order-channel.e2e-spec.ts 7.6 KB

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