price-calculation-strategy.e2e-spec.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import { DefaultSearchPlugin, mergeConfig } from '@vendure/core';
  2. import { createTestEnvironment } from '@vendure/testing';
  3. import gql from 'graphql-tag';
  4. import path from 'path';
  5. import { initialData } from '../../../e2e-common/e2e-initial-data';
  6. import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
  7. import { TestPriceCalculationStrategy } from './fixtures/test-price-calculation-strategy';
  8. import { AddItemToOrder, SearchProductsShop, SinglePrice } from './graphql/generated-e2e-shop-types';
  9. import { ADD_ITEM_TO_ORDER, SEARCH_PRODUCTS_SHOP } from './graphql/shop-definitions';
  10. describe('custom PriceCalculationStrategy', () => {
  11. let variants: SearchProductsShop.Items[];
  12. const { server, adminClient, shopClient } = createTestEnvironment(
  13. mergeConfig(testConfig, {
  14. customFields: {
  15. OrderLine: [{ name: 'giftWrap', type: 'boolean' }],
  16. },
  17. orderOptions: {
  18. priceCalculationStrategy: new TestPriceCalculationStrategy(),
  19. },
  20. plugins: [DefaultSearchPlugin],
  21. }),
  22. );
  23. beforeAll(async () => {
  24. await server.init({
  25. initialData,
  26. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-full.csv'),
  27. customerCount: 3,
  28. });
  29. const { search } = await shopClient.query<SearchProductsShop.Query, SearchProductsShop.Variables>(
  30. SEARCH_PRODUCTS_SHOP,
  31. {
  32. input: { take: 3, groupByProduct: false },
  33. },
  34. );
  35. variants = search.items;
  36. }, TEST_SETUP_TIMEOUT_MS);
  37. afterAll(async () => {
  38. await server.destroy();
  39. });
  40. it('does not add surcharge', async () => {
  41. const variant0 = variants[0];
  42. const { addItemToOrder } = await shopClient.query(ADD_ITEM_TO_ORDER_CUSTOM_FIELDS, {
  43. productVariantId: variant0.productVariantId,
  44. quantity: 1,
  45. customFields: {
  46. giftWrap: false,
  47. },
  48. });
  49. expect(addItemToOrder.lines[0].unitPrice).toEqual((variant0.price as SinglePrice).value);
  50. });
  51. it('adds a surcharge', async () => {
  52. const variant0 = variants[0];
  53. const { addItemToOrder } = await shopClient.query(ADD_ITEM_TO_ORDER_CUSTOM_FIELDS, {
  54. productVariantId: variant0.productVariantId,
  55. quantity: 1,
  56. customFields: {
  57. giftWrap: true,
  58. },
  59. });
  60. const variantPrice = (variant0.price as SinglePrice).value as number;
  61. expect(addItemToOrder.lines[0].unitPrice).toEqual(variantPrice);
  62. expect(addItemToOrder.lines[1].unitPrice).toEqual(variantPrice + 500);
  63. expect(addItemToOrder.subTotalBeforeTax).toEqual(variantPrice + variantPrice + 500);
  64. });
  65. });
  66. const ADD_ITEM_TO_ORDER_CUSTOM_FIELDS = gql`
  67. mutation AddItemToOrderCustomFields(
  68. $productVariantId: ID!
  69. $quantity: Int!
  70. $customFields: OrderLineCustomFieldsInput
  71. ) {
  72. addItemToOrder(
  73. productVariantId: $productVariantId
  74. quantity: $quantity
  75. customFields: $customFields
  76. ) {
  77. ... on Order {
  78. id
  79. subTotalBeforeTax
  80. subTotal
  81. shipping
  82. total
  83. lines {
  84. id
  85. quantity
  86. unitPrice
  87. unitPriceWithTax
  88. items {
  89. unitPrice
  90. unitPriceWithTax
  91. unitPriceIncludesTax
  92. }
  93. }
  94. }
  95. }
  96. }
  97. `;