zone.e2e-spec.ts 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import { createTestEnvironment } from '@vendure/testing';
  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 { ZONE_FRAGMENT } from './graphql/fragments';
  7. import {
  8. AddMembersToZone,
  9. CreateZone,
  10. DeleteZone,
  11. DeletionResult,
  12. GetActiveChannelWithZoneMembersQuery,
  13. GetCountryList,
  14. GetZone,
  15. GetZones,
  16. RemoveMembersFromZone,
  17. UpdateChannel,
  18. UpdateZone,
  19. } from './graphql/generated-e2e-admin-types';
  20. import { GET_COUNTRY_LIST, UPDATE_CHANNEL } from './graphql/shared-definitions';
  21. // tslint:disable:no-non-null-assertion
  22. describe('Zone resolver', () => {
  23. const { server, adminClient } = createTestEnvironment(testConfig());
  24. let countries: GetCountryList.Items[];
  25. let zones: Array<{ id: string; name: string }>;
  26. let oceania: { id: string; name: string };
  27. let pangaea: { id: string; name: string; members: any[] };
  28. beforeAll(async () => {
  29. await server.init({
  30. initialData,
  31. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-minimal.csv'),
  32. customerCount: 1,
  33. });
  34. await adminClient.asSuperAdmin();
  35. const result = await adminClient.query<GetCountryList.Query>(GET_COUNTRY_LIST, {});
  36. countries = result.countries.items;
  37. }, TEST_SETUP_TIMEOUT_MS);
  38. afterAll(async () => {
  39. await server.destroy();
  40. });
  41. it('zones', async () => {
  42. const result = await adminClient.query<GetZones.Query>(GET_ZONE_LIST);
  43. expect(result.zones.length).toBe(5);
  44. zones = result.zones;
  45. oceania = zones[0];
  46. });
  47. it('zone', async () => {
  48. const result = await adminClient.query<GetZone.Query, GetZone.Variables>(GET_ZONE, {
  49. id: oceania.id,
  50. });
  51. expect(result.zone!.name).toBe('Oceania');
  52. });
  53. it('zone.members field resolver', async () => {
  54. const { activeChannel } = await adminClient.query<GetActiveChannelWithZoneMembersQuery>(
  55. GET_ACTIVE_CHANNEL_WITH_ZONE_MEMBERS,
  56. );
  57. expect(activeChannel.defaultShippingZone?.members.length).toBe(2);
  58. });
  59. it('updateZone', async () => {
  60. const result = await adminClient.query<UpdateZone.Mutation, UpdateZone.Variables>(UPDATE_ZONE, {
  61. input: {
  62. id: oceania.id,
  63. name: 'oceania2',
  64. },
  65. });
  66. expect(result.updateZone.name).toBe('oceania2');
  67. });
  68. it('createZone', async () => {
  69. const result = await adminClient.query<CreateZone.Mutation, CreateZone.Variables>(CREATE_ZONE, {
  70. input: {
  71. name: 'Pangaea',
  72. memberIds: [countries[0].id, countries[1].id],
  73. },
  74. });
  75. pangaea = result.createZone;
  76. expect(pangaea.name).toBe('Pangaea');
  77. expect(pangaea.members.map(m => m.name)).toEqual([countries[0].name, countries[1].name]);
  78. });
  79. it('addMembersToZone', async () => {
  80. const result = await adminClient.query<AddMembersToZone.Mutation, AddMembersToZone.Variables>(
  81. ADD_MEMBERS_TO_ZONE,
  82. {
  83. zoneId: oceania.id,
  84. memberIds: [countries[2].id, countries[3].id],
  85. },
  86. );
  87. expect(!!result.addMembersToZone.members.find(m => m.name === countries[2].name)).toBe(true);
  88. expect(!!result.addMembersToZone.members.find(m => m.name === countries[3].name)).toBe(true);
  89. });
  90. it('removeMembersFromZone', async () => {
  91. const result = await adminClient.query<
  92. RemoveMembersFromZone.Mutation,
  93. RemoveMembersFromZone.Variables
  94. >(REMOVE_MEMBERS_FROM_ZONE, {
  95. zoneId: oceania.id,
  96. memberIds: [countries[0].id, countries[2].id],
  97. });
  98. expect(!!result.removeMembersFromZone.members.find(m => m.name === countries[0].name)).toBe(false);
  99. expect(!!result.removeMembersFromZone.members.find(m => m.name === countries[2].name)).toBe(false);
  100. expect(!!result.removeMembersFromZone.members.find(m => m.name === countries[3].name)).toBe(true);
  101. });
  102. describe('deletion', () => {
  103. it('deletes Zone not used in any TaxRate', async () => {
  104. const result1 = await adminClient.query<DeleteZone.Mutation, DeleteZone.Variables>(DELETE_ZONE, {
  105. id: pangaea.id,
  106. });
  107. expect(result1.deleteZone).toEqual({
  108. result: DeletionResult.DELETED,
  109. message: '',
  110. });
  111. const result2 = await adminClient.query<GetZones.Query>(GET_ZONE_LIST);
  112. expect(result2.zones.find(c => c.id === pangaea.id)).toBeUndefined();
  113. });
  114. it('does not delete Zone that is used in one or more TaxRates', async () => {
  115. const result1 = await adminClient.query<DeleteZone.Mutation, DeleteZone.Variables>(DELETE_ZONE, {
  116. id: oceania.id,
  117. });
  118. expect(result1.deleteZone).toEqual({
  119. result: DeletionResult.NOT_DELETED,
  120. message:
  121. 'The selected Zone cannot be deleted as it is used in the following ' +
  122. 'TaxRates: Standard Tax Oceania, Reduced Tax Oceania, Zero Tax Oceania',
  123. });
  124. const result2 = await adminClient.query<GetZones.Query>(GET_ZONE_LIST);
  125. expect(result2.zones.find(c => c.id === oceania.id)).not.toBeUndefined();
  126. });
  127. it('does not delete Zone that is used as a Channel defaultTaxZone', async () => {
  128. await adminClient.query<UpdateChannel.Mutation, UpdateChannel.Variables>(UPDATE_CHANNEL, {
  129. input: {
  130. id: 'T_1',
  131. defaultTaxZoneId: oceania.id,
  132. },
  133. });
  134. const result1 = await adminClient.query<DeleteZone.Mutation, DeleteZone.Variables>(DELETE_ZONE, {
  135. id: oceania.id,
  136. });
  137. expect(result1.deleteZone).toEqual({
  138. result: DeletionResult.NOT_DELETED,
  139. message:
  140. 'The selected Zone cannot be deleted as it used as a default in the following Channels: ' +
  141. '__default_channel__',
  142. });
  143. const result2 = await adminClient.query<GetZones.Query>(GET_ZONE_LIST);
  144. expect(result2.zones.find(c => c.id === oceania.id)).not.toBeUndefined();
  145. });
  146. it('does not delete Zone that is used as a Channel defaultShippingZone', async () => {
  147. await adminClient.query<UpdateChannel.Mutation, UpdateChannel.Variables>(UPDATE_CHANNEL, {
  148. input: {
  149. id: 'T_1',
  150. defaultTaxZoneId: 'T_1',
  151. defaultShippingZoneId: oceania.id,
  152. },
  153. });
  154. const result1 = await adminClient.query<DeleteZone.Mutation, DeleteZone.Variables>(DELETE_ZONE, {
  155. id: oceania.id,
  156. });
  157. expect(result1.deleteZone).toEqual({
  158. result: DeletionResult.NOT_DELETED,
  159. message:
  160. 'The selected Zone cannot be deleted as it used as a default in the following Channels: ' +
  161. '__default_channel__',
  162. });
  163. const result2 = await adminClient.query<GetZones.Query>(GET_ZONE_LIST);
  164. expect(result2.zones.find(c => c.id === oceania.id)).not.toBeUndefined();
  165. });
  166. });
  167. });
  168. const DELETE_ZONE = gql`
  169. mutation DeleteZone($id: ID!) {
  170. deleteZone(id: $id) {
  171. result
  172. message
  173. }
  174. }
  175. `;
  176. const GET_ZONE_LIST = gql`
  177. query GetZones {
  178. zones {
  179. id
  180. name
  181. }
  182. }
  183. `;
  184. export const GET_ZONE = gql`
  185. query GetZone($id: ID!) {
  186. zone(id: $id) {
  187. ...Zone
  188. }
  189. }
  190. ${ZONE_FRAGMENT}
  191. `;
  192. export const GET_ACTIVE_CHANNEL_WITH_ZONE_MEMBERS = gql`
  193. query GetActiveChannelWithZoneMembers {
  194. activeChannel {
  195. id
  196. defaultShippingZone {
  197. id
  198. members {
  199. name
  200. }
  201. }
  202. }
  203. }
  204. `;
  205. export const CREATE_ZONE = gql`
  206. mutation CreateZone($input: CreateZoneInput!) {
  207. createZone(input: $input) {
  208. ...Zone
  209. }
  210. }
  211. ${ZONE_FRAGMENT}
  212. `;
  213. export const UPDATE_ZONE = gql`
  214. mutation UpdateZone($input: UpdateZoneInput!) {
  215. updateZone(input: $input) {
  216. ...Zone
  217. }
  218. }
  219. ${ZONE_FRAGMENT}
  220. `;
  221. export const ADD_MEMBERS_TO_ZONE = gql`
  222. mutation AddMembersToZone($zoneId: ID!, $memberIds: [ID!]!) {
  223. addMembersToZone(zoneId: $zoneId, memberIds: $memberIds) {
  224. ...Zone
  225. }
  226. }
  227. ${ZONE_FRAGMENT}
  228. `;
  229. export const REMOVE_MEMBERS_FROM_ZONE = gql`
  230. mutation RemoveMembersFromZone($zoneId: ID!, $memberIds: [ID!]!) {
  231. removeMembersFromZone(zoneId: $zoneId, memberIds: $memberIds) {
  232. ...Zone
  233. }
  234. }
  235. ${ZONE_FRAGMENT}
  236. `;