order-channel.e2e-spec.ts 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /* tslint:disable:no-non-null-assertion */
  2. import {
  3. createErrorResultGuard,
  4. createTestEnvironment,
  5. E2E_DEFAULT_CHANNEL_TOKEN,
  6. ErrorResultGuard,
  7. } from '@vendure/testing';
  8. import path from 'path';
  9. import { initialData } from '../../../e2e-common/e2e-initial-data';
  10. import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
  11. import {
  12. AssignProductsToChannel,
  13. CreateChannel,
  14. CurrencyCode,
  15. GetCustomerList,
  16. GetOrderList,
  17. GetProductWithVariants,
  18. LanguageCode,
  19. } from './graphql/generated-e2e-admin-types';
  20. import {
  21. AddItemToOrder,
  22. GetActiveOrder,
  23. GetOrderShop,
  24. UpdatedOrderFragment,
  25. } from './graphql/generated-e2e-shop-types';
  26. import {
  27. ASSIGN_PRODUCT_TO_CHANNEL,
  28. CREATE_CHANNEL,
  29. GET_CUSTOMER_LIST,
  30. GET_ORDERS_LIST,
  31. GET_PRODUCT_WITH_VARIANTS,
  32. } from './graphql/shared-definitions';
  33. import { ADD_ITEM_TO_ORDER, GET_ACTIVE_ORDER, GET_ORDER_SHOP } from './graphql/shop-definitions';
  34. describe('Channelaware orders', () => {
  35. const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
  36. const SECOND_CHANNEL_TOKEN = 'second_channel_token';
  37. const THIRD_CHANNEL_TOKEN = 'third_channel_token';
  38. let customerUser: GetCustomerList.Items;
  39. let product1: GetProductWithVariants.Product;
  40. let product2: GetProductWithVariants.Product;
  41. let order1Id: string;
  42. let order2Id: string;
  43. beforeAll(async () => {
  44. await server.init({
  45. initialData,
  46. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-full.csv'),
  47. customerCount: 1,
  48. });
  49. await adminClient.asSuperAdmin();
  50. const { customers } = await adminClient.query<GetCustomerList.Query, GetCustomerList.Variables>(
  51. GET_CUSTOMER_LIST,
  52. {
  53. options: { take: 1 },
  54. },
  55. );
  56. customerUser = customers.items[0];
  57. await shopClient.asUserWithCredentials(customerUser.emailAddress, 'test');
  58. await adminClient.query<CreateChannel.Mutation, CreateChannel.Variables>(CREATE_CHANNEL, {
  59. input: {
  60. code: 'second-channel',
  61. token: SECOND_CHANNEL_TOKEN,
  62. defaultLanguageCode: LanguageCode.en,
  63. currencyCode: CurrencyCode.GBP,
  64. pricesIncludeTax: true,
  65. defaultShippingZoneId: 'T_1',
  66. defaultTaxZoneId: 'T_1',
  67. },
  68. });
  69. await adminClient.query<CreateChannel.Mutation, CreateChannel.Variables>(CREATE_CHANNEL, {
  70. input: {
  71. code: 'third-channel',
  72. token: THIRD_CHANNEL_TOKEN,
  73. defaultLanguageCode: LanguageCode.en,
  74. currencyCode: CurrencyCode.GBP,
  75. pricesIncludeTax: true,
  76. defaultShippingZoneId: 'T_1',
  77. defaultTaxZoneId: 'T_1',
  78. },
  79. });
  80. product1 = (
  81. await adminClient.query<GetProductWithVariants.Query, GetProductWithVariants.Variables>(
  82. GET_PRODUCT_WITH_VARIANTS,
  83. {
  84. id: 'T_1',
  85. },
  86. )
  87. ).product!;
  88. await adminClient.query<AssignProductsToChannel.Mutation, AssignProductsToChannel.Variables>(
  89. ASSIGN_PRODUCT_TO_CHANNEL,
  90. {
  91. input: {
  92. channelId: 'T_2',
  93. productIds: [product1.id],
  94. },
  95. },
  96. );
  97. product2 = (
  98. await adminClient.query<GetProductWithVariants.Query, GetProductWithVariants.Variables>(
  99. GET_PRODUCT_WITH_VARIANTS,
  100. {
  101. id: 'T_2',
  102. },
  103. )
  104. ).product!;
  105. await adminClient.query<AssignProductsToChannel.Mutation, AssignProductsToChannel.Variables>(
  106. ASSIGN_PRODUCT_TO_CHANNEL,
  107. {
  108. input: {
  109. channelId: 'T_3',
  110. productIds: [product2.id],
  111. },
  112. },
  113. );
  114. }, TEST_SETUP_TIMEOUT_MS);
  115. afterAll(async () => {
  116. await server.destroy();
  117. });
  118. const orderResultGuard: ErrorResultGuard<UpdatedOrderFragment> = createErrorResultGuard(
  119. input => !!input.lines,
  120. );
  121. it('creates order on current channel', async () => {
  122. shopClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  123. const { addItemToOrder } = await shopClient.query<AddItemToOrder.Mutation, AddItemToOrder.Variables>(
  124. ADD_ITEM_TO_ORDER,
  125. {
  126. productVariantId: product1.variants[0].id,
  127. quantity: 1,
  128. },
  129. );
  130. orderResultGuard.assertSuccess(addItemToOrder);
  131. expect(addItemToOrder!.lines.length).toBe(1);
  132. expect(addItemToOrder!.lines[0].quantity).toBe(1);
  133. expect(addItemToOrder!.lines[0].productVariant.id).toBe(product1.variants[0].id);
  134. order1Id = addItemToOrder!.id;
  135. });
  136. it('sets active order to null when switching channel', async () => {
  137. shopClient.setChannelToken(THIRD_CHANNEL_TOKEN);
  138. const result = await shopClient.query<GetActiveOrder.Query>(GET_ACTIVE_ORDER);
  139. expect(result.activeOrder).toBeNull();
  140. });
  141. it('creates new order on current channel when already active order on other channel', async () => {
  142. const { addItemToOrder } = await shopClient.query<AddItemToOrder.Mutation, AddItemToOrder.Variables>(
  143. ADD_ITEM_TO_ORDER,
  144. {
  145. productVariantId: product2.variants[0].id,
  146. quantity: 1,
  147. },
  148. );
  149. orderResultGuard.assertSuccess(addItemToOrder);
  150. expect(addItemToOrder!.lines.length).toBe(1);
  151. expect(addItemToOrder!.lines[0].quantity).toBe(1);
  152. expect(addItemToOrder!.lines[0].productVariant.id).toBe(product2.variants[0].id);
  153. order2Id = addItemToOrder!.id;
  154. });
  155. it('goes back to most recent active order when switching channel', async () => {
  156. shopClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  157. const { activeOrder } = await shopClient.query<GetActiveOrder.Query>(GET_ACTIVE_ORDER);
  158. expect(activeOrder!.id).toBe(order1Id);
  159. });
  160. it('returns null when requesting order from other channel', async () => {
  161. const result = await shopClient.query<GetOrderShop.Query>(GET_ORDER_SHOP, {
  162. id: order2Id,
  163. });
  164. expect(result!.order).toBeNull();
  165. });
  166. it('returns order when requesting order from correct channel', async () => {
  167. const result = await shopClient.query<GetOrderShop.Query>(GET_ORDER_SHOP, {
  168. id: order1Id,
  169. });
  170. expect(result.order!.id).toBe(order1Id);
  171. });
  172. it('returns all orders on default channel', async () => {
  173. adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  174. const result = await adminClient.query<GetOrderList.Query>(GET_ORDERS_LIST);
  175. expect(result.orders.items.map(o => o.id).sort()).toEqual([order1Id, order2Id]);
  176. });
  177. it('returns only channel specific orders when on other than default channel', async () => {
  178. adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  179. const result = await adminClient.query<GetOrderList.Query>(GET_ORDERS_LIST);
  180. expect(result.orders.items.map(o => o.id)).toEqual([order1Id]);
  181. });
  182. });