1
0

order-test-utils.ts 4.7 KB

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