mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
Free group plan subscription from a party/guild no longer gets cancelled after leaving a guild - fixes #11055 (#11228)
* bug fix: free group plan subscription from party/guild is no longer cancelled when leaving a guild * free group plan subscription from party/guild no longer gets cancelled when leaving a guild * bug fix: free group plan subscription from party/guild is no longer cancelled when leaving a guild * free group plan subscription from party/guild no longer gets cancelled when leaving a guild * Added tests to check if a member of a group plan maintains free subscription when leaving another group without a plan * Added tests to check if member of a group plan still keeps free subscription when leaving some other group without a plan * bug fix: free group plan subscription from party/guild is no longer cancelled when leaving a guild * free group plan subscription from party/guild no longer gets cancelled when leaving a guild * bug fix: free group plan subscription from party/guild is no longer cancelled when leaving a guild * free group plan subscription from party/guild no longer gets cancelled when leaving a guild * Added tests to check if a member of a group plan maintains free subscription when leaving another group without a plan * Added tests to check if member of a group plan still keeps free subscription when leaving some other group without a plan
This commit is contained in:
committed by
Sabe Jones
parent
f0e6703546
commit
5a83f93ade
@@ -276,44 +276,70 @@ describe('POST /groups/:groupId/leave', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
context('Leaving a group plan', () => {
|
each(typesOfGroups, (groupDetails, groupType) => {
|
||||||
it('cancels the free subscription', async () => {
|
context(`Leaving a group plan when the group is a ${groupType}`, () => {
|
||||||
// Create group
|
let groupWithPlan;
|
||||||
let { group, groupLeader, members } = await createAndPopulateGroup({
|
let leader;
|
||||||
groupDetails: {
|
let member;
|
||||||
name: 'Test Private Guild',
|
|
||||||
type: 'guild',
|
beforeEach(async () => {
|
||||||
},
|
let { group, groupLeader, members } = await createAndPopulateGroup({
|
||||||
members: 1,
|
groupDetails,
|
||||||
|
members: 1,
|
||||||
|
});
|
||||||
|
leader = groupLeader;
|
||||||
|
member = members[0];
|
||||||
|
groupWithPlan = group;
|
||||||
|
let userWithFreePlan = await User.findById(leader._id).exec();
|
||||||
|
|
||||||
|
// Create subscription
|
||||||
|
let paymentData = {
|
||||||
|
user: userWithFreePlan,
|
||||||
|
groupId: groupWithPlan._id,
|
||||||
|
sub: {
|
||||||
|
key: 'basic_3mo',
|
||||||
|
},
|
||||||
|
customerId: 'customer-id',
|
||||||
|
paymentMethod: 'Payment Method',
|
||||||
|
headers: {
|
||||||
|
'x-client': 'habitica-web',
|
||||||
|
'user-agent': '',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
await payments.createSubscription(paymentData);
|
||||||
|
await member.sync();
|
||||||
});
|
});
|
||||||
|
|
||||||
let leader = groupLeader;
|
it('cancels the free subscription', async () => {
|
||||||
let member = members[0];
|
expect(member.purchased.plan.planId).to.equal('group_plan_auto');
|
||||||
let userWithFreePlan = await User.findById(leader._id).exec();
|
expect(member.purchased.plan.dateTerminated).to.not.exist;
|
||||||
|
|
||||||
// Create subscription
|
// Leave
|
||||||
let paymentData = {
|
await member.post(`/groups/${groupWithPlan._id}/leave`);
|
||||||
user: userWithFreePlan,
|
await member.sync();
|
||||||
groupId: group._id,
|
expect(member.purchased.plan.dateTerminated).to.exist;
|
||||||
sub: {
|
});
|
||||||
key: 'basic_3mo',
|
|
||||||
},
|
|
||||||
customerId: 'customer-id',
|
|
||||||
paymentMethod: 'Payment Method',
|
|
||||||
headers: {
|
|
||||||
'x-client': 'habitica-web',
|
|
||||||
'user-agent': '',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
await payments.createSubscription(paymentData);
|
|
||||||
await member.sync();
|
|
||||||
expect(member.purchased.plan.planId).to.equal('group_plan_auto');
|
|
||||||
expect(member.purchased.plan.dateTerminated).to.not.exist;
|
|
||||||
|
|
||||||
// Leave
|
it('preserves the free subscription when leaving a any other group without a plan', async () => {
|
||||||
await member.post(`/groups/${group._id}/leave`);
|
// Joining a guild without a group plan
|
||||||
await member.sync();
|
let { group: groupWithNoPlan } = await createAndPopulateGroup({
|
||||||
expect(member.purchased.plan.dateTerminated).to.exist;
|
groupDetails: {
|
||||||
|
name: 'Group Without Plan',
|
||||||
|
type: 'guild',
|
||||||
|
privacy: 'public',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
await member.post(`/groups/${groupWithNoPlan._id}/join`);
|
||||||
|
await member.sync();
|
||||||
|
expect(member.purchased.plan.planId).to.equal('group_plan_auto');
|
||||||
|
expect(member.purchased.plan.dateTerminated).to.not.exist;
|
||||||
|
|
||||||
|
// Leaving the guild without a group plan
|
||||||
|
await member.post(`/groups/${groupWithNoPlan._id}/leave`);
|
||||||
|
await member.sync();
|
||||||
|
expect(member.purchased.plan.dateTerminated).to.not.exist;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -776,7 +776,7 @@ api.leaveGroup = {
|
|||||||
|
|
||||||
if (group.type !== 'party') {
|
if (group.type !== 'party') {
|
||||||
let guildIndex = user.guilds.indexOf(group._id);
|
let guildIndex = user.guilds.indexOf(group._id);
|
||||||
user.guilds.splice(guildIndex, 1);
|
if (guildIndex >= 0) user.guilds.splice(guildIndex, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
let isMemberOfGroupPlan = await user.isMemberOfGroupPlan();
|
let isMemberOfGroupPlan = await user.isMemberOfGroupPlan();
|
||||||
|
|||||||
@@ -211,13 +211,13 @@ async function cancelGroupSubscriptionForUser (user, group, userWasRemoved = fal
|
|||||||
if (user.party._id) userGroups.push(user.party._id);
|
if (user.party._id) userGroups.push(user.party._id);
|
||||||
|
|
||||||
let index = userGroups.indexOf(group._id);
|
let index = userGroups.indexOf(group._id);
|
||||||
userGroups.splice(index, 1);
|
if (index >= 0) userGroups.splice(index, 1);
|
||||||
|
|
||||||
let groupPlansQuery = {
|
let groupPlansQuery = {
|
||||||
type: {$in: ['guild', 'party']},
|
// type: { $in: ['guild', 'party'] },
|
||||||
// privacy: 'private',
|
// privacy: 'private',
|
||||||
_id: {$in: userGroups},
|
_id: {$in: userGroups},
|
||||||
'purchased.plan.dateTerminated': null,
|
'purchased.plan.dateTerminated': { $type: 'null' },
|
||||||
};
|
};
|
||||||
|
|
||||||
let groupFields = `${basicGroupFields} purchased`;
|
let groupFields = `${basicGroupFields} purchased`;
|
||||||
|
|||||||
@@ -392,7 +392,7 @@ schema.methods.canGetGems = async function canObtainGems () {
|
|||||||
schema.methods.isMemberOfGroupPlan = async function isMemberOfGroupPlan () {
|
schema.methods.isMemberOfGroupPlan = async function isMemberOfGroupPlan () {
|
||||||
const groups = await getUserGroupData(this);
|
const groups = await getUserGroupData(this);
|
||||||
|
|
||||||
return groups.every(g => {
|
return groups.some(g => {
|
||||||
return g.isSubscribed();
|
return g.isSubscribed();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user