zone.e2e-spec.ts 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import { DeletionResult } from '@vendure/common/lib/generated-types';
  2. import { createTestEnvironment } from '@vendure/testing';
  3. import path from 'path';
  4. import { afterAll, beforeAll, describe, expect, it } from 'vitest';
  5. import { initialData } from '../../../e2e-common/e2e-initial-data';
  6. import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
  7. import { ResultOf } from './graphql/graphql-admin';
  8. import {
  9. addMembersToZoneDocument,
  10. createZoneDocument,
  11. deleteZoneDocument,
  12. getActiveChannelWithZoneMembersDocument,
  13. getCountryListDocument,
  14. getZoneDocument,
  15. getZonesDocument,
  16. removeMembersFromZoneDocument,
  17. updateChannelDocument,
  18. updateZoneDocument,
  19. } from './graphql/shared-definitions';
  20. /* eslint-disable @typescript-eslint/no-non-null-assertion */
  21. describe('Zone resolver', () => {
  22. const { server, adminClient } = createTestEnvironment(testConfig());
  23. let countries: ResultOf<typeof getCountryListDocument>['countries']['items'];
  24. let zones: Array<{ id: string; name: string }>;
  25. let oceania: { id: string; name: string };
  26. let pangaea: ResultOf<typeof createZoneDocument>['createZone'];
  27. beforeAll(async () => {
  28. await server.init({
  29. initialData,
  30. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-minimal.csv'),
  31. customerCount: 1,
  32. });
  33. await adminClient.asSuperAdmin();
  34. const result = await adminClient.query(getCountryListDocument, {});
  35. countries = result.countries.items;
  36. }, TEST_SETUP_TIMEOUT_MS);
  37. afterAll(async () => {
  38. await server.destroy();
  39. });
  40. it('zones', async () => {
  41. const result = await adminClient.query(getZonesDocument);
  42. expect(result.zones.items.length).toBe(5);
  43. zones = result.zones.items;
  44. oceania = zones[0];
  45. });
  46. it('zone', async () => {
  47. const result = await adminClient.query(getZoneDocument, {
  48. id: oceania.id,
  49. });
  50. expect(result.zone!.name).toBe('Oceania');
  51. });
  52. it('zone.members field resolver', async () => {
  53. const { activeChannel } = await adminClient.query(getActiveChannelWithZoneMembersDocument);
  54. expect(activeChannel.defaultShippingZone?.members.length).toBe(2);
  55. });
  56. it('updateZone', async () => {
  57. const result = await adminClient.query(updateZoneDocument, {
  58. input: {
  59. id: oceania.id,
  60. name: 'oceania2',
  61. },
  62. });
  63. expect(result.updateZone.name).toBe('oceania2');
  64. });
  65. it('createZone', async () => {
  66. const result = await adminClient.query(createZoneDocument, {
  67. input: {
  68. name: 'Pangaea',
  69. memberIds: [countries[0].id, countries[1].id],
  70. },
  71. });
  72. pangaea = result.createZone;
  73. expect(pangaea.name).toBe('Pangaea');
  74. expect(pangaea.members.map(m => m.name)).toEqual([countries[0].name, countries[1].name]);
  75. });
  76. it('addMembersToZone', async () => {
  77. const result = await adminClient.query(addMembersToZoneDocument, {
  78. zoneId: oceania.id,
  79. memberIds: [countries[2].id, countries[3].id],
  80. });
  81. expect(!!result.addMembersToZone.members.find(m => m.name === countries[2].name)).toBe(true);
  82. expect(!!result.addMembersToZone.members.find(m => m.name === countries[3].name)).toBe(true);
  83. });
  84. it('removeMembersFromZone', async () => {
  85. const result = await adminClient.query(removeMembersFromZoneDocument, {
  86. zoneId: oceania.id,
  87. memberIds: [countries[0].id, countries[2].id],
  88. });
  89. expect(!!result.removeMembersFromZone.members.find(m => m.name === countries[0].name)).toBe(false);
  90. expect(!!result.removeMembersFromZone.members.find(m => m.name === countries[2].name)).toBe(false);
  91. expect(!!result.removeMembersFromZone.members.find(m => m.name === countries[3].name)).toBe(true);
  92. });
  93. describe('deletion', () => {
  94. it('deletes Zone not used in any TaxRate', async () => {
  95. const result1 = await adminClient.query(deleteZoneDocument, {
  96. id: pangaea.id,
  97. });
  98. expect(result1.deleteZone).toEqual({
  99. result: DeletionResult.DELETED,
  100. message: '',
  101. });
  102. const result2 = await adminClient.query(getZonesDocument);
  103. expect(result2.zones.items.find(c => c.id === pangaea.id)).toBeUndefined();
  104. });
  105. it('does not delete Zone that is used in one or more TaxRates', async () => {
  106. const result1 = await adminClient.query(deleteZoneDocument, {
  107. id: oceania.id,
  108. });
  109. expect(result1.deleteZone).toEqual({
  110. result: DeletionResult.NOT_DELETED,
  111. message:
  112. 'The selected Zone cannot be deleted as it is used in the following ' +
  113. 'TaxRates: Standard Tax Oceania, Reduced Tax Oceania, Zero Tax Oceania',
  114. });
  115. const result2 = await adminClient.query(getZonesDocument);
  116. expect(result2.zones.items.find(c => c.id === oceania.id)).not.toBeUndefined();
  117. });
  118. it('does not delete Zone that is used as a Channel defaultTaxZone', async () => {
  119. await adminClient.query(updateChannelDocument, {
  120. input: {
  121. id: 'T_1',
  122. defaultTaxZoneId: oceania.id,
  123. },
  124. });
  125. const result1 = await adminClient.query(deleteZoneDocument, {
  126. id: oceania.id,
  127. });
  128. expect(result1.deleteZone).toEqual({
  129. result: DeletionResult.NOT_DELETED,
  130. message:
  131. 'The selected Zone cannot be deleted as it used as a default in the following Channels: ' +
  132. '__default_channel__',
  133. });
  134. const result2 = await adminClient.query(getZonesDocument);
  135. expect(result2.zones.items.find(c => c.id === oceania.id)).not.toBeUndefined();
  136. });
  137. it('does not delete Zone that is used as a Channel defaultShippingZone', async () => {
  138. await adminClient.query(updateChannelDocument, {
  139. input: {
  140. id: 'T_1',
  141. defaultTaxZoneId: 'T_1',
  142. defaultShippingZoneId: oceania.id,
  143. },
  144. });
  145. const result1 = await adminClient.query(deleteZoneDocument, {
  146. id: oceania.id,
  147. });
  148. expect(result1.deleteZone).toEqual({
  149. result: DeletionResult.NOT_DELETED,
  150. message:
  151. 'The selected Zone cannot be deleted as it used as a default in the following Channels: ' +
  152. '__default_channel__',
  153. });
  154. const result2 = await adminClient.query(getZonesDocument);
  155. expect(result2.zones.items.find(c => c.id === oceania.id)).not.toBeUndefined();
  156. });
  157. });
  158. });