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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { DefaultSearchPlugin, mergeConfig } from '@vendure/core';
  2. import { createErrorResultGuard, createTestEnvironment, ErrorResultGuard } 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 { TestOrderItemPriceCalculationStrategy } from './fixtures/test-order-item-price-calculation-strategy';
  8. import { FragmentOf, ResultOf } from './graphql/graphql-shop';
  9. import {
  10. addItemToOrderCustomFieldsDocument,
  11. adjustOrderLineCustomFieldsDocument,
  12. orderWithLinesAndItemsFragment,
  13. searchProductsShopDocument,
  14. } from './graphql/shop-definitions';
  15. describe('custom OrderItemPriceCalculationStrategy', () => {
  16. let variants: ResultOf<typeof searchProductsShopDocument>['search']['items'];
  17. const { server, adminClient, shopClient } = createTestEnvironment(
  18. mergeConfig(testConfig(), {
  19. customFields: {
  20. OrderLine: [{ name: 'giftWrap', type: 'boolean' }],
  21. },
  22. orderOptions: {
  23. orderItemPriceCalculationStrategy: new TestOrderItemPriceCalculationStrategy(),
  24. },
  25. plugins: [DefaultSearchPlugin],
  26. }),
  27. );
  28. type OrderWithLinesAndItems = FragmentOf<typeof orderWithLinesAndItemsFragment>;
  29. const orderGuard: ErrorResultGuard<OrderWithLinesAndItems> = createErrorResultGuard(
  30. input => !!input.lines,
  31. );
  32. beforeAll(async () => {
  33. await server.init({
  34. initialData,
  35. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-full.csv'),
  36. customerCount: 3,
  37. });
  38. const { search } = await shopClient.query(searchProductsShopDocument, {
  39. input: { take: 3, groupByProduct: false },
  40. });
  41. variants = search.items;
  42. }, TEST_SETUP_TIMEOUT_MS);
  43. afterAll(async () => {
  44. await server.destroy();
  45. });
  46. let secondOrderLineId: string;
  47. it('does not add surcharge', async () => {
  48. const variant0 = variants[0];
  49. const variantPrice = 'value' in variant0.price ? variant0.price.value : variant0.price.min;
  50. const { addItemToOrder } = await shopClient.query(addItemToOrderCustomFieldsDocument, {
  51. productVariantId: variant0.productVariantId,
  52. quantity: 1,
  53. customFields: {
  54. giftWrap: false,
  55. },
  56. } as any);
  57. orderGuard.assertSuccess(addItemToOrder);
  58. expect(addItemToOrder.lines[0].unitPrice).toEqual(variantPrice);
  59. });
  60. it('adds a surcharge', async () => {
  61. const variant0 = variants[0];
  62. const variantPrice = 'value' in variant0.price ? variant0.price.value : variant0.price.min;
  63. const { addItemToOrder } = await shopClient.query(addItemToOrderCustomFieldsDocument, {
  64. productVariantId: variant0.productVariantId,
  65. quantity: 1,
  66. customFields: {
  67. giftWrap: true,
  68. },
  69. } as any);
  70. orderGuard.assertSuccess(addItemToOrder);
  71. expect(addItemToOrder.lines[0].unitPrice).toEqual(variantPrice);
  72. expect(addItemToOrder.lines[1].unitPrice).toEqual(variantPrice + 500);
  73. expect(addItemToOrder.subTotal).toEqual(variantPrice + variantPrice + 500);
  74. secondOrderLineId = addItemToOrder.lines[1].id;
  75. });
  76. it('re-calculates when customFields changes', async () => {
  77. const variantPrice = 'value' in variants[0].price ? variants[0].price.value : variants[0].price.min;
  78. const { adjustOrderLine } = await shopClient.query(adjustOrderLineCustomFieldsDocument, {
  79. orderLineId: secondOrderLineId,
  80. quantity: 1,
  81. customFields: {
  82. giftWrap: false,
  83. },
  84. } as any);
  85. orderGuard.assertSuccess(adjustOrderLine);
  86. expect(adjustOrderLine.lines[0].unitPrice).toEqual(variantPrice);
  87. expect(adjustOrderLine.lines[1].unitPrice).toEqual(variantPrice);
  88. expect(adjustOrderLine.subTotal).toEqual(variantPrice + variantPrice);
  89. });
  90. it('applies discount for quantity greater than 3', async () => {
  91. const variantPrice = 'value' in variants[0].price ? variants[0].price.value : variants[0].price.min;
  92. const { adjustOrderLine } = await shopClient.query(adjustOrderLineCustomFieldsDocument, {
  93. orderLineId: secondOrderLineId,
  94. quantity: 4,
  95. customFields: {
  96. giftWrap: false,
  97. },
  98. } as any);
  99. orderGuard.assertSuccess(adjustOrderLine);
  100. expect(adjustOrderLine.lines[1].unitPrice).toEqual(variantPrice / 2);
  101. expect(adjustOrderLine.subTotal).toEqual(variantPrice + (variantPrice / 2) * 4);
  102. });
  103. });