|
|
@@ -163,6 +163,12 @@ describe('Page', () => {
|
|
|
const pageIdUpd11 = new mongoose.Types.ObjectId();
|
|
|
const pageIdUpd12 = new mongoose.Types.ObjectId();
|
|
|
const pageIdUpd13 = new mongoose.Types.ObjectId();
|
|
|
+ const pageIdUpd14 = new mongoose.Types.ObjectId();
|
|
|
+ const pageIdUpd15 = new mongoose.Types.ObjectId();
|
|
|
+ const pageIdUpd16 = new mongoose.Types.ObjectId();
|
|
|
+ const pageIdUpd17 = new mongoose.Types.ObjectId();
|
|
|
+ const pageIdUpd18 = new mongoose.Types.ObjectId();
|
|
|
+ const pageIdUpd19 = new mongoose.Types.ObjectId();
|
|
|
|
|
|
await Page.insertMany([
|
|
|
{
|
|
|
@@ -337,7 +343,138 @@ describe('Page', () => {
|
|
|
descendantCount: 0,
|
|
|
},
|
|
|
{
|
|
|
- path: '/mup24',
|
|
|
+ _id: pageIdUpd14,
|
|
|
+ path: '/mup24_pub',
|
|
|
+ grant: Page.GRANT_PUBLIC,
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: rootPage,
|
|
|
+ descendantCount: 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ path: '/mup24_pub/mup25_pub',
|
|
|
+ grant: Page.GRANT_PUBLIC,
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: pageIdUpd14,
|
|
|
+ descendantCount: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ path: '/mup26_awl',
|
|
|
+ grant: Page.GRANT_RESTRICTED,
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ descendantCount: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _id: pageIdUpd15,
|
|
|
+ path: '/mup27_pub',
|
|
|
+ grant: Page.GRANT_PUBLIC,
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: rootPage,
|
|
|
+ descendantCount: 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ path: '/mup27_pub/mup28_owner',
|
|
|
+ grant: Page.GRANT_OWNER,
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: pageIdUpd15,
|
|
|
+ grantedUsers: [pModelUserId1],
|
|
|
+ descendantCount: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _id: pageIdUpd16,
|
|
|
+ path: '/mup29_A',
|
|
|
+ grant: Page.GRANT_USER_GROUP,
|
|
|
+ grantedGroup: groupIdA,
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: rootPage,
|
|
|
+ descendantCount: 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ path: '/mup29_A/mup30_owner',
|
|
|
+ grant: Page.GRANT_OWNER,
|
|
|
+ grantedUsers: [pModelUserId1],
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: pageIdUpd16,
|
|
|
+ descendantCount: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _id: pageIdUpd17,
|
|
|
+ path: '/mup31_A',
|
|
|
+ grant: Page.GRANT_USER_GROUP,
|
|
|
+ grantedGroup: groupIdA,
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: rootPage,
|
|
|
+ descendantCount: 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ path: '/mup31_A/mup32_owner',
|
|
|
+ grant: Page.GRANT_OWNER,
|
|
|
+ grantedUsers: [pModelUserId1],
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: pageIdUpd17,
|
|
|
+ descendantCount: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _id: pageIdUpd18,
|
|
|
+ path: '/mup33_C',
|
|
|
+ grant: Page.GRANT_USER_GROUP,
|
|
|
+ grantedGroup: groupIdC,
|
|
|
+ creator: pModelUserId3,
|
|
|
+ lastUpdateUser: pModelUserId3,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: rootPage,
|
|
|
+ descendantCount: 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ path: '/mup33_C/mup34_owner',
|
|
|
+ grant: Page.GRANT_OWNER,
|
|
|
+ grantedUsers: [pModelUserId3],
|
|
|
+ creator: pModelUserId3,
|
|
|
+ lastUpdateUser: pModelUserId3,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: pageIdUpd18,
|
|
|
+ descendantCount: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _id: pageIdUpd19,
|
|
|
+ path: '/mup35_owner',
|
|
|
+ grant: Page.GRANT_OWNER,
|
|
|
+ grantedUsers: [pModelUserId1],
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: rootPage,
|
|
|
+ descendantCount: 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ path: '/mup35_owner/mup36_owner',
|
|
|
+ grant: Page.GRANT_OWNER,
|
|
|
+ grantedUsers: [pModelUserId1],
|
|
|
+ creator: pModelUserId1,
|
|
|
+ lastUpdateUser: pModelUserId1,
|
|
|
+ isEmpty: false,
|
|
|
+ parent: pageIdUpd19,
|
|
|
+ descendantCount: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ path: '/mup40', // used this number to resolve conflict
|
|
|
grant: Page.GRANT_OWNER,
|
|
|
grantedUsers: [dummyUser1._id],
|
|
|
creator: dummyUser1,
|
|
|
@@ -434,7 +571,7 @@ describe('Page', () => {
|
|
|
|
|
|
describe('Changing grant to GRANT_RESTRICTED', () => {
|
|
|
test('successfully change to GRANT_RESTRICTED from GRANT_OWNER', async() => {
|
|
|
- const path = '/mup24';
|
|
|
+ const path = '/mup40';
|
|
|
const _page = await Page.findOne({ path, grant: Page.GRANT_OWNER, grantedUsers: [dummyUser1._id] });
|
|
|
expect(_page).toBeTruthy();
|
|
|
|
|
|
@@ -559,6 +696,213 @@ describe('Page', () => {
|
|
|
expect(page1.grantedUsers).not.toStrictEqual([dummyUser1._id]);
|
|
|
});
|
|
|
});
|
|
|
+ describe('Changing grant to GRANT_USER_GROUP', () => {
|
|
|
+ describe('update grant of a page under a page with GRANT_PUBLIC', () => {
|
|
|
+ test('successfully change to GRANT_USER_GROUP from GRANT_PUBLIC if parent page is GRANT_PUBLIC', async() => {
|
|
|
+ // path
|
|
|
+ const path1 = '/mup24_pub';
|
|
|
+ const path2 = '/mup24_pub/mup25_pub';
|
|
|
+ // page
|
|
|
+ const _page1 = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC }); // out of update scope
|
|
|
+ const _page2 = await Page.findOne({ path: path2, grant: Page.GRANT_PUBLIC, parent: _page1._id }); // update target
|
|
|
+ expect(_page1).toBeTruthy();
|
|
|
+ expect(_page2).toBeTruthy();
|
|
|
+
|
|
|
+ const options = { grant: Page.GRANT_USER_GROUP, grantUserGroupId: groupIdA };
|
|
|
+ const updatedPage = await updatePage(_page2, 'new', 'old', pModelUser1, options); // from GRANT_PUBLIC to GRANT_USER_GROUP(groupIdA)
|
|
|
+
|
|
|
+ const page1 = await Page.findById(_page1._id);
|
|
|
+ const page2 = await Page.findById(_page2._id);
|
|
|
+ expect(page1).toBeTruthy();
|
|
|
+ expect(page2).toBeTruthy();
|
|
|
+ expect(updatedPage).toBeTruthy();
|
|
|
+ expect(updatedPage._id).toStrictEqual(page2._id);
|
|
|
+
|
|
|
+ // check page2 grant and group
|
|
|
+ expect(page2.grant).toBe(Page.GRANT_USER_GROUP);
|
|
|
+ expect(page2.grantedGroup._id).toStrictEqual(groupIdA);
|
|
|
+ });
|
|
|
+
|
|
|
+ test('successfully change to GRANT_USER_GROUP from GRANT_RESTRICTED if parent page is GRANT_PUBLIC', async() => {
|
|
|
+ // path
|
|
|
+ const _path1 = '/mup26_awl';
|
|
|
+ // page
|
|
|
+ const _page1 = await Page.findOne({ path: _path1, grant: Page.GRANT_RESTRICTED });
|
|
|
+ expect(_page1).toBeTruthy();
|
|
|
+
|
|
|
+ const options = { grant: Page.GRANT_USER_GROUP, grantUserGroupId: groupIdA };
|
|
|
+ const updatedPage = await updatePage(_page1, 'new', 'old', pModelUser1, options); // from GRANT_RESTRICTED to GRANT_USER_GROUP(groupIdA)
|
|
|
+
|
|
|
+ const page1 = await Page.findById(_page1._id);
|
|
|
+ expect(page1).toBeTruthy();
|
|
|
+ expect(updatedPage).toBeTruthy();
|
|
|
+ expect(updatedPage._id).toStrictEqual(page1._id);
|
|
|
+
|
|
|
+ // updated page
|
|
|
+ expect(page1.grant).toBe(Page.GRANT_USER_GROUP);
|
|
|
+ expect(page1.grantedGroup._id).toStrictEqual(groupIdA);
|
|
|
+
|
|
|
+ // parent's grant check
|
|
|
+ const parent = await Page.findById(page1.parent);
|
|
|
+ expect(parent.grant).toBe(Page.GRANT_PUBLIC);
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ test('successfully change to GRANT_USER_GROUP from GRANT_OWNER if parent page is GRANT_PUBLIC', async() => {
|
|
|
+ // path
|
|
|
+ const path1 = '/mup27_pub';
|
|
|
+ const path2 = '/mup27_pub/mup28_owner';
|
|
|
+ // page
|
|
|
+ const _page1 = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC }); // out of update scope
|
|
|
+ const _page2 = await Page.findOne({
|
|
|
+ path: path2, grant: Page.GRANT_OWNER, grantedUsers: [pModelUser1], parent: _page1._id,
|
|
|
+ }); // update target
|
|
|
+ expect(_page1).toBeTruthy();
|
|
|
+ expect(_page2).toBeTruthy();
|
|
|
+
|
|
|
+ const options = { grant: Page.GRANT_USER_GROUP, grantUserGroupId: groupIdA };
|
|
|
+ const updatedPage = await updatePage(_page2, 'new', 'old', pModelUser1, options); // from GRANT_OWNER to GRANT_USER_GROUP(groupIdA)
|
|
|
+
|
|
|
+ const page1 = await Page.findById(_page1._id);
|
|
|
+ const page2 = await Page.findById(_page2._id);
|
|
|
+ expect(page1).toBeTruthy();
|
|
|
+ expect(page2).toBeTruthy();
|
|
|
+ expect(updatedPage).toBeTruthy();
|
|
|
+ expect(updatedPage._id).toStrictEqual(page2._id);
|
|
|
+
|
|
|
+ // grant check
|
|
|
+ expect(page2.grant).toBe(Page.GRANT_USER_GROUP);
|
|
|
+ expect(page2.grantedGroup._id).toStrictEqual(groupIdA);
|
|
|
+ expect(page2.grantedUsers.length).toBe(0);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe('update grant of a page under a page with GRANT_USER_GROUP', () => {
|
|
|
+ test('successfully change to GRANT_USER_GROUP if the group to set is the child or descendant of the parent page group', async() => {
|
|
|
+ // path
|
|
|
+ const _path1 = '/mup29_A';
|
|
|
+ const _path2 = '/mup29_A/mup30_owner';
|
|
|
+ // page
|
|
|
+ const _page1 = await Page.findOne({ path: _path1, grant: Page.GRANT_USER_GROUP, grantedGroup: groupIdA }); // out of update scope
|
|
|
+ const _page2 = await Page.findOne({ // update target
|
|
|
+ path: _path2, grant: Page.GRANT_OWNER, grantedUsers: [pModelUser1], parent: _page1._id,
|
|
|
+ });
|
|
|
+ expect(_page1).toBeTruthy();
|
|
|
+ expect(_page2).toBeTruthy();
|
|
|
+
|
|
|
+ const options = { grant: Page.GRANT_USER_GROUP, grantUserGroupId: groupIdB };
|
|
|
+
|
|
|
+ // First round
|
|
|
+ // Group relation(parent -> child): groupIdA -> groupIdB -> groupIdC
|
|
|
+ const updatedPage = await updatePage(_page2, 'new', 'old', pModelUser3, options); // from GRANT_OWNER to GRANT_USER_GROUP(groupIdB)
|
|
|
+
|
|
|
+ const page1 = await Page.findById(_page1._id);
|
|
|
+ const page2 = await Page.findById(_page2._id);
|
|
|
+ expect(page1).toBeTruthy();
|
|
|
+ expect(page2).toBeTruthy();
|
|
|
+ expect(updatedPage).toBeTruthy();
|
|
|
+ expect(updatedPage._id).toStrictEqual(page2._id);
|
|
|
+
|
|
|
+ expect(page2.grant).toBe(Page.GRANT_USER_GROUP);
|
|
|
+ expect(page2.grantedGroup._id).toStrictEqual(groupIdB);
|
|
|
+ expect(page2.grantedUsers.length).toBe(0);
|
|
|
+
|
|
|
+ // Second round
|
|
|
+ // Update group to groupC which is a grandchild from pageA's point of view
|
|
|
+ const secondRoundOptions = { grant: Page.GRANT_USER_GROUP, grantUserGroupId: groupIdC }; // from GRANT_USER_GROUP(groupIdB) to GRANT_USER_GROUP(groupIdC)
|
|
|
+ const secondRoundUpdatedPage = await updatePage(_page2, 'new', 'new', pModelUser3, secondRoundOptions);
|
|
|
+
|
|
|
+ expect(secondRoundUpdatedPage).toBeTruthy();
|
|
|
+ expect(secondRoundUpdatedPage.grant).toBe(Page.GRANT_USER_GROUP);
|
|
|
+ expect(secondRoundUpdatedPage.grantedGroup._id).toStrictEqual(groupIdC);
|
|
|
+ });
|
|
|
+ test('Fail to change to GRANT_USER_GROUP if the group to set is NOT the child or descendant of the parent page group', async() => {
|
|
|
+ // path
|
|
|
+ const _path1 = '/mup31_A';
|
|
|
+ const _path2 = '/mup31_A/mup32_owner';
|
|
|
+ // page
|
|
|
+ const _page1 = await Page.findOne({ path: _path1, grant: Page.GRANT_USER_GROUP, grantedGroup: groupIdA });
|
|
|
+ const _page2 = await Page.findOne({ // update target
|
|
|
+ path: _path2, grant: Page.GRANT_OWNER, grantedUsers: [pModelUser1._id], parent: _page1._id,
|
|
|
+ });
|
|
|
+ expect(_page1).toBeTruthy();
|
|
|
+ expect(_page2).toBeTruthy();
|
|
|
+
|
|
|
+ // group
|
|
|
+ const _groupIsolated = await UserGroup.findById(groupIdIsolate);
|
|
|
+ expect(_groupIsolated).toBeTruthy();
|
|
|
+ // group parent check
|
|
|
+ expect(_groupIsolated.parent).toBeUndefined(); // should have no parent
|
|
|
+
|
|
|
+ const options = { grant: Page.GRANT_USER_GROUP, grantUserGroupId: groupIdIsolate };
|
|
|
+ await expect(updatePage(_page2, 'new', 'old', pModelUser1, options)) // from GRANT_OWNER to GRANT_USER_GROUP(groupIdIsolate)
|
|
|
+ .rejects.toThrow(new Error('The selected grant or grantedGroup is not assignable to this page.'));
|
|
|
+
|
|
|
+ const page1 = await Page.findById(_page1._id);
|
|
|
+ const page2 = await Page.findById(_page2._id);
|
|
|
+ expect(page1).toBeTruthy();
|
|
|
+ expect(page1).toBeTruthy();
|
|
|
+
|
|
|
+ expect(page2.grant).toBe(Page.GRANT_OWNER); // should be the same before the update
|
|
|
+ expect(page2.grantedUsers).toStrictEqual([pModelUser1._id]); // should be the same before the update
|
|
|
+ expect(page2.grantedGroup).toBeUndefined(); // no group should be set
|
|
|
+ });
|
|
|
+ test('Fail to change to GRANT_USER_GROUP if the group to set is an ancestor of the parent page group', async() => {
|
|
|
+ // path
|
|
|
+ const _path1 = '/mup33_C';
|
|
|
+ const _path2 = '/mup33_C/mup34_owner';
|
|
|
+ // page
|
|
|
+ const _page1 = await Page.findOne({ path: _path1, grant: Page.GRANT_USER_GROUP, grantedGroup: groupIdC }); // groupC
|
|
|
+ const _page2 = await Page.findOne({ // update target
|
|
|
+ path: _path2, grant: Page.GRANT_OWNER, grantedUsers: [pModelUser3], parent: _page1._id,
|
|
|
+ });
|
|
|
+ expect(_page1).toBeTruthy();
|
|
|
+ expect(_page2).toBeTruthy();
|
|
|
+
|
|
|
+ const options = { grant: Page.GRANT_USER_GROUP, grantUserGroupId: groupIdA };
|
|
|
+
|
|
|
+ // Group relation(parent -> child): groupIdA -> groupIdB -> groupIdC
|
|
|
+ // this should fail because the groupC is a descendant of groupA
|
|
|
+ await expect(updatePage(_page2, 'new', 'old', pModelUser3, options)) // from GRANT_OWNER to GRANT_USER_GROUP(groupIdA)
|
|
|
+ .rejects.toThrow(new Error('The selected grant or grantedGroup is not assignable to this page.'));
|
|
|
+
|
|
|
+ const page1 = await Page.findById(_page1._id);
|
|
|
+ const page2 = await Page.findById(_page2._id);
|
|
|
+ expect(page1).toBeTruthy();
|
|
|
+ expect(page2).toBeTruthy();
|
|
|
+
|
|
|
+ expect(page2.grant).toBe(Page.GRANT_OWNER); // should be the same before the update
|
|
|
+ expect(page2.grantedUsers).toStrictEqual([pModelUser3._id]); // should be the same before the update
|
|
|
+ expect(page2.grantedGroup).toBeUndefined(); // no group should be set
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe('update grant of a page under a page with GRANT_OWNER', () => {
|
|
|
+ test('Fail to change from GRNAT_OWNER', async() => {
|
|
|
+ // path
|
|
|
+ const path1 = '/mup35_owner';
|
|
|
+ const path2 = '/mup35_owner/mup36_owner';
|
|
|
+ // page
|
|
|
+ const _page1 = await Page.findOne({ path: path1, grant: Page.GRANT_OWNER, grantedUsers: [pModelUser1] });
|
|
|
+ const _page2 = await Page.findOne({ // update target
|
|
|
+ path: path2, grant: Page.GRANT_OWNER, grantedUsers: [pModelUser1], parent: _page1._id,
|
|
|
+ });
|
|
|
+ expect(_page1).toBeTruthy();
|
|
|
+ expect(_page2).toBeTruthy();
|
|
|
+
|
|
|
+ const options = { grant: Page.GRANT_USER_GROUP, grantUserGroupId: groupIdA };
|
|
|
+ await expect(updatePage(_page2, 'new', 'old', pModelUser1, options)) // from GRANT_OWNER to GRANT_USER_GROUP(groupIdA)
|
|
|
+ .rejects.toThrow(new Error('The selected grant or grantedGroup is not assignable to this page.'));
|
|
|
+
|
|
|
+ const page1 = await Page.findById(_page1.id);
|
|
|
+ const page2 = await Page.findById(_page2.id);
|
|
|
+ expect(page1).toBeTruthy();
|
|
|
+ expect(page2).toBeTruthy();
|
|
|
+ expect(page2.grant).toBe(Page.GRANT_OWNER); // should be the same before the update
|
|
|
+ expect(page2.grantedUsers).toStrictEqual([pModelUser1._id]); // should be the same before the update
|
|
|
+ expect(page2.grantedGroup).toBeUndefined(); // no group should be set
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ });
|
|
|
|
|
|
});
|
|
|
});
|