diff --git a/graphql-types/src/generated/ctp.ts b/graphql-types/src/generated/ctp.ts index 43572cd5d..c97c3b6bd 100644 --- a/graphql-types/src/generated/ctp.ts +++ b/graphql-types/src/generated/ctp.ts @@ -9,10 +9,9 @@ type MakeOptional = Omit & { type MakeMaybe = Omit & { [SubKey in K]: Maybe; }; -type MakeEmpty< - T extends { [key: string]: unknown }, - K extends keyof T -> = { [_ in K]?: never }; +type MakeEmpty = { + [_ in K]?: never; +}; type Incremental = | T | { diff --git a/models/business-unit/src/associate/builder.spec.ts b/models/business-unit/src/associate/builder.spec.ts index b168cb728..7f25effe1 100644 --- a/models/business-unit/src/associate/builder.spec.ts +++ b/models/business-unit/src/associate/builder.spec.ts @@ -40,6 +40,10 @@ describe('builder', () => { ]), customer: expect.objectContaining({ id: expect.any(String), + typeId: 'customer', + obj: expect.objectContaining({ + id: expect.any(String), + }), }), }) ) @@ -66,10 +70,10 @@ describe('builder', () => { ]), customer: expect.objectContaining({ id: expect.any(String), - typeId: 'customer', - __typename: 'Reference', + email: expect.any(String), }), customerRef: expect.objectContaining({ + id: expect.any(String), typeId: 'customer', __typename: 'Reference', }), diff --git a/models/business-unit/src/associate/transformers.ts b/models/business-unit/src/associate/transformers.ts index b1c609f02..5fddf2f79 100644 --- a/models/business-unit/src/associate/transformers.ts +++ b/models/business-unit/src/associate/transformers.ts @@ -1,9 +1,9 @@ import { - type TReference, type TReferenceGraphql, Reference, } from '@commercetools-test-data/commons'; -import { Transformer } from '@commercetools-test-data/core'; +import { buildField, Transformer } from '@commercetools-test-data/core'; +import { Customer, TCustomerGraphql } from '@commercetools-test-data/customer'; import type { TAssociateDefault, TAssociateRest, @@ -16,26 +16,30 @@ const transformers = { }), rest: Transformer('rest', { buildFields: ['associateRoleAssignments', 'customer'], - replaceFields: ({ fields }) => { - const customer: TReference<'customer'> = Reference.presets - .customerReference() - .id(fields.customer.id) - .build(); - return { - ...fields, - customer, - }; - }, }), graphql: Transformer('graphql', { - buildFields: ['associateRoleAssignments', 'customer'], + buildFields: ['associateRoleAssignments'], replaceFields: ({ fields }) => { - const customerRef: TReferenceGraphql = Reference.presets + const restCustomerRef = buildField(fields.customer, 'rest'); + + const customerRef = Reference.presets .customerReference() - .id(fields.customer.id) - .buildGraphql(); + .id(restCustomerRef.id) + .buildGraphql(); + + const customer = Customer.random() + .id(restCustomerRef.id) + .firstName(restCustomerRef.obj?.firstName) + .lastName(restCustomerRef.obj?.lastName) + .key(restCustomerRef.obj?.key) + .customerNumber(restCustomerRef.obj?.customerNumber) + .externalId(restCustomerRef.obj?.externalId) + .email(restCustomerRef.obj?.email || '') + .buildGraphql(); + return { ...fields, + customer, customerRef, __typename: 'Associate', }; diff --git a/models/business-unit/src/associate/types.ts b/models/business-unit/src/associate/types.ts index 76019ff61..f212d84e7 100644 --- a/models/business-unit/src/associate/types.ts +++ b/models/business-unit/src/associate/types.ts @@ -1,19 +1,17 @@ -import type { - Associate, - AssociateDraft, - Customer, -} from '@commercetools/platform-sdk'; +import type { Associate, AssociateDraft } from '@commercetools/platform-sdk'; import { TReferenceGraphql } from '@commercetools-test-data/commons'; import type { TBuilder } from '@commercetools-test-data/core'; +import { TCustomerGraphql } from '@commercetools-test-data/customer'; + +export type TAssociateDefault = Associate; export type TAssociateDraft = AssociateDraft; export type TAssociateDraftGraphql = TAssociateDraft; -export type TAssociateDefault = Omit & { - customer: Customer; -}; export type TAssociateRest = Associate; -export type TAssociateGraphql = TAssociateDefault & { + +export type TAssociateGraphql = Omit & { + customer: TCustomerGraphql; customerRef: TReferenceGraphql | null; __typename: 'Associate'; }; diff --git a/models/commons/src/localized-string/helpers.ts b/models/commons/src/localized-string/helpers.ts index 989618d64..1a52f5f1b 100644 --- a/models/commons/src/localized-string/helpers.ts +++ b/models/commons/src/localized-string/helpers.ts @@ -24,7 +24,7 @@ const resolveGraphqlDefaultLocaleValue = ( const defaultLocaleName = allLocales.find( (name) => name.locale === DEFAULT_LOCALE ); - return defaultLocaleName ? defaultLocaleName.value : allLocales[0].value; + return defaultLocaleName ? defaultLocaleName.value : allLocales[0]?.value; }; export { resolveGraphqlDefaultLocaleValue, toLocalizedField }; diff --git a/models/commons/src/reference/builder.spec.ts b/models/commons/src/reference/builder.spec.ts index ef4c9a6c1..08bbcdc33 100644 --- a/models/commons/src/reference/builder.spec.ts +++ b/models/commons/src/reference/builder.spec.ts @@ -1,9 +1,32 @@ /* eslint-disable jest/no-disabled-tests */ /* eslint-disable jest/valid-title */ +import { + Builder, + fake, + Generator, + Transformer, +} from '@commercetools-test-data/core'; import { createBuilderSpec } from '@commercetools-test-data/core/test-utils'; import type { TReference, TReferenceGraphql, TReferenceRest } from './types'; import * as Reference from './index'; +// We use this dummy model in the customization tests. +// It is a simple model so we don't need to depend on other models. +const DummyModel = () => + Builder<{ id: string; name: string }>({ + generator: Generator<{ id: string; name: string }>({ + fields: { + id: fake((f) => f.string.uuid()), + name: fake((f) => f.person.fullName()), + }, + }), + transformers: { + default: Transformer('default', {}), + rest: Transformer('rest', {}), + graphql: Transformer('graphql', {}), + }, + }); + describe('builder', () => { it( ...createBuilderSpec( @@ -39,4 +62,39 @@ describe('builder', () => { } ) ); + + describe('when customizing the model', () => { + const referenceMock = Reference.random() + .typeId('dummy-type') + .obj(DummyModel().id('dummy-id').name('dummy-name')); + + it('should build the right rest model', () => { + const restReference = referenceMock.buildRest(); + + expect(restReference).toEqual( + expect.objectContaining({ + id: 'dummy-id', + typeId: 'dummy-type', + obj: { + id: 'dummy-id', + name: 'dummy-name', + }, + }) + ); + }); + it('should build the right graphql model', () => { + const graphqlReference = referenceMock.buildGraphql(); + + expect(graphqlReference).toEqual( + expect.objectContaining({ + __typename: 'Reference', + id: 'dummy-id', + typeId: 'dummy-type', + }) + ); + // @ts-expect-error "obj" is not defined in the graphql model + // but we want to make sure the built model does not include it + expect(graphqlReference.obj).toBeUndefined(); + }); + }); }); diff --git a/models/commons/src/reference/generator.ts b/models/commons/src/reference/generator.ts index bcbe91c1f..f98bcd735 100644 --- a/models/commons/src/reference/generator.ts +++ b/models/commons/src/reference/generator.ts @@ -6,6 +6,7 @@ const generator = Generator({ fields: { id: fake((f) => f.string.uuid()), typeId: null, + obj: undefined, }, }); diff --git a/models/commons/src/reference/transformers.ts b/models/commons/src/reference/transformers.ts index d585a166e..bce87f102 100644 --- a/models/commons/src/reference/transformers.ts +++ b/models/commons/src/reference/transformers.ts @@ -1,22 +1,45 @@ import { Transformer } from '@commercetools-test-data/core'; -import omit from 'lodash/omit'; -import type { TReference, TReferenceGraphql, TReferenceRest } from './types'; +import type { + TExpandedReferenceObject, + TReference, + TReferenceGraphql, + TReferenceRest, +} from './types'; const transformers = { - default: Transformer('default', {}), + default: Transformer('default', { + buildFields: ['obj'], + }), rest: Transformer('rest', { - replaceFields: ({ fields }) => ({ - ...fields, - obj: omit(fields, ['typeId']), - }), + replaceFields: ({ fields }) => { + const obj = fields.obj + ? fields.obj.buildRest() + : { + id: fields.id, + }; + + return { + ...fields, + id: obj.id, + obj, + }; + }, }), // we do not add the expanded object ourselves // since some fields are pure `*Ref`, e.g `channelsRef` // with no option to expand. graphql: Transformer('graphql', { - addFields: () => ({ - __typename: 'Reference', - }), + replaceFields: ({ fields }) => { + const id = fields.obj + ? fields.obj.buildGraphql().id + : fields.id; + + return { + id, + typeId: fields.typeId, + __typename: 'Reference', + }; + }, }), }; diff --git a/models/inventory-entry/src/types.ts b/models/inventory-entry/src/types.ts index 93a930838..0471de514 100644 --- a/models/inventory-entry/src/types.ts +++ b/models/inventory-entry/src/types.ts @@ -19,7 +19,7 @@ export type TInventoryEntry = InventoryEntry; export type TInventoryEntryDraft = InventoryEntryDraft; // REST -export type TInventoryEntryRest = InventoryEntry; +export type TInventoryEntryRest = TInventoryEntry; export type TInventoryEntryDraftRest = InventoryEntryDraft; // GraphQL diff --git a/models/payment/src/payment/builder.spec.ts b/models/payment/src/payment/builder.spec.ts index 424f82fdc..05b43ed4f 100644 --- a/models/payment/src/payment/builder.spec.ts +++ b/models/payment/src/payment/builder.spec.ts @@ -12,7 +12,8 @@ describe('builder', () => { expect.objectContaining({ key: expect.any(String), customer: expect.objectContaining({ - email: expect.any(String), + id: expect.any(String), + typeId: 'customer', }), anonymousId: expect.any(String), interfaceId: expect.any(String), @@ -69,6 +70,9 @@ describe('builder', () => { customer: expect.objectContaining({ id: expect.any(String), typeId: expect.any(String), + obj: expect.objectContaining({ + id: expect.any(String), + }), }), anonymousId: expect.any(String), interfaceId: expect.any(String), diff --git a/models/payment/src/payment/generator.ts b/models/payment/src/payment/generator.ts index ca0ce74de..2e94a24a9 100644 --- a/models/payment/src/payment/generator.ts +++ b/models/payment/src/payment/generator.ts @@ -1,6 +1,8 @@ -import { CentPrecisionMoney } from '@commercetools-test-data/commons'; +import { + CentPrecisionMoney, + Reference, +} from '@commercetools-test-data/commons'; import { fake, Generator, sequence } from '@commercetools-test-data/core'; -import { Customer } from '@commercetools-test-data/customer'; import { createRelatedDates } from '@commercetools-test-data/utils'; import * as PaymentMethodInfo from '../payment-method-info'; import * as PaymentStatus from '../payment-status'; @@ -16,7 +18,7 @@ const generator = Generator({ id: fake((f) => f.string.uuid()), version: sequence(), key: fake((f) => f.string.uuid()), - customer: fake((f) => Customer.random()), + customer: fake((f) => Reference.presets.customerReference()), anonymousId: fake((f) => f.string.uuid()), interfaceId: fake((f) => f.string.uuid()), amountPlanned: fake((f) => CentPrecisionMoney.random()), diff --git a/models/payment/src/payment/transformers.ts b/models/payment/src/payment/transformers.ts index 844327a35..1121ef9dc 100644 --- a/models/payment/src/payment/transformers.ts +++ b/models/payment/src/payment/transformers.ts @@ -1,12 +1,10 @@ -import { - Reference, - TReference, - TReferenceGraphql, -} from '@commercetools-test-data/commons'; +import { Reference, TReferenceGraphql } from '@commercetools-test-data/commons'; import { Transformer, + buildField, toGraphqlPaginatedQueryResult, } from '@commercetools-test-data/core'; +import { Customer, TCustomerGraphql } from '@commercetools-test-data/customer'; import type { TPayment, TPaymentGraphql, TPaymentRest } from './types'; const transformers = { @@ -31,20 +29,9 @@ const transformers = { 'interfaceInteractions', 'custom', ], - replaceFields: ({ fields }) => { - const customer = Reference.presets - .customerReference() - .id(fields.customer.id) - .build>(); - return { - ...fields, - customer, - }; - }, }), graphql: Transformer('graphql', { buildFields: [ - 'customer', 'amountPlanned', 'paymentMethodInfo', 'paymentStatus', @@ -52,10 +39,29 @@ const transformers = { 'custom', ], replaceFields: ({ fields }) => { - const customerRef: TReferenceGraphql = Reference.presets - .customerReference() - .id(fields.customer.id) - .buildGraphql(); + let customer: TCustomerGraphql | undefined = undefined; + let customerRef: TReferenceGraphql | undefined = undefined; + + if (fields.customer) { + const restCustomerRef = buildField(fields.customer, 'rest'); + + customerRef = Reference.presets + .customerReference() + .id(restCustomerRef.id) + .buildGraphql(); + + customer = Customer.random() + .id(restCustomerRef.id) + .firstName(restCustomerRef.obj?.firstName) + .lastName(restCustomerRef.obj?.lastName) + .key(restCustomerRef.obj?.key) + .customerNumber(restCustomerRef.obj?.customerNumber) + .externalId(restCustomerRef.obj?.externalId) + .email(restCustomerRef.obj?.email || '') + .title(restCustomerRef.obj?.title) + .buildGraphql(); + } + // TODO: This exists in the Graphql API, but not in the REST API // We're stubbing it out for now because it's non-nullable const interfaceInteractionsRaw = toGraphqlPaginatedQueryResult([], { @@ -63,6 +69,7 @@ const transformers = { }); return { ...fields, + customer, customerRef, interfaceInteractionsRaw, __typename: 'Payment', diff --git a/models/payment/src/payment/types.ts b/models/payment/src/payment/types.ts index 9179c339b..f77904a6c 100644 --- a/models/payment/src/payment/types.ts +++ b/models/payment/src/payment/types.ts @@ -1,14 +1,13 @@ -import { Customer, Payment, PaymentDraft } from '@commercetools/platform-sdk'; +import { Payment, PaymentDraft } from '@commercetools/platform-sdk'; import type { TReferenceGraphql } from '@commercetools-test-data/commons'; import type { TBuilder, TPaginatedQueryResult, } from '@commercetools-test-data/core'; +import { TCustomerGraphql } from '@commercetools-test-data/customer'; // Default -export type TPayment = Omit & { - customer: Customer; -}; +export type TPayment = Payment; export type TPaymentDraft = PaymentDraft; // Rest @@ -16,9 +15,10 @@ export type TPaymentRest = Payment; export type TPaymentDraftRest = PaymentDraft; // Graphql -export type TPaymentGraphql = TPayment & { +export type TPaymentGraphql = Omit & { __typename: 'Payment'; - customerRef: TReferenceGraphql; + customer?: TCustomerGraphql; + customerRef?: TReferenceGraphql; interfaceInteractionsRaw: TPaginatedQueryResult; }; export type TPaymentDraftGraphql = TPaymentDraft; diff --git a/models/product-discount/src/discounted-product-price/builder.spec.ts b/models/product-discount/src/discounted-product-price/builder.spec.ts new file mode 100644 index 000000000..d1924422a --- /dev/null +++ b/models/product-discount/src/discounted-product-price/builder.spec.ts @@ -0,0 +1,62 @@ +/* eslint-disable jest/no-disabled-tests */ +/* eslint-disable jest/valid-title */ +import { + HighPrecisionMoney, + Reference, +} from '@commercetools-test-data/commons'; +import { createBuilderSpec } from '@commercetools-test-data/core/test-utils'; +import { + DiscountedProductPrice, + type TDiscountedProductPriceRest, + type TDiscountedProductPriceGraphql, +} from './'; + +describe('builder', () => { + it( + ...createBuilderSpec< + TDiscountedProductPriceRest, + TDiscountedProductPriceRest + >( + 'rest', + DiscountedProductPrice.random() + .value(HighPrecisionMoney.random().currencyCode('USD')) + .discount(Reference.presets.productDiscountReference().id('pd-123')), + expect.objectContaining({ + value: expect.objectContaining({ + currencyCode: 'USD', + }), + discount: expect.objectContaining({ + id: 'pd-123', + typeId: 'product-discount', + }), + }) + ) + ); + + it( + ...createBuilderSpec< + TDiscountedProductPriceRest, + TDiscountedProductPriceGraphql + >( + 'graphql', + DiscountedProductPrice.random() + .value(HighPrecisionMoney.random().currencyCode('USD')) + .discount(Reference.presets.productDiscountReference().id('pd-123')), + expect.objectContaining({ + value: expect.objectContaining({ + currencyCode: 'USD', + __typename: 'HighPrecisionMoney', + }), + discount: expect.objectContaining({ + id: 'pd-123', + __typename: 'ProductDiscount', + }), + discountRef: expect.objectContaining({ + id: 'pd-123', + __typename: 'Reference', + }), + __typename: 'DiscountedProductPrice', + }) + ) + ); +}); diff --git a/models/product-discount/src/discounted-product-price/builder.ts b/models/product-discount/src/discounted-product-price/builder.ts new file mode 100644 index 000000000..137d60de8 --- /dev/null +++ b/models/product-discount/src/discounted-product-price/builder.ts @@ -0,0 +1,15 @@ +import { Builder } from '@commercetools-test-data/core'; +import generator from './generator'; +import transformers from './transformers'; +import type { + TCreateDiscountedPriceBuilder, + TDiscountedProductPriceRest, +} from './types'; + +const Model: TCreateDiscountedPriceBuilder = () => + Builder({ + generator, + transformers, + }); + +export default Model; diff --git a/models/product-discount/src/discounted-product-price/discounted-product-price-draft/builder.spec.ts b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/builder.spec.ts new file mode 100644 index 000000000..ff45adfee --- /dev/null +++ b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/builder.spec.ts @@ -0,0 +1,57 @@ +/* eslint-disable jest/no-disabled-tests */ +/* eslint-disable jest/valid-title */ +import { + HighPrecisionMoney, + Reference, +} from '@commercetools-test-data/commons'; +import { createBuilderSpec } from '@commercetools-test-data/core/test-utils'; +import { DiscountedProductPriceDraft } from '..'; +import { + TDiscountedProductPriceDraft, + TDiscountedProductPriceDraftGraphql, +} from '../types'; + +describe('builder', () => { + it( + ...createBuilderSpec< + TDiscountedProductPriceDraft, + TDiscountedProductPriceDraft + >( + 'rest', + DiscountedProductPriceDraft.random() + .value(HighPrecisionMoney.random().currencyCode('USD')) + .discount(Reference.presets.productDiscountReference().id('pd-123')), + expect.objectContaining({ + value: expect.objectContaining({ + currencyCode: 'USD', + }), + discount: expect.objectContaining({ + id: 'pd-123', + typeId: 'product-discount', + }), + }) + ) + ); + + it( + ...createBuilderSpec< + TDiscountedProductPriceDraft, + TDiscountedProductPriceDraftGraphql + >( + 'graphql', + DiscountedProductPriceDraft.random() + .value(HighPrecisionMoney.random().currencyCode('USD')) + .discount(Reference.presets.productDiscountReference().id('pd-123')), + expect.objectContaining({ + value: expect.objectContaining({ + currencyCode: 'USD', + }), + discount: expect.objectContaining({ + id: 'pd-123', + __typename: 'ProductDiscount', + }), + __typename: 'DiscountedProductPriceDraft', + }) + ) + ); +}); diff --git a/models/product-discount/src/discounted-product-price/discounted-product-price-draft/builder.ts b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/builder.ts new file mode 100644 index 000000000..e2f287b32 --- /dev/null +++ b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/builder.ts @@ -0,0 +1,15 @@ +import { Builder } from '@commercetools-test-data/core'; +import type { + TCreateDiscountedPriceDraftBuilder, + TDiscountedProductPriceDraft, +} from '../types'; +import generator from './generator'; +import transformers from './transformers'; + +const AddressDraft: TCreateDiscountedPriceDraftBuilder = () => + Builder({ + generator, + transformers, + }); + +export default AddressDraft; diff --git a/models/product-discount/src/discounted-product-price/discounted-product-price-draft/generator.ts b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/generator.ts new file mode 100644 index 000000000..6fa5c63de --- /dev/null +++ b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/generator.ts @@ -0,0 +1,11 @@ +import { Generator } from '@commercetools-test-data/core'; +import { TDiscountedProductPriceDraft } from '../types'; + +const generator = Generator({ + fields: { + value: null, + discount: null, + }, +}); + +export default generator; diff --git a/models/product-discount/src/discounted-product-price/discounted-product-price-draft/index.ts b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/index.ts new file mode 100644 index 000000000..96e2519e1 --- /dev/null +++ b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/index.ts @@ -0,0 +1,2 @@ +export { default as random } from './builder'; +export { default as presets } from './presets'; diff --git a/models/product-discount/src/discounted-product-price/discounted-product-price-draft/presets/index.ts b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/presets/index.ts new file mode 100644 index 000000000..763e57fe0 --- /dev/null +++ b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/presets/index.ts @@ -0,0 +1,3 @@ +const presets = {}; + +export default presets; diff --git a/models/product-discount/src/discounted-product-price/discounted-product-price-draft/transformers.ts b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/transformers.ts new file mode 100644 index 000000000..e66b5d1aa --- /dev/null +++ b/models/product-discount/src/discounted-product-price/discounted-product-price-draft/transformers.ts @@ -0,0 +1,54 @@ +import { + HighPrecisionMoneyDraft, + type THighPrecisionMoneyDraft, + type THighPrecisionMoneyDraftGraphql, +} from '@commercetools-test-data/commons'; +import { buildField, Transformer } from '@commercetools-test-data/core'; +import { ProductDiscount, type TProductDiscountDraftGraphql } from '../..'; +import type { + TDiscountedProductPriceDraft, + TDiscountedProductPriceDraftGraphql, +} from '../types'; + +const transformers = { + default: Transformer< + TDiscountedProductPriceDraft, + TDiscountedProductPriceDraft + >('default', { + buildFields: ['value', 'discount'], + }), + rest: Transformer( + 'rest', + { + buildFields: ['value', 'discount'], + } + ), + graphql: Transformer< + TDiscountedProductPriceDraft, + TDiscountedProductPriceDraftGraphql + >('graphql', { + buildFields: ['value'], + replaceFields: ({ fields }) => { + const restValue = fields.value as THighPrecisionMoneyDraft; + const value = HighPrecisionMoneyDraft.random() + .centAmount(restValue.centAmount) + .currencyCode(restValue.currencyCode) + .fractionDigits(restValue.fractionDigits) + .preciseAmount(restValue.preciseAmount) + .type(restValue.type) + .buildGraphql(); + const restProductDiscount = buildField(fields.discount, 'rest'); + const graphqlProductDiscount = ProductDiscount.random() + .id(restProductDiscount.id) + .buildGraphql(); + return { + ...fields, + value, + discount: graphqlProductDiscount, + __typename: 'DiscountedProductPriceDraft', + }; + }, + }), +}; + +export default transformers; diff --git a/models/product-discount/src/discounted-product-price/generator.ts b/models/product-discount/src/discounted-product-price/generator.ts new file mode 100644 index 000000000..5c4b8008b --- /dev/null +++ b/models/product-discount/src/discounted-product-price/generator.ts @@ -0,0 +1,12 @@ +import { HighPrecisionMoney } from '@commercetools-test-data/commons'; +import { fake, Generator } from '@commercetools-test-data/core'; +import type { TDiscountedProductPriceRest } from './types'; + +const generator = Generator({ + fields: { + value: fake(() => HighPrecisionMoney.random()), + discount: null, + }, +}); + +export default generator; diff --git a/models/product-discount/src/discounted-product-price/index.ts b/models/product-discount/src/discounted-product-price/index.ts new file mode 100644 index 000000000..716f83c2b --- /dev/null +++ b/models/product-discount/src/discounted-product-price/index.ts @@ -0,0 +1,6 @@ +export * as DiscountedProductPriceDraft from './discounted-product-price-draft'; +export * as DiscountedProductPrice from '.'; + +export { default as random } from './builder'; +export { default as presets } from './presets'; +export * from './types'; diff --git a/models/product-discount/src/discounted-product-price/presets/index.ts b/models/product-discount/src/discounted-product-price/presets/index.ts new file mode 100644 index 000000000..763e57fe0 --- /dev/null +++ b/models/product-discount/src/discounted-product-price/presets/index.ts @@ -0,0 +1,3 @@ +const presets = {}; + +export default presets; diff --git a/models/product-discount/src/discounted-product-price/transformers.ts b/models/product-discount/src/discounted-product-price/transformers.ts new file mode 100644 index 000000000..b2bcfed97 --- /dev/null +++ b/models/product-discount/src/discounted-product-price/transformers.ts @@ -0,0 +1,62 @@ +import { + HighPrecisionMoney, + Reference, + THighPrecisionMoney, + THighPrecisionMoneyGraphql, + TReferenceGraphql, +} from '@commercetools-test-data/commons'; +import { buildField, Transformer } from '@commercetools-test-data/core'; +import { ProductDiscount, TProductDiscountGraphql } from '..'; +import type { + TDiscountedProductPriceRest, + TDiscountedProductPriceGraphql, +} from './types'; + +const transformers = { + default: Transformer< + TDiscountedProductPriceRest, + TDiscountedProductPriceRest + >('default', { + buildFields: ['value', 'discount'], + }), + rest: Transformer( + 'rest', + { + buildFields: ['value', 'discount'], + } + ), + graphql: Transformer< + TDiscountedProductPriceRest, + TDiscountedProductPriceGraphql + >('graphql', { + buildFields: ['value'], + replaceFields: ({ fields }) => { + const restValue = fields.value as THighPrecisionMoney; + const value = HighPrecisionMoney.random() + .centAmount(restValue.centAmount) + .currencyCode(restValue.currencyCode) + .fractionDigits(restValue.fractionDigits) + .preciseAmount(restValue.preciseAmount) + .type(restValue.type) + .buildGraphql(); + const restProductDiscount = buildField(fields.discount, 'rest'); + const graphqlProductDiscount = ProductDiscount.random() + .id(restProductDiscount.id) + .buildGraphql(); + const productDiscountRef = Reference.presets + .productDiscountReference() + .id(restProductDiscount.id) + .buildGraphql(); + + return { + ...fields, + value, + discount: graphqlProductDiscount, + discountRef: productDiscountRef, + __typename: 'DiscountedProductPrice', + }; + }, + }), +}; + +export default transformers; diff --git a/models/product-discount/src/discounted-product-price/types.ts b/models/product-discount/src/discounted-product-price/types.ts new file mode 100644 index 000000000..0c9b62a5d --- /dev/null +++ b/models/product-discount/src/discounted-product-price/types.ts @@ -0,0 +1,40 @@ +import { + DiscountedPrice, + DiscountedPriceDraft, +} from '@commercetools/platform-sdk'; +import { + THighPrecisionMoneyDraftGraphql, + THighPrecisionMoneyGraphql, + TReferenceGraphql, +} from '@commercetools-test-data/commons'; +import { TBuilder } from '@commercetools-test-data/core'; +import { + TProductDiscountDraftGraphql, + TProductDiscountGraphql, +} from '../product-discount'; + +export type TDiscountedProductPriceRest = DiscountedPrice; + +export type TDiscountedProductPriceGraphql = { + value: THighPrecisionMoneyGraphql; + discount: TProductDiscountGraphql; + discountRef: TReferenceGraphql; + __typename: 'DiscountedProductPrice'; +}; + +export type TDiscountedProductPriceDraft = DiscountedPriceDraft; + +export type TDiscountedProductPriceDraftGraphql = { + value: THighPrecisionMoneyDraftGraphql; + discount: TProductDiscountDraftGraphql; + __typename: 'DiscountedProductPriceDraft'; +}; + +export type TDiscountedProductPriceBuilder = + TBuilder; +export type TCreateDiscountedPriceBuilder = + () => TDiscountedProductPriceBuilder; +export type TDiscountedProductPriceDraftBuilder = + TBuilder; +export type TCreateDiscountedPriceDraftBuilder = + () => TDiscountedProductPriceDraftBuilder; diff --git a/models/product-discount/src/index.ts b/models/product-discount/src/index.ts index 5ac603e12..ee1a1e676 100644 --- a/models/product-discount/src/index.ts +++ b/models/product-discount/src/index.ts @@ -3,6 +3,7 @@ export * from './product-discount/types'; export * from './product-discount-value-absolute/types'; export * from './product-discount-value-external/types'; export * from './product-discount-value-relative/types'; +export * from './discounted-product-price/types'; // Export models export * as ProductDiscount from './product-discount'; @@ -16,3 +17,6 @@ export * as ProductDiscountValueExternalDraft from './product-discount-value-ext export * as ProductDiscountValueRelative from './product-discount-value-relative'; export * as ProductDiscountValueRelativeDraft from './product-discount-value-relative/product-discount-value-relative-draft'; + +export * as DiscountedProductPrice from './discounted-product-price'; +export * as DiscountedProductPriceDraft from './discounted-product-price/discounted-product-price-draft'; diff --git a/models/product-projection/src/builder.spec.ts b/models/product-projection/src/builder.spec.ts index 7cf8f229c..3d249287c 100644 --- a/models/product-projection/src/builder.spec.ts +++ b/models/product-projection/src/builder.spec.ts @@ -5,6 +5,8 @@ import { LocalizedString, Reference } from '@commercetools-test-data/commons'; import { createBuilderSpec } from '@commercetools-test-data/core/test-utils'; import { ProductVariant } from '@commercetools-test-data/product'; import { ProductType } from '@commercetools-test-data/product-type'; +import { State } from '@commercetools-test-data/state'; +import { TaxCategory } from '@commercetools-test-data/tax-category'; import { TProductProjection, TProductProjectionGraphql, @@ -36,38 +38,42 @@ describe('builder', () => { key: expect.any(String), productType: expect.objectContaining({ id: expect.any(String), - key: expect.any(String), - version: expect.any(Number), - createdAt: expect.any(String), - createdBy: expect.objectContaining({ - customer: expect.objectContaining({ typeId: 'customer' }), - }), - lastModifiedAt: expect.any(String), - lastModifiedBy: expect.objectContaining({ - customer: expect.objectContaining({ typeId: 'customer' }), - }), - name: expect.any(String), - description: expect.any(String), - attributes: expect.arrayContaining([ - expect.objectContaining({ - type: expect.objectContaining({ name: expect.any(String) }), - name: expect.any(String), - label: expect.objectContaining({ - de: expect.any(String), - en: expect.any(String), - fr: expect.any(String), - }), - isRequired: expect.any(Boolean), - attributeConstraint: expect.any(String), - inputTip: expect.objectContaining({ - de: expect.any(String), - en: expect.any(String), - fr: expect.any(String), - }), - inputHint: expect.any(String), - isSearchable: expect.any(Boolean), + typeId: expect.any(String), + obj: expect.objectContaining({ + id: expect.any(String), + key: expect.any(String), + version: expect.any(Number), + createdAt: expect.any(String), + createdBy: expect.objectContaining({ + customer: expect.objectContaining({ typeId: 'customer' }), }), - ]), + lastModifiedAt: expect.any(String), + lastModifiedBy: expect.objectContaining({ + customer: expect.objectContaining({ typeId: 'customer' }), + }), + name: expect.any(String), + description: expect.any(String), + attributes: expect.arrayContaining([ + expect.objectContaining({ + type: expect.objectContaining({ name: expect.any(String) }), + name: expect.any(String), + label: expect.objectContaining({ + de: expect.any(String), + en: expect.any(String), + fr: expect.any(String), + }), + isRequired: expect.any(Boolean), + attributeConstraint: expect.any(String), + inputTip: expect.objectContaining({ + de: expect.any(String), + en: expect.any(String), + fr: expect.any(String), + }), + inputHint: expect.any(String), + isSearchable: expect.any(Boolean), + }), + ]), + }), }), name: expectedGeneralLocalizedString, description: expectedGeneralLocalizedString, @@ -126,30 +132,26 @@ describe('builder', () => { key: expect.any(String), productType: expect.objectContaining({ id: expect.any(String), - key: expect.any(String), - version: expect.any(Number), - createdAt: expect.any(String), - createdBy: expect.objectContaining({ - customer: expect.objectContaining({ typeId: 'customer' }), - }), - lastModifiedAt: expect.any(String), - lastModifiedBy: expect.objectContaining({ - customer: expect.objectContaining({ typeId: 'customer' }), + typeId: expect.any(String), + obj: expect.objectContaining({ + id: expect.any(String), + key: expect.any(String), + version: expect.any(Number), + name: expect.any(String), + description: expect.any(String), + attributes: expect.arrayContaining([ + expect.objectContaining({ + type: expect.objectContaining({ name: expect.any(String) }), + name: expect.any(String), + label: expectedGeneralLocalizedString, + isRequired: expect.any(Boolean), + attributeConstraint: expect.any(String), + inputTip: expectedGeneralLocalizedString, + inputHint: expect.any(String), + isSearchable: expect.any(Boolean), + }), + ]), }), - name: expect.any(String), - description: expect.any(String), - attributes: expect.arrayContaining([ - expect.objectContaining({ - type: expect.objectContaining({ name: expect.any(String) }), - name: expect.any(String), - label: expectedGeneralLocalizedString, - isRequired: expect.any(Boolean), - attributeConstraint: expect.any(String), - inputTip: expectedGeneralLocalizedString, - inputHint: expect.any(String), - isSearchable: expect.any(Boolean), - }), - ]), }), name: expectedGeneralLocalizedString, description: expectedGeneralLocalizedString, @@ -236,8 +238,8 @@ describe('builder', () => { sku: expect.any(String), }), variants: [], - taxCategory: undefined, - state: undefined, + taxCategory: null, + state: null, createdAt: expect.any(String), lastModifiedAt: expect.any(String), reviewRatingStatistics: undefined, @@ -246,13 +248,17 @@ describe('builder', () => { ) ); - it('should allow customization', () => { + describe('when customizing the model', () => { const productProjectionMock = ProductProjection.presets - .happyCowMilkProductProjection() + .happyCowMilk() .categories([ - Category.random() - .id('category-id') - .name(LocalizedString.presets.empty().en('category-name')), + Reference.presets + .categoryReference() + .obj( + Category.random() + .id('category-id') + .name(LocalizedString.presets.empty().en('category-name')) + ), ]) .categoryOrderHints({ 'category-1': '0.4', @@ -261,7 +267,11 @@ describe('builder', () => { .key('happy-cow-milk-key') .metaKeywords(LocalizedString.presets.empty().en('happy')) .priceMode('Embedded') - .productType(ProductType.presets.milk().id('product-type-id')) + .productType( + Reference.presets + .productTypeReference() + .obj(ProductType.presets.milk().id('product-type-id')) + ) .reviewRatingStatistics({ averageRating: 3.12345, highestRating: 4.9, @@ -272,141 +282,253 @@ describe('builder', () => { .searchKeywords({ en: [{ text: 'product search keyword' }], }) - .state(Reference.presets.stateReference()) - .taxCategory(Reference.presets.taxCategoryReference()) + .state( + Reference.presets.stateReference().obj(State.random().id('state-id')) + ) + .taxCategory( + Reference.presets + .taxCategoryReference() + .obj(TaxCategory.random().id('tax-category-id')) + ) .variants([ProductVariant.random().key('alternative-variant-key')]) - .version(222) - .buildGraphql(); + .version(222); - const expectedLocalizedName = expect.arrayContaining([ - expect.objectContaining({ - locale: 'en', - value: 'Happy Cow Milk', - }), - expect.objectContaining({ - locale: 'de', - value: 'Fröhliche Kuhmilch', - }), - ]); - const expectedLocalizedDescription = expect.arrayContaining([ - expect.objectContaining({ - locale: 'en', - value: 'Very happy milk produced by very happy cow!', - }), - expect.objectContaining({ - locale: 'de', - value: 'Sehr glückliche Milch von sehr glücklicher Kuh!', - }), - ]); + it('should build the right rest model', () => { + const restProductProjection = + productProjectionMock.buildRest(); - expect(productProjectionMock).toEqual( - expect.objectContaining({ - categories: expect.arrayContaining([ - expect.objectContaining({ - id: 'category-id', - name: 'category-name', - __typename: 'Category', + expect(restProductProjection).toEqual( + expect.objectContaining({ + categories: expect.arrayContaining([ + expect.objectContaining({ + typeId: 'category', + id: 'category-id', + obj: expect.objectContaining({ + id: 'category-id', + name: expect.objectContaining({ + en: 'category-name', + }), + }), + }), + ]), + categoryOrderHints: expect.objectContaining({ + 'category-1': '0.4', }), - ]), - categoryOrderHints: expect.arrayContaining([ - { - categoryId: 'category-1', - orderHint: '0.4', - __typename: 'CategoryOrderHint', - }, - ]), - categoriesRef: expect.arrayContaining([ - expect.objectContaining({ - typeId: 'category', - id: 'category-id', - __typename: 'Reference', + description: expect.objectContaining({ + en: 'Very happy milk produced by very happy cow!', }), - ]), - description: 'Very happy milk produced by very happy cow!', - descriptionAllLocales: expectedLocalizedDescription, - hasStagedChanges: false, - id: 'happy-cow-milk-id', - key: 'happy-cow-milk-key', - masterVariant: expect.objectContaining({ - __typename: 'ProductVariant', - key: 'happy-cow-master-variant-key', - sku: 'happy-cow-master-variant-sku', - }), - metaDescription: 'Very happy milk produced by very happy cow!', - metaDescriptionAllLocales: expectedLocalizedDescription, - metaKeywords: 'happy', - metaKeywordsAllLocales: expect.arrayContaining([ - expect.objectContaining({ - locale: 'en', - value: 'happy', + hasStagedChanges: false, + id: 'happy-cow-milk-id', + key: 'happy-cow-milk-key', + masterVariant: expect.objectContaining({ + key: 'happy-cow-master-variant-key', + sku: 'happy-cow-master-variant-sku', }), - ]), - metaTitle: 'Happy Cow Milk', - metaTitleAllLocales: expectedLocalizedName, - name: 'Happy Cow Milk', - nameAllLocales: expectedLocalizedName, - priceMode: 'Embedded', - productType: expect.objectContaining({ - __typename: 'ProductTypeDefinition', - name: 'Milk Product Type', - }), - productTypeRef: expect.objectContaining({ - typeId: 'product-type', - id: 'product-type-id', - __typename: 'Reference', - }), - published: true, - reviewRatingStatistics: expect.objectContaining({ - averageRating: 3.12345, - highestRating: 4.9, - lowestRating: 2.1, - count: 25, - ratingsDistribution: {}, - __typename: 'ReviewRatingStatistics', - }), - searchKeywords: expect.arrayContaining([ - expect.objectContaining({ - locale: 'en', - searchKeywords: [ + metaDescription: expect.objectContaining({ + en: 'Very happy milk produced by very happy cow!', + }), + metaKeywords: expect.objectContaining({ + en: 'happy', + }), + metaTitle: expect.objectContaining({ + en: 'Happy Cow Milk', + }), + name: expect.objectContaining({ + en: 'Happy Cow Milk', + }), + priceMode: 'Embedded', + productType: expect.objectContaining({ + id: 'product-type-id', + typeId: 'product-type', + obj: expect.objectContaining({ + id: 'product-type-id', + name: 'Milk Product Type', + attributes: expect.any(Array), + }), + }), + published: true, + reviewRatingStatistics: expect.objectContaining({ + averageRating: 3.12345, + highestRating: 4.9, + lowestRating: 2.1, + count: 25, + ratingsDistribution: {}, + }), + searchKeywords: expect.objectContaining({ + en: expect.arrayContaining([ { text: 'product search keyword', - suggestTokenizer: undefined, }, - ], - __typename: 'SearchKeywordsProductSearch', + ]), + }), + slug: expect.objectContaining({ + en: 'happy-cow-milk-slug', + }), + state: expect.objectContaining({ + id: 'state-id', + typeId: 'state', + obj: expect.objectContaining({ + id: 'state-id', + type: expect.any(String), + initial: expect.any(Boolean), + }), }), - ]), - slug: 'happy-cow-milk-slug', - slugAllLocales: expect.arrayContaining([ - expect.objectContaining({ - locale: 'en', - value: 'happy-cow-milk-slug', + taxCategory: expect.objectContaining({ + id: 'tax-category-id', + typeId: 'tax-category', + obj: expect.objectContaining({ + id: 'tax-category-id', + name: expect.any(String), + rates: expect.any(Array), + }), }), - ]), - state: expect.objectContaining({ - id: 'product-type-id', - __typename: 'State', + variants: expect.arrayContaining([ + expect.objectContaining({ + key: 'alternative-variant-key', + sku: expect.any(String), + }), + ]), + version: 222, + }) + ); + }); + + it('should build the right graphql model', () => { + const grapqlProductProjection = + productProjectionMock.buildGraphql(); + + const expectedLocalizedName = expect.arrayContaining([ + expect.objectContaining({ + locale: 'en', + value: 'Happy Cow Milk', }), - stateRef: expect.objectContaining({ - typeId: 'state', - __typename: 'Reference', + expect.objectContaining({ + locale: 'de', + value: 'Fröhliche Kuhmilch', }), - taxCategory: expect.objectContaining({ - id: 'product-type-id', - __typename: 'TaxCategory', + ]); + const expectedLocalizedDescription = expect.arrayContaining([ + expect.objectContaining({ + locale: 'en', + value: 'Very happy milk produced by very happy cow!', }), - taxCategoryRef: expect.objectContaining({ - typeId: 'tax-category', - __typename: 'Reference', + expect.objectContaining({ + locale: 'de', + value: 'Sehr glückliche Milch von sehr glücklicher Kuh!', }), - variants: expect.arrayContaining([ - expect.objectContaining({ - key: 'alternative-variant-key', + ]); + + expect(grapqlProductProjection).toEqual( + expect.objectContaining({ + categories: expect.arrayContaining([ + expect.objectContaining({ + id: 'category-id', + name: 'category-name', + __typename: 'Category', + }), + ]), + categoryOrderHints: expect.arrayContaining([ + { + categoryId: 'category-1', + orderHint: '0.4', + __typename: 'CategoryOrderHint', + }, + ]), + categoriesRef: expect.arrayContaining([ + expect.objectContaining({ + typeId: 'category', + id: 'category-id', + __typename: 'Reference', + }), + ]), + description: 'Very happy milk produced by very happy cow!', + descriptionAllLocales: expectedLocalizedDescription, + hasStagedChanges: false, + id: 'happy-cow-milk-id', + key: 'happy-cow-milk-key', + masterVariant: expect.objectContaining({ __typename: 'ProductVariant', + key: 'happy-cow-master-variant-key', + sku: 'happy-cow-master-variant-sku', }), - ]), - version: 222, - }) - ); + metaDescription: 'Very happy milk produced by very happy cow!', + metaDescriptionAllLocales: expectedLocalizedDescription, + metaKeywords: 'happy', + metaKeywordsAllLocales: expect.arrayContaining([ + expect.objectContaining({ + locale: 'en', + value: 'happy', + }), + ]), + metaTitle: 'Happy Cow Milk', + metaTitleAllLocales: expectedLocalizedName, + name: 'Happy Cow Milk', + nameAllLocales: expectedLocalizedName, + priceMode: 'Embedded', + productType: expect.objectContaining({ + __typename: 'ProductTypeDefinition', + name: 'Milk Product Type', + }), + productTypeRef: expect.objectContaining({ + typeId: 'product-type', + id: 'product-type-id', + __typename: 'Reference', + }), + published: true, + reviewRatingStatistics: expect.objectContaining({ + averageRating: 3.12345, + highestRating: 4.9, + lowestRating: 2.1, + count: 25, + ratingsDistribution: {}, + __typename: 'ReviewRatingStatistics', + }), + searchKeywords: expect.arrayContaining([ + expect.objectContaining({ + locale: 'en', + searchKeywords: [ + { + text: 'product search keyword', + suggestTokenizer: undefined, + }, + ], + __typename: 'SearchKeywordsProductSearch', + }), + ]), + slug: 'happy-cow-milk-slug', + slugAllLocales: expect.arrayContaining([ + expect.objectContaining({ + locale: 'en', + value: 'happy-cow-milk-slug', + }), + ]), + state: expect.objectContaining({ + id: 'state-id', + __typename: 'State', + }), + stateRef: expect.objectContaining({ + id: 'state-id', + typeId: 'state', + __typename: 'Reference', + }), + taxCategory: expect.objectContaining({ + id: 'tax-category-id', + __typename: 'TaxCategory', + }), + taxCategoryRef: expect.objectContaining({ + id: 'tax-category-id', + typeId: 'tax-category', + __typename: 'Reference', + }), + variants: expect.arrayContaining([ + expect.objectContaining({ + key: 'alternative-variant-key', + __typename: 'ProductVariant', + }), + ]), + version: 222, + }) + ); + }); }); }); diff --git a/models/product-projection/src/generator.ts b/models/product-projection/src/generator.ts index 4f80eb2ed..b1d9761c4 100644 --- a/models/product-projection/src/generator.ts +++ b/models/product-projection/src/generator.ts @@ -1,4 +1,4 @@ -import { LocalizedString } from '@commercetools-test-data/commons'; +import { LocalizedString, Reference } from '@commercetools-test-data/commons'; import { Generator, fake, sequence } from '@commercetools-test-data/core'; import { ProductVariant } from '@commercetools-test-data/product'; import { ProductType } from '@commercetools-test-data/product-type'; @@ -14,7 +14,9 @@ export default Generator({ version: sequence(), createdAt: fake(getOlderDate), lastModifiedAt: fake(getNewerDate), - productType: fake(() => ProductType.random()), + productType: fake(() => + Reference.random().typeId('product-type').obj(ProductType.random()) + ), name: fake(() => LocalizedString.random()), description: fake(() => LocalizedString.random()), slug: fake(() => LocalizedString.presets.ofSlugs()), diff --git a/models/product-projection/src/index.ts b/models/product-projection/src/index.ts index b19319eb5..5089f19da 100644 --- a/models/product-projection/src/index.ts +++ b/models/product-projection/src/index.ts @@ -1,4 +1,5 @@ export { default as random } from './builder'; export { default as presets } from './presets'; +export * as ProductProjection from '.'; export * from './types'; diff --git a/models/product-projection/src/presets/happy-cow-milk-product-projection.ts b/models/product-projection/src/presets/happy-cow-milk.ts similarity index 83% rename from models/product-projection/src/presets/happy-cow-milk-product-projection.ts rename to models/product-projection/src/presets/happy-cow-milk.ts index c95d79b3a..79fba2994 100644 --- a/models/product-projection/src/presets/happy-cow-milk-product-projection.ts +++ b/models/product-projection/src/presets/happy-cow-milk.ts @@ -1,4 +1,4 @@ -import { LocalizedString } from '@commercetools-test-data/commons'; +import { LocalizedString, Reference } from '@commercetools-test-data/commons'; import { ProductVariant } from '@commercetools-test-data/product'; import { ProductType } from '@commercetools-test-data/product-type'; import ProductProjection from '../builder'; @@ -17,7 +17,9 @@ const happyCowMilk = () => { const slug = LocalizedString.presets.empty().en('happy-cow-milk-slug'); return ProductProjection() - .productType(ProductType.presets.milk()) + .productType( + Reference.presets.productTypeReference().obj(ProductType.presets.milk()) + ) .slug(slug) .key('happy-cow-milk-key') .name(productName) diff --git a/models/product-projection/src/presets/index.ts b/models/product-projection/src/presets/index.ts index aa495b374..db6e8a994 100644 --- a/models/product-projection/src/presets/index.ts +++ b/models/product-projection/src/presets/index.ts @@ -1,5 +1,5 @@ -import happyCowMilkProductProjection from './happy-cow-milk-product-projection'; +import happyCowMilk from './happy-cow-milk'; -const presets = { happyCowMilkProductProjection }; +const presets = { happyCowMilk }; export default presets; diff --git a/models/product-projection/src/transformers.ts b/models/product-projection/src/transformers.ts index 602dd518c..ac523a22d 100644 --- a/models/product-projection/src/transformers.ts +++ b/models/product-projection/src/transformers.ts @@ -1,13 +1,21 @@ +import { Category, TCategoryGraphql } from '@commercetools-test-data/category'; import { LocalizedString, - Reference, type TReferenceGraphql, } from '@commercetools-test-data/commons'; -import { Transformer } from '@commercetools-test-data/core'; -import { State, TState } from '@commercetools-test-data/state'; +import { + Transformer, + buildField, + buildFields, +} from '@commercetools-test-data/core'; +import { + ProductType, + TProductTypeGraphql, +} from '@commercetools-test-data/product-type'; +import { State, TStateGraphql } from '@commercetools-test-data/state'; import { TaxCategory, - TTaxCategory, + TTaxCategoryGraphql, } from '@commercetools-test-data/tax-category'; import type { TCategoryOrderHintGraphql, @@ -43,7 +51,6 @@ const transformers = { 'description', 'slug', 'categories', - 'categoryOrderHints', 'metaTitle', 'metaDescription', 'metaKeywords', @@ -56,14 +63,7 @@ const transformers = { graphql: Transformer( 'graphql', { - buildFields: [ - 'productType', - 'categories', - 'masterVariant', - 'variants', - 'taxCategory', - 'state', - ], + buildFields: ['masterVariant', 'variants'], replaceFields: ({ fields }) => { const nameAllLocales = LocalizedString.toLocalizedField(fields.name)!; const descriptionAllLocales = LocalizedString.toLocalizedField( @@ -79,35 +79,69 @@ const transformers = { const metaDescriptionAllLocales = LocalizedString.toLocalizedField( fields.metaDescription ); - const productTypeRef = Reference.random() - .id(fields.productType.id) - .typeId('product-type') - .buildGraphql(); - const state = fields.state - ? State.random().id(fields.productType.id).buildGraphql() - : undefined; - const stateRef = fields.state - ? Reference.random() - .id(fields.productType.id) - .typeId('state') - .buildGraphql() - : undefined; - const taxCategory = fields.taxCategory - ? TaxCategory.random() - .id(fields.productType.id) - .buildGraphql() - : undefined; - const taxCategoryRef = fields.taxCategory - ? Reference.random() - .id(fields.productType.id) - .typeId('tax-category') - .buildGraphql() - : undefined; - const categoriesRef = fields.categories.map((category) => ({ - id: category.id, - typeId: 'category' as const, - __typename: 'Reference' as const, - })); + + const restProductType = buildField(fields.productType, 'rest'); + const productTypeRef = buildField( + fields.productType, + 'graphql' + ) as TReferenceGraphql; + const productType = ProductType.random() + .description(restProductType.obj?.description || '') + .id(restProductType.id) + .key(restProductType.obj?.key || '') + .name(restProductType.obj?.name || '') + .buildGraphql(); + + let state: TStateGraphql | null = null; + let stateRef: TReferenceGraphql | null = null; + if (fields.state) { + const restState = buildField(fields.state, 'rest'); + stateRef = buildField(fields.state, 'graphql') as TReferenceGraphql; + state = State.random() + .id(restState.id) + .key(restState.obj?.key || '') + .version(restState.obj?.version || 1) + .type(restState.obj?.type || 'unknown') + .buildGraphql(); + } + + let taxCategory: TTaxCategoryGraphql | null = null; + let taxCategoryRef: TReferenceGraphql | null = null; + if (fields.taxCategory) { + const restTaxCategory = buildField(fields.taxCategory, 'rest'); + taxCategory = TaxCategory.random() + .id(restTaxCategory.id) + .key(restTaxCategory.obj?.key || '') + .name(restTaxCategory.obj?.name || '') + .description(restTaxCategory.obj?.description || '') + .version(restTaxCategory.obj?.version || 1) + .buildGraphql(); + taxCategoryRef = buildField( + fields.taxCategory, + 'graphql' + ) as TReferenceGraphql; + } + + const categories = fields.categories + .map((category) => { + const restCategory = buildField(category, 'rest'); + const categoryObj = restCategory.obj; + if (categoryObj) { + return Category.random() + .id(categoryObj.id) + .key(categoryObj.key || '') + .name(LocalizedString.presets.empty().en(categoryObj.name.en)) + .version(categoryObj.version || 1) + .buildGraphql(); + } + return undefined; + }) + .filter(Boolean) as TCategoryGraphql[]; + const categoriesRef = buildFields( + fields.categories, + 'graphql' + ) as TReferenceGraphql[]; + const categoryOrderHints: Array = Object.entries(fields.categoryOrderHints || {}).map( ([key, value]) => ({ @@ -116,6 +150,7 @@ const transformers = { __typename: 'CategoryOrderHint', }) ); + const searchKeywords: Array = Object.entries( fields.searchKeywords || {} ).map(([locale, searchKeywords]) => ({ @@ -126,6 +161,7 @@ const transformers = { })), __typename: 'SearchKeywordsProductSearch', })); + const reviewRatingStatistics = fields.reviewRatingStatistics ? { ...fields.reviewRatingStatistics, @@ -136,7 +172,7 @@ const transformers = { return { ...fields, name: LocalizedString.resolveGraphqlDefaultLocaleValue( - nameAllLocales + nameAllLocales! )!, nameAllLocales, description: LocalizedString.resolveGraphqlDefaultLocaleValue( @@ -161,11 +197,13 @@ const transformers = { ), metaDescriptionAllLocales, reviewRatingStatistics, + productType, productTypeRef, state, stateRef, taxCategory, taxCategoryRef, + categories, categoriesRef, categoryOrderHints, searchKeywords, diff --git a/models/product/package.json b/models/product/package.json index 277c0e47c..3410b0b4f 100644 --- a/models/product/package.json +++ b/models/product/package.json @@ -24,6 +24,7 @@ "@commercetools-test-data/commons": "10.11.2", "@commercetools-test-data/core": "10.11.2", "@commercetools-test-data/product-type": "10.11.2", + "@commercetools-test-data/state": "10.11.2", "@commercetools-test-data/tax-category": "10.11.2", "@commercetools-test-data/utils": "10.11.2", "@commercetools/platform-sdk": "7.21.0", diff --git a/models/product/src/product-data/transformers.ts b/models/product/src/product-data/transformers.ts index 99478dc83..649d7ff42 100644 --- a/models/product/src/product-data/transformers.ts +++ b/models/product/src/product-data/transformers.ts @@ -39,17 +39,18 @@ const transformers = { 'variants', ], replaceFields: ({ fields }) => { - const { categories } = fields; + const { allVariants, variant, skus, categories, ...rest } = fields; const categoryReferences: Array = categories.map( (category) => ({ id: category.id, typeId: 'category', + obj: category, }) ); return { - ...fields, + ...rest, categories: categoryReferences, }; }, diff --git a/models/product/src/product/builder.spec.ts b/models/product/src/product/builder.spec.ts index 6fede1ea8..4ba5ba421 100644 --- a/models/product/src/product/builder.spec.ts +++ b/models/product/src/product/builder.spec.ts @@ -26,54 +26,62 @@ describe('builder', () => { state: null, taxCategory: expect.objectContaining({ id: expect.any(String), - version: expect.any(Number), - key: expect.any(String), - name: expect.any(String), - description: expect.any(String), - rates: expect.any(Array), - createdAt: expect.any(String), - createdBy: expect.objectContaining({ - customer: expect.objectContaining({ typeId: 'customer' }), - }), - lastModifiedAt: expect.any(String), - lastModifiedBy: expect.objectContaining({ - customer: expect.objectContaining({ typeId: 'customer' }), + typeId: 'tax-category', + obj: expect.objectContaining({ + id: expect.any(String), + version: expect.any(Number), + key: expect.any(String), + name: expect.any(String), + description: expect.any(String), + rates: expect.any(Array), + createdAt: expect.any(String), + createdBy: expect.objectContaining({ + customer: expect.objectContaining({ typeId: 'customer' }), + }), + lastModifiedAt: expect.any(String), + lastModifiedBy: expect.objectContaining({ + customer: expect.objectContaining({ typeId: 'customer' }), + }), }), }), productType: expect.objectContaining({ id: expect.any(String), - key: expect.any(String), - version: expect.any(Number), - createdAt: expect.any(String), - createdBy: expect.objectContaining({ - customer: expect.objectContaining({ typeId: 'customer' }), - }), - lastModifiedAt: expect.any(String), - lastModifiedBy: expect.objectContaining({ - customer: expect.objectContaining({ typeId: 'customer' }), - }), - name: expect.any(String), - description: expect.any(String), - attributes: expect.arrayContaining([ - expect.objectContaining({ - type: expect.objectContaining({ name: expect.any(String) }), - name: expect.any(String), - label: expect.objectContaining({ - de: expect.any(String), - en: expect.any(String), - fr: expect.any(String), - }), - isRequired: expect.any(Boolean), - attributeConstraint: expect.any(String), - inputTip: expect.objectContaining({ - de: expect.any(String), - en: expect.any(String), - fr: expect.any(String), - }), - inputHint: expect.any(String), - isSearchable: expect.any(Boolean), + typeId: 'product-type', + obj: expect.objectContaining({ + id: expect.any(String), + key: expect.any(String), + version: expect.any(Number), + createdAt: expect.any(String), + createdBy: expect.objectContaining({ + customer: expect.objectContaining({ typeId: 'customer' }), + }), + lastModifiedAt: expect.any(String), + lastModifiedBy: expect.objectContaining({ + customer: expect.objectContaining({ typeId: 'customer' }), }), - ]), + name: expect.any(String), + description: expect.any(String), + attributes: expect.arrayContaining([ + expect.objectContaining({ + type: expect.objectContaining({ name: expect.any(String) }), + name: expect.any(String), + label: expect.objectContaining({ + de: expect.any(String), + en: expect.any(String), + fr: expect.any(String), + }), + isRequired: expect.any(Boolean), + attributeConstraint: expect.any(String), + inputTip: expect.objectContaining({ + de: expect.any(String), + en: expect.any(String), + fr: expect.any(String), + }), + inputHint: expect.any(String), + isSearchable: expect.any(Boolean), + }), + ]), + }), }), createdBy: expect.objectContaining({ customer: expect.objectContaining({ typeId: 'customer' }), @@ -102,12 +110,26 @@ describe('builder', () => { }), }), priceMode: expect.any(String), - state: undefined, + state: null, taxCategory: expect.objectContaining({ + id: expect.any(String), typeId: 'tax-category', + obj: expect.objectContaining({ + id: expect.any(String), + key: expect.any(String), + name: expect.any(String), + rates: expect.any(Array), + }), }), productType: expect.objectContaining({ + id: expect.any(String), typeId: 'product-type', + obj: expect.objectContaining({ + id: expect.any(String), + key: expect.any(String), + name: expect.any(String), + description: expect.any(String), + }), }), createdBy: expect.objectContaining({ customer: expect.objectContaining({ typeId: 'customer' }), @@ -136,10 +158,8 @@ describe('builder', () => { }), }), priceMode: expect.any(String), - state: null, - stateRef: expect.objectContaining({ - typeId: 'state', - }), + state: undefined, + stateRef: undefined, taxCategory: expect.objectContaining({ __typename: 'TaxCategory', id: expect.any(String), @@ -160,6 +180,7 @@ describe('builder', () => { }), }), taxCategoryRef: expect.objectContaining({ + id: expect.any(String), typeId: 'tax-category', }), productType: expect.objectContaining({ @@ -184,6 +205,7 @@ describe('builder', () => { }), }), productTypeRef: expect.objectContaining({ + id: expect.any(String), typeId: 'product-type', }), skus: expect.arrayContaining([]), diff --git a/models/product/src/product/generator.ts b/models/product/src/product/generator.ts index 185256270..82debc404 100644 --- a/models/product/src/product/generator.ts +++ b/models/product/src/product/generator.ts @@ -1,4 +1,4 @@ -import { ClientLogging } from '@commercetools-test-data/commons'; +import { ClientLogging, Reference } from '@commercetools-test-data/commons'; import { fake, Generator, oneOf } from '@commercetools-test-data/core'; import { ProductType } from '@commercetools-test-data/product-type'; import { TaxCategory } from '@commercetools-test-data/tax-category'; @@ -16,9 +16,13 @@ const generator = Generator({ id: fake((f) => f.string.uuid()), version: fake((f) => f.number.int()), key: fake((f) => f.lorem.slug()), - productType: fake(() => ProductType.random()), + productType: fake(() => + Reference.presets.productTypeReference().obj(ProductType.random()) + ), masterData: fake(() => ProductCatalogData.random()), - taxCategory: fake(() => TaxCategory.random()), + taxCategory: fake(() => + Reference.presets.taxCategoryReference().obj(TaxCategory.random()) + ), state: null, reviewRatingStatistics: null, priceMode: oneOf(...Object.values(productPriceMode)), diff --git a/models/product/src/product/presets/boring-generic-milk.ts b/models/product/src/product/presets/boring-generic-milk.ts index 9f39fc5ae..2d06fd572 100644 --- a/models/product/src/product/presets/boring-generic-milk.ts +++ b/models/product/src/product/presets/boring-generic-milk.ts @@ -1,3 +1,4 @@ +import { Reference } from '@commercetools-test-data/commons'; import { ProductType } from '@commercetools-test-data/product-type'; import * as ProductCatalogData from '../../product-catalog-data'; import Product from '../builder'; @@ -5,7 +6,9 @@ import { TProductBuilder } from '../types'; const boringGenericMilk = (): TProductBuilder => Product() - .productType(ProductType.presets.milk()) + .productType( + Reference.presets.productTypeReference().obj(ProductType.presets.milk()) + ) .key('boring-generic-milk-key') .masterData( ProductCatalogData.presets.boringGenericMilkProductCatalogData() diff --git a/models/product/src/product/presets/happy-cow-milk.ts b/models/product/src/product/presets/happy-cow-milk.ts index ba8252d77..7269d0b7b 100644 --- a/models/product/src/product/presets/happy-cow-milk.ts +++ b/models/product/src/product/presets/happy-cow-milk.ts @@ -1,3 +1,4 @@ +import { Reference } from '@commercetools-test-data/commons'; import { ProductType } from '@commercetools-test-data/product-type'; import * as ProductCatalogData from '../../product-catalog-data'; import Product from '../builder'; @@ -5,7 +6,9 @@ import { TProductBuilder } from '../types'; const happyCowMilk = (): TProductBuilder => Product() - .productType(ProductType.presets.milk()) + .productType( + Reference.presets.productTypeReference().obj(ProductType.presets.milk()) + ) .key('happy-cow-milk-key') .masterData(ProductCatalogData.presets.happyCowMilkProductCatalogData()); diff --git a/models/product/src/product/transformers.ts b/models/product/src/product/transformers.ts index dfa84cae8..98b8cfdd3 100644 --- a/models/product/src/product/transformers.ts +++ b/models/product/src/product/transformers.ts @@ -1,5 +1,14 @@ import { Reference, TReferenceGraphql } from '@commercetools-test-data/commons'; -import { Transformer } from '@commercetools-test-data/core'; +import { buildField, Transformer } from '@commercetools-test-data/core'; +import { + ProductType, + TProductTypeGraphql, +} from '@commercetools-test-data/product-type'; +import { TStateGraphql, State } from '@commercetools-test-data/state'; +import { + TaxCategory, + TTaxCategoryGraphql, +} from '@commercetools-test-data/tax-category'; import type { TProduct, TProductRest, TProductGraphql } from './types'; const transformers = { @@ -14,19 +23,6 @@ const transformers = { ], }), rest: Transformer('rest', { - buildFields: ['masterData', 'createdBy', 'lastModifiedBy'], - replaceFields: ({ fields }) => { - return { - ...fields, - productType: Reference.random().typeId('product-type').buildRest(), - taxCategory: Reference.random().typeId('tax-category').buildRest(), - state: fields.state - ? Reference.random().id(fields.state.id).typeId('state').buildRest() - : undefined, - }; - }, - }), - graphql: Transformer('graphql', { buildFields: [ 'productType', 'masterData', @@ -35,25 +31,61 @@ const transformers = { 'createdBy', 'lastModifiedBy', ], - addFields: ({ fields }) => { - const productTypeRef: TReferenceGraphql = Reference.random() - .id(fields.productType.id) + }), + graphql: Transformer('graphql', { + buildFields: ['masterData', 'state', 'createdBy', 'lastModifiedBy'], + replaceFields: ({ fields }) => { + const restProductType = buildField(fields.productType, 'rest'); + const productType = ProductType.random() + .id(restProductType.id) + .key(restProductType.obj!.key) + .name(restProductType.obj!.name) + .description(restProductType.obj!.description) + .buildGraphql(); + const productTypeRef = Reference.random() + .id(restProductType.id) .typeId('product-type') - .buildGraphql(); + .buildGraphql(); + + let state: TStateGraphql | undefined; + let stateRef: TReferenceGraphql | undefined; + let taxCategory: TTaxCategoryGraphql | undefined; + let taxCategoryRef: TReferenceGraphql | undefined; - const stateRef: TReferenceGraphql = Reference.random() - .id(fields.productType.id) - .typeId('state') - .buildGraphql(); + if (fields.state) { + const restStateRef = buildField(fields.state, 'rest'); + stateRef = Reference.presets + .stateReference() + .id(restStateRef.id) + .buildGraphql(); + state = State.random() + .id(restStateRef.id) + .key(restStateRef.obj!.key) + .name(restStateRef.obj!.name) + .buildGraphql(); + } - const taxCategoryRef: TReferenceGraphql = Reference.random() - .id(fields.productType.id) - .typeId('tax-category') - .buildGraphql(); + if (fields.taxCategory) { + const restTaxCategoryRef = buildField(fields.taxCategory, 'rest'); + taxCategoryRef = Reference.presets + .taxCategoryReference() + .id(restTaxCategoryRef.id) + .buildGraphql(); + taxCategory = TaxCategory.random() + .id(restTaxCategoryRef.id) + .key(restTaxCategoryRef.obj!.key) + .name(restTaxCategoryRef.obj!.name) + .description(restTaxCategoryRef.obj!.description) + .buildGraphql(); + } return { + ...fields, + productType, productTypeRef, + state, stateRef, + taxCategory, taxCategoryRef, __typename: 'Product', }; diff --git a/models/product/src/product/types.ts b/models/product/src/product/types.ts index 33e1514dd..a9baa4cc1 100644 --- a/models/product/src/product/types.ts +++ b/models/product/src/product/types.ts @@ -4,6 +4,9 @@ import { TReferenceGraphql, } from '@commercetools-test-data/commons'; import type { TBuilder } from '@commercetools-test-data/core'; +import { TProductTypeGraphql } from '@commercetools-test-data/product-type'; +import { TStateGraphql } from '@commercetools-test-data/state'; +import { TTaxCategoryGraphql } from '@commercetools-test-data/tax-category'; export type TProduct = Product & { skus: Array; @@ -11,10 +14,16 @@ export type TProduct = Product & { export type TProductRest = Omit; -export type TProductGraphql = TProduct & { +export type TProductGraphql = Omit< + TProduct, + 'productType' | 'state' | 'taxCategory' +> & { + productType: TProductTypeGraphql; productTypeRef: TReferenceGraphql; - stateRef: TReferenceGraphql; - taxCategoryRef: TReferenceGraphql; + state?: TStateGraphql; + stateRef?: TReferenceGraphql; + taxCategory?: TTaxCategoryGraphql; + taxCategoryRef?: TReferenceGraphql; // TODO: add productSelectionRefs __typename: 'Product'; }; diff --git a/models/quote-request/package.json b/models/quote-request/package.json index 17d17f122..72dfddbe0 100644 --- a/models/quote-request/package.json +++ b/models/quote-request/package.json @@ -25,6 +25,7 @@ "@commercetools-test-data/core": "10.11.2", "@commercetools-test-data/customer": "10.11.2", "@commercetools-test-data/customer-group": "10.11.2", + "@commercetools-test-data/state": "10.11.2", "@commercetools-test-data/store": "10.11.2", "@commercetools-test-data/utils": "10.11.2", "@commercetools/platform-sdk": "7.21.0", diff --git a/models/quote-request/src/builder.spec.ts b/models/quote-request/src/builder.spec.ts index c0889409f..eb291866a 100644 --- a/models/quote-request/src/builder.spec.ts +++ b/models/quote-request/src/builder.spec.ts @@ -21,15 +21,23 @@ describe('builder', () => { quoteRequestState: expect.any(String), comment: null, customer: expect.objectContaining({ - email: expect.any(String), + id: expect.any(String), + typeId: 'customer', + obj: expect.objectContaining({ + email: expect.any(String), + }), }), customerGroup: expect.objectContaining({ - name: expect.any(String), - version: expect.any(Number), + id: expect.any(String), + typeId: 'customer-group', + obj: expect.objectContaining({ + name: expect.any(String), + version: expect.any(Number), + }), }), store: expect.objectContaining({ - id: expect.any(String), key: expect.any(String), + typeId: 'store', }), lineItems: expect.arrayContaining([ expect.objectContaining({ @@ -71,12 +79,15 @@ describe('builder', () => { directDiscounts: expect.arrayContaining([]), state: null, cart: expect.objectContaining({ + id: expect.any(String), typeId: 'cart', + obj: expect.objectContaining({ + taxMode: expect.any(String), + }), }), businessUnit: expect.objectContaining({ - id: expect.any(String), key: expect.any(String), - associateMode: expect.any(String), + typeId: 'business-unit', }), custom: null, createdAt: expect.any(String), @@ -90,6 +101,7 @@ describe('builder', () => { }) ) ); + it( ...createBuilderSpec( 'rest', @@ -103,11 +115,20 @@ describe('builder', () => { customer: expect.objectContaining({ id: expect.any(String), typeId: 'customer', + obj: expect.objectContaining({ + email: expect.any(String), + }), }), customerGroup: expect.objectContaining({ + id: expect.any(String), typeId: 'customer-group', + obj: expect.objectContaining({ + name: expect.any(String), + version: expect.any(Number), + }), }), store: expect.objectContaining({ + key: expect.any(String), typeId: 'store', }), lineItems: expect.arrayContaining([ @@ -148,11 +169,16 @@ describe('builder', () => { }), ]), directDiscounts: expect.arrayContaining([]), - state: undefined, + state: null, cart: expect.objectContaining({ + id: expect.any(String), typeId: 'cart', + obj: expect.objectContaining({ + taxMode: expect.any(String), + }), }), businessUnit: expect.objectContaining({ + key: expect.any(String), typeId: 'business-unit', }), custom: null, @@ -238,8 +264,13 @@ describe('builder', () => { }), ]), directDiscounts: expect.arrayContaining([]), - state: null, + state: undefined, stateRef: undefined, + cart: expect.objectContaining({ + id: expect.any(String), + taxMode: expect.any(String), + __typename: 'Cart', + }), cartRef: expect.objectContaining({ typeId: 'cart', __typename: 'Reference', @@ -247,7 +278,7 @@ describe('builder', () => { businessUnit: expect.objectContaining({ id: expect.any(String), key: expect.any(String), - associateMode: expect.any(String), + name: expect.any(String), }), businessUnitRef: expect.objectContaining({ typeId: 'business-unit', diff --git a/models/quote-request/src/generator.ts b/models/quote-request/src/generator.ts index 8e1d14022..ed6012249 100644 --- a/models/quote-request/src/generator.ts +++ b/models/quote-request/src/generator.ts @@ -1,10 +1,10 @@ -import { Company } from '@commercetools-test-data/business-unit'; -import { LineItem } from '@commercetools-test-data/cart'; +import { Cart, LineItem } from '@commercetools-test-data/cart'; import { CentPrecisionMoney, ClientLogging, Address, Reference, + KeyReference, } from '@commercetools-test-data/commons'; import { sequence, @@ -14,7 +14,6 @@ import { } from '@commercetools-test-data/core'; import { Customer } from '@commercetools-test-data/customer'; import { CustomerGroup } from '@commercetools-test-data/customer-group'; -import { Store } from '@commercetools-test-data/store'; import { createRelatedDates } from '@commercetools-test-data/utils'; import { QUOTE_REQUEST_STATE, @@ -36,9 +35,13 @@ const generator = Generator({ key: fake((f) => f.lorem.slug(2)), quoteRequestState: oneOf(...Object.values(QUOTE_REQUEST_STATE)), comment: null, - customer: fake(() => Customer.random()), - customerGroup: fake(() => CustomerGroup.random()), - store: fake(() => Store.random()), + customer: fake(() => + Reference.presets.customerReference().obj(Customer.random()) + ), + customerGroup: fake(() => + Reference.presets.customerGroupReference().obj(CustomerGroup.random()) + ), + store: fake(() => KeyReference.presets.store()), lineItems: fake(() => [LineItem.random()]), customLineItems: [], totalPrice: fake(() => CentPrecisionMoney.random()), @@ -57,8 +60,11 @@ const generator = Generator({ directDiscounts: [], state: null, purchaseOrderNumber: null, - cart: fake(() => Reference.random().typeId('cart')), - businessUnit: fake(() => Company.random()), + cart: fake(() => Reference.presets.cartReference().obj(Cart.random())), + businessUnit: fake( + () => KeyReference.presets.businessUnit() + // Reference.presets.businessUnitReference().obj(Company.random()) + ), custom: null, createdAt: fake(getOlderDate), createdBy: fake(() => ClientLogging.random()), diff --git a/models/quote-request/src/transformers.ts b/models/quote-request/src/transformers.ts index 82897328a..92dfdbece 100644 --- a/models/quote-request/src/transformers.ts +++ b/models/quote-request/src/transformers.ts @@ -1,16 +1,25 @@ import { - BusinessUnitKeyReference, - StoreKeyReference, -} from '@commercetools/platform-sdk'; + Company, + TCompanyGraphql, + TDivisionGraphql, +} from '@commercetools-test-data/business-unit'; +import { Cart, TCartGraphql } from '@commercetools-test-data/cart'; import { Reference, KeyReference, - TReference, TReferenceGraphql, TKeyReferenceGraphql, + LocalizedString, } from '@commercetools-test-data/commons'; -import { Transformer } from '@commercetools-test-data/core'; +import { buildField, Transformer } from '@commercetools-test-data/core'; +import { Customer, TCustomerGraphql } from '@commercetools-test-data/customer'; +import { + CustomerGroup, + TCustomerGroupGraphql, +} from '@commercetools-test-data/customer-group'; +import { State, TStateGraphql } from '@commercetools-test-data/state'; +import { Store, TStoreGraphql } from '@commercetools-test-data/store'; import type { TQuoteRequest, TQuoteRequestRest, @@ -53,107 +62,128 @@ const transformers = { 'createdBy', 'lastModifiedBy', ], - replaceFields: ({ fields }) => { - const customer = Reference.presets - .customerReference() - .id(fields.customer.id) - .build>(); - - const customerGroup = Reference.presets - .customerGroupReference() - .id(fields.customerGroup?.id) - .build>(); - - const store = KeyReference.random() - .typeId('store') - .key(fields.store?.key) - .buildRest(); - - const state = Reference.presets - .stateReference() - .id(fields.state?.id) - .build>(); - - const businessUnit = KeyReference.random() - .typeId('business-unit') - .key(fields.businessUnit?.key) - .buildRest(); - - return { - ...fields, - customer, - customerGroup: fields.customerGroup ? customerGroup : undefined, - store: fields.store ? store : undefined, - state: fields.state ? state : undefined, - businessUnit: fields.businessUnit ? businessUnit : undefined, - }; - }, }), graphql: Transformer('graphql', { buildFields: [ - 'customer', - 'customerGroup', - 'store', 'lineItems', 'totalPrice', 'shippingAddress', 'billingAddress', 'itemShippingAddresses', - 'state', - 'cart', - 'businessUnit', 'custom', 'createdBy', 'lastModifiedBy', ], - addFields: ({ fields }) => { - const customerRef: TReferenceGraphql = Reference.presets + replaceFields: ({ fields }) => { + let businessUnit: TCompanyGraphql | TDivisionGraphql | undefined = + undefined; + let businessUnitRef: TKeyReferenceGraphql | undefined = undefined; + let cart: TCartGraphql | undefined = undefined; + let cartRef: TReferenceGraphql | undefined = undefined; + let customerGroup: TCustomerGroupGraphql | undefined = undefined; + let customerGroupRef: TReferenceGraphql | undefined = undefined; + let state: TStateGraphql | undefined = undefined; + let stateRef: TReferenceGraphql | undefined = undefined; + let store: TStoreGraphql | undefined = undefined; + let storeRef: TKeyReferenceGraphql | undefined = undefined; + + const restCustomerRef = buildField(fields.customer, 'rest'); + const customerRef = Reference.presets .customerReference() - .id(fields.customer.id) - .typeId('customer') - .buildGraphql(); + .id(restCustomerRef.id) + .buildGraphql(); + const customer = Customer.random() + .id(restCustomerRef.id) + .firstName(restCustomerRef.obj?.firstName) + .lastName(restCustomerRef.obj?.lastName) + .key(restCustomerRef.obj?.key) + .email(restCustomerRef.obj?.email || '') + .buildGraphql(); - const customerGroupRef: TReferenceGraphql = Reference.presets - .customerGroupReference() - .id(fields.customerGroup?.id) - .typeId('customer-group') - .buildGraphql(); + if (fields.businessUnit) { + const restBusinessUnitRef = buildField(fields.businessUnit, 'rest'); + businessUnitRef = KeyReference.presets + .businessUnit() + .key(restBusinessUnitRef.key) + .buildGraphql(); + businessUnit = Company.random() + .key(restBusinessUnitRef.key) + .buildGraphql(); + } - const storeRef: TKeyReferenceGraphql = KeyReference.presets - .store() - .key(fields.store?.key) - .buildGraphql(); + if (fields.cart) { + const restCartRef = buildField(fields.cart, 'rest'); + cartRef = Reference.presets + .cartReference() + .id(fields.cart.id) + .buildGraphql(); + cart = Cart.random() + .id(restCartRef.id) + .key(restCartRef.obj?.key) + .customerId(restCartRef.obj?.customerId) + .customerEmail(restCartRef.obj?.customerEmail) + .buildGraphql(); + } - const stateRef: TReferenceGraphql = Reference.presets - .stateReference() - .id(fields.state?.id) - .typeId('state') - .buildGraphql(); + if (fields.customerGroup) { + const restCustomerGroupRef = buildField(fields.customerGroup, 'rest'); + customerGroupRef = Reference.presets + .customerGroupReference() + .id(restCustomerGroupRef.id) + .buildGraphql(); + customerGroup = CustomerGroup.random() + .id(restCustomerGroupRef.id) + .key(restCustomerGroupRef.obj?.key) + .buildGraphql(); + } - const cartRef: TReferenceGraphql | null = fields.cart - ? Reference.presets - .cartReference() - .id(fields.cart.id) - .typeId('cart') - .buildGraphql() - : null; + if (fields.state) { + const restStateRef = buildField(fields.state, 'rest'); + stateRef = Reference.presets + .stateReference() + .id(restStateRef.id) + .buildGraphql(); + state = State.random() + .id(restStateRef.id) + .key(restStateRef.obj?.key || '') + .type(restStateRef.obj?.type || '') + .name( + LocalizedString.presets + .empty() + .en(restStateRef.obj?.name?.en) + .de(restStateRef.obj?.name?.de) + ) + .buildGraphql(); + } - const businessUnitRef: TKeyReferenceGraphql = KeyReference.presets - .businessUnit() - .key(fields.businessUnit?.key) - .buildGraphql(); + if (fields.store) { + const restStoreRef = buildField(fields.store, 'rest'); + storeRef = KeyReference.presets + .store() + .key(restStoreRef.key) + .buildGraphql(); + store = Store.random() + .key(restStoreRef.key) + .buildGraphql(); + } return { + ...fields, + customer, customerRef, - customerGroupRef: fields.customerGroup ? customerGroupRef : undefined, - storeRef: fields.store ? storeRef : undefined, - stateRef: fields.state ? stateRef : undefined, - cartRef: fields.cart ? cartRef : undefined, - businessUnitRef: fields.businessUnit ? businessUnitRef : undefined, + customerGroup, + customerGroupRef, + store, + storeRef, + state, + stateRef, + cart, + cartRef, + businessUnit, + businessUnitRef, __typename: 'QuoteRequest', }; }, - removeFields: ['cart'], }), }; diff --git a/models/quote-request/src/types.ts b/models/quote-request/src/types.ts index ccadb304a..b6b67a3dc 100644 --- a/models/quote-request/src/types.ts +++ b/models/quote-request/src/types.ts @@ -1,43 +1,48 @@ import type { - BusinessUnit, - Customer, - CustomerGroup, - State, - Store, QuoteRequest, QuoteRequestDraft, } from '@commercetools/platform-sdk'; +import { + TCompanyGraphql, + TDivisionGraphql, +} from '@commercetools-test-data/business-unit'; +import { TCartGraphql } from '@commercetools-test-data/cart'; import { TReferenceGraphql, TKeyReferenceGraphql, } from '@commercetools-test-data/commons'; import type { TBuilder } from '@commercetools-test-data/core'; +import { TCustomerGraphql } from '@commercetools-test-data/customer'; +import { TCustomerGroupGraphql } from '@commercetools-test-data/customer-group'; +import { TStateGraphql } from '@commercetools-test-data/state'; +import { TStoreGraphql } from '@commercetools-test-data/store'; // Default -export type TQuoteRequest = Omit< - QuoteRequest, - 'customer' | 'customerGroup' | 'store' | 'state' | 'businessUnit' -> & { - customer: Customer; - customerGroup: CustomerGroup; - store: Store; - state: State; - businessUnit: BusinessUnit; -}; +export type TQuoteRequest = QuoteRequest; // Rest export type TQuoteRequestRest = QuoteRequest; export type TQuoteRequestDraft = QuoteRequestDraft; -export type TQuoteRequestGraphql = TQuoteRequest & { - customerRef: TReferenceGraphql | null; - customerGroupRef: TReferenceGraphql | null; - storeRef: TKeyReferenceGraphql | null; - stateRef: TReferenceGraphql | null; - cartRef: TReferenceGraphql | null; - businessUnitRef: TKeyReferenceGraphql | null; +export type TQuoteRequestGraphql = Omit< + TQuoteRequest, + 'cart' | 'businessUnit' | 'customer' | 'customerGroup' | 'state' | 'store' +> & { + businessUnit?: TCompanyGraphql | TDivisionGraphql; + businessUnitRef?: TKeyReferenceGraphql | null; + cart?: TCartGraphql; + cartRef?: TReferenceGraphql; + customer: TCustomerGraphql; + customerRef: TReferenceGraphql; + customerGroup?: TCustomerGroupGraphql; + customerGroupRef?: TReferenceGraphql; + state?: TStateGraphql; + stateRef?: TReferenceGraphql; + store?: TStoreGraphql; + storeRef?: TKeyReferenceGraphql; __typename: 'QuoteRequest'; }; + export type TQuoteRequestDraftGraphql = TQuoteRequestDraft; export type TQuoteRequestBuilder = TBuilder; diff --git a/models/quote/package.json b/models/quote/package.json index 20177764c..7b9309ff3 100644 --- a/models/quote/package.json +++ b/models/quote/package.json @@ -27,6 +27,7 @@ "@commercetools-test-data/customer-group": "10.11.2", "@commercetools-test-data/quote-request": "10.11.2", "@commercetools-test-data/staged-quote": "^10.11.2", + "@commercetools-test-data/state": "10.11.2", "@commercetools-test-data/store": "10.11.2", "@commercetools-test-data/utils": "10.11.2", "@commercetools/platform-sdk": "7.21.0", diff --git a/models/quote/src/builder.spec.ts b/models/quote/src/builder.spec.ts index 463160a46..def3cf765 100644 --- a/models/quote/src/builder.spec.ts +++ b/models/quote/src/builder.spec.ts @@ -15,24 +15,40 @@ describe('builder', () => { version: expect.any(Number), key: expect.any(String), quoteRequest: expect.objectContaining({ - quoteRequestState: expect.any(String), + id: expect.any(String), + typeId: 'quote-request', + obj: expect.objectContaining({ + quoteRequestState: expect.any(String), + }), }), stagedQuote: expect.objectContaining({ - stagedQuoteState: expect.any(String), + id: expect.any(String), + typeId: 'staged-quote', + obj: expect.objectContaining({ + stagedQuoteState: expect.any(String), + }), }), customer: expect.objectContaining({ - email: expect.any(String), + id: expect.any(String), + typeId: 'customer', + obj: expect.objectContaining({ + email: expect.any(String), + }), }), customerGroup: expect.objectContaining({ - name: expect.any(String), - version: expect.any(Number), + id: expect.any(String), + typeId: 'customer-group', + obj: expect.objectContaining({ + name: expect.any(String), + version: expect.any(Number), + }), }), validTo: expect.any(String), sellerComment: expect.any(String), buyerComment: expect.any(String), store: expect.objectContaining({ - id: expect.any(String), key: expect.any(String), + typeId: 'store', }), lineItems: expect.arrayContaining([ expect.objectContaining({ @@ -76,9 +92,8 @@ describe('builder', () => { state: null, purchaseOrderNumber: null, businessUnit: expect.objectContaining({ - id: expect.any(String), key: expect.any(String), - associateMode: expect.any(String), + typeId: 'business-unit', }), custom: null, createdAt: expect.any(String), @@ -103,17 +118,31 @@ describe('builder', () => { quoteRequest: expect.objectContaining({ id: expect.any(String), typeId: 'quote-request', + obj: expect.objectContaining({ + quoteRequestState: expect.any(String), + }), }), stagedQuote: expect.objectContaining({ id: expect.any(String), typeId: 'staged-quote', + obj: expect.objectContaining({ + stagedQuoteState: expect.any(String), + }), }), customer: expect.objectContaining({ id: expect.any(String), typeId: 'customer', + obj: expect.objectContaining({ + email: expect.any(String), + }), }), customerGroup: expect.objectContaining({ + id: expect.any(String), typeId: 'customer-group', + obj: expect.objectContaining({ + name: expect.any(String), + version: expect.any(Number), + }), }), validTo: expect.any(String), sellerComment: expect.any(String), @@ -161,7 +190,7 @@ describe('builder', () => { ]), directDiscounts: expect.arrayContaining([]), quoteState: expect.any(String), - state: undefined, + state: null, businessUnit: expect.objectContaining({ key: expect.any(String), typeId: 'business-unit', @@ -267,7 +296,7 @@ describe('builder', () => { ]), directDiscounts: expect.arrayContaining([]), quoteState: expect.any(String), - state: null, + state: undefined, stateRef: undefined, businessUnit: expect.objectContaining({ id: expect.any(String), diff --git a/models/quote/src/generator.ts b/models/quote/src/generator.ts index 1cb1a21e1..12786892e 100644 --- a/models/quote/src/generator.ts +++ b/models/quote/src/generator.ts @@ -1,9 +1,10 @@ -import { Company } from '@commercetools-test-data/business-unit'; import { LineItem } from '@commercetools-test-data/cart'; import { CentPrecisionMoney, ClientLogging, Address, + Reference, + KeyReference, } from '@commercetools-test-data/commons'; import { sequence, @@ -15,7 +16,6 @@ import { Customer } from '@commercetools-test-data/customer'; import { CustomerGroup } from '@commercetools-test-data/customer-group'; import { QuoteRequest } from '@commercetools-test-data/quote-request'; import { StagedQuote } from '@commercetools-test-data/staged-quote'; -import { Store } from '@commercetools-test-data/store'; import { createRelatedDates } from '@commercetools-test-data/utils'; import { QUOTE_STATE, @@ -35,14 +35,22 @@ const generator = Generator({ id: fake((f) => f.string.uuid()), version: sequence(), key: fake((f) => f.lorem.slug(2)), - quoteRequest: fake(() => QuoteRequest.random()), - stagedQuote: fake(() => StagedQuote.random()), - customer: fake(() => Customer.random()), - customerGroup: fake(() => CustomerGroup.random()), + quoteRequest: fake(() => + Reference.presets.quoteRequestReference().obj(QuoteRequest.random()) + ), + stagedQuote: fake(() => + Reference.presets.stagedQuoteReference().obj(StagedQuote.random()) + ), + customer: fake(() => + Reference.presets.customerReference().obj(Customer.random()) + ), + customerGroup: fake(() => + Reference.presets.customerGroupReference().obj(CustomerGroup.random()) + ), validTo: fake(getFutureDate), sellerComment: fake((f) => f.lorem.words(5)), buyerComment: fake((f) => f.lorem.words(5)), - store: fake(() => Store.random()), + store: fake(() => KeyReference.presets.store()), lineItems: fake(() => [LineItem.random()]), customLineItems: [], totalPrice: fake(() => CentPrecisionMoney.random()), @@ -62,7 +70,10 @@ const generator = Generator({ quoteState: oneOf(...Object.values(QUOTE_STATE)), state: null, purchaseOrderNumber: null, - businessUnit: fake(() => Company.random()), + businessUnit: fake( + () => KeyReference.presets.businessUnit().key('company') + // Reference.random().typeId('company').obj(Company.random()) + ), custom: null, createdAt: fake(getOlderDate), createdBy: fake(() => ClientLogging.random()), diff --git a/models/quote/src/transformers.ts b/models/quote/src/transformers.ts index 8e3f26888..640e010bc 100644 --- a/models/quote/src/transformers.ts +++ b/models/quote/src/transformers.ts @@ -1,16 +1,32 @@ import { - BusinessUnitKeyReference, - StoreKeyReference, -} from '@commercetools/platform-sdk'; + Company, + TCompanyGraphql, + TDivisionGraphql, +} from '@commercetools-test-data/business-unit'; import { Reference, KeyReference, - TReference, TReferenceGraphql, TKeyReferenceGraphql, + LocalizedString, } from '@commercetools-test-data/commons'; -import { Transformer } from '@commercetools-test-data/core'; +import { buildField, Transformer } from '@commercetools-test-data/core'; +import { Customer, TCustomerGraphql } from '@commercetools-test-data/customer'; +import { + CustomerGroup, + TCustomerGroupGraphql, +} from '@commercetools-test-data/customer-group'; +import { + QuoteRequest, + TQuoteRequestGraphql, +} from '@commercetools-test-data/quote-request'; +import { + StagedQuote, + TStagedQuoteGraphql, +} from '@commercetools-test-data/staged-quote'; +import { State, TStateGraphql } from '@commercetools-test-data/state'; +import { Store } from '@commercetools-test-data/store'; import type { TQuote, TQuoteRest, TQuoteGraphql } from './types'; const transformers = { @@ -55,61 +71,9 @@ const transformers = { 'createdBy', 'lastModifiedBy', ], - replaceFields: ({ fields }) => { - const quoteRequest = Reference.presets - .quoteRequestReference() - .id(fields.quoteRequest.id) - .build>(); - - const stagedQuote = Reference.presets - .stagedQuoteReference() - .id(fields.stagedQuote.id) - .build>(); - - const customer = Reference.presets - .customerReference() - .id(fields.customer.id) - .build>(); - - const customerGroup = Reference.presets - .customerGroupReference() - .id(fields.customerGroup?.id) - .build>(); - - const store = KeyReference.presets - .store() - .key(fields.store?.key) - .buildRest(); - - const state = Reference.presets - .stateReference() - .id(fields.state?.id) - .build>(); - - const businessUnit = KeyReference.presets - .businessUnit() - .key(fields.businessUnit?.key) - .buildRest(); - - return { - ...fields, - quoteRequest, - stagedQuote, - customer, - customerGroup: fields.customerGroup ? customerGroup : undefined, - store: fields.store ? store : undefined, - state: fields.state ? state : undefined, - businessUnit: fields.businessUnit ? businessUnit : undefined, - }; - }, }), graphql: Transformer('graphql', { buildFields: [ - 'quoteRequest', - 'stagedQuote', - 'customer', - 'customerGroup', - 'store', 'lineItems', 'customLineItems', 'totalPrice', @@ -117,59 +81,127 @@ const transformers = { 'billingAddress', 'itemShippingAddresses', 'directDiscounts', - 'state', - 'businessUnit', 'custom', 'createdBy', 'lastModifiedBy', ], - addFields: ({ fields }) => { + replaceFields: ({ fields }) => { + let businessUnit: TCompanyGraphql | TDivisionGraphql | undefined = + undefined; + let businessUnitRef: TKeyReferenceGraphql | undefined = undefined; + let customer: TCustomerGraphql | undefined = undefined; + let customerRef: TReferenceGraphql | undefined = undefined; + let customerGroup: TCustomerGroupGraphql | undefined = undefined; + let customerGroupRef: TReferenceGraphql | undefined = undefined; + let state: TStateGraphql | undefined = undefined; + let stateRef: TReferenceGraphql | undefined = undefined; + let store: TReferenceGraphql | undefined = undefined; + let storeRef: TKeyReferenceGraphql | undefined = undefined; + + const restQuoteRequestRef = buildField(fields.quoteRequest, 'rest'); const quoteRequestRef: TReferenceGraphql = Reference.presets .quoteRequestReference() - .id(fields.quoteRequest.id) + .id(restQuoteRequestRef.id) .buildGraphql(); + const quoteRequest = QuoteRequest.random() + .id(restQuoteRequestRef.id) + .key(restQuoteRequestRef.obj?.key) + .buildGraphql(); + const restStagedQuoteRef = buildField(fields.stagedQuote, 'rest'); const stagedQuoteRef: TReferenceGraphql = Reference.presets .stagedQuoteReference() - .id(fields.stagedQuote.id) - .buildGraphql(); - - const customerRef: TReferenceGraphql = Reference.presets - .customerReference() - .id(fields.customer.id) - .typeId('customer') - .buildGraphql(); - - const customerGroupRef: TReferenceGraphql = Reference.presets - .customerGroupReference() - .id(fields.customerGroup?.id) - .typeId('customer-group') - .buildGraphql(); - - const storeRef: TKeyReferenceGraphql = KeyReference.presets - .store() - .key(fields.store?.key) - .buildGraphql(); - - const stateRef: TReferenceGraphql = Reference.presets - .stateReference() - .id(fields.state?.id) - .typeId('state') - .buildGraphql(); - - const businessUnitRef: TKeyReferenceGraphql = KeyReference.presets - .businessUnit() - .key(fields.businessUnit?.key) + .id(restStagedQuoteRef.id) .buildGraphql(); + const stagedQuote = StagedQuote.random() + .id(restStagedQuoteRef.id) + .key(restStagedQuoteRef.obj?.key) + .buildGraphql(); + + if (fields.businessUnit) { + const restBusinessUnitRef = buildField(fields.businessUnit, 'rest'); + businessUnitRef = KeyReference.presets + .businessUnit() + .key(restBusinessUnitRef.key) + .buildGraphql(); + businessUnit = Company.random() + .key(restBusinessUnitRef.key) + .buildGraphql(); + } + + if (fields.customer) { + const restCustomerRef = buildField(fields.customer, 'rest'); + customerRef = Reference.presets + .customerReference() + .id(restCustomerRef.id) + .buildGraphql(); + customer = Customer.random() + .id(restCustomerRef.id) + .firstName(restCustomerRef.obj?.firstName) + .lastName(restCustomerRef.obj?.lastName) + .key(restCustomerRef.obj?.key) + .email(restCustomerRef.obj?.email || '') + .buildGraphql(); + } + + if (fields.customerGroup) { + const restCustomerGroupRef = buildField(fields.customerGroup, 'rest'); + customerGroupRef = Reference.presets + .customerGroupReference() + .id(restCustomerGroupRef.id) + .buildGraphql(); + customerGroup = CustomerGroup.random() + .id(restCustomerGroupRef.id) + .key(restCustomerGroupRef.obj?.key) + .buildGraphql(); + } + + if (fields.state) { + const restStateRef = buildField(fields.state, 'rest'); + stateRef = Reference.presets + .stateReference() + .id(restStateRef.id) + .buildGraphql(); + state = State.random() + .id(restStateRef.id) + .key(restStateRef.obj?.key || '') + .type(restStateRef.obj?.type || '') + .name( + LocalizedString.presets + .empty() + .en(restStateRef.obj?.name?.en) + .de(restStateRef.obj?.name?.de) + ) + .buildGraphql(); + } + + if (fields.store) { + const restStoreRef = buildField(fields.store, 'rest'); + storeRef = KeyReference.presets + .store() + .key(restStoreRef.key) + .buildGraphql(); + store = Store.random() + .key(restStoreRef.key) + .buildGraphql(); + } return { + ...fields, + quoteRequest, quoteRequestRef, + stagedQuote, stagedQuoteRef, + customer, customerRef, - customerGroupRef: fields.customerGroup ? customerGroupRef : undefined, - storeRef: fields.store ? storeRef : undefined, - stateRef: fields.state ? stateRef : undefined, - businessUnitRef: fields.businessUnit ? businessUnitRef : undefined, + customerGroup, + customerGroupRef, + state, + stateRef, + store, + storeRef, + businessUnit, + businessUnitRef, __typename: 'Quote', }; }, diff --git a/models/quote/src/types.ts b/models/quote/src/types.ts index a9ca5c3a6..b0995cbd8 100644 --- a/models/quote/src/types.ts +++ b/models/quote/src/types.ts @@ -1,23 +1,28 @@ -import type { - BusinessUnit, - Customer, - CustomerGroup, - Quote, - QuoteDraft, - QuoteRequest, - StagedQuote, - State, - Store, -} from '@commercetools/platform-sdk'; +import type { Quote, QuoteDraft } from '@commercetools/platform-sdk'; +import { + TCompanyGraphql, + TDivisionGraphql, +} from '@commercetools-test-data/business-unit'; import { TReferenceGraphql, TKeyReferenceGraphql, } from '@commercetools-test-data/commons'; import type { TBuilder } from '@commercetools-test-data/core'; +import { TCustomerGraphql } from '@commercetools-test-data/customer'; +import { TCustomerGroupGraphql } from '@commercetools-test-data/customer-group'; +import { TQuoteRequestGraphql } from '@commercetools-test-data/quote-request'; +import { TStagedQuoteGraphql } from '@commercetools-test-data/staged-quote'; +import { TStateGraphql } from '@commercetools-test-data/state'; // Default -export type TQuote = Omit< - Quote, +export type TQuote = Quote; + +// Rest +export type TQuoteRest = Quote; +export type TQuoteDraft = QuoteDraft; + +export type TQuoteGraphql = Omit< + TQuote, | 'businessUnit' | 'customer' | 'customerGroup' @@ -26,27 +31,20 @@ export type TQuote = Omit< | 'state' | 'store' > & { - businessUnit: BusinessUnit; - customer: Customer; - customerGroup: CustomerGroup; - quoteRequest: QuoteRequest; - stagedQuote: StagedQuote; - state: State; - store: Store; -}; - -// Rest -export type TQuoteRest = Quote; -export type TQuoteDraft = QuoteDraft; - -export type TQuoteGraphql = TQuote & { - businessUnitRef: TKeyReferenceGraphql | null; - customerRef: TReferenceGraphql | null; - customerGroupRef: TReferenceGraphql | null; - quoteReqestRef: TReferenceGraphql; + businessUnit?: TCompanyGraphql | TDivisionGraphql; + businessUnitRef?: TKeyReferenceGraphql; + customer?: TCustomerGraphql; + customerRef?: TReferenceGraphql; + customerGroup?: TCustomerGroupGraphql; + customerGroupRef?: TReferenceGraphql; + quoteRequest: TQuoteRequestGraphql; + quoteRequestRef: TReferenceGraphql; + stagedQuote: TStagedQuoteGraphql; stagedQuoteRef: TReferenceGraphql; - stateRef: TReferenceGraphql | null; - storeRef: TKeyReferenceGraphql | null; + state?: TStateGraphql; + stateRef?: TReferenceGraphql; + store?: TReferenceGraphql; + storeRef?: TKeyReferenceGraphql; __typename: 'Quote'; }; export type TQuoteDraftGraphql = TQuoteDraft; diff --git a/models/staged-quote/package.json b/models/staged-quote/package.json index c96f67bee..621d820df 100644 --- a/models/staged-quote/package.json +++ b/models/staged-quote/package.json @@ -26,6 +26,7 @@ "@commercetools-test-data/customer": "10.11.2", "@commercetools-test-data/customer-group": "10.11.2", "@commercetools-test-data/quote-request": "10.11.2", + "@commercetools-test-data/state": "10.11.2", "@commercetools-test-data/store": "10.11.2", "@commercetools-test-data/utils": "10.11.2", "@commercetools/platform-sdk": "7.21.0", diff --git a/models/staged-quote/src/builder.spec.ts b/models/staged-quote/src/builder.spec.ts index 22df52bca..2863a8d15 100644 --- a/models/staged-quote/src/builder.spec.ts +++ b/models/staged-quote/src/builder.spec.ts @@ -20,22 +20,33 @@ describe('builder', () => { key: expect.any(String), stagedQuoteState: expect.any(String), customer: expect.objectContaining({ - email: expect.any(String), + id: expect.any(String), + typeId: 'customer', + obj: expect.objectContaining({ + email: expect.any(String), + }), }), quoteRequest: expect.objectContaining({ - quoteRequestState: expect.any(String), + id: expect.any(String), + typeId: 'quote-request', + obj: expect.objectContaining({ + quoteRequestState: expect.any(String), + }), }), quotationCart: expect.objectContaining({ - cartState: expect.any(String), + id: expect.any(String), + typeId: 'cart', + obj: expect.objectContaining({ + cartState: expect.any(String), + }), }), validTo: expect.any(String), sellerComment: expect.any(String), state: null, purchaseOrderNumber: null, businessUnit: expect.objectContaining({ - id: expect.any(String), key: expect.any(String), - associateMode: expect.any(String), + typeId: 'business-unit', }), custom: null, createdAt: expect.any(String), @@ -61,18 +72,30 @@ describe('builder', () => { customer: expect.objectContaining({ id: expect.any(String), typeId: 'customer', + obj: expect.objectContaining({ + email: expect.any(String), + }), }), quoteRequest: expect.objectContaining({ + id: expect.any(String), typeId: 'quote-request', + obj: expect.objectContaining({ + quoteRequestState: expect.any(String), + }), }), quotationCart: expect.objectContaining({ + id: expect.any(String), typeId: 'cart', + obj: expect.objectContaining({ + cartState: expect.any(String), + }), }), validTo: expect.any(String), sellerComment: expect.any(String), - state: undefined, + state: null, purchaseOrderNumber: null, businessUnit: expect.objectContaining({ + key: expect.any(String), typeId: 'business-unit', }), custom: null, @@ -119,7 +142,7 @@ describe('builder', () => { }), validTo: expect.any(String), sellerComment: expect.any(String), - state: null, + state: undefined, stateRef: undefined, purchaseOrderNumber: null, businessUnit: expect.objectContaining({ diff --git a/models/staged-quote/src/generator.ts b/models/staged-quote/src/generator.ts index ba446c965..eba14c8e1 100644 --- a/models/staged-quote/src/generator.ts +++ b/models/staged-quote/src/generator.ts @@ -1,6 +1,9 @@ -import { Company } from '@commercetools-test-data/business-unit'; import { Cart } from '@commercetools-test-data/cart'; -import { ClientLogging } from '@commercetools-test-data/commons'; +import { + ClientLogging, + KeyReference, + Reference, +} from '@commercetools-test-data/commons'; import { sequence, fake, @@ -23,14 +26,20 @@ const generator = Generator({ version: sequence(), key: fake((f) => f.lorem.slug(2)), stagedQuoteState: oneOf(...Object.values(STAGED_QUOTE_STATE)), - customer: fake(() => Customer.random()), - quoteRequest: fake(() => QuoteRequest.random()), - quotationCart: fake(() => Cart.random()), + customer: fake(() => + Reference.presets.customerReference().obj(Customer.random()) + ), + quoteRequest: fake(() => + Reference.presets.quoteRequestReference().obj(QuoteRequest.random()) + ), + quotationCart: fake(() => + Reference.presets.cartReference().obj(Cart.random()) + ), validTo: fake(getFutureDate), sellerComment: fake((f) => f.lorem.words(5)), state: null, purchaseOrderNumber: null, - businessUnit: fake(() => Company.random()), + businessUnit: fake(() => KeyReference.presets.businessUnit()), custom: null, createdAt: fake(getOlderDate), createdBy: fake(() => ClientLogging.random()), diff --git a/models/staged-quote/src/transformers.ts b/models/staged-quote/src/transformers.ts index 9ab7851c2..3c998407c 100644 --- a/models/staged-quote/src/transformers.ts +++ b/models/staged-quote/src/transformers.ts @@ -1,13 +1,23 @@ -import { BusinessUnitKeyReference } from '@commercetools/platform-sdk'; +import { + Company, + TCompanyGraphql, +} from '@commercetools-test-data/business-unit'; +import { Cart, TCartGraphql } from '@commercetools-test-data/cart'; import { Reference, KeyReference, - TReference, TReferenceGraphql, TKeyReferenceGraphql, + LocalizedString, } from '@commercetools-test-data/commons'; -import { Transformer } from '@commercetools-test-data/core'; +import { buildField, Transformer } from '@commercetools-test-data/core'; +import { Customer, TCustomerGraphql } from '@commercetools-test-data/customer'; +import { + QuoteRequest, + TQuoteRequestGraphql, +} from '@commercetools-test-data/quote-request'; +import { State, TStateGraphql } from '@commercetools-test-data/state'; import type { TStagedQuote, TStagedQuoteRest, @@ -38,89 +48,94 @@ const transformers = { 'createdBy', 'lastModifiedBy', ], - replaceFields: ({ fields }) => { - const customer = Reference.presets - .customerReference() - .id(fields.customer.id) - .build>(); - - const quoteRequest = Reference.presets - .quoteRequestReference() - .id(fields.quoteRequest.id) - .build>(); - - const quotationCart = Reference.presets - .cartReference() - .id(fields.quotationCart.id) - .build>(); - - const state = Reference.presets - .stateReference() - .id(fields.state?.id) - .build>(); - - const businessUnit = KeyReference.presets - .businessUnit() - .key(fields.businessUnit?.key) - .buildRest(); - - return { - ...fields, - customer, - quoteRequest, - quotationCart, - state: fields.state ? state : undefined, - businessUnit: fields.businessUnit ? businessUnit : undefined, - }; - }, }), graphql: Transformer('graphql', { - buildFields: [ - 'customer', - 'quoteRequest', - 'quotationCart', - 'state', - 'businessUnit', - 'custom', - 'createdBy', - 'lastModifiedBy', - ], - addFields: ({ fields }) => { - const customerRef: TReferenceGraphql = Reference.presets - .customerReference() - .id(fields.customer.id) - .typeId('customer') - .buildGraphql(); + buildFields: ['custom', 'createdBy', 'lastModifiedBy'], + replaceFields: ({ fields }) => { + let businessUnit: TCompanyGraphql | undefined = undefined; + let businessUnitRef: TKeyReferenceGraphql | undefined = undefined; + let customer: TCustomerGraphql | undefined = undefined; + let customerRef: TReferenceGraphql | undefined = undefined; + let state: TStateGraphql | undefined = undefined; + let stateRef: TReferenceGraphql | undefined = undefined; + const restQuoteRequestRef = buildField(fields.quoteRequest, 'rest'); const quoteRequestRef: TReferenceGraphql = Reference.presets .quoteRequestReference() - .id(fields.quoteRequest.id) - .typeId('quote-request') + .id(restQuoteRequestRef.id) .buildGraphql(); + const quoteRequest = QuoteRequest.random() + .id(restQuoteRequestRef.id) + .key(restQuoteRequestRef.obj?.key) + .buildGraphql(); + const restQuotationCartRef = buildField(fields.quotationCart, 'rest'); const quotationCartRef: TReferenceGraphql = Reference.presets .cartReference() - .id(fields.quotationCart.id) - .typeId('cart') + .id(restQuotationCartRef.id) .buildGraphql(); + const quotationCart = Cart.random() + .id(restQuotationCartRef.id) + .key(restQuotationCartRef.obj?.key) + .buildGraphql(); - const stateRef: TReferenceGraphql = Reference.presets - .stateReference() - .id(fields.state?.id) - .typeId('state') - .buildGraphql(); + if (fields.customer) { + const restCustomerRef = buildField(fields.customer, 'rest'); + customerRef = Reference.presets + .customerReference() + .id(restCustomerRef.id) + .buildGraphql(); + customer = Customer.random() + .id(restCustomerRef.id) + .firstName(restCustomerRef.obj?.firstName) + .lastName(restCustomerRef.obj?.lastName) + .key(restCustomerRef.obj?.key) + .email(restCustomerRef.obj?.email || '') + .buildGraphql(); + } - const businessUnitRef: TKeyReferenceGraphql = KeyReference.presets - .businessUnit() - .key(fields.businessUnit?.key) - .buildGraphql(); + if (fields.businessUnit) { + const restBusinessUnitRef = buildField(fields.businessUnit, 'rest'); + businessUnitRef = KeyReference.presets + .businessUnit() + .key(restBusinessUnitRef.key) + .buildGraphql(); + businessUnit = Company.random() + .key(restBusinessUnitRef.key) + .buildGraphql(); + } + + if (fields.state) { + const restStateRef = buildField(fields.state, 'rest'); + stateRef = Reference.presets + .stateReference() + .id(restStateRef.id) + .buildGraphql(); + state = State.random() + .id(restStateRef.id) + .key(restStateRef.obj?.key || '') + .type(restStateRef.obj?.type || '') + .name( + LocalizedString.presets + .empty() + .en(restStateRef.obj?.name?.en) + .de(restStateRef.obj?.name?.de) + ) + .buildGraphql(); + } return { + ...fields, + businessUnit, + businessUnitRef, + customer, customerRef, - quoteRequestRef, + quotationCart, quotationCartRef, - stateRef: fields.state ? stateRef : undefined, - businessUnitRef: fields.businessUnit ? businessUnitRef : undefined, + quoteRequest, + quoteRequestRef, + state, + stateRef, __typename: 'StagedQuote', }; }, diff --git a/models/staged-quote/src/types.ts b/models/staged-quote/src/types.ts index 09c34c923..a9bf6dbe2 100644 --- a/models/staged-quote/src/types.ts +++ b/models/staged-quote/src/types.ts @@ -1,40 +1,42 @@ import type { - BusinessUnit, - Cart, - Customer, StagedQuote, StagedQuoteDraft, - State, - QuoteRequest, } from '@commercetools/platform-sdk'; +import { + TCompanyGraphql, + TDivisionGraphql, +} from '@commercetools-test-data/business-unit'; +import { TCartGraphql } from '@commercetools-test-data/cart'; import { TReferenceGraphql, TKeyReferenceGraphql, } from '@commercetools-test-data/commons'; import type { TBuilder } from '@commercetools-test-data/core'; +import { TCustomerGraphql } from '@commercetools-test-data/customer'; +import { TQuoteRequestGraphql } from '@commercetools-test-data/quote-request'; +import { TStateGraphql } from '@commercetools-test-data/state'; // Default -export type TStagedQuote = Omit< - StagedQuote, - 'businessUnit' | 'customer' | 'quotationCart' | 'quoteRequest' | 'state' -> & { - businessUnit: BusinessUnit; - customer: Customer; - quotationCart: Cart; - quoteRequest: QuoteRequest; - state: State; -}; +export type TStagedQuote = StagedQuote; // Rest export type TStagedQuoteRest = StagedQuote; export type TStagedQuoteDraft = StagedQuoteDraft; -export type TStagedQuoteGraphql = TStagedQuote & { - businessUnitRef: TKeyReferenceGraphql | null; - customerRef: TReferenceGraphql | null; +export type TStagedQuoteGraphql = Omit< + TStagedQuote, + 'businessUnit' | 'customer' | 'quotationCart' | 'quoteRequest' | 'state' +> & { + businessUnit?: TCompanyGraphql | TDivisionGraphql; + businessUnitRef?: TKeyReferenceGraphql; + customer?: TCustomerGraphql; + customerRef?: TReferenceGraphql; + quotationCart: TCartGraphql; quotationCartRef: TReferenceGraphql; + quoteRequest: TQuoteRequestGraphql; quoteRequestRef: TReferenceGraphql; - stateRef: TReferenceGraphql | null; + state?: TStateGraphql; + stateRef?: TReferenceGraphql | null; __typename: 'StagedQuote'; }; export type TStagedQuoteDraftGraphql = TStagedQuoteDraft; diff --git a/models/standalone-price/src/builder.spec.ts b/models/standalone-price/src/builder.spec.ts index 1f5100182..afc4c306c 100644 --- a/models/standalone-price/src/builder.spec.ts +++ b/models/standalone-price/src/builder.spec.ts @@ -31,11 +31,11 @@ describe('builder', () => { country: expect.any(String), customerGroup: expect.objectContaining({ id: expect.any(String), - key: expect.any(String), + typeId: 'customer-group', }), channel: expect.objectContaining({ id: expect.any(String), - key: expect.any(String), + typeId: 'channel', }), validFrom: expect.any(String), validUntil: expect.any(String), @@ -53,7 +53,6 @@ describe('builder', () => { discounted: null, staged: null, active: expect.any(Boolean), - expiresAt: expect.any(String), }) ) ); @@ -103,7 +102,7 @@ describe('builder', () => { }), }), ]), - discounted: undefined, + discounted: null, staged: undefined, active: expect.any(Boolean), }) @@ -143,12 +142,14 @@ describe('builder', () => { key: expect.any(String), }), customerGroupRef: expect.objectContaining({ - typeId: 'customer-group', id: expect.any(String), + typeId: 'customer-group', + __typename: 'Reference', }), channelRef: expect.objectContaining({ - typeId: 'channel', id: expect.any(String), + typeId: 'channel', + __typename: 'Reference', }), validFrom: expect.any(String), validUntil: expect.any(String), diff --git a/models/standalone-price/src/generator.ts b/models/standalone-price/src/generator.ts index 9edc94893..9d8fd7fb5 100644 --- a/models/standalone-price/src/generator.ts +++ b/models/standalone-price/src/generator.ts @@ -3,6 +3,7 @@ import { ClientLogging, PriceTier, CentPrecisionMoney, + Reference, } from '@commercetools-test-data/commons'; import { Generator, fake, sequence } from '@commercetools-test-data/core'; import { CustomerGroup } from '@commercetools-test-data/customer-group'; @@ -25,8 +26,12 @@ const generator = Generator({ sku: fake((f) => `${f.lorem.word()}-${f.string.alphanumeric(3)}`), value: fake(() => CentPrecisionMoney.random()), country: fake((f) => f.location.countryCode()), - customerGroup: fake(() => CustomerGroup.random()), - channel: fake(() => Channel.random()), + customerGroup: fake(() => + Reference.presets.customerGroupReference().obj(CustomerGroup.random()) + ), + channel: fake(() => + Reference.presets.channelReference().obj(Channel.random()) + ), validFrom: fake(getCreatedAt), validUntil: fake(getExpiresAt), tiers: [ @@ -40,7 +45,6 @@ const generator = Generator({ staged: null, custom: null, active: fake((f) => f.datatype.boolean()), - expiresAt: fake(getExpiresAt), }, }); diff --git a/models/standalone-price/src/transformers.ts b/models/standalone-price/src/transformers.ts index e71edb350..d19bc0e3b 100644 --- a/models/standalone-price/src/transformers.ts +++ b/models/standalone-price/src/transformers.ts @@ -1,9 +1,14 @@ +import { Channel, TChannelGraphql } from '@commercetools-test-data/channel'; import { Reference, TReference, TReferenceGraphql, } from '@commercetools-test-data/commons'; -import { Transformer } from '@commercetools-test-data/core'; +import { buildField, Transformer } from '@commercetools-test-data/core'; +import { + CustomerGroup, + TCustomerGroupGraphql, +} from '@commercetools-test-data/customer-group'; import type { TStandalonePrice, TStandalonePriceGraphql, @@ -37,30 +42,10 @@ const transformers = { 'staged', ], replaceFields: ({ fields }) => { - // Remove `expiresAt` from the fields - const { expiresAt, ...rest } = fields; - - const customerGroup = fields.customerGroup - ? Reference.random() - .typeId('customer-group') - .id(fields.customerGroup.id) - .buildRest>() - : undefined; - - const channel = fields.channel - ? Reference.random() - .typeId('channel') - .id(fields.channel.id) - .buildRest>() - : undefined; - const mainCurrency = fields.value.currencyCode; - const adjustedFields = { - ...rest, - customerGroup, - channel, - // Currency sync + return { + ...fields, tiers: fields.tiers ? fields.tiers.map((tier) => ({ ...tier, @@ -69,7 +54,7 @@ const transformers = { currencyCode: mainCurrency, }, })) - : undefined, + : [], staged: fields.staged ? { ...fields.staged, @@ -79,46 +64,54 @@ const transformers = { }, } : undefined, - discounted: fields.discounted || undefined, }; - - return adjustedFields; }, }), graphql: Transformer('graphql', { - buildFields: [ - 'lastModifiedBy', - 'createdBy', - 'value', - 'customerGroup', - 'channel', - 'tiers', - 'custom', - 'discounted', - 'staged', - ], + buildFields: ['lastModifiedBy', 'createdBy', 'value', 'tiers'], replaceFields: ({ fields }) => { - const customerGroupRef = fields.customerGroup - ? Reference.random() - .typeId('customer-group') - .id(fields.customerGroup.id) - .buildGraphql>() - : null; + let channel: TChannelGraphql | undefined = undefined; + let channelRef: TReferenceGraphql | undefined = undefined; + let customerGroup: TCustomerGroupGraphql | undefined = undefined; + let customerGroupRef: TReferenceGraphql | undefined = undefined; - const channelRef = fields.channel - ? Reference.random() - .typeId('channel') - .id(fields.channel.id) - .buildGraphql>() - : null; + if (fields.customerGroup) { + const restCustomerGroupRef = buildField(fields.customerGroup, 'rest'); + customerGroupRef = Reference.presets + .customerGroupReference() + .id(restCustomerGroupRef.id) + .buildGraphql(); + + customerGroup = CustomerGroup.random() + .id(restCustomerGroupRef.id) + .key(restCustomerGroupRef.obj!.key) + .name(restCustomerGroupRef.obj!.name) + .buildGraphql(); + } + + if (fields.channel) { + const restChannelRef = buildField(fields.channel, 'rest'); + channelRef = Reference.presets + .channelReference() + .id(restChannelRef.id) + .buildGraphql(); + + channel = Channel.random() + .id(restChannelRef.id) + .key(restChannelRef.obj!.key) + .name(restChannelRef.obj!.name) + .buildGraphql(); + } const mainCurrency = fields.value.currencyCode; const adjustedFields: TStandalonePriceGraphql = { ...fields, - __typename: 'StandalonePrice' as const, - customerGroupRef, + __typename: 'StandalonePrice', + channel, channelRef, + customerGroup, + customerGroupRef, custom: fields.custom || null, // Currency sync tiers: fields.tiers diff --git a/models/standalone-price/src/types.ts b/models/standalone-price/src/types.ts index 4b59803cb..f278c27a7 100644 --- a/models/standalone-price/src/types.ts +++ b/models/standalone-price/src/types.ts @@ -1,28 +1,21 @@ import { StandalonePrice, StandalonePriceDraft, - CustomerGroup, - Channel, StagedStandalonePrice, PriceTier, CustomFields, DiscountedPrice, } from '@commercetools/platform-sdk'; +import { TChannelGraphql } from '@commercetools-test-data/channel'; import { TMoneyGraphql, TReferenceGraphql, } from '@commercetools-test-data/commons'; import type { TBuilder } from '@commercetools-test-data/core'; +import { TCustomerGroupGraphql } from '@commercetools-test-data/customer-group'; // Base representation -export type TStandalonePrice = Omit< - StandalonePrice, - 'customerGroup' | 'channel' -> & { - customerGroup: CustomerGroup | null; - channel: Channel | null; - expiresAt: string | null; -}; +export type TStandalonePrice = StandalonePrice; // REST representation export type TStandalonePriceRest = StandalonePrice; @@ -31,14 +24,16 @@ export type TStandalonePriceDraft = StandalonePriceDraft; // Graphql representation export type TStandalonePriceGraphql = Omit< TStandalonePrice, - 'staged' | 'tiers' | 'custom' | 'discounted' + 'staged' | 'tiers' | 'custom' | 'discounted' | 'channel' | 'customerGroup' > & { + channel?: TChannelGraphql; + channelRef?: TReferenceGraphql; + customerGroup?: TCustomerGroupGraphql; + customerGroupRef?: TReferenceGraphql; tiers: PriceTier[] | null; staged: StagedStandalonePrice | null; custom: CustomFields | null; discounted: DiscountedPrice | null; - customerGroupRef: TReferenceGraphql | null; - channelRef: TReferenceGraphql | null; __typename: 'StandalonePrice'; }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 263c195b7..df4f7d2af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -891,6 +891,9 @@ importers: '@commercetools-test-data/product-type': specifier: 10.11.2 version: link:../product-type + '@commercetools-test-data/state': + specifier: 10.11.2 + version: link:../state '@commercetools-test-data/tax-category': specifier: 10.11.2 version: link:../tax-category @@ -1098,6 +1101,9 @@ importers: '@commercetools-test-data/staged-quote': specifier: ^10.11.2 version: link:../staged-quote + '@commercetools-test-data/state': + specifier: 10.11.2 + version: link:../state '@commercetools-test-data/store': specifier: 10.11.2 version: link:../store @@ -1137,6 +1143,9 @@ importers: '@commercetools-test-data/customer-group': specifier: 10.11.2 version: link:../customer-group + '@commercetools-test-data/state': + specifier: 10.11.2 + version: link:../state '@commercetools-test-data/store': specifier: 10.11.2 version: link:../store @@ -1257,6 +1266,9 @@ importers: '@commercetools-test-data/quote-request': specifier: 10.11.2 version: link:../quote-request + '@commercetools-test-data/state': + specifier: 10.11.2 + version: link:../state '@commercetools-test-data/store': specifier: 10.11.2 version: link:../store diff --git a/tsconfig.json b/tsconfig.json index eaaabafa3..cd6377af6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,6 +11,7 @@ "forceConsistentCasingInFileNames": true, "isolatedModules": true, "resolveJsonModule": true, - "allowJs": false + "allowJs": false, + "preserveSymlinks": true, } }