administrator.e2e-spec.ts 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. import { SUPER_ADMIN_USER_IDENTIFIER } from '@vendure/common/lib/shared-constants';
  2. import { createTestEnvironment } from '@vendure/testing';
  3. import { fail } from 'assert';
  4. import gql from 'graphql-tag';
  5. import path from 'path';
  6. import { initialData } from '../../../e2e-common/e2e-initial-data';
  7. import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
  8. import { ADMINISTRATOR_FRAGMENT } from './graphql/fragments';
  9. import {
  10. ActiveAdministrator,
  11. Administrator,
  12. CreateAdministrator,
  13. DeleteAdministrator,
  14. DeletionResult,
  15. GetAdministrator,
  16. GetAdministrators,
  17. UpdateActiveAdministrator,
  18. UpdateAdministrator,
  19. } from './graphql/generated-e2e-admin-types';
  20. import { CREATE_ADMINISTRATOR, UPDATE_ADMINISTRATOR } from './graphql/shared-definitions';
  21. import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
  22. describe('Administrator resolver', () => {
  23. const { server, adminClient } = createTestEnvironment(testConfig());
  24. let createdAdmin: Administrator.Fragment;
  25. beforeAll(async () => {
  26. await server.init({
  27. initialData,
  28. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-minimal.csv'),
  29. customerCount: 1,
  30. });
  31. await adminClient.asSuperAdmin();
  32. }, TEST_SETUP_TIMEOUT_MS);
  33. afterAll(async () => {
  34. await server.destroy();
  35. });
  36. it('administrators', async () => {
  37. const result = await adminClient.query<GetAdministrators.Query, GetAdministrators.Variables>(
  38. GET_ADMINISTRATORS,
  39. );
  40. expect(result.administrators.items.length).toBe(1);
  41. expect(result.administrators.totalItems).toBe(1);
  42. });
  43. it('createAdministrator', async () => {
  44. const result = await adminClient.query<CreateAdministrator.Mutation, CreateAdministrator.Variables>(
  45. CREATE_ADMINISTRATOR,
  46. {
  47. input: {
  48. emailAddress: 'test@test.com',
  49. firstName: 'First',
  50. lastName: 'Last',
  51. password: 'password',
  52. roleIds: ['1'],
  53. },
  54. },
  55. );
  56. createdAdmin = result.createAdministrator;
  57. expect(createdAdmin).toMatchSnapshot();
  58. });
  59. it('administrator', async () => {
  60. const result = await adminClient.query<GetAdministrator.Query, GetAdministrator.Variables>(
  61. GET_ADMINISTRATOR,
  62. {
  63. id: createdAdmin.id,
  64. },
  65. );
  66. expect(result.administrator).toEqual(createdAdmin);
  67. });
  68. it('updateAdministrator', async () => {
  69. const result = await adminClient.query<UpdateAdministrator.Mutation, UpdateAdministrator.Variables>(
  70. UPDATE_ADMINISTRATOR,
  71. {
  72. input: {
  73. id: createdAdmin.id,
  74. emailAddress: 'new-email',
  75. firstName: 'new first',
  76. lastName: 'new last',
  77. password: 'new password',
  78. roleIds: ['2'],
  79. },
  80. },
  81. );
  82. expect(result.updateAdministrator).toMatchSnapshot();
  83. });
  84. it('updateAdministrator works with partial input', async () => {
  85. const result = await adminClient.query<UpdateAdministrator.Mutation, UpdateAdministrator.Variables>(
  86. UPDATE_ADMINISTRATOR,
  87. {
  88. input: {
  89. id: createdAdmin.id,
  90. emailAddress: 'newest-email',
  91. },
  92. },
  93. );
  94. expect(result.updateAdministrator.emailAddress).toBe('newest-email');
  95. expect(result.updateAdministrator.firstName).toBe('new first');
  96. expect(result.updateAdministrator.lastName).toBe('new last');
  97. });
  98. it(
  99. 'updateAdministrator throws with invalid roleId',
  100. assertThrowsWithMessage(
  101. () =>
  102. adminClient.query<UpdateAdministrator.Mutation, UpdateAdministrator.Variables>(
  103. UPDATE_ADMINISTRATOR,
  104. {
  105. input: {
  106. id: createdAdmin.id,
  107. emailAddress: 'new-email',
  108. firstName: 'new first',
  109. lastName: 'new last',
  110. password: 'new password',
  111. roleIds: ['999'],
  112. },
  113. },
  114. ),
  115. `No Role with the id '999' could be found`,
  116. ),
  117. );
  118. it('deleteAdministrator', async () => {
  119. const { administrators: before } = await adminClient.query<
  120. GetAdministrators.Query,
  121. GetAdministrators.Variables
  122. >(GET_ADMINISTRATORS);
  123. expect(before.totalItems).toBe(2);
  124. const { deleteAdministrator } = await adminClient.query<
  125. DeleteAdministrator.Mutation,
  126. DeleteAdministrator.Variables
  127. >(DELETE_ADMINISTRATOR, {
  128. id: createdAdmin.id,
  129. });
  130. expect(deleteAdministrator.result).toBe(DeletionResult.DELETED);
  131. const { administrators: after } = await adminClient.query<
  132. GetAdministrators.Query,
  133. GetAdministrators.Variables
  134. >(GET_ADMINISTRATORS);
  135. expect(after.totalItems).toBe(1);
  136. });
  137. it('cannot delete sole SuperAdmin', async () => {
  138. const { administrators: before } = await adminClient.query<
  139. GetAdministrators.Query,
  140. GetAdministrators.Variables
  141. >(GET_ADMINISTRATORS);
  142. expect(before.totalItems).toBe(1);
  143. expect(before.items[0].emailAddress).toBe('superadmin');
  144. try {
  145. const { deleteAdministrator } = await adminClient.query<
  146. DeleteAdministrator.Mutation,
  147. DeleteAdministrator.Variables
  148. >(DELETE_ADMINISTRATOR, {
  149. id: before.items[0].id,
  150. });
  151. fail('Should have thrown');
  152. } catch (e) {
  153. expect(e.message).toBe('The sole SuperAdmin cannot be deleted');
  154. }
  155. const { administrators: after } = await adminClient.query<
  156. GetAdministrators.Query,
  157. GetAdministrators.Variables
  158. >(GET_ADMINISTRATORS);
  159. expect(after.totalItems).toBe(1);
  160. });
  161. it(
  162. 'cannot remove SuperAdmin role from sole SuperAdmin',
  163. assertThrowsWithMessage(async () => {
  164. const result = await adminClient.query<
  165. UpdateAdministrator.Mutation,
  166. UpdateAdministrator.Variables
  167. >(UPDATE_ADMINISTRATOR, {
  168. input: {
  169. id: 'T_1',
  170. roleIds: [],
  171. },
  172. });
  173. }, 'Cannot remove the SuperAdmin role from the sole SuperAdmin'),
  174. );
  175. it('cannot query a deleted Administrator', async () => {
  176. const { administrator } = await adminClient.query<GetAdministrator.Query, GetAdministrator.Variables>(
  177. GET_ADMINISTRATOR,
  178. {
  179. id: createdAdmin.id,
  180. },
  181. );
  182. expect(administrator).toBeNull();
  183. });
  184. it('activeAdministrator', async () => {
  185. await adminClient.asAnonymousUser();
  186. const { activeAdministrator: result1 } = await adminClient.query<ActiveAdministrator.Query>(
  187. GET_ACTIVE_ADMINISTRATOR,
  188. );
  189. expect(result1).toBeNull();
  190. await adminClient.asSuperAdmin();
  191. const { activeAdministrator: result2 } = await adminClient.query<ActiveAdministrator.Query>(
  192. GET_ACTIVE_ADMINISTRATOR,
  193. );
  194. expect(result2?.emailAddress).toBe(SUPER_ADMIN_USER_IDENTIFIER);
  195. });
  196. it('updateActiveAdministrator', async () => {
  197. const { updateActiveAdministrator } = await adminClient.query<
  198. UpdateActiveAdministrator.Mutation,
  199. UpdateActiveAdministrator.Variables
  200. >(UPDATE_ACTIVE_ADMINISTRATOR, {
  201. input: {
  202. firstName: 'Thomas',
  203. lastName: 'Anderson',
  204. emailAddress: 'neo@metacortex.com',
  205. },
  206. });
  207. expect(updateActiveAdministrator.firstName).toBe('Thomas');
  208. expect(updateActiveAdministrator.lastName).toBe('Anderson');
  209. const { activeAdministrator } = await adminClient.query<ActiveAdministrator.Query>(
  210. GET_ACTIVE_ADMINISTRATOR,
  211. );
  212. expect(activeAdministrator?.firstName).toBe('Thomas');
  213. expect(activeAdministrator?.user.identifier).toBe('neo@metacortex.com');
  214. });
  215. });
  216. export const GET_ADMINISTRATORS = gql`
  217. query GetAdministrators($options: AdministratorListOptions) {
  218. administrators(options: $options) {
  219. items {
  220. ...Administrator
  221. }
  222. totalItems
  223. }
  224. }
  225. ${ADMINISTRATOR_FRAGMENT}
  226. `;
  227. export const GET_ADMINISTRATOR = gql`
  228. query GetAdministrator($id: ID!) {
  229. administrator(id: $id) {
  230. ...Administrator
  231. }
  232. }
  233. ${ADMINISTRATOR_FRAGMENT}
  234. `;
  235. export const GET_ACTIVE_ADMINISTRATOR = gql`
  236. query ActiveAdministrator {
  237. activeAdministrator {
  238. ...Administrator
  239. }
  240. }
  241. ${ADMINISTRATOR_FRAGMENT}
  242. `;
  243. export const UPDATE_ACTIVE_ADMINISTRATOR = gql`
  244. mutation UpdateActiveAdministrator($input: UpdateActiveAdministratorInput!) {
  245. updateActiveAdministrator(input: $input) {
  246. ...Administrator
  247. }
  248. }
  249. ${ADMINISTRATOR_FRAGMENT}
  250. `;
  251. export const DELETE_ADMINISTRATOR = gql`
  252. mutation DeleteAdministrator($id: ID!) {
  253. deleteAdministrator(id: $id) {
  254. message
  255. result
  256. }
  257. }
  258. `;