From ef5064f351eaaa6e7264692cdf4f7df18cd60cc6 Mon Sep 17 00:00:00 2001 From: Blade Barringer Date: Sat, 16 Jan 2016 17:23:30 -0600 Subject: [PATCH] Move generators to own file --- test/api/v2/groups/GET-groups.test.js | 2 + test/api/v2/groups/GET-groups_id.test.js | 2 +- .../api/v2/groups/POST-groups_id_join.test.js | 2 +- .../v2/groups/POST-groups_id_leave.test.js | 8 +- .../POST-groups_id_removeMember.test.js | 2 +- .../groups/chat/DELETE-groups_id_chat.test.js | 2 +- .../v2/groups/chat/GET-groups_id_chat.test.js | 2 +- .../groups/chat/POST-groups_id_chat.test.js | 2 +- .../POST-groups_id_chat_id_clearflags.test.js | 21 ++- .../chat/POST-groups_id_chat_id_flag.test.js | 10 +- .../chat/POST-groups_id_chat_id_like.test.js | 8 +- test/api/v2/user/DELETE-user.test.js | 24 ++-- test/helpers/api-integration.helper.js | 130 +----------------- .../api-integration/v2/object-generators.js | 109 +++++++++++++++ 14 files changed, 158 insertions(+), 166 deletions(-) create mode 100644 test/helpers/api-integration/v2/object-generators.js diff --git a/test/api/v2/groups/GET-groups.test.js b/test/api/v2/groups/GET-groups.test.js index 0bf191acfb..9661115726 100644 --- a/test/api/v2/groups/GET-groups.test.js +++ b/test/api/v2/groups/GET-groups.test.js @@ -22,6 +22,7 @@ describe('GET /groups', () => { name: 'public guild - is member', type: 'guild', privacy: 'public', + }, { members: [leader._id, user._id], }); @@ -35,6 +36,7 @@ describe('GET /groups', () => { name: 'private guild - is member', type: 'guild', privacy: 'private', + }, { members: [leader._id, user._id], }); diff --git a/test/api/v2/groups/GET-groups_id.test.js b/test/api/v2/groups/GET-groups_id.test.js index 54ce590222..2d23219737 100644 --- a/test/api/v2/groups/GET-groups_id.test.js +++ b/test/api/v2/groups/GET-groups_id.test.js @@ -24,7 +24,7 @@ describe('GET /groups/:id', () => { groupDetails, }); - leader = groupData.leader; + leader = groupData.groupLeader; member = groupData.members[0]; createdGroup = groupData.group; }); diff --git a/test/api/v2/groups/POST-groups_id_join.test.js b/test/api/v2/groups/POST-groups_id_join.test.js index 1c21fe8a58..f553c3c8ea 100644 --- a/test/api/v2/groups/POST-groups_id_join.test.js +++ b/test/api/v2/groups/POST-groups_id_join.test.js @@ -98,7 +98,7 @@ describe('POST /groups/:id/join', () => { }, }); group = groupData.group; - await groupData.leader.post(`/groups/${group._id}/leave`); + await groupData.groupLeader.post(`/groups/${group._id}/leave`); user = await generateUser(); }); diff --git a/test/api/v2/groups/POST-groups_id_leave.test.js b/test/api/v2/groups/POST-groups_id_leave.test.js index dcfa3077f1..994b8fd0b8 100644 --- a/test/api/v2/groups/POST-groups_id_leave.test.js +++ b/test/api/v2/groups/POST-groups_id_leave.test.js @@ -48,7 +48,7 @@ describe('POST /groups/:id/leave', () => { }, }); - user = groupData.leader; + user = groupData.groupLeader; group = groupData.group; }); @@ -71,7 +71,7 @@ describe('POST /groups/:id/leave', () => { }, }); - user = groupData.leader; + user = groupData.groupLeader; group = groupData.group; }); @@ -95,7 +95,7 @@ describe('POST /groups/:id/leave', () => { }, }); - user = groupData.leader; + user = groupData.groupLeader; group = groupData.group; invitee1 = groupData.invitees[0]; invitee2 = groupData.invitees[1]; @@ -122,7 +122,7 @@ describe('POST /groups/:id/leave', () => { }, }); - user = groupData.leader; + user = groupData.groupLeader; group = groupData.group; invitee1 = groupData.invitees[0]; invitee2 = groupData.invitees[1]; diff --git a/test/api/v2/groups/POST-groups_id_removeMember.test.js b/test/api/v2/groups/POST-groups_id_removeMember.test.js index 757ac6bcba..0cd29f0455 100644 --- a/test/api/v2/groups/POST-groups_id_removeMember.test.js +++ b/test/api/v2/groups/POST-groups_id_removeMember.test.js @@ -24,7 +24,7 @@ describe('POST /groups/:id/removeMember', () => { privacy: 'public', }, }).then((res) => { - leader = res.leader; + leader = res.groupLeader; member = res.members[0]; group = res.group; }); diff --git a/test/api/v2/groups/chat/DELETE-groups_id_chat.test.js b/test/api/v2/groups/chat/DELETE-groups_id_chat.test.js index cf9f519032..c38e6c3565 100644 --- a/test/api/v2/groups/chat/DELETE-groups_id_chat.test.js +++ b/test/api/v2/groups/chat/DELETE-groups_id_chat.test.js @@ -14,7 +14,7 @@ describe('DELETE /groups/:id/chat', () => { }, }).then((res) => { group = res.group; - user = res.leader; + user = res.groupLeader; return user.post(`/groups/${group._id}/chat`, null, { message: 'Some message' }); }).then((res) => { diff --git a/test/api/v2/groups/chat/GET-groups_id_chat.test.js b/test/api/v2/groups/chat/GET-groups_id_chat.test.js index 2095d16987..b62e859c18 100644 --- a/test/api/v2/groups/chat/GET-groups_id_chat.test.js +++ b/test/api/v2/groups/chat/GET-groups_id_chat.test.js @@ -16,7 +16,7 @@ describe('GET /groups/:id/chat', () => { }); group = groupData.group; - user = groupData.leader; + user = groupData.groupLeader; member = groupData.members[0]; await member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' }); diff --git a/test/api/v2/groups/chat/POST-groups_id_chat.test.js b/test/api/v2/groups/chat/POST-groups_id_chat.test.js index 4cb2c21dfa..f02ae4e435 100644 --- a/test/api/v2/groups/chat/POST-groups_id_chat.test.js +++ b/test/api/v2/groups/chat/POST-groups_id_chat.test.js @@ -14,7 +14,7 @@ describe('POST /groups/:id/chat', () => { }, }).then((res) => { group = res.group; - user = res.leader; + user = res.groupLeader; }); }); diff --git a/test/api/v2/groups/chat/POST-groups_id_chat_id_clearflags.test.js b/test/api/v2/groups/chat/POST-groups_id_chat_id_clearflags.test.js index 8a84fa300c..5ab1893afe 100644 --- a/test/api/v2/groups/chat/POST-groups_id_chat_id_clearflags.test.js +++ b/test/api/v2/groups/chat/POST-groups_id_chat_id_clearflags.test.js @@ -5,24 +5,23 @@ import { } from '../../../../helpers/api-integration.helper'; describe('POST /groups/:id/chat/:id/clearflags', () => { - let group; + let guild; beforeEach(async () => { - return createAndPopulateGroup({ + let { group } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'public', members: 1, - flagCount: 1, chat: [{ id: 'message-to-clear', flagCount: 1, flags: { 'some-id': true }, }], }, - }).then((res) => { - group = res.group; }); + + guild = group; }); context('non admin', () => { @@ -33,7 +32,7 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { }); it('cannot clear flags', async () => { - return expect(nonadmin.post(`/groups/${group._id}/chat/message-to-clear/clearflags`)) + return expect(nonadmin.post(`/groups/${guild._id}/chat/message-to-clear/clearflags`)) .to.eventually.be.rejected.and.eql({ code: 401, text: t('messageGroupChatAdminClearFlagCount'), @@ -53,23 +52,23 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { }); it('clears flags', async () => { - return admin.post(`/groups/${group._id}/chat/message-to-clear/clearflags`).then(() => { - return admin.get(`/groups/${group._id}/chat`); + return admin.post(`/groups/${guild._id}/chat/message-to-clear/clearflags`).then(() => { + return admin.get(`/groups/${guild._id}/chat`); }).then((messages) => { expect(messages[0].flagCount).to.eql(0); }); }); it('leaves old flags on the flag object', async () => { - return admin.post(`/groups/${group._id}/chat/message-to-clear/clearflags`).then(() => { - return admin.get(`/groups/${group._id}/chat`); + return admin.post(`/groups/${guild._id}/chat/message-to-clear/clearflags`).then(() => { + return admin.get(`/groups/${guild._id}/chat`); }).then((messages) => { expect(messages[0].flags).to.have.property('some-id', true); }); }); it('returns error if message does not exist', async () => { - return expect(admin.post(`/groups/${group._id}/chat/non-existant-message/clearflags`)) + return expect(admin.post(`/groups/${guild._id}/chat/non-existant-message/clearflags`)) .to.eventually.be.rejected.and.eql({ code: 404, text: t('messageGroupChatNotFound'), diff --git a/test/api/v2/groups/chat/POST-groups_id_chat_id_flag.test.js b/test/api/v2/groups/chat/POST-groups_id_chat_id_flag.test.js index 0f064ba6b3..febbdd9134 100644 --- a/test/api/v2/groups/chat/POST-groups_id_chat_id_flag.test.js +++ b/test/api/v2/groups/chat/POST-groups_id_chat_id_flag.test.js @@ -17,7 +17,7 @@ describe('POST /groups/:id/chat/:id/flag', () => { members: 1, }).then((res) => { group = res.group; - user = res.leader; + user = res.groupLeader; member = res.members[0]; return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' }); @@ -56,7 +56,7 @@ describe('POST /groups/:id/chat/:id/flag', () => { }, }).then((res) => { group = res.group; - user = res.leader; + user = res.groupLeader; return user.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message' }); }).then((res) => { @@ -84,7 +84,7 @@ describe('POST /groups/:id/chat/:id/flag', () => { }, }).then((res) => { group = res.group; - user = res.leader; + user = res.groupLeader; }); }); @@ -121,7 +121,7 @@ describe('POST /groups/:id/chat/:id/flag', () => { }); group = groupData.group; - user = groupData.leader; + user = groupData.groupLeader; }); it('changes only the message that is flagged', async () => { @@ -166,7 +166,7 @@ describe('POST /groups/:id/chat/:id/flag', () => { members: 1, }).then((res) => { group = res.group; - user = res.leader; + user = res.groupLeader; member = res.members[0]; return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' }); diff --git a/test/api/v2/groups/chat/POST-groups_id_chat_id_like.test.js b/test/api/v2/groups/chat/POST-groups_id_chat_id_like.test.js index cf0e5aae75..80fd1f3adb 100644 --- a/test/api/v2/groups/chat/POST-groups_id_chat_id_like.test.js +++ b/test/api/v2/groups/chat/POST-groups_id_chat_id_like.test.js @@ -17,7 +17,7 @@ describe('POST /groups/:id/chat/:id/like', () => { members: 1, }).then((res) => { group = res.group; - user = res.leader; + user = res.groupLeader; member = res.members[0]; return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' }); @@ -53,7 +53,7 @@ describe('POST /groups/:id/chat/:id/like', () => { }, }).then((res) => { group = res.group; - user = res.leader; + user = res.groupLeader; return user.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message' }); }).then((res) => { @@ -94,7 +94,7 @@ describe('POST /groups/:id/chat/:id/like', () => { }); group = groupData.group; - user = groupData.leader; + user = groupData.groupLeader; }); it('changes only the message that is liked', async () => { @@ -134,7 +134,7 @@ describe('POST /groups/:id/chat/:id/like', () => { }, }).then((res) => { group = res.group; - user = res.leader; + user = res.groupLeader; }); }); diff --git a/test/api/v2/user/DELETE-user.test.js b/test/api/v2/user/DELETE-user.test.js index 416bdcbfee..ab450715e6 100644 --- a/test/api/v2/user/DELETE-user.test.js +++ b/test/api/v2/user/DELETE-user.test.js @@ -36,28 +36,30 @@ describe('DELETE /user', () => { }); it('deletes party when user is the only member', async () => { - return expect(user.del('/user').then(() => { - return checkExistence('groups', party._id); - })).to.eventually.eql(false); + await user.del('/user'); + await expect(checkExistence('groups', party._id)).to.eventually.eql(false); }); }); context('last member of a private guild', () => { - let guild; + let guild, lastMember; beforeEach(async () => { - return generateGroup(user, { + let { + groupLeader, + group, + } = await createAndPopulateGroup({ type: 'guild', privacy: 'private', - }).then((group) => { - guild = group; }); + + guild = group; + lastMember = groupLeader; }); it('deletes guild when user is the only member', async () => { - return expect(user.del('/user').then(() => { - return checkExistence('groups', guild._id); - })).to.eventually.eql(false); + await lastMember.del('/user'); + await expect(checkExistence('groups', guild._id)).to.eventually.eql(false); }); }); @@ -74,7 +76,7 @@ describe('DELETE /user', () => { }).then((res) => { group = res.group; newLeader = res.members[0]; - oldLeader = res.leader; + oldLeader = res.groupLeader; }); }); diff --git a/test/helpers/api-integration.helper.js b/test/helpers/api-integration.helper.js index 838c5f622c..5ed81347e9 100644 --- a/test/helpers/api-integration.helper.js +++ b/test/helpers/api-integration.helper.js @@ -1,134 +1,14 @@ /* eslint-disable no-use-before-define */ -import { - each, - times, -} from 'lodash'; -import { v4 as generateUUID } from 'uuid'; - -import { ApiUser, ApiGroup } from './api-integration/api-classes'; - - // Import requester function, set it up for v2, export it import { requester } from './api-integration/requester' requester.setApiVersion('v2'); export { requester }; export { translate } from './api-integration/translate'; - export { checkExistence, resetHabiticaDB } from './api-integration/mongo'; - -// Creates a new user and returns it -// If you need the user to have specific requirements, -// such as a balance > 0, just pass in the adjustment -// to the update object. If you want to adjust a nested -// paramter, such as the number of wolf eggs the user has, -// , you can do so by passing in the full path as a string: -// { 'items.eggs.Wolf': 10 } -export async function generateUser (update = {}) { - let username = generateUUID(); - let password = 'password'; - let email = `${username}@example.com`; - - let user = await requester().post('/register', { - username, - email, - password, - confirmPassword: password, - }); - - let apiUser = new ApiUser(user); - - await apiUser.update(update); - - return apiUser; -} - -// Generates a new group. Requires a user object, which -// will will become the groups leader. Takes an update -// argument which will update group -export async function generateGroup (leader, update = {}) { - let group = await leader.post('/groups'); - let apiGroup = new ApiGroup(group); - - await apiGroup.update(update); - - return apiGroup; -} - -// This is generate group + the ability to create -// real users to populate it. The settings object -// takes in: -// members: Number - the number of group members to create. Defaults to 0. -// inivtes: Number - the number of users to create and invite to the group. Defaults to 0. -// groupDetails: Object - how to initialize the group -// leaderDetails: Object - defaults for the leader, defaults with a gem balance so the user -// can create the group -// -// Returns an object with -// members: an array of user objects that correspond to the members of the group -// invitees: an array of user objects that correspond to the invitees of the group -// leader: the leader user object -// group: the group object -export function createAndPopulateGroup (settings = {}) { - let request, leader, members, invitees, group; - - let numberOfMembers = settings.members || 0; - let numberOfInvites = settings.invites || 0; - let groupDetails = settings.groupDetails; - let leaderDetails = settings.leaderDetails || { balance: 10 }; - - let leaderPromise = generateUser(leaderDetails); - - let memberPromises = Promise.all( - times(numberOfMembers, () => { - return generateUser(); - }) - ); - - let invitePromises = Promise.all( - times(numberOfInvites, () => { - return generateUser(); - }) - ); - - return new Promise((resolve, reject) => { - return leaderPromise.then((user) => { - leader = user; - return memberPromises; - }).then((users) => { - members = users; - groupDetails.members = groupDetails.members || [leader._id]; - - each(members, (member) => { - groupDetails.members.push(member._id); - }); - - return generateGroup(leader, groupDetails); - }).then((createdGroup) => { - group = createdGroup; - return invitePromises; - }).then((users) => { - invitees = users; - - let invitationPromises = []; - - each(invitees, (invitee) => { - let invitePromise = leader.post(`/groups/${group._id}/invite`, { - uuids: [invitee._id], - }); - - invitationPromises.push(invitePromise); - }); - - return Promise.all(invitationPromises); - }).then(() => { - resolve({ - leader, - group, - members, - invitees, - }); - }).catch(reject); - }); -} +export { + generateUser, + generateGroup, + createAndPopulateGroup, +} from './api-integration/v2/object-generators'; diff --git a/test/helpers/api-integration/v2/object-generators.js b/test/helpers/api-integration/v2/object-generators.js new file mode 100644 index 0000000000..cb7715d687 --- /dev/null +++ b/test/helpers/api-integration/v2/object-generators.js @@ -0,0 +1,109 @@ +import { + each, + times, +} from 'lodash'; +import Q from 'q'; +import { v4 as generateUUID } from 'uuid'; +import { ApiUser, ApiGroup } from '../api-classes'; +import { requester } from '../requester' + +// Creates a new user and returns it +// If you need the user to have specific requirements, +// such as a balance > 0, just pass in the adjustment +// to the update object. If you want to adjust a nested +// paramter, such as the number of wolf eggs the user has, +// , you can do so by passing in the full path as a string: +// { 'items.eggs.Wolf': 10 } +export async function generateUser (update = {}) { + let username = generateUUID(); + let password = 'password'; + let email = `${username}@example.com`; + + let user = await requester().post('/register', { + username, + email, + password, + confirmPassword: password, + }); + + let apiUser = new ApiUser(user); + + await apiUser.update(update); + + return apiUser; +} + +// Generates a new group. Requires a user object, which +// will will become the groups leader. Takes a details argument +// for the initial group creation and an update argument which +// will update the group via the db +export async function generateGroup (leader, details = {}, update = {}) { + details.type = details.type || 'party'; + details.privacy = details.privacy || 'private'; + details.name = details.name || 'test group'; + + let group = await leader.post('/groups', details); + let apiGroup = new ApiGroup(group); + + await apiGroup.update(update); + + return apiGroup; +} + +// This is generate group + the ability to create +// real users to populate it. The settings object +// takes in: +// members: Number - the number of group members to create. Defaults to 0. +// inivtes: Number - the number of users to create and invite to the group. Defaults to 0. +// groupDetails: Object - how to initialize the group +// leaderDetails: Object - defaults for the leader, defaults with a gem balance so the user +// can create the group +// +// Returns an object with +// members: an array of user objects that correspond to the members of the group +// invitees: an array of user objects that correspond to the invitees of the group +// leader: the leader user object +// group: the group object +export async function createAndPopulateGroup (settings = {}) { + let numberOfMembers = settings.members || 0; + let numberOfInvites = settings.invites || 0; + let groupDetails = settings.groupDetails; + let leaderDetails = settings.leaderDetails || { balance: 10 }; + + let groupLeader = await generateUser(leaderDetails); + let group = await generateGroup(groupLeader, groupDetails); + + let members = await Q.all( + times(numberOfMembers, () => { + return generateUser(); + }) + ); + + let memberIds = members.map((member) => { + return member._id; + }); + memberIds.push(groupLeader._id); + + await group.update({ members: memberIds }); + + let invitees = await Q.all( + times(numberOfInvites, () => { + return generateUser(); + }) + ); + + let invitationPromises = invitees.map((invitee) => { + return groupLeader.post(`/groups/${group._id}/invite`, { + uuids: [invitee._id], + }); + }); + + await Q.all(invitationPromises); + + return { + groupLeader, + group, + members, + invitees, + }; + }