diff --git a/integration-tests/testkit/seed.ts b/integration-tests/testkit/seed.ts index 602e98c39..53beb6c24 100644 --- a/integration-tests/testkit/seed.ts +++ b/integration-tests/testkit/seed.ts @@ -29,6 +29,7 @@ import { createMemberRole, createOrganization, createProject, + createTarget, createToken, deleteMemberRole, deleteSchema, @@ -731,6 +732,16 @@ export function initSeed() { ownerToken, ).then(r => r.expectNoGraphQLErrors()); }, + async createTarget(args?: { slug?: string; accessToken?: string }) { + return createTarget( + { + organizationSlug: orgSlug, + projectSlug: project.slug, + slug: args?.slug ?? generateUnique(), + }, + args?.accessToken ?? ownerToken, + ); + }, }; }, async inviteAndJoinMember(inviteToken: string = ownerToken) { diff --git a/integration-tests/tests/api/target/crud.spec.ts b/integration-tests/tests/api/target/crud.spec.ts index a40101995..de7eef843 100644 --- a/integration-tests/tests/api/target/crud.spec.ts +++ b/integration-tests/tests/api/target/crud.spec.ts @@ -51,7 +51,7 @@ test.concurrent( `changing a target's slug to a taken value should result in an error`, async ({ expect }) => { const { createOrg, ownerToken } = await initSeed().createOwner(); - const { createProject, organization, projects } = await createOrg(); + const { createProject, organization } = await createOrg(); const { project, targets } = await createProject(ProjectType.Single); const firstTarget = targets[0]; @@ -136,3 +136,29 @@ test.concurrent( expect(renameResult.updateTargetSlug.error?.message).toBeDefined(); }, ); + +test.concurrent('organization member user can create a target', async ({ expect }) => { + const { createOrg } = await initSeed().createOwner(); + const { ownerEmail: orgMemberEmail, ownerToken: orgMemberToken } = await initSeed().createOwner(); + const { createProject, inviteMember, joinMemberUsingCode } = await createOrg(); + const inviteMemberResult = await inviteMember(orgMemberEmail); + + if (inviteMemberResult.ok == null) { + throw new Error('Invite did not succeed' + JSON.stringify(inviteMemberResult)); + } + + const joinMemberUsingCodeResult = await joinMemberUsingCode( + inviteMemberResult.ok.code, + orgMemberToken, + ).then(r => r.expectNoGraphQLErrors()); + + expect(joinMemberUsingCodeResult.joinOrganization.__typename).toEqual('OrganizationPayload'); + + const { createTarget } = await createProject(ProjectType.Single); + + const createTargetResult = await createTarget({ + accessToken: orgMemberToken, + }).then(r => r.expectNoGraphQLErrors()); + expect(createTargetResult.createTarget.error).toEqual(null); + expect(createTargetResult.createTarget.ok).not.toBeNull(); +});