Merge pull request #3718 from overleaf/jel-emailHasLicence

Update emailHasLicence for reconfirmation and SAML

GitOrigin-RevId: 58daf538d9f0a7db46bb3c1e21f8ca04df095446
This commit is contained in:
Thomas 2021-03-15 15:42:45 +01:00 committed by Copybot
parent 18eea6d024
commit 1c54a15e42
4 changed files with 44 additions and 50 deletions

View file

@ -16,6 +16,10 @@ function emailHasLicence(emailData) {
if (!affiliation.licence) {
return false
}
if (affiliation.pastReconfirmDate) {
return false
}
return affiliation.licence !== 'free'
}

View file

@ -63,9 +63,6 @@ const FeaturesUpdater = {
bonusFeatures(cb) {
ReferalFeatures.getBonusFeatures(userId, cb)
},
samlFeatures(cb) {
FeaturesUpdater._getSamlFeatures(userId, cb)
},
featuresOverrides(cb) {
FeaturesUpdater._getFeaturesOverrides(userId, cb)
}
@ -88,7 +85,6 @@ const FeaturesUpdater = {
institutionFeatures,
v1Features,
bonusFeatures,
samlFeatures,
featuresOverrides
} = results
logger.log(
@ -99,7 +95,6 @@ const FeaturesUpdater = {
institutionFeatures,
v1Features,
bonusFeatures,
samlFeatures,
featuresOverrides
},
'merging user features'
@ -109,7 +104,6 @@ const FeaturesUpdater = {
institutionFeatures,
v1Features,
bonusFeatures,
samlFeatures,
featuresOverrides
])
const features = _.reduce(
@ -133,30 +127,6 @@ const FeaturesUpdater = {
)
},
_getSamlFeatures(userId, callback) {
UserGetter.getUser(userId, (err, user) => {
if (err) {
return callback(err)
}
if (
!user ||
!Array.isArray(user.samlIdentifiers) ||
!user.samlIdentifiers.length
) {
return callback(null, {})
}
for (const samlIdentifier of user.samlIdentifiers) {
if (samlIdentifier && samlIdentifier.hasEntitlement) {
return callback(
null,
FeaturesUpdater._planCodeToFeatures('professional')
)
}
}
callback(null, {})
})
},
_getFeaturesOverrides(userId, callback) {
UserGetter.getUser(userId, { featuresOverrides: 1 }, (error, user) => {
if (error) {

View file

@ -1025,11 +1025,12 @@ describe('UserEmails', function() {
password: userHelper.getDefaultPassword()
})
const institutionId = MockV1Api.createInstitution({
commonsAccount: true,
ssoEnabled: false,
maxConfirmationMonths
})
const domain = 'example-affiliation.com'
MockV1Api.addInstitutionDomain(institutionId, domain)
MockV1Api.addInstitutionDomain(institutionId, domain, { confirmed: true })
email1 = `leonard@${domain}`
email2 = `mccoy@${domain}`
@ -1053,24 +1054,37 @@ describe('UserEmails', function() {
)
})
it('should flag inReconfirmNotificationPeriod for all affiliations in period', async function() {
const response = await userHelper.request.get('/user/emails')
expect(response.statusCode).to.equal(200)
const fullEmails = JSON.parse(response.body)
expect(fullEmails.length).to.equal(4)
expect(fullEmails[0].affiliation).to.not.exist
expect(
fullEmails[1].affiliation.inReconfirmNotificationPeriod
).to.equal(true)
expect(fullEmails[1].affiliation.pastReconfirmDate).to.equal(false)
expect(
fullEmails[2].affiliation.inReconfirmNotificationPeriod
).to.equal(true)
expect(fullEmails[2].affiliation.pastReconfirmDate).to.equal(false)
expect(
fullEmails[3].affiliation.inReconfirmNotificationPeriod
).to.equal(true)
expect(fullEmails[3].affiliation.pastReconfirmDate).to.equal(true)
describe('when all affiliations in notification period or past reconfirm date', function() {
it('should flag inReconfirmNotificationPeriod for all affiliations in period', async function() {
const response = await userHelper.request.get('/user/emails')
expect(response.statusCode).to.equal(200)
const fullEmails = JSON.parse(response.body)
expect(fullEmails.length).to.equal(4)
expect(fullEmails[0].affiliation).to.not.exist
expect(
fullEmails[1].affiliation.inReconfirmNotificationPeriod
).to.equal(true)
expect(
fullEmails[2].affiliation.inReconfirmNotificationPeriod
).to.equal(true)
expect(
fullEmails[3].affiliation.inReconfirmNotificationPeriod
).to.equal(true)
})
it('should set pastReconfirmDate and emailHasInstitutionLicence:false for lapsed confirmations', async function() {
const response = await userHelper.request.get('/user/emails')
expect(response.statusCode).to.equal(200)
const fullEmails = JSON.parse(response.body)
expect(fullEmails.length).to.equal(4)
expect(fullEmails[0].affiliation).to.not.exist
expect(fullEmails[1].affiliation.pastReconfirmDate).to.equal(false)
expect(fullEmails[1].emailHasInstitutionLicence).to.equal(true)
expect(fullEmails[2].affiliation.pastReconfirmDate).to.equal(false)
expect(fullEmails[2].emailHasInstitutionLicence).to.equal(true)
expect(fullEmails[3].affiliation.pastReconfirmDate).to.equal(true)
expect(fullEmails[3].emailHasInstitutionLicence).to.equal(false)
})
})
describe('should flag emails before their confirmation expires, but within the notification period', function() {

View file

@ -212,7 +212,13 @@ class MockV1Api extends AbstractMockApi {
affiliation.institution.confirmed = !!domainData.confirmed
if (institutionData.commonsAccount) {
affiliation.licence = 'free'
if (
institutionData.commonsAccount &&
(!institutionData.sso_enabled ||
(institutionData.sso_enabled &&
affiliation.cached_entitlement === true))
) {
affiliation.licence = 'pro_plus'
}
return affiliation