Merge pull request #4287 from overleaf/jpa-no-analytics-queues-server-ce-pro

[misc] do not set up analytics queues in Server CE/Pro

GitOrigin-RevId: 61a62f0ff7f04d5206845e01c68097229a5954fd
This commit is contained in:
Miguel Serrano 2021-07-01 13:42:30 +02:00 committed by Copybot
parent 37a50e295a
commit 7430d7f558
4 changed files with 158 additions and 90 deletions

View file

@ -1,3 +1,4 @@
const Features = require('../../infrastructure/Features')
const Queues = require('../../infrastructure/Queues') const Queues = require('../../infrastructure/Queues')
const EmailHandler = require('../Email/EmailHandler') const EmailHandler = require('../Email/EmailHandler')
const UserUpdater = require('./UserUpdater') const UserUpdater = require('./UserUpdater')
@ -34,4 +35,10 @@ class UserOnboardingEmailManager {
} }
} }
module.exports = new UserOnboardingEmailManager() class NoopManager {
async scheduleOnboardingEmail() {}
}
module.exports = Features.hasFeature('saas')
? new UserOnboardingEmailManager()
: new NoopManager()

View file

@ -4,6 +4,7 @@ const {
promises: InstitutionsAPIPromises, promises: InstitutionsAPIPromises,
} = require('../Institutions/InstitutionsAPI') } = require('../Institutions/InstitutionsAPI')
const AnalyticsManager = require('../Analytics/AnalyticsManager') const AnalyticsManager = require('../Analytics/AnalyticsManager')
const Features = require('../../infrastructure/Features')
const ONE_DAY_MS = 24 * 60 * 60 * 1000 const ONE_DAY_MS = 24 * 60 * 60 * 1000
@ -47,4 +48,10 @@ async function checkAffiliations(userId) {
} }
} }
module.exports = new UserPostRegistrationAnalyticsManager() class NoopManager {
async schedulePostRegistrationAnalytics() {}
}
module.exports = Features.hasFeature('saas')
? new UserPostRegistrationAnalyticsManager()
: new NoopManager()

View file

@ -1,6 +1,7 @@
const SandboxedModule = require('sandboxed-module') const SandboxedModule = require('sandboxed-module')
const path = require('path') const path = require('path')
const sinon = require('sinon') const sinon = require('sinon')
const { expect } = require('chai')
const MODULE_PATH = path.join( const MODULE_PATH = path.join(
__dirname, __dirname,
@ -17,11 +18,10 @@ describe('UserOnboardingEmailManager', function () {
this.queueProcessFunction = callback this.queueProcessFunction = callback
}, },
} }
const self = this
this.Queues = { this.Queues = {
getOnboardingEmailsQueue: () => { getOnboardingEmailsQueue: sinon
return self.onboardingEmailsQueue .stub()
}, .returns(this.onboardingEmailsQueue),
} }
this.UserGetter = { this.UserGetter = {
promises: { promises: {
@ -41,21 +41,49 @@ describe('UserOnboardingEmailManager', function () {
updateUser: sinon.stub().resolves(), updateUser: sinon.stub().resolves(),
}, },
} }
this.Features = {
hasFeature: sinon.stub(),
}
this.request = sinon.stub().yields() this.request = sinon.stub().yields()
this.init = isSAAS => {
this.Features.hasFeature.withArgs('saas').returns(isSAAS)
this.UserOnboardingEmailManager = SandboxedModule.require(MODULE_PATH, { this.UserOnboardingEmailManager = SandboxedModule.require(MODULE_PATH, {
globals: { globals: {
console: console, console: console,
}, },
requires: { requires: {
'../../infrastructure/Features': this.Features,
'../../infrastructure/Queues': this.Queues, '../../infrastructure/Queues': this.Queues,
'../Email/EmailHandler': this.EmailHandler, '../Email/EmailHandler': this.EmailHandler,
'./UserGetter': this.UserGetter, './UserGetter': this.UserGetter,
'./UserUpdater': this.UserUpdater, './UserUpdater': this.UserUpdater,
}, },
}) })
}
})
describe('in Server CE/Pro', function () {
beforeEach(function () {
this.init(false)
})
it('should not create any queue', function () {
expect(this.Queues.getOnboardingEmailsQueue).to.not.have.been.called
})
it('should not schedule any email', function () {
this.UserOnboardingEmailManager.scheduleOnboardingEmail({
_id: this.fakeUserId,
})
expect(this.onboardingEmailsQueue.add).to.not.have.been.called
})
})
describe('schedule email in SAAS', function () {
beforeEach(function () {
this.init(true)
}) })
describe('schedule email', function () {
it('should schedule delayed job on queue', function () { it('should schedule delayed job on queue', function () {
this.UserOnboardingEmailManager.scheduleOnboardingEmail({ this.UserOnboardingEmailManager.scheduleOnboardingEmail({
_id: this.fakeUserId, _id: this.fakeUserId,

View file

@ -1,6 +1,7 @@
const SandboxedModule = require('sandboxed-module') const SandboxedModule = require('sandboxed-module')
const path = require('path') const path = require('path')
const sinon = require('sinon') const sinon = require('sinon')
const { expect } = require('chai')
const MODULE_PATH = path.join( const MODULE_PATH = path.join(
__dirname, __dirname,
@ -16,11 +17,10 @@ describe('UserPostRegistrationAnalyticsManager', function () {
this.queueProcessFunction = callback this.queueProcessFunction = callback
}, },
} }
const self = this
this.Queues = { this.Queues = {
getPostRegistrationAnalyticsQueue: () => { getPostRegistrationAnalyticsQueue: sinon
return self.postRegistrationAnalyticsQueue .stub()
}, .returns(this.postRegistrationAnalyticsQueue),
} }
this.UserGetter = { this.UserGetter = {
promises: { promises: {
@ -35,13 +35,16 @@ describe('UserPostRegistrationAnalyticsManager', function () {
this.AnalyticsManager = { this.AnalyticsManager = {
setUserProperty: sinon.stub().resolves(), setUserProperty: sinon.stub().resolves(),
} }
this.Features = {
hasFeature: sinon.stub().returns(true),
}
this.init = isSAAS => {
this.Features.hasFeature.withArgs('saas').returns(isSAAS)
this.UserPostRegistrationAnalyticsManager = SandboxedModule.require( this.UserPostRegistrationAnalyticsManager = SandboxedModule.require(
MODULE_PATH, MODULE_PATH,
{ {
globals: {
console: console,
},
requires: { requires: {
'../../infrastructure/Features': this.Features,
'../../infrastructure/Queues': this.Queues, '../../infrastructure/Queues': this.Queues,
'./UserGetter': this.UserGetter, './UserGetter': this.UserGetter,
'../Institutions/InstitutionsAPI': this.InstitutionsAPI, '../Institutions/InstitutionsAPI': this.InstitutionsAPI,
@ -49,9 +52,29 @@ describe('UserPostRegistrationAnalyticsManager', function () {
}, },
} }
) )
}
}) })
describe('schedule jobs', function () { describe('in Server CE/Pro', function () {
beforeEach(function () {
this.init(false)
})
it('should schedule delayed job on queue', function () {
this.UserPostRegistrationAnalyticsManager.schedulePostRegistrationAnalytics(
{ _id: this.fakeUserId }
)
expect(this.Queues.getPostRegistrationAnalyticsQueue).to.not.have.been
.called
expect(this.postRegistrationAnalyticsQueue.add).to.not.have.been.called
})
})
describe('in SAAS', function () {
beforeEach(function () {
this.init(true)
})
describe('schedule jobs in SAAS', function () {
it('should schedule delayed job on queue', function () { it('should schedule delayed job on queue', function () {
this.UserPostRegistrationAnalyticsManager.schedulePostRegistrationAnalytics( this.UserPostRegistrationAnalyticsManager.schedulePostRegistrationAnalytics(
{ {
@ -73,7 +96,9 @@ describe('UserPostRegistrationAnalyticsManager', function () {
sinon.assert.calledWith(this.UserGetter.promises.getUser, { sinon.assert.calledWith(this.UserGetter.promises.getUser, {
_id: this.fakeUserId, _id: this.fakeUserId,
}) })
sinon.assert.notCalled(this.InstitutionsAPI.promises.getUserAffiliations) sinon.assert.notCalled(
this.InstitutionsAPI.promises.getUserAffiliations
)
sinon.assert.notCalled(this.AnalyticsManager.setUserProperty) sinon.assert.notCalled(this.AnalyticsManager.setUserProperty)
}) })
@ -120,3 +145,4 @@ describe('UserPostRegistrationAnalyticsManager', function () {
}) })
}) })
}) })
})