Files
Verso/services/web/test/unit/src/Subscription/SubscriptionLocatorTests.js
T
ilkin-overleaf cfc6ff0759 Merge pull request #25983 from overleaf/ii-managed-users-make-unmanaged-roles-access
[web] Prevent managers from removing/deleting themselves

GitOrigin-RevId: 9287dc06bab8024bf03fecff678a4118a9456919
2025-06-13 08:05:46 +00:00

192 lines
5.9 KiB
JavaScript

const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const modulePath =
'../../../../app/src/Features/Subscription/SubscriptionLocator'
const { expect } = require('chai')
describe('Subscription Locator Tests', function () {
beforeEach(function () {
this.user = { _id: '5208dd34438842e2db333333' }
this.subscription = { hello: 'world' }
this.Subscription = {
findOne: sinon.stub().returns({
exec: sinon.stub().resolves(),
}),
find: sinon.stub().returns({
populate: sinon.stub().returns({
populate: sinon.stub().returns({
exec: sinon.stub().resolves([]),
}),
}),
exec: sinon.stub().resolves(),
}),
}
this.DeletedSubscription = {
findOne: sinon.stub().returns({
exec: sinon.stub().resolves(),
}),
find: sinon.stub().returns({
exec: sinon.stub().resolves(),
}),
}
this.SubscriptionLocator = SandboxedModule.require(modulePath, {
requires: {
'./GroupPlansData': {},
'../../models/Subscription': {
Subscription: this.Subscription,
},
'../../models/DeletedSubscription': {
DeletedSubscription: this.DeletedSubscription,
},
'../../models/SSOConfig': {
SSOConfig: this.SSOConfig,
},
},
})
})
describe('finding users subscription', function () {
it('should send the users features', async function () {
this.Subscription.findOne.returns({
exec: sinon.stub().resolves(this.subscription),
})
const subscription =
await this.SubscriptionLocator.promises.getUsersSubscription(this.user)
this.Subscription.findOne
.calledWith({ admin_id: this.user._id })
.should.equal(true)
subscription.should.equal(this.subscription)
})
it('should error if not found', async function () {
this.Subscription.findOne.returns({
exec: sinon.stub().rejects('not found'),
})
await expect(
this.SubscriptionLocator.promises.getUsersSubscription(this.user)
).to.be.rejected
})
it('should take a user id rather than the user object', async function () {
this.Subscription.findOne.returns({
exec: sinon.stub().resolves(this.subscription),
})
const subscription =
await this.SubscriptionLocator.promises.getUsersSubscription(
this.user._id
)
this.Subscription.findOne
.calledWith({ admin_id: this.user._id })
.should.equal(true)
subscription.should.equal(this.subscription)
})
})
describe('getUserSubscriptionStatus', function () {
it('should return no active personal or group subscription when no user is passed', async function () {
const subscriptionStatus =
await this.SubscriptionLocator.promises.getUserSubscriptionStatus(
undefined
)
expect(subscriptionStatus).to.deep.equal({
personal: false,
group: false,
})
})
it('should return no active personal or group subscription when the user has no subscription', async function () {
const subscriptionStatus =
await this.SubscriptionLocator.promises.getUserSubscriptionStatus(
this.user._id
)
expect(subscriptionStatus).to.deep.equal({
personal: false,
group: false,
})
})
it('should return active personal subscription', async function () {
this.Subscription.findOne.returns({
exec: sinon.stub().resolves({
recurlyStatus: {
state: 'active',
},
}),
})
const subscriptionStatus =
await this.SubscriptionLocator.promises.getUserSubscriptionStatus(
this.user._id
)
expect(subscriptionStatus).to.deep.equal({ personal: true, group: false })
})
it('should return active group subscription when member of a group plan', async function () {
this.Subscription.find.returns({
populate: sinon.stub().returns({
populate: sinon.stub().returns({
exec: sinon.stub().resolves([
{
recurlyStatus: {
state: 'active',
},
groupPlan: true,
},
]),
}),
}),
})
const subscriptionStatus =
await this.SubscriptionLocator.promises.getUserSubscriptionStatus(
this.user._id
)
expect(subscriptionStatus).to.deep.equal({ personal: false, group: true })
})
it('should return active group subscription when owner of a group plan', async function () {
this.Subscription.findOne.returns({
exec: sinon.stub().resolves({
recurlyStatus: {
state: 'active',
},
groupPlan: true,
}),
})
const subscriptionStatus =
await this.SubscriptionLocator.promises.getUserSubscriptionStatus(
this.user._id
)
expect(subscriptionStatus).to.deep.equal({ personal: false, group: true })
})
it('should return active personal and group subscription when has personal subscription and member of a group', async function () {
this.Subscription.find.returns({
populate: sinon.stub().returns({
populate: sinon.stub().returns({
exec: sinon.stub().resolves([
{
recurlyStatus: {
state: 'active',
},
groupPlan: true,
},
]),
}),
}),
})
this.Subscription.findOne.returns({
exec: sinon.stub().resolves({
recurlyStatus: {
state: 'active',
},
}),
})
const subscriptionStatus =
await this.SubscriptionLocator.promises.getUserSubscriptionStatus(
this.user._id
)
expect(subscriptionStatus).to.deep.equal({ personal: true, group: true })
})
})
})