custom-permissions.e2e-spec.ts 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import { mergeConfig } from '@vendure/core';
  2. import gql from 'graphql-tag';
  3. import path from 'path';
  4. import { initialData } from '../../../e2e-common/e2e-initial-data';
  5. import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
  6. import { createTestEnvironment } from '../../testing/lib/create-test-environment';
  7. import {
  8. sync,
  9. TestPluginWithCustomPermissions,
  10. wishlist,
  11. } from './fixtures/test-plugins/with-custom-permissions';
  12. import {
  13. AdministratorFragment,
  14. CreateAdministratorMutation,
  15. CreateAdministratorMutationVariables,
  16. CreateRoleMutation,
  17. CreateRoleMutationVariables,
  18. RoleFragment,
  19. UpdateRoleMutation,
  20. UpdateRoleMutationVariables,
  21. } from './graphql/generated-e2e-admin-types';
  22. import { CREATE_ADMINISTRATOR, CREATE_ROLE, UPDATE_ROLE } from './graphql/shared-definitions';
  23. import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
  24. describe('Custom permissions', () => {
  25. const { server, adminClient } = createTestEnvironment(
  26. mergeConfig(testConfig(), {
  27. plugins: [TestPluginWithCustomPermissions],
  28. }),
  29. );
  30. let testRole: RoleFragment;
  31. let testAdmin: AdministratorFragment;
  32. beforeAll(async () => {
  33. await server.init({
  34. initialData,
  35. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-minimal.csv'),
  36. customerCount: 1,
  37. });
  38. await adminClient.asSuperAdmin();
  39. // create a new role and Admin and sign in as that Admin
  40. const { createRole } = await adminClient.query<CreateRoleMutation, CreateRoleMutationVariables>(
  41. CREATE_ROLE,
  42. {
  43. input: {
  44. channelIds: ['T_1'],
  45. code: 'test-role',
  46. description: 'Testing custom permissions',
  47. permissions: [],
  48. },
  49. },
  50. );
  51. testRole = createRole;
  52. const { createAdministrator } = await adminClient.query<
  53. CreateAdministratorMutation,
  54. CreateAdministratorMutationVariables
  55. >(CREATE_ADMINISTRATOR, {
  56. input: {
  57. firstName: 'Test',
  58. lastName: 'Admin',
  59. emailAddress: 'test@admin.com',
  60. password: 'test',
  61. roleIds: [testRole.id],
  62. },
  63. });
  64. testAdmin = createAdministrator;
  65. }, TEST_SETUP_TIMEOUT_MS);
  66. afterAll(async () => {
  67. await server.destroy();
  68. });
  69. describe('superadmin has custom permissions automatically', () => {
  70. beforeAll(async () => {
  71. await adminClient.asSuperAdmin();
  72. });
  73. it('single permission', async () => {
  74. const { syncWishlist } = await adminClient.query(SYNC);
  75. expect(syncWishlist).toBe(true);
  76. });
  77. it('CRUD create permission', async () => {
  78. const { createWishlist } = await adminClient.query(CRUD_CREATE);
  79. expect(createWishlist).toBe(true);
  80. });
  81. it('CRUD read permission', async () => {
  82. // tslint:disable-next-line:no-shadowed-variable
  83. const { wishlist } = await adminClient.query(CRUD_READ);
  84. expect(wishlist).toBe(true);
  85. });
  86. it('CRUD update permission', async () => {
  87. const { updateWishlist } = await adminClient.query(CRUD_UPDATE);
  88. expect(updateWishlist).toBe(true);
  89. });
  90. it('CRUD delete permission', async () => {
  91. const { deleteWishlist } = await adminClient.query(CRUD_DELETE);
  92. expect(deleteWishlist).toBe(true);
  93. });
  94. });
  95. describe('custom permissions prevent unauthorized access', () => {
  96. beforeAll(async () => {
  97. await adminClient.asUserWithCredentials(testAdmin.emailAddress, 'test');
  98. });
  99. it(
  100. 'single permission',
  101. assertThrowsWithMessage(async () => {
  102. await adminClient.query(SYNC);
  103. }, 'You are not currently authorized to perform this action'),
  104. );
  105. it(
  106. 'CRUD create permission',
  107. assertThrowsWithMessage(async () => {
  108. await adminClient.query(CRUD_CREATE);
  109. }, 'You are not currently authorized to perform this action'),
  110. );
  111. it(
  112. 'CRUD read permission',
  113. assertThrowsWithMessage(async () => {
  114. await adminClient.query(CRUD_READ);
  115. }, 'You are not currently authorized to perform this action'),
  116. );
  117. it(
  118. 'CRUD update permission',
  119. assertThrowsWithMessage(async () => {
  120. await adminClient.query(CRUD_UPDATE);
  121. }, 'You are not currently authorized to perform this action'),
  122. );
  123. it(
  124. 'CRUD delete permission',
  125. assertThrowsWithMessage(async () => {
  126. await adminClient.query(CRUD_DELETE);
  127. }, 'You are not currently authorized to perform this action'),
  128. );
  129. });
  130. describe('adding permissions enables access', () => {
  131. beforeAll(async () => {
  132. await adminClient.asSuperAdmin();
  133. await adminClient.query<UpdateRoleMutation, UpdateRoleMutationVariables>(UPDATE_ROLE, {
  134. input: {
  135. id: testRole.id,
  136. permissions: [
  137. sync.Permission,
  138. wishlist.Create,
  139. wishlist.Read,
  140. wishlist.Update,
  141. wishlist.Delete,
  142. ],
  143. },
  144. });
  145. await adminClient.asUserWithCredentials(testAdmin.emailAddress, 'test');
  146. });
  147. it('single permission', async () => {
  148. const { syncWishlist } = await adminClient.query(SYNC);
  149. expect(syncWishlist).toBe(true);
  150. });
  151. it('CRUD create permission', async () => {
  152. const { createWishlist } = await adminClient.query(CRUD_CREATE);
  153. expect(createWishlist).toBe(true);
  154. });
  155. it('CRUD read permission', async () => {
  156. // tslint:disable-next-line:no-shadowed-variable
  157. const { wishlist } = await adminClient.query(CRUD_READ);
  158. expect(wishlist).toBe(true);
  159. });
  160. it('CRUD update permission', async () => {
  161. const { updateWishlist } = await adminClient.query(CRUD_UPDATE);
  162. expect(updateWishlist).toBe(true);
  163. });
  164. it('CRUD delete permission', async () => {
  165. const { deleteWishlist } = await adminClient.query(CRUD_DELETE);
  166. expect(deleteWishlist).toBe(true);
  167. });
  168. });
  169. });
  170. const SYNC = gql`
  171. mutation Sync {
  172. syncWishlist
  173. }
  174. `;
  175. const CRUD_READ = gql`
  176. query CrudRead {
  177. wishlist
  178. }
  179. `;
  180. const CRUD_CREATE = gql`
  181. mutation CrudCreate {
  182. createWishlist
  183. }
  184. `;
  185. const CRUD_UPDATE = gql`
  186. mutation CrudUpdate {
  187. updateWishlist
  188. }
  189. `;
  190. const CRUD_DELETE = gql`
  191. mutation CrudDelete {
  192. deleteWishlist
  193. }
  194. `;