administrator.e2e-spec.ts 9.7 KB

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