From e4af6b8f9c29e28b2da582ce28f3c0beecae052c Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Fri, 25 Mar 2022 15:08:54 +0100 Subject: [PATCH] chore: fix integration tests (#1240) * chore: fix integration tests * chore: fix integration tests * fix: store tests * fix: store tests * fix: cleanup --- .../admin/__snapshots__/discount.js.snap | 16 ++ .../api/__tests__/admin/customer-groups.js | 2 +- .../api/__tests__/admin/discount.js | 164 +++++++++--------- .../api/__tests__/admin/store.js | 2 +- .../api/__tests__/store/customer.js | 4 +- .../api/__tests__/swaps/index.js | 2 + .../api/factories/simple-product-factory.ts | 1 + .../src/api/middlewares/error-handler.js | 2 +- .../src/api/routes/admin/store/get-store.ts | 1 + packages/medusa/src/loaders/defaults.js | 15 +- .../src/services/fulfillment-provider.js | 5 +- .../medusa/src/services/payment-provider.js | 6 +- packages/medusa/src/services/tax-provider.ts | 3 +- 13 files changed, 119 insertions(+), 104 deletions(-) create mode 100644 integration-tests/api/__tests__/admin/__snapshots__/discount.js.snap diff --git a/integration-tests/api/__tests__/admin/__snapshots__/discount.js.snap b/integration-tests/api/__tests__/admin/__snapshots__/discount.js.snap new file mode 100644 index 0000000000..a3a4b59fcd --- /dev/null +++ b/integration-tests/api/__tests__/admin/__snapshots__/discount.js.snap @@ -0,0 +1,16 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`/admin/discounts POST /admin/discounts fails if multiple types of resources are provided on update 1`] = ` +Object { + "message": "Only one of products, product_types is allowed, Only one of product_types, products is allowed", + "type": "invalid_data", +} +`; + +exports[`/admin/discounts POST /admin/discounts fails to add condition on rule with existing comb. of type and operator 1`] = ` +Object { + "code": "invalid_request_error", + "message": "Discount Condition with operator 'in' and type 'products' already exist on a Discount Rule", + "type": "duplicate_error", +} +`; diff --git a/integration-tests/api/__tests__/admin/customer-groups.js b/integration-tests/api/__tests__/admin/customer-groups.js index 5671014c58..d9b27b97ca 100644 --- a/integration-tests/api/__tests__/admin/customer-groups.js +++ b/integration-tests/api/__tests__/admin/customer-groups.js @@ -77,7 +77,7 @@ describe("/admin/customer-groups", () => { }, }) .catch((err) => { - expect(err.response.status).toEqual(402) + expect(err.response.status).toEqual(422) expect(err.response.data.type).toEqual("duplicate_error") expect(err.response.data.message).toEqual( "Key (name)=(vip-customers) already exists." diff --git a/integration-tests/api/__tests__/admin/discount.js b/integration-tests/api/__tests__/admin/discount.js index 50e1077d8d..e0282f8d64 100644 --- a/integration-tests/api/__tests__/admin/discount.js +++ b/integration-tests/api/__tests__/admin/discount.js @@ -489,32 +489,34 @@ describe("/admin/discounts", () => { }) expect(response.status).toEqual(200) - expect(response.data.discount.rule.conditions).toEqual([ - expect.objectContaining({ - type: "products", - operator: "in", - }), - expect.objectContaining({ - type: "products", - operator: "not_in", - }), - expect.objectContaining({ - type: "product_types", - operator: "not_in", - }), - expect.objectContaining({ - type: "product_types", - operator: "in", - }), - expect.objectContaining({ - type: "product_tags", - operator: "not_in", - }), - expect.objectContaining({ - type: "product_tags", - operator: "in", - }), - ]) + expect(response.data.discount.rule.conditions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + type: "products", + operator: "in", + }), + expect.objectContaining({ + type: "products", + operator: "not_in", + }), + expect.objectContaining({ + type: "product_types", + operator: "not_in", + }), + expect.objectContaining({ + type: "product_types", + operator: "in", + }), + expect.objectContaining({ + type: "product_tags", + operator: "not_in", + }), + expect.objectContaining({ + type: "product_tags", + operator: "in", + }), + ]) + ) }) it("creates a discount with conditions and updates said conditions", async () => { @@ -668,36 +670,32 @@ describe("/admin/discounts", () => { const createdRule = response.data.discount.rule - try { - await api.post( - `/admin/discounts/${response.data.discount.id}?expand=rule,rule.conditions,rule.conditions.products`, - { - rule: { - id: createdRule.id, - type: createdRule.type, - value: createdRule.value, - allocation: createdRule.allocation, - conditions: [ - { - products: [anotherProduct.id], - operator: "in", - }, - ], + await expect( + api + .post( + `/admin/discounts/${response.data.discount.id}?expand=rule,rule.conditions,rule.conditions.products`, + { + rule: { + id: createdRule.id, + type: createdRule.type, + value: createdRule.value, + allocation: createdRule.allocation, + conditions: [ + { + products: [anotherProduct.id], + operator: "in", + }, + ], + }, }, - }, - { - headers: { - Authorization: "Bearer test_token", - }, - } - ) - } catch (error) { - console.log(error) - expect(error.response.data.type).toEqual("duplicate_error") - expect(error.response.data.message).toEqual( - `Discount Condition with operator 'in' and type 'products' already exist on a Discount Rule` - ) - } + { + headers: { + Authorization: "Bearer test_token", + }, + } + ) + .catch((err) => err.response.data) + ).resolves.toMatchSnapshot() }) it("fails if multiple types of resources are provided on create", async () => { @@ -785,37 +783,33 @@ describe("/admin/discounts", () => { const createdRule = response.data.discount.rule - try { - await api.post( - `/admin/discounts/${response.data.discount.id}?expand=rule,rule.conditions,rule.conditions.products`, - { - rule: { - id: createdRule.id, - type: createdRule.type, - value: createdRule.value, - allocation: createdRule.allocation, - conditions: [ - { - products: [anotherProduct.id], - product_types: [product.type_id], - operator: "in", - }, - ], + await expect( + api + .post( + `/admin/discounts/${response.data.discount.id}?expand=rule,rule.conditions,rule.conditions.products`, + { + rule: { + id: createdRule.id, + type: createdRule.type, + value: createdRule.value, + allocation: createdRule.allocation, + conditions: [ + { + products: [anotherProduct.id], + product_types: [product.type_id], + operator: "in", + }, + ], + }, }, - }, - { - headers: { - Authorization: "Bearer test_token", - }, - } - ) - } catch (error) { - console.log(error) - expect(error.response.data.type).toEqual("invalid_data") - expect(error.response.data.message).toEqual( - `Only one of products, product_types is allowed, Only one of product_types, products is allowed` - ) - } + { + headers: { + Authorization: "Bearer test_token", + }, + } + ) + .catch((err) => err.response.data) + ).resolves.toMatchSnapshot() }) it("creates a discount and updates it", async () => { diff --git a/integration-tests/api/__tests__/admin/store.js b/integration-tests/api/__tests__/admin/store.js index 1e8d558d16..7cf95afa7c 100644 --- a/integration-tests/api/__tests__/admin/store.js +++ b/integration-tests/api/__tests__/admin/store.js @@ -32,7 +32,7 @@ describe("/admin/store", () => { afterEach(async () => { const db = useDb() - await db.teardown() + await db.teardown({ forceDelete: ["store"] }) await medusaProcess.kill() }) diff --git a/integration-tests/api/__tests__/store/customer.js b/integration-tests/api/__tests__/store/customer.js index b675a461fa..3bdf830daf 100644 --- a/integration-tests/api/__tests__/store/customer.js +++ b/integration-tests/api/__tests__/store/customer.js @@ -58,7 +58,7 @@ describe("/store/customers", () => { expect(response.data.customer).not.toHaveProperty("password_hash") }) - it("responds 409 on duplicate", async () => { + it("responds 422 on duplicate", async () => { const api = useApi() const response = await api @@ -70,7 +70,7 @@ describe("/store/customers", () => { }) .catch((err) => err.response) - expect(response.status).toEqual(402) + expect(response.status).toEqual(422) }) }) diff --git a/integration-tests/api/__tests__/swaps/index.js b/integration-tests/api/__tests__/swaps/index.js index 82ca8da79b..61d0b055b4 100644 --- a/integration-tests/api/__tests__/swaps/index.js +++ b/integration-tests/api/__tests__/swaps/index.js @@ -12,6 +12,8 @@ const { simpleProductFactory, } = require("../../factories") +jest.setTimeout(30000) + describe("Swaps", () => { let medusaProcess let dbConnection diff --git a/integration-tests/api/factories/simple-product-factory.ts b/integration-tests/api/factories/simple-product-factory.ts index 642a25d063..fa89ab9242 100644 --- a/integration-tests/api/factories/simple-product-factory.ts +++ b/integration-tests/api/factories/simple-product-factory.ts @@ -47,6 +47,7 @@ export const simpleProductFactory = async ( const productToCreate = { id: prodId, title: data.title || faker.commerce.productName(), + status: data.status, is_giftcard: data.is_giftcard || false, discountable: !data.is_giftcard, tags: [], diff --git a/packages/medusa/src/api/middlewares/error-handler.js b/packages/medusa/src/api/middlewares/error-handler.js index 03659a8659..ee4ea47932 100644 --- a/packages/medusa/src/api/middlewares/error-handler.js +++ b/packages/medusa/src/api/middlewares/error-handler.js @@ -32,7 +32,7 @@ export default () => { "The request conflicted with another request. You may retry the request with the provided Idempotency-Key." break case MedusaError.Types.DUPLICATE_ERROR: - statusCode = 402 + statusCode = 422 errObj.code = INVALID_REQUEST_ERROR break case MedusaError.Types.NOT_ALLOWED: diff --git a/packages/medusa/src/api/routes/admin/store/get-store.ts b/packages/medusa/src/api/routes/admin/store/get-store.ts index c606e50a60..c27507fc8b 100644 --- a/packages/medusa/src/api/routes/admin/store/get-store.ts +++ b/packages/medusa/src/api/routes/admin/store/get-store.ts @@ -31,6 +31,7 @@ export default async (req, res) => { req.scope.resolve("fulfillmentProviderService") const data = await storeService.retrieve(["currencies", "default_currency"]) + const paymentProviders = await paymentProviderService.list() const fulfillmentProviders = await fulfillmentProviderService.list() diff --git a/packages/medusa/src/loaders/defaults.js b/packages/medusa/src/loaders/defaults.js index af03f5eb4d..2e3232a64b 100644 --- a/packages/medusa/src/loaders/defaults.js +++ b/packages/medusa/src/loaders/defaults.js @@ -67,7 +67,7 @@ export default async ({ container }) => { const currencyRepo = manager.getCustomRepository(currencyRepository) const hasCurrencies = await currencyRepo.findOne() if (!hasCurrencies) { - for (const [_, c] of Object.entries(currencies)) { + for (const [, c] of Object.entries(currencies)) { const query = `INSERT INTO "currency" ("code", "symbol", "symbol_native", "name") VALUES ($1, $2, $3, $4)` const code = c.code.toLowerCase() @@ -83,40 +83,37 @@ export default async ({ container }) => { await entityManager.transaction(async (manager) => { await storeService.withTransaction(manager).create() - let payIds const pProviderService = container.resolve("paymentProviderService") const payProviders = silentResolution(container, "paymentProviders", logger) || [] - payIds = payProviders.map((p) => p.getIdentifier()) + const payIds = payProviders.map((p) => p.getIdentifier()) + await pProviderService.registerInstalledProviders(payIds) - let notiIds const nProviderService = container.resolve("notificationService") const notiProviders = silentResolution(container, "notificationProviders", logger) || [] - notiIds = notiProviders.map((p) => p.getIdentifier()) + const notiIds = notiProviders.map((p) => p.getIdentifier()) await nProviderService.registerInstalledProviders(notiIds) - let fulfilIds const fProviderService = container.resolve("fulfillmentProviderService") const fulfilProviders = silentResolution(container, "fulfillmentProviders", logger) || [] - fulfilIds = fulfilProviders.map((p) => p.getIdentifier()) + const fulfilIds = fulfilProviders.map((p) => p.getIdentifier()) await fProviderService.registerInstalledProviders(fulfilIds) - let taxIds const tProviderService = container.resolve("taxProviderService") const taxProviders = silentResolution(container, "taxProviders", logger) || [] - taxIds = taxProviders.map((p) => p.getIdentifier()) + const taxIds = taxProviders.map((p) => p.getIdentifier()) await tProviderService.registerInstalledProviders(taxIds) await profileService.withTransaction(manager).createDefault() diff --git a/packages/medusa/src/services/fulfillment-provider.js b/packages/medusa/src/services/fulfillment-provider.js index 85705fcf33..cc6e5ffca4 100644 --- a/packages/medusa/src/services/fulfillment-provider.js +++ b/packages/medusa/src/services/fulfillment-provider.js @@ -12,7 +12,8 @@ class FulfillmentProviderService { async registerInstalledProviders(providers) { const { manager, fulfillmentProviderRepository } = this.container_ const model = manager.getCustomRepository(fulfillmentProviderRepository) - model.update({}, { is_installed: false }) + await model.update({}, { is_installed: false }) + for (const p of providers) { const n = model.create({ id: p, is_installed: true }) await model.save(n) @@ -23,7 +24,7 @@ class FulfillmentProviderService { const { manager, fulfillmentProviderRepository } = this.container_ const fpRepo = manager.getCustomRepository(fulfillmentProviderRepository) - return fpRepo.find({}) + return await fpRepo.find({}) } async listFulfillmentOptions(providers) { diff --git a/packages/medusa/src/services/payment-provider.js b/packages/medusa/src/services/payment-provider.js index fcff5f2be8..613811d59c 100644 --- a/packages/medusa/src/services/payment-provider.js +++ b/packages/medusa/src/services/payment-provider.js @@ -34,8 +34,10 @@ class PaymentProviderService extends BaseService { async registerInstalledProviders(providers) { const { manager, paymentProviderRepository } = this.container_ + const model = manager.getCustomRepository(paymentProviderRepository) - model.update({}, { is_installed: false }) + await model.update({}, { is_installed: false }) + for (const p of providers) { const n = model.create({ id: p, is_installed: true }) await model.save(n) @@ -46,7 +48,7 @@ class PaymentProviderService extends BaseService { const { manager, paymentProviderRepository } = this.container_ const ppRepo = manager.getCustomRepository(paymentProviderRepository) - return ppRepo.find({}) + return await ppRepo.find({}) } async retrievePayment(id, relations = []) { diff --git a/packages/medusa/src/services/tax-provider.ts b/packages/medusa/src/services/tax-provider.ts index 8411675ca4..ca5fe39fba 100644 --- a/packages/medusa/src/services/tax-provider.ts +++ b/packages/medusa/src/services/tax-provider.ts @@ -431,7 +431,8 @@ class TaxProviderService extends BaseService { async registerInstalledProviders(providers: string[]): Promise { const model = this.manager_.getCustomRepository(this.taxProviderRepo_) - model.update({}, { is_installed: false }) + await model.update({}, { is_installed: false }) + for (const p of providers) { const n = model.create({ id: p, is_installed: true }) await model.save(n)