order-changed-price-handling.e2e-spec.ts 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /* eslint-disable @typescript-eslint/no-non-null-assertion */
  2. import {
  3. ChangedPriceHandlingStrategy,
  4. mergeConfig,
  5. OrderLine,
  6. PriceCalculationResult,
  7. RequestContext,
  8. } from '@vendure/core';
  9. import { createTestEnvironment } from '@vendure/testing';
  10. import path from 'path';
  11. import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest';
  12. import { initialData } from '../../../e2e-common/e2e-initial-data';
  13. import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
  14. import { updateProductVariantsDocument } from './graphql/shared-definitions';
  15. import {
  16. addItemToOrderDocument,
  17. adjustItemQuantityDocument,
  18. getActiveOrderDocument,
  19. } from './graphql/shop-definitions';
  20. class TestChangedPriceStrategy implements ChangedPriceHandlingStrategy {
  21. static spy = vi.fn();
  22. static useLatestPrice = true;
  23. handlePriceChange(
  24. ctx: RequestContext,
  25. current: PriceCalculationResult,
  26. orderLine: OrderLine,
  27. ): PriceCalculationResult {
  28. TestChangedPriceStrategy.spy(current);
  29. if (TestChangedPriceStrategy.useLatestPrice) {
  30. return current;
  31. } else {
  32. return {
  33. price: orderLine.listPrice,
  34. priceIncludesTax: orderLine.listPriceIncludesTax,
  35. };
  36. }
  37. }
  38. }
  39. describe('ChangedPriceHandlingStrategy', () => {
  40. const { server, shopClient, adminClient } = createTestEnvironment(
  41. mergeConfig(testConfig(), {
  42. orderOptions: {
  43. changedPriceHandlingStrategy: new TestChangedPriceStrategy(),
  44. },
  45. }),
  46. );
  47. beforeAll(async () => {
  48. await server.init({
  49. initialData,
  50. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-full.csv'),
  51. customerCount: 1,
  52. });
  53. await adminClient.asSuperAdmin();
  54. }, TEST_SETUP_TIMEOUT_MS);
  55. afterAll(async () => {
  56. await server.destroy();
  57. });
  58. it('unitPriceChangeSinceAdded starts as 0', async () => {
  59. TestChangedPriceStrategy.spy.mockClear();
  60. await shopClient.query(addItemToOrderDocument, {
  61. productVariantId: 'T_12',
  62. quantity: 1,
  63. });
  64. const { activeOrder } = await shopClient.query(getActiveOrderDocument);
  65. expect(activeOrder?.lines[0].unitPriceChangeSinceAdded).toBe(0);
  66. expect(activeOrder?.lines[0].unitPrice).toBe(5374);
  67. expect(TestChangedPriceStrategy.spy).not.toHaveBeenCalled();
  68. });
  69. describe('use latest price', () => {
  70. let firstOrderLineId: string;
  71. beforeAll(() => {
  72. TestChangedPriceStrategy.useLatestPrice = true;
  73. });
  74. it('calls handlePriceChange on addItemToOrder', async () => {
  75. TestChangedPriceStrategy.spy.mockClear();
  76. await adminClient.query(updateProductVariantsDocument, {
  77. input: [
  78. {
  79. id: 'T_12',
  80. price: 6000,
  81. },
  82. ],
  83. });
  84. await shopClient.query(addItemToOrderDocument, {
  85. productVariantId: 'T_12',
  86. quantity: 1,
  87. });
  88. const { activeOrder } = await shopClient.query(getActiveOrderDocument);
  89. expect(activeOrder?.lines[0].unitPriceChangeSinceAdded).toBe(626);
  90. expect(activeOrder?.lines[0].unitPrice).toBe(6000);
  91. expect(TestChangedPriceStrategy.spy).toHaveBeenCalledTimes(1);
  92. firstOrderLineId = activeOrder!.lines[0].id;
  93. });
  94. it('calls handlePriceChange on adjustOrderLine', async () => {
  95. TestChangedPriceStrategy.spy.mockClear();
  96. await adminClient.query(updateProductVariantsDocument, {
  97. input: [
  98. {
  99. id: 'T_12',
  100. price: 3000,
  101. },
  102. ],
  103. });
  104. await shopClient.query(adjustItemQuantityDocument, {
  105. orderLineId: firstOrderLineId,
  106. quantity: 3,
  107. });
  108. const { activeOrder } = await shopClient.query(getActiveOrderDocument);
  109. expect(activeOrder?.lines[0].unitPriceChangeSinceAdded).toBe(-2374);
  110. expect(activeOrder?.lines[0].unitPrice).toBe(3000);
  111. expect(TestChangedPriceStrategy.spy).toHaveBeenCalledTimes(1);
  112. });
  113. });
  114. describe('use original price', () => {
  115. let secondOrderLineId: string;
  116. const ORIGINAL_PRICE = 7896;
  117. beforeAll(() => {
  118. TestChangedPriceStrategy.useLatestPrice = false;
  119. });
  120. it('calls handlePriceChange on addItemToOrder', async () => {
  121. TestChangedPriceStrategy.spy.mockClear();
  122. await shopClient.query(addItemToOrderDocument, {
  123. productVariantId: 'T_13',
  124. quantity: 1,
  125. });
  126. await adminClient.query(updateProductVariantsDocument, {
  127. input: [
  128. {
  129. id: 'T_13',
  130. price: 8000,
  131. },
  132. ],
  133. });
  134. await shopClient.query(addItemToOrderDocument, {
  135. productVariantId: 'T_13',
  136. quantity: 1,
  137. });
  138. const { activeOrder } = await shopClient.query(getActiveOrderDocument);
  139. expect(activeOrder?.lines[1].unitPriceChangeSinceAdded).toBe(0);
  140. expect(activeOrder?.lines[1].unitPrice).toBe(ORIGINAL_PRICE);
  141. expect(TestChangedPriceStrategy.spy).toHaveBeenCalledTimes(1);
  142. secondOrderLineId = activeOrder!.lines[1].id;
  143. });
  144. it('calls handlePriceChange on adjustOrderLine', async () => {
  145. TestChangedPriceStrategy.spy.mockClear();
  146. await adminClient.query(updateProductVariantsDocument, {
  147. input: [
  148. {
  149. id: 'T_13',
  150. price: 3000,
  151. },
  152. ],
  153. });
  154. await shopClient.query(adjustItemQuantityDocument, {
  155. orderLineId: secondOrderLineId,
  156. quantity: 3,
  157. });
  158. const { activeOrder } = await shopClient.query(getActiveOrderDocument);
  159. expect(activeOrder?.lines[1].unitPriceChangeSinceAdded).toBe(0);
  160. expect(activeOrder?.lines[1].unitPrice).toBe(ORIGINAL_PRICE);
  161. expect(TestChangedPriceStrategy.spy).toHaveBeenCalledTimes(1);
  162. });
  163. });
  164. });