order-test-utils.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import { LanguageCode } from '@vendure/common/lib/generated-types';
  2. import { Omit } from '@vendure/common/lib/omit';
  3. import { ID } from '@vendure/common/lib/shared-types';
  4. import { RequestContext } from '../api/common/request-context';
  5. import { Channel } from '../entity/channel/channel.entity';
  6. import { OrderItem } from '../entity/order-item/order-item.entity';
  7. import { OrderLine } from '../entity/order-line/order-line.entity';
  8. import { Order } from '../entity/order/order.entity';
  9. import { ProductVariant } from '../entity/product-variant/product-variant.entity';
  10. import { TaxCategory } from '../entity/tax-category/tax-category.entity';
  11. import { TaxRate } from '../entity/tax-rate/tax-rate.entity';
  12. import { Zone } from '../entity/zone/zone.entity';
  13. export type SimpleLine = { productVariantId: ID; quantity: number; lineId: ID; customFields?: any };
  14. export function createOrderFromLines(simpleLines: SimpleLine[]): Order {
  15. const lines = simpleLines.map(
  16. ({ productVariantId, quantity, lineId, customFields }) =>
  17. new OrderLine({
  18. id: lineId,
  19. productVariant: new ProductVariant({ id: productVariantId }),
  20. items: Array.from({ length: quantity }).map(() => new OrderItem({})),
  21. ...(customFields ? { customFields } : {}),
  22. }),
  23. );
  24. return new Order({
  25. lines,
  26. });
  27. }
  28. export function createRequestContext(options: { pricesIncludeTax: boolean }): RequestContext {
  29. const channel = new Channel({
  30. defaultTaxZone: zoneDefault,
  31. pricesIncludeTax: options.pricesIncludeTax,
  32. });
  33. const ctx = new RequestContext({
  34. apiType: 'admin',
  35. channel,
  36. authorizedAsOwnerOnly: false,
  37. languageCode: LanguageCode.en,
  38. isAuthorized: true,
  39. session: {} as any,
  40. });
  41. return ctx;
  42. }
  43. export const taxCategoryStandard = new TaxCategory({
  44. id: 'taxCategoryStandard',
  45. name: 'Standard Tax',
  46. });
  47. export const taxCategoryReduced = new TaxCategory({
  48. id: 'taxCategoryReduced',
  49. name: 'Reduced Tax',
  50. });
  51. export const taxCategoryZero = new TaxCategory({
  52. id: 'taxCategoryZero',
  53. name: 'Zero Tax',
  54. });
  55. export const zoneDefault = new Zone({
  56. id: 'zoneDefault',
  57. name: 'Default Zone',
  58. });
  59. export const zoneOther = new Zone({
  60. id: 'zoneOther',
  61. name: 'Other Zone',
  62. });
  63. export const zoneWithNoTaxRate = new Zone({
  64. id: 'zoneWithNoTaxRate',
  65. name: 'Zone for which no TaxRate is configured',
  66. });
  67. export const taxRateDefaultStandard = new TaxRate({
  68. id: 'taxRateDefaultStandard',
  69. name: 'Default Standard',
  70. value: 20,
  71. enabled: true,
  72. zone: zoneDefault,
  73. category: taxCategoryStandard,
  74. });
  75. export const taxRateDefaultReduced = new TaxRate({
  76. id: 'taxRateDefaultReduced',
  77. name: 'Default Reduced',
  78. value: 10,
  79. enabled: true,
  80. zone: zoneDefault,
  81. category: taxCategoryReduced,
  82. });
  83. export const taxRateDefaultZero = new TaxRate({
  84. id: 'taxRateDefaultZero',
  85. name: 'Default Zero Tax',
  86. value: 0,
  87. enabled: true,
  88. zone: zoneDefault,
  89. category: taxCategoryZero,
  90. });
  91. export const taxRateOtherStandard = new TaxRate({
  92. id: 'taxRateOtherStandard',
  93. name: 'Other Standard',
  94. value: 15,
  95. enabled: true,
  96. zone: zoneOther,
  97. category: taxCategoryStandard,
  98. });
  99. export const taxRateOtherReduced = new TaxRate({
  100. id: 'taxRateOtherReduced',
  101. name: 'Other Reduced',
  102. value: 5,
  103. enabled: true,
  104. zone: zoneOther,
  105. category: taxCategoryReduced,
  106. });
  107. export class MockTaxRateService {
  108. private activeTaxRates = [
  109. taxRateDefaultStandard,
  110. taxRateDefaultReduced,
  111. taxRateDefaultZero,
  112. taxRateOtherStandard,
  113. taxRateOtherReduced,
  114. ];
  115. initTaxRates() {
  116. /* noop */
  117. }
  118. async getApplicableTaxRate(ctx: RequestContext, zone: Zone, taxCategory: TaxCategory): Promise<TaxRate> {
  119. const rate = this.activeTaxRates.find(r => r.test(zone, taxCategory));
  120. return rate || taxRateDefaultStandard;
  121. }
  122. }
  123. export function createOrder(
  124. orderConfig: Partial<Omit<Order, 'lines'>> & {
  125. ctx: RequestContext;
  126. lines: Array<{
  127. listPrice: number;
  128. taxCategory: TaxCategory;
  129. quantity: number;
  130. }>;
  131. },
  132. ): Order {
  133. const lines = orderConfig.lines.map(
  134. ({ listPrice, taxCategory, quantity }) =>
  135. new OrderLine({
  136. taxCategory,
  137. items: Array.from({ length: quantity }).map(
  138. () =>
  139. new OrderItem({
  140. listPrice,
  141. listPriceIncludesTax: orderConfig.ctx.channel.pricesIncludeTax,
  142. taxLines: [],
  143. adjustments: [],
  144. }),
  145. ),
  146. }),
  147. );
  148. return new Order({
  149. couponCodes: [],
  150. lines,
  151. shippingLines: [],
  152. surcharges: [],
  153. modifications: [],
  154. });
  155. }