| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913 |
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
- import { pick } from '@vendure/common/lib/pick';
- import {
- Collection,
- CollectionService,
- CurrencyCode,
- defaultEntityDuplicators,
- EntityDuplicator,
- freeShipping,
- LanguageCode,
- mergeConfig,
- minimumOrderAmount,
- Permission,
- PermissionDefinition,
- TransactionalConnection,
- variantIdCollectionFilter,
- } from '@vendure/core';
- import { createErrorResultGuard, createTestEnvironment, ErrorResultGuard } from '@vendure/testing';
- import path from 'path';
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
- import { initialData } from '../../../e2e-common/e2e-initial-data';
- import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
- import { channelFragment, promotionFragment, roleFragment } from './graphql/fragments-admin';
- import { FragmentOf, ResultOf } from './graphql/graphql-admin';
- import {
- assignProductToChannelDocument,
- createAdministratorDocument,
- createChannelDocument,
- createCollectionDocument,
- createPromotionDocument,
- createRoleDocument,
- duplicateEntityDocument,
- getCollectionDocument,
- getCollectionsDocument,
- getEntityDuplicatorsDocument,
- getFacetWithValuesDocument,
- getProductWithVariantsDocument,
- getPromotionDocument,
- updateProductVariantsDocument,
- } from './graphql/shared-definitions';
- const customPermission = new PermissionDefinition({
- name: 'custom',
- });
- let collectionService: CollectionService;
- let connection: TransactionalConnection;
- const customCollectionDuplicator = new EntityDuplicator({
- code: 'custom-collection-duplicator',
- description: [{ languageCode: LanguageCode.en, value: 'Custom Collection Duplicator' }],
- args: {
- throwError: {
- type: 'boolean',
- defaultValue: false,
- },
- },
- forEntities: ['Collection'],
- requiresPermission: customPermission.Permission,
- init(injector) {
- collectionService = injector.get(CollectionService);
- connection = injector.get(TransactionalConnection);
- },
- duplicate: async input => {
- const { ctx, id, args } = input;
- const original = await connection.getEntityOrThrow(ctx, Collection, id, {
- relations: {
- assets: true,
- featuredAsset: true,
- },
- });
- const newCollection = await collectionService.create(ctx, {
- isPrivate: original.isPrivate,
- customFields: original.customFields,
- assetIds: original.assets.map(a => a.id),
- featuredAssetId: original.featuredAsset?.id,
- parentId: original.parentId,
- filters: original.filters.map(f => ({
- code: f.code,
- arguments: f.args,
- })),
- inheritFilters: original.inheritFilters,
- translations: original.translations.map(t => ({
- languageCode: t.languageCode,
- name: `${t.name} (copy)`,
- slug: `${t.slug}-copy`,
- description: t.description,
- customFields: t.customFields,
- })),
- });
- if (args.throwError) {
- throw new Error('Dummy error');
- }
- return newCollection;
- },
- });
- describe('Duplicating entities', () => {
- const { server, adminClient } = createTestEnvironment(
- mergeConfig(testConfig(), {
- authOptions: {
- customPermissions: [customPermission],
- },
- entityOptions: {
- entityDuplicators: [...defaultEntityDuplicators, customCollectionDuplicator],
- },
- }),
- );
- const duplicateEntityGuard: ErrorResultGuard<{ newEntityId: string }> = createErrorResultGuard(
- result => !!result.newEntityId,
- );
- const createChannelGuard: ErrorResultGuard<FragmentOf<typeof channelFragment>> = createErrorResultGuard(
- result => !!result.id,
- );
- let testRole: FragmentOf<typeof roleFragment>;
- let testAdmin: ResultOf<typeof createAdministratorDocument>['createAdministrator'];
- let newEntityId: string;
- beforeAll(async () => {
- await server.init({
- initialData,
- productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-minimal.csv'),
- customerCount: 1,
- });
- await adminClient.asSuperAdmin();
- // create a new role and Admin and sign in as that Admin
- const { createRole } = await adminClient.query(createRoleDocument, {
- input: {
- channelIds: ['T_1'],
- code: 'test-role',
- description: 'Testing custom permissions',
- permissions: [
- Permission.CreateCollection,
- Permission.UpdateCollection,
- Permission.ReadCollection,
- ],
- },
- });
- testRole = createRole;
- const { createAdministrator } = await adminClient.query(createAdministratorDocument, {
- input: {
- firstName: 'Test',
- lastName: 'Admin',
- emailAddress: 'test@admin.com',
- password: 'test',
- roleIds: [testRole.id],
- },
- });
- testAdmin = createAdministrator;
- }, TEST_SETUP_TIMEOUT_MS);
- afterAll(async () => {
- await server.destroy();
- });
- it('get entity duplicators', async () => {
- const { entityDuplicators } = await adminClient.query(getEntityDuplicatorsDocument);
- expect(entityDuplicators.find(d => d.code === 'custom-collection-duplicator')).toEqual({
- args: [
- {
- defaultValue: false,
- name: 'throwError',
- type: 'boolean',
- },
- ],
- code: 'custom-collection-duplicator',
- description: 'Custom Collection Duplicator',
- forEntities: ['Collection'],
- requiresPermission: ['custom'],
- });
- });
- it('cannot duplicate if lacking permissions', async () => {
- await adminClient.asUserWithCredentials(testAdmin.emailAddress, 'test');
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Collection',
- entityId: 'T_2',
- duplicatorInput: {
- code: 'custom-collection-duplicator',
- arguments: [
- {
- name: 'throwError',
- value: 'false',
- },
- ],
- },
- },
- });
- duplicateEntityGuard.assertErrorResult(duplicateEntity);
- expect(duplicateEntity.message).toBe('The entity could not be duplicated');
- expect(duplicateEntity.duplicationError).toBe(
- 'You do not have the required permissions to duplicate this entity',
- );
- });
- it('errors thrown in duplicator cause ErrorResult', async () => {
- await adminClient.asSuperAdmin();
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Collection',
- entityId: 'T_2',
- duplicatorInput: {
- code: 'custom-collection-duplicator',
- arguments: [
- {
- name: 'throwError',
- value: 'true',
- },
- ],
- },
- },
- });
- duplicateEntityGuard.assertErrorResult(duplicateEntity);
- expect(duplicateEntity.message).toBe('The entity could not be duplicated');
- expect(duplicateEntity.duplicationError).toBe('Dummy error');
- });
- it('errors thrown cause all DB changes to be rolled back', async () => {
- await adminClient.asSuperAdmin();
- const { collections } = await adminClient.query(getCollectionsDocument);
- expect(collections.items.length).toBe(1);
- expect(collections.items.map(i => i.name)).toEqual(['Plants']);
- });
- it('returns ID of new entity', async () => {
- await adminClient.asSuperAdmin();
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Collection',
- entityId: 'T_2',
- duplicatorInput: {
- code: 'custom-collection-duplicator',
- arguments: [
- {
- name: 'throwError',
- value: 'false',
- },
- ],
- },
- },
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- expect(duplicateEntity.newEntityId).toBeDefined();
- newEntityId = duplicateEntity.newEntityId;
- });
- it('duplicate gets created', async () => {
- const { collection } = await adminClient.query(getCollectionDocument, {
- id: newEntityId,
- });
- expect(pick(collection!, ['id', 'name', 'slug'])).toEqual({
- id: newEntityId,
- name: 'Plants (copy)',
- slug: 'plants-copy',
- });
- });
- describe('default entity duplicators', () => {
- describe('Product duplicator', () => {
- let originalProduct: NonNullable<ResultOf<typeof getProductWithVariantsDocument>['product']>;
- let originalFirstVariant: NonNullable<
- ResultOf<typeof getProductWithVariantsDocument>['product']
- >['variants'][0];
- let newProduct1Id: string;
- let newProduct2Id: string;
- beforeAll(async () => {
- await adminClient.asSuperAdmin();
- // Add asset and facet values to the first product variant
- await adminClient.query(updateProductVariantsDocument, {
- input: [
- {
- id: 'T_1',
- assetIds: ['T_1'],
- featuredAssetId: 'T_1',
- facetValueIds: ['T_1', 'T_2'],
- },
- ],
- });
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: 'T_1',
- });
- originalProduct = product!;
- originalFirstVariant = product!.variants.find(v => v.id === 'T_1')!;
- });
- it('duplicate product without variants', async () => {
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'false',
- },
- ],
- },
- },
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- newProduct1Id = duplicateEntity.newEntityId;
- expect(newProduct1Id).toBe('T_2');
- });
- it('new product has no variants', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct1Id,
- });
- expect(product?.variants.length).toBe(0);
- });
- it('is initially disabled', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct1Id,
- });
- expect(product?.enabled).toBe(false);
- });
- it('assets are duplicated', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct1Id,
- });
- expect(product?.featuredAsset).toEqual(originalProduct.featuredAsset);
- expect(product?.assets.length).toBe(1);
- expect(product?.assets).toEqual(originalProduct.assets);
- });
- it('facet values are duplicated', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct1Id,
- });
- expect(product?.facetValues).toEqual(originalProduct.facetValues);
- expect(product?.facetValues.map(fv => fv.name).sort()).toEqual(['computers', 'electronics']);
- });
- it('duplicate product with variants', async () => {
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'true',
- },
- ],
- },
- },
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- newProduct2Id = duplicateEntity.newEntityId;
- expect(newProduct2Id).toBe('T_3');
- });
- it('new product has variants', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct2Id,
- });
- expect(product?.variants.length).toBe(4);
- expect(product?.variants.length).toBe(originalProduct.variants.length);
- expect(product?.variants.map(v => v.name).sort()).toEqual(
- originalProduct.variants.map(v => v.name).sort(),
- );
- });
- it('product name is suffixed', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct2Id,
- });
- expect(product?.name).toBe('Laptop (copy)');
- });
- it('variant SKUs are suffixed', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct2Id,
- });
- expect(product?.variants.map(v => v.sku).sort()).toEqual([
- 'L2201308-copy',
- 'L2201316-copy',
- 'L2201508-copy',
- 'L2201516-copy',
- ]);
- });
- it('variant assets are preserved', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct2Id,
- });
- expect(product?.variants.find(v => v.name === originalFirstVariant.name)?.assets).toEqual(
- originalFirstVariant.assets,
- );
- expect(
- product?.variants.find(v => v.name === originalFirstVariant.name)?.featuredAsset,
- ).toEqual(originalFirstVariant.featuredAsset);
- });
- it('variant facet values are preserved', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct2Id,
- });
- expect(
- product?.variants.find(v => v.name === originalFirstVariant.name)?.facetValues.length,
- ).toBe(2);
- expect(
- product?.variants.find(v => v.name === originalFirstVariant.name)?.facetValues,
- ).toEqual(originalFirstVariant.facetValues);
- });
- it('variant stock levels are preserved', async () => {
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: newProduct2Id,
- });
- expect(product?.variants.find(v => v.name === originalFirstVariant.name)?.stockOnHand).toBe(
- 100,
- );
- });
- it('variant prices are duplicated', async () => {
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'true',
- },
- ],
- },
- },
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: duplicateEntity.newEntityId,
- });
- const variant = product?.variants.find(v => v.sku.startsWith(originalFirstVariant.sku));
- expect(variant).not.toBeUndefined();
- expect(originalFirstVariant.price).toBeGreaterThan(0);
- expect(variant!.price).toBe(originalFirstVariant.price);
- });
- it('variant prices are duplicated on a channel specific basis', async () => {
- const { createChannel } = await adminClient.query(createChannelDocument, {
- input: {
- code: 'second-channel',
- token: 'second-channel',
- defaultLanguageCode: LanguageCode.en,
- currencyCode: CurrencyCode.USD,
- pricesIncludeTax: false,
- defaultShippingZoneId: 'T_1',
- defaultTaxZoneId: 'T_1',
- },
- });
- createChannelGuard.assertSuccess(createChannel);
- await adminClient.query(assignProductToChannelDocument, {
- input: {
- channelId: createChannel.id,
- productIds: ['T_1'],
- },
- });
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: 'T_1',
- });
- const productVariant = product!.variants[0];
- adminClient.setChannelToken('second-channel');
- await adminClient.query(updateProductVariantsDocument, {
- input: [
- {
- id: productVariant.id,
- price: productVariant.price + 150,
- },
- ],
- });
- adminClient.setChannelToken('e2e-default-channel');
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'true',
- },
- ],
- },
- },
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- const { product: productWithVariantChannelNull } = await adminClient.query(
- getProductWithVariantsDocument,
- {
- id: duplicateEntity.newEntityId,
- },
- );
- const productVariantChannelNull = productWithVariantChannelNull!.variants.find(v =>
- v.sku.startsWith(productVariant.sku),
- );
- expect(productVariantChannelNull!.price).toEqual(productVariant.price);
- adminClient.setChannelToken('second-channel');
- const { duplicateEntity: duplicateEntitySecondChannel } = await adminClient.query(
- duplicateEntityDocument,
- {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'true',
- },
- ],
- },
- },
- },
- );
- duplicateEntityGuard.assertSuccess(duplicateEntitySecondChannel);
- const { product: productWithVariantChannel2 } = await adminClient.query(
- getProductWithVariantsDocument,
- {
- id: duplicateEntitySecondChannel.newEntityId,
- },
- );
- const productVariantChannel2 = productWithVariantChannel2!.variants.find(v =>
- v.sku.startsWith(productVariant.sku),
- );
- expect(productVariantChannel2!.price).toEqual(productVariant.price + 150);
- });
- it('tax categories are duplicated', async () => {
- // update existing variant with a non 1 first tax category
- // bc tax category defaults to the first available
- const { product } = await adminClient.query(getProductWithVariantsDocument, {
- id: 'T_1',
- });
- await adminClient.query(updateProductVariantsDocument, {
- input: [{ id: product!.variants[0].id, taxCategoryId: 'T_2' }],
- });
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'true',
- },
- ],
- },
- },
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- const { product: productReloaded } = await adminClient.query(getProductWithVariantsDocument, {
- id: duplicateEntity.newEntityId,
- });
- const variant = productReloaded?.variants.find(v =>
- v.sku.startsWith(product!.variants[0].sku),
- );
- expect(variant).not.toBeUndefined();
- expect(variant!.taxCategory.id).toEqual('T_2');
- });
- });
- describe('Collection duplicator', () => {
- let testCollection: ResultOf<typeof createCollectionDocument>['createCollection'];
- let duplicatedCollectionId: string;
- beforeAll(async () => {
- await adminClient.asSuperAdmin();
- const { createCollection } = await adminClient.query(createCollectionDocument, {
- input: {
- parentId: 'T_2',
- assetIds: ['T_1'],
- featuredAssetId: 'T_1',
- isPrivate: false,
- inheritFilters: false,
- translations: [
- {
- languageCode: LanguageCode.en,
- name: 'Test Collection',
- description: 'Test Collection description',
- slug: 'test-collection',
- },
- ],
- filters: [
- {
- code: variantIdCollectionFilter.code,
- arguments: [
- {
- name: 'variantIds',
- value: '["T_1"]',
- },
- {
- name: 'combineWithAnd',
- value: 'true',
- },
- ],
- },
- ],
- },
- });
- testCollection = createCollection;
- });
- it('duplicate collection', async () => {
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Collection',
- entityId: testCollection.id,
- duplicatorInput: {
- code: 'collection-duplicator',
- arguments: [],
- },
- },
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- expect(duplicateEntity.newEntityId).toBeDefined();
- duplicatedCollectionId = duplicateEntity.newEntityId;
- });
- it('collection name is suffixed', async () => {
- const { collection } = await adminClient.query(getCollectionDocument, {
- id: duplicatedCollectionId,
- });
- expect(collection?.name).toBe('Test Collection (copy)');
- });
- it('is initially private', async () => {
- const { collection } = await adminClient.query(getCollectionDocument, {
- id: duplicatedCollectionId,
- });
- expect(collection?.isPrivate).toBe(true);
- });
- it('assets are duplicated', async () => {
- const { collection } = await adminClient.query(getCollectionDocument, {
- id: duplicatedCollectionId,
- });
- expect(collection?.featuredAsset).toEqual(testCollection.featuredAsset);
- expect(collection?.assets.length).toBe(1);
- expect(collection?.assets).toEqual(testCollection.assets);
- });
- it('parentId matches', async () => {
- const { collection } = await adminClient.query(getCollectionDocument, {
- id: duplicatedCollectionId,
- });
- expect(collection?.parent?.id).toBe(testCollection.parent?.id);
- });
- it('filters are duplicated', async () => {
- const { collection } = await adminClient.query(getCollectionDocument, {
- id: duplicatedCollectionId,
- });
- expect(collection?.filters).toEqual(testCollection.filters);
- });
- });
- describe('Facet duplicator', () => {
- let newFacetId: string;
- it('duplicate facet', async () => {
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Facet',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'facet-duplicator',
- arguments: [
- {
- name: 'includeFacetValues',
- value: 'true',
- },
- ],
- },
- },
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- expect(duplicateEntity.newEntityId).toBe('T_2');
- newFacetId = duplicateEntity.newEntityId;
- });
- it('facet name is suffixed', async () => {
- const { facet } = await adminClient.query(getFacetWithValuesDocument, {
- id: newFacetId,
- });
- expect(facet?.name).toBe('category (copy)');
- });
- it('is initially private', async () => {
- const { facet } = await adminClient.query(getFacetWithValuesDocument, {
- id: newFacetId,
- });
- expect(facet?.isPrivate).toBe(true);
- });
- it('facet values are duplicated', async () => {
- const { facet } = await adminClient.query(getFacetWithValuesDocument, {
- id: newFacetId,
- });
- expect(facet?.values.map(v => v.name).sort()).toEqual([
- 'computers (copy)',
- 'electronics (copy)',
- ]);
- });
- });
- describe('Promotion duplicator', () => {
- let testPromotion: FragmentOf<typeof promotionFragment>;
- let duplicatedPromotionId: string;
- const promotionGuard: ErrorResultGuard<{ id: string }> = createErrorResultGuard(
- result => !!result.id,
- );
- beforeAll(async () => {
- await adminClient.asSuperAdmin();
- const { createPromotion } = await adminClient.query(createPromotionDocument, {
- input: {
- enabled: true,
- couponCode: 'TEST',
- perCustomerUsageLimit: 1,
- usageLimit: 100,
- startsAt: new Date().toISOString(),
- endsAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30).toISOString(),
- translations: [
- {
- name: 'Test Promotion',
- description: 'Test Promotion description',
- languageCode: LanguageCode.en,
- },
- ],
- conditions: [
- {
- code: minimumOrderAmount.code,
- arguments: [
- {
- name: 'amount',
- value: '1000',
- },
- {
- name: 'taxInclusive',
- value: 'true',
- },
- ],
- },
- ],
- actions: [
- {
- code: freeShipping.code,
- arguments: [],
- },
- ],
- },
- });
- promotionGuard.assertSuccess(createPromotion);
- testPromotion = createPromotion;
- });
- it('duplicate promotion', async () => {
- const { duplicateEntity } = await adminClient.query(duplicateEntityDocument, {
- input: {
- entityName: 'Promotion',
- entityId: testPromotion.id,
- duplicatorInput: {
- code: 'promotion-duplicator',
- arguments: [],
- },
- },
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- expect(testPromotion.id).toBe('T_1');
- expect(duplicateEntity.newEntityId).toBe('T_2');
- duplicatedPromotionId = duplicateEntity.newEntityId;
- });
- it('promotion name is suffixed', async () => {
- const { promotion } = await adminClient.query(getPromotionDocument, {
- id: duplicatedPromotionId,
- });
- expect(promotion?.name).toBe('Test Promotion (copy)');
- });
- it('is initially disabled', async () => {
- const { promotion } = await adminClient.query(getPromotionDocument, {
- id: duplicatedPromotionId,
- });
- expect(promotion?.enabled).toBe(false);
- });
- it('properties are duplicated', async () => {
- const { promotion } = await adminClient.query(getPromotionDocument, {
- id: duplicatedPromotionId,
- });
- expect(promotion?.startsAt).toBe(testPromotion.startsAt);
- expect(promotion?.endsAt).toBe(testPromotion.endsAt);
- expect(promotion?.couponCode).toBe(testPromotion.couponCode);
- expect(promotion?.perCustomerUsageLimit).toBe(testPromotion.perCustomerUsageLimit);
- expect(promotion?.usageLimit).toBe(testPromotion.usageLimit);
- });
- it('conditions are duplicated', async () => {
- const { promotion } = await adminClient.query(getPromotionDocument, {
- id: duplicatedPromotionId,
- });
- expect(promotion?.conditions).toEqual(testPromotion.conditions);
- });
- it('actions are duplicated', async () => {
- const { promotion } = await adminClient.query(getPromotionDocument, {
- id: duplicatedPromotionId,
- });
- expect(promotion?.actions).toEqual(testPromotion.actions);
- });
- });
- });
- });
|