|
|
@@ -1,7 +1,10 @@
|
|
|
+import { Args, Query, Resolver } from '@nestjs/graphql';
|
|
|
+import { ID } from '@vendure/common/lib/shared-types';
|
|
|
import {
|
|
|
Asset,
|
|
|
Collection,
|
|
|
Country,
|
|
|
+ Ctx,
|
|
|
CustomFields,
|
|
|
defaultShippingCalculator,
|
|
|
defaultShippingEligibilityChecker,
|
|
|
@@ -9,11 +12,15 @@ import {
|
|
|
FacetValue,
|
|
|
manualFulfillmentHandler,
|
|
|
mergeConfig,
|
|
|
+ PluginCommonModule,
|
|
|
Product,
|
|
|
ProductOption,
|
|
|
ProductOptionGroup,
|
|
|
ProductVariant,
|
|
|
+ RequestContext,
|
|
|
ShippingMethod,
|
|
|
+ TransactionalConnection,
|
|
|
+ VendurePlugin,
|
|
|
} from '@vendure/core';
|
|
|
import { createTestEnvironment } from '@vendure/testing';
|
|
|
import gql from 'graphql-tag';
|
|
|
@@ -22,6 +29,7 @@ import path from 'path';
|
|
|
import { initialData } from '../../../e2e-common/e2e-initial-data';
|
|
|
import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
|
|
|
|
|
|
+import { testSuccessfulPaymentMethod } from './fixtures/test-payment-methods';
|
|
|
import { AddItemToOrderMutation } from './graphql/generated-e2e-shop-types';
|
|
|
import { ADD_ITEM_TO_ORDER } from './graphql/shop-definitions';
|
|
|
import { sortById } from './utils/test-order-utils';
|
|
|
@@ -42,19 +50,26 @@ const entitiesWithCustomFields = enumerate<keyof CustomFields>()(
|
|
|
'Asset',
|
|
|
'Channel',
|
|
|
'Collection',
|
|
|
+ 'Country',
|
|
|
'Customer',
|
|
|
+ 'CustomerGroup',
|
|
|
'Facet',
|
|
|
'FacetValue',
|
|
|
'Fulfillment',
|
|
|
'GlobalSettings',
|
|
|
'Order',
|
|
|
'OrderLine',
|
|
|
+ 'PaymentMethod',
|
|
|
'Product',
|
|
|
'ProductOption',
|
|
|
'ProductOptionGroup',
|
|
|
'ProductVariant',
|
|
|
- 'User',
|
|
|
+ 'Promotion',
|
|
|
'ShippingMethod',
|
|
|
+ 'TaxCategory',
|
|
|
+ 'TaxRate',
|
|
|
+ 'User',
|
|
|
+ 'Zone',
|
|
|
);
|
|
|
|
|
|
const customFieldConfig: CustomFields = {};
|
|
|
@@ -77,11 +92,43 @@ customFieldConfig.Product?.push(
|
|
|
{ name: 'cfInternalAsset', type: 'relation', entity: Asset, list: false, internal: true },
|
|
|
);
|
|
|
|
|
|
+const testResolverSpy = jest.fn();
|
|
|
+@Resolver()
|
|
|
+class TestResolver1636 {
|
|
|
+ constructor(private connection: TransactionalConnection) {}
|
|
|
+
|
|
|
+ @Query()
|
|
|
+ async getAssetTest(@Ctx() ctx: RequestContext, @Args() args: { id: ID }) {
|
|
|
+ const asset = await this.connection.findOneInChannel(ctx, Asset, args.id, ctx.channelId, {
|
|
|
+ relations: ['customFields.single', 'customFields.multi'],
|
|
|
+ });
|
|
|
+ testResolverSpy(asset);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@VendurePlugin({
|
|
|
+ imports: [PluginCommonModule],
|
|
|
+ shopApiExtensions: {
|
|
|
+ schema: gql`
|
|
|
+ extend type Query {
|
|
|
+ getAssetTest(id: ID!): Boolean!
|
|
|
+ }
|
|
|
+ `,
|
|
|
+ resolvers: [TestResolver1636],
|
|
|
+ },
|
|
|
+})
|
|
|
+class TestPlugin1636 {}
|
|
|
+
|
|
|
const customConfig = mergeConfig(testConfig(), {
|
|
|
+ paymentOptions: {
|
|
|
+ paymentMethodHandlers: [testSuccessfulPaymentMethod],
|
|
|
+ },
|
|
|
dbConnectionOptions: {
|
|
|
timezone: 'Z',
|
|
|
},
|
|
|
customFields: customFieldConfig,
|
|
|
+ plugins: [TestPlugin1636],
|
|
|
});
|
|
|
|
|
|
describe('Custom field relations', () => {
|
|
|
@@ -236,7 +283,6 @@ describe('Custom field relations', () => {
|
|
|
});
|
|
|
|
|
|
it('ProductVariant prices get resolved', async () => {
|
|
|
- debugger;
|
|
|
const { product } = await adminClient.query(gql`
|
|
|
query {
|
|
|
product(id: "${productId}") {
|
|
|
@@ -249,7 +295,7 @@ describe('Custom field relations', () => {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }`);
|
|
|
+ }`);
|
|
|
|
|
|
expect(product.customFields.cfProductVariant).toEqual({
|
|
|
price: 129900,
|
|
|
@@ -264,6 +310,7 @@ describe('Custom field relations', () => {
|
|
|
expect(customFields.single).toEqual({ id: single });
|
|
|
expect(customFields.multi.sort(sortById)).toEqual(multi.map(id => ({ id })));
|
|
|
}
|
|
|
+
|
|
|
const customFieldsSelection = `
|
|
|
customFields {
|
|
|
single {
|
|
|
@@ -277,20 +324,20 @@ describe('Custom field relations', () => {
|
|
|
describe('Address entity', () => {
|
|
|
it('admin createCustomerAddress', async () => {
|
|
|
const { createCustomerAddress } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createCustomerAddress(
|
|
|
- customerId: "T_1"
|
|
|
- input: {
|
|
|
- countryCode: "GB"
|
|
|
- streetLine1: "Test Street"
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ createCustomerAddress(
|
|
|
+ customerId: "T_1"
|
|
|
+ input: {
|
|
|
+ countryCode: "GB"
|
|
|
+ streetLine1: "Test Street"
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createCustomerAddress.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
});
|
|
|
@@ -298,49 +345,49 @@ describe('Custom field relations', () => {
|
|
|
it('shop createCustomerAddress', async () => {
|
|
|
await shopClient.asUserWithCredentials('hayden.zieme12@hotmail.com', 'test');
|
|
|
const { createCustomerAddress } = await shopClient.query(gql`
|
|
|
- mutation {
|
|
|
- createCustomerAddress(
|
|
|
- input: {
|
|
|
- countryCode: "GB"
|
|
|
- streetLine1: "Test Street"
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ createCustomerAddress(
|
|
|
+ input: {
|
|
|
+ countryCode: "GB"
|
|
|
+ streetLine1: "Test Street"
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createCustomerAddress.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
});
|
|
|
|
|
|
it('admin updateCustomerAddress', async () => {
|
|
|
const { updateCustomerAddress } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateCustomerAddress(
|
|
|
- input: { id: "T_1", customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] } }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ updateCustomerAddress(
|
|
|
+ input: { id: "T_1", customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] } }
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(updateCustomerAddress.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
|
|
|
it('shop updateCustomerAddress', async () => {
|
|
|
const { updateCustomerAddress } = await shopClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateCustomerAddress(
|
|
|
- input: { id: "T_1", customFields: { singleId: "T_3", multiIds: ["T_4", "T_2"] } }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ updateCustomerAddress(
|
|
|
+ input: { id: "T_1", customFields: { singleId: "T_3", multiIds: ["T_4", "T_2"] } }
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(updateCustomerAddress.customFields, 'T_3', ['T_2', 'T_4']);
|
|
|
});
|
|
|
@@ -350,39 +397,39 @@ describe('Custom field relations', () => {
|
|
|
let collectionId: string;
|
|
|
it('admin createCollection', async () => {
|
|
|
const { createCollection } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createCollection(
|
|
|
- input: {
|
|
|
- translations: [
|
|
|
- { languageCode: en, name: "Test", description: "test", slug: "test" }
|
|
|
- ]
|
|
|
- filters: []
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ createCollection(
|
|
|
+ input: {
|
|
|
+ translations: [
|
|
|
+ { languageCode: en, name: "Test", description: "test", slug: "test" }
|
|
|
+ ]
|
|
|
+ filters: []
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(createCollection.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
collectionId = createCollection.id;
|
|
|
});
|
|
|
|
|
|
it('admin updateCollection', async () => {
|
|
|
const { updateCollection } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateCollection(
|
|
|
- input: {
|
|
|
- id: "${collectionId}"
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ updateCollection(
|
|
|
+ input: {
|
|
|
+ id: "${collectionId}"
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(updateCollection.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
@@ -392,22 +439,22 @@ describe('Custom field relations', () => {
|
|
|
let customerId: string;
|
|
|
it('admin createCustomer', async () => {
|
|
|
const { createCustomer } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createCustomer(
|
|
|
- input: {
|
|
|
- emailAddress: "test@test.com"
|
|
|
- firstName: "Test"
|
|
|
- lastName: "Person"
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- ... on Customer {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ createCustomer(
|
|
|
+ input: {
|
|
|
+ emailAddress: "test@test.com"
|
|
|
+ firstName: "Test"
|
|
|
+ lastName: "Person"
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ ... on Customer {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createCustomer.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
customerId = createCustomer.id;
|
|
|
@@ -415,32 +462,32 @@ describe('Custom field relations', () => {
|
|
|
|
|
|
it('admin updateCustomer', async () => {
|
|
|
const { updateCustomer } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateCustomer(
|
|
|
- input: {
|
|
|
- id: "${customerId}"
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- ...on Customer {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ updateCustomer(
|
|
|
+ input: {
|
|
|
+ id: "${customerId}"
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ ...on Customer {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateCustomer.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
|
|
|
it('shop updateCustomer', async () => {
|
|
|
const { updateCustomer } = await shopClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateCustomer(input: { customFields: { singleId: "T_4", multiIds: ["T_2", "T_4"] } }) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ updateCustomer(input: { customFields: { singleId: "T_4", multiIds: ["T_2", "T_4"] } }) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateCustomer.customFields, 'T_4', ['T_2', 'T_4']);
|
|
|
});
|
|
|
});
|
|
|
@@ -449,20 +496,20 @@ describe('Custom field relations', () => {
|
|
|
let facetId: string;
|
|
|
it('admin createFacet', async () => {
|
|
|
const { createFacet } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createFacet(
|
|
|
- input: {
|
|
|
- code: "test"
|
|
|
- isPrivate: false
|
|
|
- translations: [{ languageCode: en, name: "test" }]
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ createFacet(
|
|
|
+ input: {
|
|
|
+ code: "test"
|
|
|
+ isPrivate: false
|
|
|
+ translations: [{ languageCode: en, name: "test" }]
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createFacet.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
facetId = createFacet.id;
|
|
|
@@ -470,18 +517,18 @@ describe('Custom field relations', () => {
|
|
|
|
|
|
it('admin updateFacet', async () => {
|
|
|
const { updateFacet } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateFacet(
|
|
|
- input: {
|
|
|
- id: "${facetId}"
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ updateFacet(
|
|
|
+ input: {
|
|
|
+ id: "${facetId}"
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateFacet.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
});
|
|
|
@@ -490,20 +537,20 @@ describe('Custom field relations', () => {
|
|
|
let facetValueId: string;
|
|
|
it('admin createFacetValues', async () => {
|
|
|
const { createFacetValues } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createFacetValues(
|
|
|
- input: {
|
|
|
- code: "test"
|
|
|
- facetId: "T_1"
|
|
|
- translations: [{ languageCode: en, name: "test" }]
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ createFacetValues(
|
|
|
+ input: {
|
|
|
+ code: "test"
|
|
|
+ facetId: "T_1"
|
|
|
+ translations: [{ languageCode: en, name: "test" }]
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createFacetValues[0].customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
facetValueId = createFacetValues[0].id;
|
|
|
@@ -511,18 +558,18 @@ describe('Custom field relations', () => {
|
|
|
|
|
|
it('admin updateFacetValues', async () => {
|
|
|
const { updateFacetValues } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateFacetValues(
|
|
|
- input: {
|
|
|
- id: "${facetValueId}"
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ updateFacetValues(
|
|
|
+ input: {
|
|
|
+ id: "${facetValueId}"
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateFacetValues[0].customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
});
|
|
|
@@ -534,19 +581,19 @@ describe('Custom field relations', () => {
|
|
|
describe('GlobalSettings entity', () => {
|
|
|
it('admin updateGlobalSettings', async () => {
|
|
|
const { updateGlobalSettings } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateGlobalSettings(
|
|
|
- input: {
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- ... on GlobalSettings {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ updateGlobalSettings(
|
|
|
+ input: {
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ ... on GlobalSettings {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateGlobalSettings.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
});
|
|
|
@@ -568,39 +615,39 @@ describe('Custom field relations', () => {
|
|
|
|
|
|
it('shop setOrderCustomFields', async () => {
|
|
|
const { setOrderCustomFields } = await shopClient.query(gql`
|
|
|
- mutation {
|
|
|
- setOrderCustomFields(
|
|
|
- input: {
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- ... on Order {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ setOrderCustomFields(
|
|
|
+ input: {
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ ... on Order {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(setOrderCustomFields.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
|
|
|
it('admin setOrderCustomFields', async () => {
|
|
|
const { setOrderCustomFields } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- setOrderCustomFields(
|
|
|
- input: {
|
|
|
- id: "${orderId}"
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- ... on Order {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ setOrderCustomFields(
|
|
|
+ input: {
|
|
|
+ id: "${orderId}"
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ ... on Order {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(setOrderCustomFields.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
});
|
|
|
@@ -610,13 +657,13 @@ describe('Custom field relations', () => {
|
|
|
it('shop addItemToOrder', async () => {
|
|
|
const { addItemToOrder } = await shopClient.query(
|
|
|
gql`mutation {
|
|
|
- addItemToOrder(productVariantId: "T_1", quantity: 1, customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }) {
|
|
|
- ... on Order {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ addItemToOrder(productVariantId: "T_1", quantity: 1, customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }) {
|
|
|
+ ... on Order {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- }`,
|
|
|
+ }
|
|
|
+ }`,
|
|
|
);
|
|
|
|
|
|
assertCustomFieldIds(addItemToOrder.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
@@ -627,18 +674,18 @@ describe('Custom field relations', () => {
|
|
|
let productId: string;
|
|
|
it('admin createProduct', async () => {
|
|
|
const { createProduct } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createProduct(
|
|
|
- input: {
|
|
|
- translations: [{ languageCode: en, name: "test" slug: "test" description: "test" }]
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ createProduct(
|
|
|
+ input: {
|
|
|
+ translations: [{ languageCode: en, name: "test" slug: "test" description: "test" }]
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createProduct.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
productId = createProduct.id;
|
|
|
@@ -646,38 +693,38 @@ describe('Custom field relations', () => {
|
|
|
|
|
|
it('admin updateProduct', async () => {
|
|
|
const { updateProduct } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateProduct(
|
|
|
- input: {
|
|
|
- id: "${productId}"
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ updateProduct(
|
|
|
+ input: {
|
|
|
+ id: "${productId}"
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateProduct.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
|
|
|
let productVariantId: string;
|
|
|
it('admin createProductVariant', async () => {
|
|
|
const { createProductVariants } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createProductVariants(
|
|
|
- input: [{
|
|
|
- sku: "TEST01"
|
|
|
- productId: "${productId}"
|
|
|
- translations: [{ languageCode: en, name: "test" }]
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }]
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ createProductVariants(
|
|
|
+ input: [{
|
|
|
+ sku: "TEST01"
|
|
|
+ productId: "${productId}"
|
|
|
+ translations: [{ languageCode: en, name: "test" }]
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
+ }]
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createProductVariants[0].customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
productVariantId = createProductVariants[0].id;
|
|
|
@@ -685,18 +732,18 @@ describe('Custom field relations', () => {
|
|
|
|
|
|
it('admin updateProductVariant', async () => {
|
|
|
const { updateProductVariants } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateProductVariants(
|
|
|
- input: [{
|
|
|
- id: "${productVariantId}"
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }]
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
- }
|
|
|
+ mutation {
|
|
|
+ updateProductVariants(
|
|
|
+ input: [{
|
|
|
+ id: "${productVariantId}"
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
+ }]
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateProductVariants[0].customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
});
|
|
|
@@ -705,20 +752,20 @@ describe('Custom field relations', () => {
|
|
|
let productOptionGroupId: string;
|
|
|
it('admin createProductOptionGroup', async () => {
|
|
|
const { createProductOptionGroup } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createProductOptionGroup(
|
|
|
- input: {
|
|
|
- code: "test"
|
|
|
- options: []
|
|
|
- translations: [{ languageCode: en, name: "test" }]
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ createProductOptionGroup(
|
|
|
+ input: {
|
|
|
+ code: "test"
|
|
|
+ options: []
|
|
|
+ translations: [{ languageCode: en, name: "test" }]
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createProductOptionGroup.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
productOptionGroupId = createProductOptionGroup.id;
|
|
|
@@ -726,38 +773,38 @@ describe('Custom field relations', () => {
|
|
|
|
|
|
it('admin updateProductOptionGroup', async () => {
|
|
|
const { updateProductOptionGroup } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateProductOptionGroup(
|
|
|
- input: {
|
|
|
- id: "${productOptionGroupId}"
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ updateProductOptionGroup(
|
|
|
+ input: {
|
|
|
+ id: "${productOptionGroupId}"
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateProductOptionGroup.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
|
|
|
let productOptionId: string;
|
|
|
it('admin createProductOption', async () => {
|
|
|
const { createProductOption } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createProductOption(
|
|
|
- input: {
|
|
|
- productOptionGroupId: "${productOptionGroupId}"
|
|
|
- code: "test-option"
|
|
|
- translations: [{ languageCode: en, name: "test-option" }]
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ createProductOption(
|
|
|
+ input: {
|
|
|
+ productOptionGroupId: "${productOptionGroupId}"
|
|
|
+ code: "test-option"
|
|
|
+ translations: [{ languageCode: en, name: "test-option" }]
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createProductOption.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
productOptionId = createProductOption.id;
|
|
|
@@ -765,18 +812,18 @@ describe('Custom field relations', () => {
|
|
|
|
|
|
it('admin updateProductOption', async () => {
|
|
|
const { updateProductOption } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateProductOption(
|
|
|
- input: {
|
|
|
- id: "${productOptionId}"
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ updateProductOption(
|
|
|
+ input: {
|
|
|
+ id: "${productOptionId}"
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateProductOption.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
});
|
|
|
@@ -789,34 +836,34 @@ describe('Custom field relations', () => {
|
|
|
let shippingMethodId: string;
|
|
|
it('admin createShippingMethod', async () => {
|
|
|
const { createShippingMethod } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- createShippingMethod(
|
|
|
- input: {
|
|
|
- code: "test"
|
|
|
- calculator: {
|
|
|
- code: "${defaultShippingCalculator.code}"
|
|
|
- arguments: [
|
|
|
- { name: "rate" value: "10"},
|
|
|
- { name: "includesTax" value: "true"},
|
|
|
- { name: "taxRate" value: "10"},
|
|
|
- ]
|
|
|
- }
|
|
|
- checker: {
|
|
|
- code: "${defaultShippingEligibilityChecker.code}"
|
|
|
- arguments: [
|
|
|
- { name: "orderMinimum" value: "0"},
|
|
|
- ]
|
|
|
- }
|
|
|
- fulfillmentHandler: "${manualFulfillmentHandler.code}"
|
|
|
- translations: [{ languageCode: en, name: "test" description: "test" }]
|
|
|
- customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
+ mutation {
|
|
|
+ createShippingMethod(
|
|
|
+ input: {
|
|
|
+ code: "test"
|
|
|
+ calculator: {
|
|
|
+ code: "${defaultShippingCalculator.code}"
|
|
|
+ arguments: [
|
|
|
+ { name: "rate" value: "10"},
|
|
|
+ { name: "includesTax" value: "true"},
|
|
|
+ { name: "taxRate" value: "10"},
|
|
|
+ ]
|
|
|
}
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ checker: {
|
|
|
+ code: "${defaultShippingEligibilityChecker.code}"
|
|
|
+ arguments: [
|
|
|
+ { name: "orderMinimum" value: "0"},
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ fulfillmentHandler: "${manualFulfillmentHandler.code}"
|
|
|
+ translations: [{ languageCode: en, name: "test" description: "test" }]
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
|
|
|
assertCustomFieldIds(createShippingMethod.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
shippingMethodId = createShippingMethod.id;
|
|
|
@@ -824,21 +871,144 @@ describe('Custom field relations', () => {
|
|
|
|
|
|
it('admin updateShippingMethod', async () => {
|
|
|
const { updateShippingMethod } = await adminClient.query(gql`
|
|
|
- mutation {
|
|
|
- updateShippingMethod(
|
|
|
- input: {
|
|
|
- id: "${shippingMethodId}"
|
|
|
- translations: []
|
|
|
- customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
- }
|
|
|
- ) {
|
|
|
- id
|
|
|
- ${customFieldsSelection}
|
|
|
+ mutation {
|
|
|
+ updateShippingMethod(
|
|
|
+ input: {
|
|
|
+ id: "${shippingMethodId}"
|
|
|
+ translations: []
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
}
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
}
|
|
|
- `);
|
|
|
+ }
|
|
|
+ `);
|
|
|
assertCustomFieldIds(updateShippingMethod.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
});
|
|
|
+
|
|
|
+ it('shop eligibleShippingMethods (ShippingMethodQuote)', async () => {
|
|
|
+ const { eligibleShippingMethods } = await shopClient.query(gql`
|
|
|
+ query {
|
|
|
+ eligibleShippingMethods {
|
|
|
+ id
|
|
|
+ name
|
|
|
+ code
|
|
|
+ description
|
|
|
+ ${customFieldsSelection}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ `);
|
|
|
+ const testShippingMethodQuote = eligibleShippingMethods.find(
|
|
|
+ (quote: any) => quote.code === 'test',
|
|
|
+ );
|
|
|
+ assertCustomFieldIds(testShippingMethodQuote.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('PaymentMethod entity', () => {
|
|
|
+ let paymentMethodId: string;
|
|
|
+ it('admin createShippingMethod', async () => {
|
|
|
+ const { createPaymentMethod } = await adminClient.query(gql`
|
|
|
+ mutation {
|
|
|
+ createPaymentMethod(
|
|
|
+ input: {
|
|
|
+ name: "test"
|
|
|
+ code: "test"
|
|
|
+ enabled: true
|
|
|
+ handler: {
|
|
|
+ code: "${testSuccessfulPaymentMethod.code}"
|
|
|
+ arguments: []
|
|
|
+ }
|
|
|
+ customFields: { singleId: "T_1", multiIds: ["T_1", "T_2"] }
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ `);
|
|
|
+
|
|
|
+ assertCustomFieldIds(createPaymentMethod.customFields, 'T_1', ['T_1', 'T_2']);
|
|
|
+ paymentMethodId = createPaymentMethod.id;
|
|
|
+ });
|
|
|
+
|
|
|
+ it('admin updatePaymentMethod', async () => {
|
|
|
+ const { updatePaymentMethod } = await adminClient.query(gql`
|
|
|
+ mutation {
|
|
|
+ updatePaymentMethod(
|
|
|
+ input: {
|
|
|
+ id: "${paymentMethodId}"
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ `);
|
|
|
+ assertCustomFieldIds(updatePaymentMethod.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('shop eligiblePaymentMethods (PaymentMethodQuote)', async () => {
|
|
|
+ const { eligiblePaymentMethods } = await shopClient.query(gql`
|
|
|
+ query {
|
|
|
+ eligiblePaymentMethods {
|
|
|
+ id
|
|
|
+ name
|
|
|
+ description
|
|
|
+ ${customFieldsSelection}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ `);
|
|
|
+ assertCustomFieldIds(eligiblePaymentMethods[0].customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('Asset entity', () => {
|
|
|
+ it('set custom field relations on Asset', async () => {
|
|
|
+ const { updateAsset } = await adminClient.query(gql`
|
|
|
+ mutation {
|
|
|
+ updateAsset(
|
|
|
+ input: {
|
|
|
+ id: "T_1",
|
|
|
+ customFields: { singleId: "T_2", multiIds: ["T_3", "T_4"] }
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ `);
|
|
|
+
|
|
|
+ assertCustomFieldIds(updateAsset.customFields, 'T_2', ['T_3', 'T_4']);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('findOne on Asset', async () => {
|
|
|
+ const { asset } = await adminClient.query(gql`
|
|
|
+ query {
|
|
|
+ asset(id: "T_1") {
|
|
|
+ id
|
|
|
+ ${customFieldsSelection}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ `);
|
|
|
+ expect(asset.customFields.single.id).toBe('T_2');
|
|
|
+ expect(asset.customFields.multi.length).toEqual(2);
|
|
|
+ });
|
|
|
+
|
|
|
+ // https://github.com/vendure-ecommerce/vendure/issues/1636
|
|
|
+ it('calling TransactionalConnection.findOneInChannel() returns custom field relations', async () => {
|
|
|
+ testResolverSpy.mockReset();
|
|
|
+ await shopClient.query(gql`
|
|
|
+ query {
|
|
|
+ getAssetTest(id: "T_1")
|
|
|
+ }
|
|
|
+ `);
|
|
|
+ const args = testResolverSpy.mock.calls[0];
|
|
|
+ expect(args[0].customFields.single.id).toEqual(2);
|
|
|
+ expect(args[0].customFields.multi.length).toEqual(2);
|
|
|
+ });
|
|
|
});
|
|
|
});
|
|
|
|