| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086 |
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
- import { pick } from '@vendure/common/lib/pick';
- import {
- Collection,
- CollectionService,
- defaultEntityDuplicators,
- EntityDuplicator,
- freeShipping,
- LanguageCode,
- mergeConfig,
- minimumOrderAmount,
- PermissionDefinition,
- TransactionalConnection,
- variantIdCollectionFilter,
- } from '@vendure/core';
- import { createErrorResultGuard, createTestEnvironment, ErrorResultGuard } from '@vendure/testing';
- import gql from 'graphql-tag';
- 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 * as Codegen from './graphql/generated-e2e-admin-types';
- import {
- AdministratorFragment,
- CreateAdministratorMutation,
- CreateAdministratorMutationVariables,
- CreateRoleMutation,
- CreateRoleMutationVariables,
- Permission,
- RoleFragment,
- } from './graphql/generated-e2e-admin-types';
- import {
- ASSIGN_PRODUCT_TO_CHANNEL,
- CREATE_ADMINISTRATOR,
- CREATE_CHANNEL,
- CREATE_COLLECTION,
- CREATE_PROMOTION,
- CREATE_ROLE,
- GET_COLLECTION,
- GET_COLLECTIONS,
- GET_FACET_WITH_VALUES,
- GET_PRODUCT_WITH_VARIANTS,
- GET_PROMOTION,
- UPDATE_PRODUCT_VARIANTS,
- } 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,
- );
- let testRole: RoleFragment;
- let testAdmin: AdministratorFragment;
- 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<CreateRoleMutation, CreateRoleMutationVariables>(
- CREATE_ROLE,
- {
- 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<
- CreateAdministratorMutation,
- CreateAdministratorMutationVariables
- >(CREATE_ADMINISTRATOR, {
- 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<Codegen.GetEntityDuplicatorsQuery>(GET_ENTITY_DUPLICATORS);
- 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<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- 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<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- 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<Codegen.GetCollectionsQuery>(GET_COLLECTIONS);
- 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<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- 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<
- Codegen.GetCollectionQuery,
- Codegen.GetCollectionQueryVariables
- >(GET_COLLECTION, {
- 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<Codegen.GetProductWithVariantsQuery['product']>;
- let originalFirstVariant: NonNullable<
- Codegen.GetProductWithVariantsQuery['product']
- >['variants'][0];
- let newProduct1Id: string;
- let newProduct2Id: string;
- beforeAll(async () => {
- await adminClient.asSuperAdmin();
- // Add asset and facet values to the first product variant
- const { updateProductVariants } = await adminClient.query<
- Codegen.UpdateProductVariantsMutation,
- Codegen.UpdateProductVariantsMutationVariables
- >(UPDATE_PRODUCT_VARIANTS, {
- input: [
- {
- id: 'T_1',
- assetIds: ['T_1'],
- featuredAssetId: 'T_1',
- facetValueIds: ['T_1', 'T_2'],
- },
- ],
- });
- const { product } = await adminClient.query<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- 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<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- id: newProduct1Id,
- });
- expect(product?.variants.length).toBe(0);
- });
- it('is initially disabled', async () => {
- const { product } = await adminClient.query<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- id: newProduct1Id,
- });
- expect(product?.enabled).toBe(false);
- });
- it('assets are duplicated', async () => {
- const { product } = await adminClient.query<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- 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<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- id: newProduct2Id,
- });
- expect(product?.name).toBe('Laptop (copy)');
- });
- it('variant SKUs are suffixed', async () => {
- const { product } = await adminClient.query<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'true',
- },
- ],
- },
- },
- });
- const { product } = await adminClient.query<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- id: duplicateEntity.newEntityId,
- });
- duplicateEntityGuard.assertSuccess(duplicateEntity);
- 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<
- Codegen.CreateChannelMutation,
- Codegen.CreateChannelMutationVariables
- >(CREATE_CHANNEL, {
- input: {
- code: 'second-channel',
- token: 'second-channel',
- defaultLanguageCode: LanguageCode.en,
- currencyCode: Codegen.CurrencyCode.USD,
- pricesIncludeTax: false,
- defaultShippingZoneId: 'T_1',
- defaultTaxZoneId: 'T_1',
- },
- });
- await adminClient.query<
- Codegen.AssignProductsToChannelMutation,
- Codegen.AssignProductsToChannelMutationVariables
- >(ASSIGN_PRODUCT_TO_CHANNEL, {
- input: {
- channelId: createChannel.id,
- productIds: ['T_1'],
- },
- });
- const { product } = await adminClient.query<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- id: 'T_1',
- });
- const productVariant = product!.variants[0];
- adminClient.setChannelToken('second-channel');
- await adminClient.query<
- Codegen.UpdateProductVariantsMutation,
- Codegen.UpdateProductVariantsMutationVariables
- >(UPDATE_PRODUCT_VARIANTS, {
- input: {
- id: productVariant.id,
- price: productVariant.price + 150,
- },
- });
- adminClient.setChannelToken('e2e-default-channel');
- const { duplicateEntity } = await adminClient.query<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'true',
- },
- ],
- },
- },
- });
- const { product: productWithVariantChannelNull } = await adminClient.query<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'true',
- },
- ],
- },
- },
- });
- const { product: productWithVariantChannel2 } = await adminClient.query<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- id: 'T_1',
- });
- const { updateProductVariants } = await adminClient.query<
- Codegen.UpdateProductVariantsMutation,
- Codegen.UpdateProductVariantsMutationVariables
- >(UPDATE_PRODUCT_VARIANTS, {
- input: [{ id: product!.variants[0].id, taxCategoryId: 'T_2' }],
- });
- const { duplicateEntity } = await adminClient.query<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- input: {
- entityName: 'Product',
- entityId: 'T_1',
- duplicatorInput: {
- code: 'product-duplicator',
- arguments: [
- {
- name: 'includeVariants',
- value: 'true',
- },
- ],
- },
- },
- });
- const { product: productReloaded } = await adminClient.query<
- Codegen.GetProductWithVariantsQuery,
- Codegen.GetProductWithVariantsQueryVariables
- >(GET_PRODUCT_WITH_VARIANTS, {
- 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: Codegen.CreateCollectionMutation['createCollection'];
- let duplicatedCollectionId: string;
- beforeAll(async () => {
- await adminClient.asSuperAdmin();
- const { createCollection } = await adminClient.query<
- Codegen.CreateCollectionMutation,
- Codegen.CreateCollectionMutationVariables
- >(CREATE_COLLECTION, {
- 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<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- 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<
- Codegen.GetCollectionQuery,
- Codegen.GetCollectionQueryVariables
- >(GET_COLLECTION, {
- id: duplicatedCollectionId,
- });
- expect(collection?.name).toBe('Test Collection (copy)');
- });
- it('is initially private', async () => {
- const { collection } = await adminClient.query<
- Codegen.GetCollectionQuery,
- Codegen.GetCollectionQueryVariables
- >(GET_COLLECTION, {
- id: duplicatedCollectionId,
- });
- expect(collection?.isPrivate).toBe(true);
- });
- it('assets are duplicated', async () => {
- const { collection } = await adminClient.query<
- Codegen.GetCollectionQuery,
- Codegen.GetCollectionQueryVariables
- >(GET_COLLECTION, {
- 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<
- Codegen.GetCollectionQuery,
- Codegen.GetCollectionQueryVariables
- >(GET_COLLECTION, {
- id: duplicatedCollectionId,
- });
- expect(collection?.parent?.id).toBe(testCollection.parent?.id);
- });
- it('filters are duplicated', async () => {
- const { collection } = await adminClient.query<
- Codegen.GetCollectionQuery,
- Codegen.GetCollectionQueryVariables
- >(GET_COLLECTION, {
- id: duplicatedCollectionId,
- });
- expect(collection?.filters).toEqual(testCollection.filters);
- });
- });
- describe('Facet duplicator', () => {
- let newFacetId: string;
- it('duplicate facet', async () => {
- const { duplicateEntity } = await adminClient.query<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- 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<
- Codegen.GetFacetWithValuesQuery,
- Codegen.GetFacetWithValuesQueryVariables
- >(GET_FACET_WITH_VALUES, {
- id: newFacetId,
- });
- expect(facet?.name).toBe('category (copy)');
- });
- it('is initially private', async () => {
- const { facet } = await adminClient.query<
- Codegen.GetFacetWithValuesQuery,
- Codegen.GetFacetWithValuesQueryVariables
- >(GET_FACET_WITH_VALUES, {
- id: newFacetId,
- });
- expect(facet?.isPrivate).toBe(true);
- });
- it('facet values are duplicated', async () => {
- const { facet } = await adminClient.query<
- Codegen.GetFacetWithValuesQuery,
- Codegen.GetFacetWithValuesQueryVariables
- >(GET_FACET_WITH_VALUES, {
- id: newFacetId,
- });
- expect(facet?.values.map(v => v.name).sort()).toEqual([
- 'computers (copy)',
- 'electronics (copy)',
- ]);
- });
- });
- describe('Promotion duplicator', () => {
- let testPromotion: Codegen.PromotionFragment;
- let duplicatedPromotionId: string;
- const promotionGuard: ErrorResultGuard<{ id: string }> = createErrorResultGuard(
- result => !!result.id,
- );
- beforeAll(async () => {
- await adminClient.asSuperAdmin();
- const { createPromotion } = await adminClient.query<
- Codegen.CreatePromotionMutation,
- Codegen.CreatePromotionMutationVariables
- >(CREATE_PROMOTION, {
- 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<
- Codegen.DuplicateEntityMutation,
- Codegen.DuplicateEntityMutationVariables
- >(DUPLICATE_ENTITY, {
- 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<
- Codegen.GetPromotionQuery,
- Codegen.GetPromotionQueryVariables
- >(GET_PROMOTION, {
- id: duplicatedPromotionId,
- });
- expect(promotion?.name).toBe('Test Promotion (copy)');
- });
- it('is initially disabled', async () => {
- const { promotion } = await adminClient.query<
- Codegen.GetPromotionQuery,
- Codegen.GetPromotionQueryVariables
- >(GET_PROMOTION, {
- id: duplicatedPromotionId,
- });
- expect(promotion?.enabled).toBe(false);
- });
- it('properties are duplicated', async () => {
- const { promotion } = await adminClient.query<
- Codegen.GetPromotionQuery,
- Codegen.GetPromotionQueryVariables
- >(GET_PROMOTION, {
- 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<
- Codegen.GetPromotionQuery,
- Codegen.GetPromotionQueryVariables
- >(GET_PROMOTION, {
- id: duplicatedPromotionId,
- });
- expect(promotion?.conditions).toEqual(testPromotion.conditions);
- });
- it('actions are duplicated', async () => {
- const { promotion } = await adminClient.query<
- Codegen.GetPromotionQuery,
- Codegen.GetPromotionQueryVariables
- >(GET_PROMOTION, {
- id: duplicatedPromotionId,
- });
- expect(promotion?.actions).toEqual(testPromotion.actions);
- });
- });
- });
- });
- const GET_ENTITY_DUPLICATORS = gql`
- query GetEntityDuplicators {
- entityDuplicators {
- code
- description
- requiresPermission
- forEntities
- args {
- name
- type
- defaultValue
- }
- }
- }
- `;
- const DUPLICATE_ENTITY = gql`
- mutation DuplicateEntity($input: DuplicateEntityInput!) {
- duplicateEntity(input: $input) {
- ... on DuplicateEntitySuccess {
- newEntityId
- }
- ... on DuplicateEntityError {
- message
- duplicationError
- }
- }
- }
- `;
|