| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- /* tslint:disable:no-non-null-assertion */
- import { createErrorResultGuard, createTestEnvironment, ErrorResultGuard } from '@vendure/testing';
- import gql from 'graphql-tag';
- import path from 'path';
- import { initialData } from '../../../e2e-common/e2e-initial-data';
- import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
- import { testSuccessfulPaymentMethod } from './fixtures/test-payment-methods';
- import { GetProductsWithVariantPrices, UpdateChannel } from './graphql/generated-e2e-admin-types';
- import {
- AddItemToOrder,
- AdjustmentType,
- GetActiveOrderWithPriceData,
- TestOrderFragmentFragment,
- UpdatedOrderFragment,
- } from './graphql/generated-e2e-shop-types';
- import { GET_PRODUCTS_WITH_VARIANT_PRICES, UPDATE_CHANNEL } from './graphql/shared-definitions';
- import { ADD_ITEM_TO_ORDER, GET_ACTIVE_ORDER_WITH_PRICE_DATA } from './graphql/shop-definitions';
- describe('Order taxes', () => {
- const { server, adminClient, shopClient } = createTestEnvironment({
- ...testConfig,
- paymentOptions: {
- paymentMethodHandlers: [testSuccessfulPaymentMethod],
- },
- });
- type OrderSuccessResult = UpdatedOrderFragment | TestOrderFragmentFragment;
- const orderResultGuard: ErrorResultGuard<OrderSuccessResult> = createErrorResultGuard<OrderSuccessResult>(
- input => !!input.lines,
- );
- let products: GetProductsWithVariantPrices.Items[];
- beforeAll(async () => {
- await server.init({
- initialData,
- productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-order-taxes.csv'),
- customerCount: 2,
- });
- await adminClient.asSuperAdmin();
- const result = await adminClient.query<GetProductsWithVariantPrices.Query>(
- GET_PRODUCTS_WITH_VARIANT_PRICES,
- );
- products = result.products.items;
- }, TEST_SETUP_TIMEOUT_MS);
- afterAll(async () => {
- await server.destroy();
- });
- describe('Channel.pricesIncludeTax = false', () => {
- beforeAll(async () => {
- await adminClient.query<UpdateChannel.Mutation, UpdateChannel.Variables>(UPDATE_CHANNEL, {
- input: {
- id: 'T_1',
- pricesIncludeTax: false,
- },
- });
- await shopClient.asAnonymousUser();
- });
- it('prices are correct', async () => {
- const variant = products[0].variants[0];
- await shopClient.query<AddItemToOrder.Mutation, AddItemToOrder.Variables>(ADD_ITEM_TO_ORDER, {
- productVariantId: variant.id,
- quantity: 2,
- });
- const { activeOrder } = await shopClient.query<GetActiveOrderWithPriceData.Query>(
- GET_ACTIVE_ORDER_WITH_PRICE_DATA,
- );
- expect(activeOrder?.total).toBe(240);
- expect(activeOrder?.totalBeforeTax).toBe(200);
- expect(activeOrder?.lines[0].taxRate).toBe(20);
- expect(activeOrder?.lines[0].linePrice).toBe(200);
- expect(activeOrder?.lines[0].lineTax).toBe(40);
- expect(activeOrder?.lines[0].linePriceWithTax).toBe(240);
- expect(activeOrder?.lines[0].unitPrice).toBe(100);
- expect(activeOrder?.lines[0].unitPriceWithTax).toBe(120);
- expect(activeOrder?.lines[0].items[0].unitPrice).toBe(100);
- expect(activeOrder?.lines[0].items[0].unitPriceWithTax).toBe(120);
- expect(activeOrder?.lines[0].items[0].taxRate).toBe(20);
- expect(activeOrder?.lines[0].adjustments).toEqual([
- {
- type: AdjustmentType.TAX,
- amount: 20,
- },
- {
- type: AdjustmentType.TAX,
- amount: 20,
- },
- ]);
- });
- });
- describe('Channel.pricesIncludeTax = true', () => {
- beforeAll(async () => {
- await adminClient.query<UpdateChannel.Mutation, UpdateChannel.Variables>(UPDATE_CHANNEL, {
- input: {
- id: 'T_1',
- pricesIncludeTax: true,
- },
- });
- await shopClient.asAnonymousUser();
- });
- it('prices are correct', async () => {
- const variant = products[0].variants[0];
- await shopClient.query<AddItemToOrder.Mutation, AddItemToOrder.Variables>(ADD_ITEM_TO_ORDER, {
- productVariantId: variant.id,
- quantity: 2,
- });
- const { activeOrder } = await shopClient.query<GetActiveOrderWithPriceData.Query>(
- GET_ACTIVE_ORDER_WITH_PRICE_DATA,
- );
- expect(activeOrder?.total).toBe(200);
- expect(activeOrder?.totalBeforeTax).toBe(166);
- expect(activeOrder?.lines[0].taxRate).toBe(20);
- expect(activeOrder?.lines[0].linePrice).toBe(166);
- expect(activeOrder?.lines[0].lineTax).toBe(34);
- expect(activeOrder?.lines[0].linePriceWithTax).toBe(200);
- expect(activeOrder?.lines[0].unitPrice).toBe(83);
- expect(activeOrder?.lines[0].unitPriceWithTax).toBe(100);
- expect(activeOrder?.lines[0].items[0].unitPrice).toBe(83);
- expect(activeOrder?.lines[0].items[0].unitPriceWithTax).toBe(100);
- expect(activeOrder?.lines[0].items[0].taxRate).toBe(20);
- expect(activeOrder?.lines[0].adjustments).toEqual([
- {
- type: AdjustmentType.TAX,
- amount: 17,
- },
- {
- type: AdjustmentType.TAX,
- amount: 17,
- },
- ]);
- });
- });
- it('taxSummary works', async () => {
- await adminClient.query<UpdateChannel.Mutation, UpdateChannel.Variables>(UPDATE_CHANNEL, {
- input: {
- id: 'T_1',
- pricesIncludeTax: false,
- },
- });
- await shopClient.asAnonymousUser();
- await shopClient.query<AddItemToOrder.Mutation, AddItemToOrder.Variables>(ADD_ITEM_TO_ORDER, {
- productVariantId: products[0].variants[0].id,
- quantity: 2,
- });
- await shopClient.query<AddItemToOrder.Mutation, AddItemToOrder.Variables>(ADD_ITEM_TO_ORDER, {
- productVariantId: products[1].variants[0].id,
- quantity: 2,
- });
- await shopClient.query<AddItemToOrder.Mutation, AddItemToOrder.Variables>(ADD_ITEM_TO_ORDER, {
- productVariantId: products[2].variants[0].id,
- quantity: 2,
- });
- const { activeOrder } = await shopClient.query<GetActiveOrderWithPriceData.Query>(
- GET_ACTIVE_ORDER_WITH_PRICE_DATA,
- );
- expect(activeOrder?.taxSummary).toEqual([
- {
- taxRate: 20,
- taxBase: 200,
- taxTotal: 40,
- },
- {
- taxRate: 10,
- taxBase: 200,
- taxTotal: 20,
- },
- {
- taxRate: 0,
- taxBase: 200,
- taxTotal: 0,
- },
- ]);
- // ensure that the summary total add up to the overall totals
- const taxSummaryBaseTotal = activeOrder!.taxSummary.reduce((total, row) => total + row.taxBase, 0);
- const taxSummaryTaxTotal = activeOrder!.taxSummary.reduce((total, row) => total + row.taxTotal, 0);
- expect(taxSummaryBaseTotal).toBe(activeOrder?.totalBeforeTax);
- expect(taxSummaryBaseTotal + taxSummaryTaxTotal).toBe(activeOrder?.total);
- });
- });
|