1
0

order-item-price-calculation-strategy.e2e-spec.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import { DefaultSearchPlugin, JobQueueService, mergeConfig } from '@vendure/core';
  2. import { createTestEnvironment } from '@vendure/testing';
  3. import gql from 'graphql-tag';
  4. import path from 'path';
  5. import { afterAll, beforeAll, describe, expect, it } from 'vitest';
  6. import { initialData } from '../../../e2e-common/e2e-initial-data';
  7. import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
  8. import { TestOrderItemPriceCalculationStrategy } from './fixtures/test-order-item-price-calculation-strategy';
  9. import {
  10. AddItemToOrderMutation,
  11. AddItemToOrderMutationVariables,
  12. SearchProductsShopQuery,
  13. SearchProductsShopQueryVariables,
  14. SinglePrice,
  15. } from './graphql/generated-e2e-shop-types';
  16. import { ADD_ITEM_TO_ORDER, SEARCH_PRODUCTS_SHOP } from './graphql/shop-definitions';
  17. describe('custom OrderItemPriceCalculationStrategy', () => {
  18. let variants: SearchProductsShopQuery['search']['items'];
  19. const { server, adminClient, shopClient } = createTestEnvironment(
  20. mergeConfig(testConfig(), {
  21. customFields: {
  22. OrderLine: [{ name: 'giftWrap', type: 'boolean' }],
  23. },
  24. orderOptions: {
  25. orderItemPriceCalculationStrategy: new TestOrderItemPriceCalculationStrategy(),
  26. },
  27. plugins: [DefaultSearchPlugin],
  28. }),
  29. );
  30. beforeAll(async () => {
  31. await server.init({
  32. initialData,
  33. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-full.csv'),
  34. customerCount: 3,
  35. });
  36. const { search } = await shopClient.query<SearchProductsShopQuery, SearchProductsShopQueryVariables>(
  37. SEARCH_PRODUCTS_SHOP,
  38. {
  39. input: { take: 3, groupByProduct: false },
  40. },
  41. );
  42. variants = search.items;
  43. }, TEST_SETUP_TIMEOUT_MS);
  44. afterAll(async () => {
  45. await server.destroy();
  46. });
  47. let secondOrderLineId: string;
  48. it('does not add surcharge', async () => {
  49. const variant0 = variants[0];
  50. const { addItemToOrder } = await shopClient.query(ADD_ITEM_TO_ORDER_CUSTOM_FIELDS, {
  51. productVariantId: variant0.productVariantId,
  52. quantity: 1,
  53. customFields: {
  54. giftWrap: false,
  55. },
  56. });
  57. expect(addItemToOrder.lines[0].unitPrice).toEqual((variant0.price as SinglePrice).value);
  58. });
  59. it('adds a surcharge', async () => {
  60. const variant0 = variants[0];
  61. const { addItemToOrder } = await shopClient.query(ADD_ITEM_TO_ORDER_CUSTOM_FIELDS, {
  62. productVariantId: variant0.productVariantId,
  63. quantity: 1,
  64. customFields: {
  65. giftWrap: true,
  66. },
  67. });
  68. const variantPrice = (variant0.price as SinglePrice).value;
  69. expect(addItemToOrder.lines[0].unitPrice).toEqual(variantPrice);
  70. expect(addItemToOrder.lines[1].unitPrice).toEqual(variantPrice + 500);
  71. expect(addItemToOrder.subTotal).toEqual(variantPrice + variantPrice + 500);
  72. secondOrderLineId = addItemToOrder.lines[1].id;
  73. });
  74. it('re-calculates when customFields changes', async () => {
  75. const { adjustOrderLine } = await shopClient.query(ADJUST_ORDER_LINE_CUSTOM_FIELDS, {
  76. orderLineId: secondOrderLineId,
  77. quantity: 1,
  78. customFields: {
  79. giftWrap: false,
  80. },
  81. });
  82. const variantPrice = (variants[0].price as SinglePrice).value;
  83. expect(adjustOrderLine.lines[0].unitPrice).toEqual(variantPrice);
  84. expect(adjustOrderLine.lines[1].unitPrice).toEqual(variantPrice);
  85. expect(adjustOrderLine.subTotal).toEqual(variantPrice + variantPrice);
  86. });
  87. it('applies discount for quantity greater than 3', async () => {
  88. const { adjustOrderLine } = await shopClient.query(ADJUST_ORDER_LINE_CUSTOM_FIELDS, {
  89. orderLineId: secondOrderLineId,
  90. quantity: 4,
  91. customFields: {
  92. giftWrap: false,
  93. },
  94. });
  95. const variantPrice = (variants[0].price as SinglePrice).value;
  96. expect(adjustOrderLine.lines[1].unitPrice).toEqual(variantPrice / 2);
  97. expect(adjustOrderLine.subTotal).toEqual(variantPrice + (variantPrice / 2) * 4);
  98. });
  99. });
  100. const ORDER_WITH_LINES_AND_ITEMS_FRAGMENT = gql`
  101. fragment OrderWithLinesAndItems on Order {
  102. id
  103. subTotal
  104. subTotalWithTax
  105. shipping
  106. total
  107. totalWithTax
  108. lines {
  109. id
  110. quantity
  111. unitPrice
  112. unitPriceWithTax
  113. }
  114. }
  115. `;
  116. const ADD_ITEM_TO_ORDER_CUSTOM_FIELDS = gql`
  117. mutation AddItemToOrderCustomFields(
  118. $productVariantId: ID!
  119. $quantity: Int!
  120. $customFields: OrderLineCustomFieldsInput
  121. ) {
  122. addItemToOrder(
  123. productVariantId: $productVariantId
  124. quantity: $quantity
  125. customFields: $customFields
  126. ) {
  127. ...OrderWithLinesAndItems
  128. }
  129. }
  130. ${ORDER_WITH_LINES_AND_ITEMS_FRAGMENT}
  131. `;
  132. const ADJUST_ORDER_LINE_CUSTOM_FIELDS = gql`
  133. mutation AdjustOrderLineCustomFields(
  134. $orderLineId: ID!
  135. $quantity: Int!
  136. $customFields: OrderLineCustomFieldsInput
  137. ) {
  138. adjustOrderLine(orderLineId: $orderLineId, quantity: $quantity, customFields: $customFields) {
  139. ...OrderWithLinesAndItems
  140. }
  141. }
  142. ${ORDER_WITH_LINES_AND_ITEMS_FRAGMENT}
  143. `;