From 96377df1017d8391bb845baf7d7369533a0f4273 Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Mon, 25 May 2020 14:06:10 +0200 Subject: [PATCH] updates tests --- packages/medusa-test-utils/src/id-map.js | 14 +++- .../__tests__/add-option-value.js | 4 +- .../__tests__/create-product-variant.js | 14 +++- .../__tests__/delete-option-value.js | 2 +- .../__tests__/set-currency-price.js | 42 ---------- .../__tests__/set-region-price.js | 40 ---------- .../__tests__/update-prices.js | 77 +++++++++++++++++++ .../__tests__/update-product-variant.js | 14 +++- .../admin/product-variants/add-price.js | 42 ++++++++++ .../product-variants/delete-option-value.js | 4 +- .../routes/admin/product-variants/index.js | 10 +-- .../product-variants/set-currency-price.js | 28 ------- .../product-variants/set-region-price.js | 2 +- .../admin/products/__tests__/add-option.js | 2 +- .../api/routes/admin/products/add-option.js | 1 - .../admin/regions/__tests__/add-country.js | 4 +- .../__tests__/add-fulfillment-provider.js | 4 +- .../regions/__tests__/add-payment-provider.js | 4 +- .../admin/regions/__tests__/get-region.js | 4 +- .../store/carts/__tests__/create-line-item.js | 8 +- .../routes/store/carts/__tests__/get-cart.js | 2 +- .../routes/store/carts/create-line-item.js | 4 +- .../src/api/routes/store/carts/get-cart.js | 16 ++-- packages/medusa/src/models/__mocks__/order.js | 6 +- packages/medusa/src/models/cart.js | 4 +- packages/medusa/src/models/order.js | 2 +- .../medusa/src/models/schemas/discount.js | 14 ++++ .../medusa/src/services/__mocks__/auth.js | 2 +- .../medusa/src/services/__mocks__/cart.js | 2 +- .../medusa/src/services/__mocks__/order.js | 4 +- .../src/services/__mocks__/product-variant.js | 1 + .../medusa/src/services/__mocks__/product.js | 1 + .../medusa/src/services/__mocks__/region.js | 5 +- .../src/services/__tests__/line-item.js | 12 ++- packages/medusa/src/services/cart.js | 10 ++- packages/medusa/src/services/line-item.js | 5 +- .../medusa/src/services/product-variant.js | 2 +- packages/medusa/src/services/product.js | 4 +- packages/medusa/src/services/region.js | 12 ++- packages/medusa/src/services/totals.js | 4 +- packages/medusa/src/services/user.js | 2 +- packages/medusa/yarn.lock | 15 ---- 42 files changed, 246 insertions(+), 203 deletions(-) delete mode 100644 packages/medusa/src/api/routes/admin/product-variants/__tests__/set-currency-price.js delete mode 100644 packages/medusa/src/api/routes/admin/product-variants/__tests__/set-region-price.js create mode 100644 packages/medusa/src/api/routes/admin/product-variants/__tests__/update-prices.js create mode 100644 packages/medusa/src/api/routes/admin/product-variants/add-price.js delete mode 100644 packages/medusa/src/api/routes/admin/product-variants/set-currency-price.js create mode 100644 packages/medusa/src/models/schemas/discount.js diff --git a/packages/medusa-test-utils/src/id-map.js b/packages/medusa-test-utils/src/id-map.js index 686cfaf235..ffc435ce24 100644 --- a/packages/medusa-test-utils/src/id-map.js +++ b/packages/medusa-test-utils/src/id-map.js @@ -1,15 +1,21 @@ import mongoose from "mongoose" +String.prototype.equals = function(that) { + return this === that +} + class IdMap { ids = {} - getId(key) { + getId(key, backend=false) { if (this.ids[key]) { return this.ids[key] } - const id = `${mongoose.Types.ObjectId()}` - this.ids[key] = id - return id + + const mongooseId = `${mongoose.Types.ObjectId()}` + this.ids[key] = mongooseId + + return mongooseId } } diff --git a/packages/medusa/src/api/routes/admin/product-variants/__tests__/add-option-value.js b/packages/medusa/src/api/routes/admin/product-variants/__tests__/add-option-value.js index b2582b1de4..24039c598e 100644 --- a/packages/medusa/src/api/routes/admin/product-variants/__tests__/add-option-value.js +++ b/packages/medusa/src/api/routes/admin/product-variants/__tests__/add-option-value.js @@ -12,8 +12,8 @@ describe("POST /admin/product-variants/:id/options", () => { `/admin/product-variants/${IdMap.getId("testVariant")}/options`, { payload: { - optionId: IdMap.getId("testOption"), - optionValue: "test", + option_id: IdMap.getId("testOption"), + value: "test", }, adminSession: { jwt: { diff --git a/packages/medusa/src/api/routes/admin/product-variants/__tests__/create-product-variant.js b/packages/medusa/src/api/routes/admin/product-variants/__tests__/create-product-variant.js index 51bfc19f40..0c685508cd 100644 --- a/packages/medusa/src/api/routes/admin/product-variants/__tests__/create-product-variant.js +++ b/packages/medusa/src/api/routes/admin/product-variants/__tests__/create-product-variant.js @@ -10,7 +10,12 @@ describe("POST /admin/product-variants", () => { subject = await request("POST", "/admin/product-variants", { payload: { title: "Test Product Variant", - prices: [{}], + prices: [ + { + currency_code: "DKK", + amount: 1234, + }, + ], }, adminSession: { jwt: { @@ -32,7 +37,12 @@ describe("POST /admin/product-variants", () => { expect(ProductVariantServiceMock.createDraft).toHaveBeenCalledTimes(1) expect(ProductVariantServiceMock.createDraft).toHaveBeenCalledWith({ title: "Test Product Variant", - prices: [{}], + prices: [ + { + currency_code: "DKK", + amount: 1234, + }, + ], }) }) }) diff --git a/packages/medusa/src/api/routes/admin/product-variants/__tests__/delete-option-value.js b/packages/medusa/src/api/routes/admin/product-variants/__tests__/delete-option-value.js index 94adc1b33f..1720b1fde3 100644 --- a/packages/medusa/src/api/routes/admin/product-variants/__tests__/delete-option-value.js +++ b/packages/medusa/src/api/routes/admin/product-variants/__tests__/delete-option-value.js @@ -12,7 +12,7 @@ describe("DELETE /admin/product-variants/:id/options", () => { `/admin/product-variants/${IdMap.getId("testVariant")}/options`, { payload: { - optionId: IdMap.getId("testOption"), + option_id: IdMap.getId("testOption"), }, adminSession: { jwt: { diff --git a/packages/medusa/src/api/routes/admin/product-variants/__tests__/set-currency-price.js b/packages/medusa/src/api/routes/admin/product-variants/__tests__/set-currency-price.js deleted file mode 100644 index de6da320ec..0000000000 --- a/packages/medusa/src/api/routes/admin/product-variants/__tests__/set-currency-price.js +++ /dev/null @@ -1,42 +0,0 @@ -import { IdMap } from "medusa-test-utils" -import { request } from "../../../../../helpers/test-request" -import { ProductVariantServiceMock } from "../../../../../services/__mocks__/product-variant" - -describe("POST /admin/product-variants/:id/currency-price", () => { - describe("successful sets currency price", () => { - let subject - - beforeAll(async () => { - subject = await request( - "POST", - `/admin/product-variants/${IdMap.getId("testVariant")}/currency-price`, - { - payload: { - currencyCode: "DKK", - amount: 100, - }, - adminSession: { - jwt: { - userId: IdMap.getId("admin_user"), - }, - }, - } - ) - }) - - it("returns 200", () => { - expect(subject.status).toEqual(200) - }) - - it("calls service setCurrencyPrice", () => { - expect(ProductVariantServiceMock.setCurrencyPrice).toHaveBeenCalledTimes( - 1 - ) - expect(ProductVariantServiceMock.setCurrencyPrice).toHaveBeenCalledWith( - IdMap.getId("testVariant"), - "DKK", - 100 - ) - }) - }) -}) diff --git a/packages/medusa/src/api/routes/admin/product-variants/__tests__/set-region-price.js b/packages/medusa/src/api/routes/admin/product-variants/__tests__/set-region-price.js deleted file mode 100644 index 7898b23243..0000000000 --- a/packages/medusa/src/api/routes/admin/product-variants/__tests__/set-region-price.js +++ /dev/null @@ -1,40 +0,0 @@ -import { IdMap } from "medusa-test-utils" -import { request } from "../../../../../helpers/test-request" -import { ProductVariantServiceMock } from "../../../../../services/__mocks__/product-variant" - -describe("POST /admin/product-variants/:id/region-price", () => { - describe("successfully sets region price", () => { - let subject - - beforeAll(async () => { - subject = await request( - "POST", - `/admin/product-variants/${IdMap.getId("testVariant")}/region-price`, - { - payload: { - regionId: IdMap.getId("region-fr"), - amount: 100, - }, - adminSession: { - jwt: { - userId: IdMap.getId("admin_user"), - }, - }, - } - ) - }) - - it("returns 200", () => { - expect(subject.status).toEqual(200) - }) - - it("calls service setCurrencyPrice", () => { - expect(ProductVariantServiceMock.setRegionPrice).toHaveBeenCalledTimes(1) - expect(ProductVariantServiceMock.setRegionPrice).toHaveBeenCalledWith( - IdMap.getId("testVariant"), - IdMap.getId("region-fr"), - 100 - ) - }) - }) -}) diff --git a/packages/medusa/src/api/routes/admin/product-variants/__tests__/update-prices.js b/packages/medusa/src/api/routes/admin/product-variants/__tests__/update-prices.js new file mode 100644 index 0000000000..09e193b6c2 --- /dev/null +++ b/packages/medusa/src/api/routes/admin/product-variants/__tests__/update-prices.js @@ -0,0 +1,77 @@ +import { IdMap } from "medusa-test-utils" +import { request } from "../../../../../helpers/test-request" +import { ProductVariantServiceMock } from "../../../../../services/__mocks__/product-variant" + +describe("POST /admin/product-variants/:id/prices", () => { + describe("successfully sets region price", () => { + let subject + + beforeAll(async () => { + subject = await request( + "POST", + `/admin/product-variants/${IdMap.getId("testVariant")}/prices`, + { + payload: { + region_id: IdMap.getId("region-fr"), + amount: 100, + }, + adminSession: { + jwt: { + userId: IdMap.getId("admin_user"), + }, + }, + } + ) + }) + + it("returns 200", () => { + expect(subject.status).toEqual(200) + }) + + it("calls service setCurrencyPrice", () => { + expect(ProductVariantServiceMock.setRegionPrice).toHaveBeenCalledTimes(1) + expect(ProductVariantServiceMock.setRegionPrice).toHaveBeenCalledWith( + IdMap.getId("testVariant"), + IdMap.getId("region-fr"), + 100 + ) + }) + }) + + describe("successfully sets currency price", () => { + let subject + + beforeAll(async () => { + subject = await request( + "POST", + `/admin/product-variants/${IdMap.getId("testVariant")}/prices`, + { + payload: { + currency_code: "EUR", + amount: 100, + }, + adminSession: { + jwt: { + userId: IdMap.getId("admin_user"), + }, + }, + } + ) + }) + + it("returns 200", () => { + expect(subject.status).toEqual(200) + }) + + it("calls service setCurrencyPrice", () => { + expect(ProductVariantServiceMock.setCurrencyPrice).toHaveBeenCalledTimes( + 1 + ) + expect(ProductVariantServiceMock.setCurrencyPrice).toHaveBeenCalledWith( + IdMap.getId("testVariant"), + "EUR", + 100 + ) + }) + }) +}) diff --git a/packages/medusa/src/api/routes/admin/product-variants/__tests__/update-product-variant.js b/packages/medusa/src/api/routes/admin/product-variants/__tests__/update-product-variant.js index fd8437d4b3..4463ad0969 100644 --- a/packages/medusa/src/api/routes/admin/product-variants/__tests__/update-product-variant.js +++ b/packages/medusa/src/api/routes/admin/product-variants/__tests__/update-product-variant.js @@ -13,7 +13,12 @@ describe("POST /admin/product-variants/:id", () => { { payload: { title: "Test Product Variant Updated", - prices: [{}], + prices: [ + { + currency_code: "DKK", + amount: 1234, + }, + ], }, adminSession: { jwt: { @@ -34,7 +39,12 @@ describe("POST /admin/product-variants/:id", () => { IdMap.getId("testVariant"), { title: "Test Product Variant Updated", - prices: [{}], + prices: [ + { + currency_code: "DKK", + amount: 1234, + }, + ], } ) }) diff --git a/packages/medusa/src/api/routes/admin/product-variants/add-price.js b/packages/medusa/src/api/routes/admin/product-variants/add-price.js new file mode 100644 index 0000000000..f93c227f97 --- /dev/null +++ b/packages/medusa/src/api/routes/admin/product-variants/add-price.js @@ -0,0 +1,42 @@ +import { MedusaError, Validator } from "medusa-core-utils" + +export default async (req, res) => { + const { id } = req.params + + const schema = Validator.object() + .keys({ + region_id: Validator.string(), + currency_code: Validator.string(), + amount: Validator.number().required(), + }) + .xor("region_id", "currency_code") + + const { value, error } = schema.validate(req.body) + if (error) { + throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details) + } + + try { + const productVariantService = req.scope.resolve("productVariantService") + + if (value.region_id) { + const productVariant = await productVariantService.setRegionPrice( + id, + value.region_id, + value.amount + ) + + res.status(200).json(productVariant) + } else { + const productVariant = await productVariantService.setCurrencyPrice( + id, + value.currency_code, + value.amount + ) + + res.status(200).json(productVariant) + } + } catch (err) { + throw err + } +} diff --git a/packages/medusa/src/api/routes/admin/product-variants/delete-option-value.js b/packages/medusa/src/api/routes/admin/product-variants/delete-option-value.js index 8db3a0e1c8..16d0f28b2b 100644 --- a/packages/medusa/src/api/routes/admin/product-variants/delete-option-value.js +++ b/packages/medusa/src/api/routes/admin/product-variants/delete-option-value.js @@ -4,7 +4,7 @@ export default async (req, res) => { const { id } = req.params const schema = Validator.object().keys({ - optionId: Validator.objectId().required(), + option_id: Validator.objectId().required(), }) const { value, error } = schema.validate(req.body) @@ -16,7 +16,7 @@ export default async (req, res) => { const productVariantService = req.scope.resolve("productVariantService") const productVariant = await productVariantService.deleteOptionValue( id, - value.optionId + value.option_id ) res.status(200).json(productVariant) diff --git a/packages/medusa/src/api/routes/admin/product-variants/index.js b/packages/medusa/src/api/routes/admin/product-variants/index.js index e6ed9f65f7..768d1d7ecc 100644 --- a/packages/medusa/src/api/routes/admin/product-variants/index.js +++ b/packages/medusa/src/api/routes/admin/product-variants/index.js @@ -17,15 +17,7 @@ export default app => { middlewares.wrap(require("./publish-product-variant").default) ) - route.post( - "/:id/currency-price", - middlewares.wrap(require("./set-currency-price").default) - ) - - route.post( - "/:id/region-price", - middlewares.wrap(require("./set-region-price").default) - ) + route.post("/:id/prices", middlewares.wrap(require("./add-price").default)) route.post( "/:id/options", diff --git a/packages/medusa/src/api/routes/admin/product-variants/set-currency-price.js b/packages/medusa/src/api/routes/admin/product-variants/set-currency-price.js deleted file mode 100644 index 948f6e1ed3..0000000000 --- a/packages/medusa/src/api/routes/admin/product-variants/set-currency-price.js +++ /dev/null @@ -1,28 +0,0 @@ -import { MedusaError, Validator } from "medusa-core-utils" - -export default async (req, res) => { - const { id } = req.params - - const schema = Validator.object().keys({ - currencyCode: Validator.string().required(), - amount: Validator.number().required(), - }) - - const { value, error } = schema.validate(req.body) - if (error) { - throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details) - } - - try { - const productVariantService = req.scope.resolve("productVariantService") - const productVariant = await productVariantService.setCurrencyPrice( - id, - value.currencyCode, - value.amount - ) - - res.status(200).json(productVariant) - } catch (err) { - throw err - } -} diff --git a/packages/medusa/src/api/routes/admin/product-variants/set-region-price.js b/packages/medusa/src/api/routes/admin/product-variants/set-region-price.js index d3564985a3..b27f6712cc 100644 --- a/packages/medusa/src/api/routes/admin/product-variants/set-region-price.js +++ b/packages/medusa/src/api/routes/admin/product-variants/set-region-price.js @@ -4,7 +4,7 @@ export default async (req, res) => { const { id } = req.params const schema = Validator.object().keys({ - regionId: Validator.objectId().required(), + region_id: Validator.objectId().required(), amount: Validator.number().required(), }) diff --git a/packages/medusa/src/api/routes/admin/products/__tests__/add-option.js b/packages/medusa/src/api/routes/admin/products/__tests__/add-option.js index 3c25957fb7..8330c6b49a 100644 --- a/packages/medusa/src/api/routes/admin/products/__tests__/add-option.js +++ b/packages/medusa/src/api/routes/admin/products/__tests__/add-option.js @@ -12,7 +12,7 @@ describe("POST /admin/products/:id/options", () => { `/admin/products/${IdMap.getId("productWithOptions")}/options`, { payload: { - optionTitle: "Test option", + option_title: "Test option", }, adminSession: { jwt: { diff --git a/packages/medusa/src/api/routes/admin/products/add-option.js b/packages/medusa/src/api/routes/admin/products/add-option.js index 386110fe36..365380d41d 100644 --- a/packages/medusa/src/api/routes/admin/products/add-option.js +++ b/packages/medusa/src/api/routes/admin/products/add-option.js @@ -27,7 +27,6 @@ export default async (req, res) => { ]) res.json(data) } catch (err) { - console.log(err) throw err } } diff --git a/packages/medusa/src/api/routes/admin/regions/__tests__/add-country.js b/packages/medusa/src/api/routes/admin/regions/__tests__/add-country.js index 7e9b524552..cb7bdaab39 100644 --- a/packages/medusa/src/api/routes/admin/regions/__tests__/add-country.js +++ b/packages/medusa/src/api/routes/admin/regions/__tests__/add-country.js @@ -7,7 +7,7 @@ describe("POST /admin/regions/:region_id/countries", () => { let subject beforeAll(async () => { - const id = IdMap.getId("region") + const id = IdMap.getId("testRegion") subject = await request("POST", `/admin/regions/${id}/countries`, { payload: { country_code: "se", @@ -27,7 +27,7 @@ describe("POST /admin/regions/:region_id/countries", () => { it("calls service addCountry", () => { expect(RegionServiceMock.addCountry).toHaveBeenCalledTimes(1) expect(RegionServiceMock.addCountry).toHaveBeenCalledWith( - IdMap.getId("region"), + IdMap.getId("testRegion"), "se" ) }) diff --git a/packages/medusa/src/api/routes/admin/regions/__tests__/add-fulfillment-provider.js b/packages/medusa/src/api/routes/admin/regions/__tests__/add-fulfillment-provider.js index 7670a850f6..74b9df9f9f 100644 --- a/packages/medusa/src/api/routes/admin/regions/__tests__/add-fulfillment-provider.js +++ b/packages/medusa/src/api/routes/admin/regions/__tests__/add-fulfillment-provider.js @@ -7,7 +7,7 @@ describe("POST /admin/regions/:region_id/fulfillment-providers", () => { let subject beforeAll(async () => { - const id = IdMap.getId("region") + const id = IdMap.getId("testRegion") subject = await request( "POST", `/admin/regions/${id}/fulfillment-providers`, @@ -31,7 +31,7 @@ describe("POST /admin/regions/:region_id/fulfillment-providers", () => { it("calls service addCountry", () => { expect(RegionServiceMock.addFulfillmentProvider).toHaveBeenCalledTimes(1) expect(RegionServiceMock.addFulfillmentProvider).toHaveBeenCalledWith( - IdMap.getId("region"), + IdMap.getId("testRegion"), "default_provider" ) }) diff --git a/packages/medusa/src/api/routes/admin/regions/__tests__/add-payment-provider.js b/packages/medusa/src/api/routes/admin/regions/__tests__/add-payment-provider.js index 327fbfd374..4f8417d746 100644 --- a/packages/medusa/src/api/routes/admin/regions/__tests__/add-payment-provider.js +++ b/packages/medusa/src/api/routes/admin/regions/__tests__/add-payment-provider.js @@ -7,7 +7,7 @@ describe("POST /admin/regions/:region_id/payment-providers", () => { let subject beforeAll(async () => { - const id = IdMap.getId("region") + const id = IdMap.getId("testRegion") subject = await request( "POST", `/admin/regions/${id}/payment-providers`, @@ -31,7 +31,7 @@ describe("POST /admin/regions/:region_id/payment-providers", () => { it("calls service addCountry", () => { expect(RegionServiceMock.addPaymentProvider).toHaveBeenCalledTimes(1) expect(RegionServiceMock.addPaymentProvider).toHaveBeenCalledWith( - IdMap.getId("region"), + IdMap.getId("testRegion"), "default_provider" ) }) diff --git a/packages/medusa/src/api/routes/admin/regions/__tests__/get-region.js b/packages/medusa/src/api/routes/admin/regions/__tests__/get-region.js index 7d4cb3601d..14d1ee9a43 100644 --- a/packages/medusa/src/api/routes/admin/regions/__tests__/get-region.js +++ b/packages/medusa/src/api/routes/admin/regions/__tests__/get-region.js @@ -7,7 +7,7 @@ describe("GET /admin/regions/:region_id", () => { let subject beforeAll(async () => { - const id = IdMap.getId("region") + const id = IdMap.getId("testRegion") subject = await request("GET", `/admin/regions/${id}`, { adminSession: { jwt: { @@ -24,7 +24,7 @@ describe("GET /admin/regions/:region_id", () => { it("calls service addCountry", () => { expect(RegionServiceMock.retrieve).toHaveBeenCalledTimes(1) expect(RegionServiceMock.retrieve).toHaveBeenCalledWith( - IdMap.getId("region") + IdMap.getId("testRegion") ) }) }) diff --git a/packages/medusa/src/api/routes/store/carts/__tests__/create-line-item.js b/packages/medusa/src/api/routes/store/carts/__tests__/create-line-item.js index 5c511807f1..dd4c8b6076 100644 --- a/packages/medusa/src/api/routes/store/carts/__tests__/create-line-item.js +++ b/packages/medusa/src/api/routes/store/carts/__tests__/create-line-item.js @@ -32,8 +32,8 @@ describe("POST /store/carts/:id", () => { expect(LineItemServiceMock.generate).toHaveBeenCalledTimes(1) expect(LineItemServiceMock.generate).toHaveBeenCalledWith( IdMap.getId("testVariant"), - 3, - IdMap.getId("testRegion") + IdMap.getId("testRegion"), + 3 ) }) @@ -71,8 +71,8 @@ describe("POST /store/carts/:id", () => { expect(LineItemServiceMock.generate).toHaveBeenCalledTimes(1) expect(LineItemServiceMock.generate).toHaveBeenCalledWith( IdMap.getId("fail"), - 3, - IdMap.getId("testRegion") + IdMap.getId("testRegion"), + 3 ) }) diff --git a/packages/medusa/src/api/routes/store/carts/__tests__/get-cart.js b/packages/medusa/src/api/routes/store/carts/__tests__/get-cart.js index 2fa20a5afb..a3e37b7247 100644 --- a/packages/medusa/src/api/routes/store/carts/__tests__/get-cart.js +++ b/packages/medusa/src/api/routes/store/carts/__tests__/get-cart.js @@ -43,7 +43,7 @@ describe("GET /store/carts", () => { expect(CartServiceMock.retrieve).toHaveBeenCalledWith("none") }) - it("returns products", () => { + it("returns 404 status", () => { expect(subject.status).toEqual(404) }) }) diff --git a/packages/medusa/src/api/routes/store/carts/create-line-item.js b/packages/medusa/src/api/routes/store/carts/create-line-item.js index bb9a6fc69b..9446a75606 100644 --- a/packages/medusa/src/api/routes/store/carts/create-line-item.js +++ b/packages/medusa/src/api/routes/store/carts/create-line-item.js @@ -20,8 +20,8 @@ export default async (req, res) => { const lineItem = await lineItemService.generate( value.variant_id, - value.quantity, - cart.region_id + cart.region_id, + value.quantity ) await cartService.addLineItem(cart._id, lineItem) diff --git a/packages/medusa/src/api/routes/store/carts/get-cart.js b/packages/medusa/src/api/routes/store/carts/get-cart.js index 34d45f6fa5..2611ccdd1a 100644 --- a/packages/medusa/src/api/routes/store/carts/get-cart.js +++ b/packages/medusa/src/api/routes/store/carts/get-cart.js @@ -1,15 +1,13 @@ export default async (req, res) => { const { id } = req.params - const cartService = req.scope.resolve("cartService") - let cart = await cartService.retrieve(id) + try { + const cartService = req.scope.resolve("cartService") + let cart = await cartService.retrieve(id) + cart = await cartService.decorate(cart) - if (!cart) { - res.sendStatus(404) - return + res.json(cart) + } catch (err) { + throw err } - - cart = await cartService.decorate(cart) - - res.json(cart) } diff --git a/packages/medusa/src/models/__mocks__/order.js b/packages/medusa/src/models/__mocks__/order.js index dff006bbcd..e3c198ed5f 100644 --- a/packages/medusa/src/models/__mocks__/order.js +++ b/packages/medusa/src/models/__mocks__/order.js @@ -39,7 +39,7 @@ export const orders = { quantity: 10, }, ], - region: IdMap.getId("region-france"), + region_id: IdMap.getId("region-france"), customer_id: IdMap.getId("test-customer"), payment_method: { provider_id: "default_provider", @@ -102,7 +102,7 @@ export const orders = { quantity: 10, }, ], - region: IdMap.getId("region-france"), + region_id: IdMap.getId("region-france"), customer_id: IdMap.getId("test-customer"), payment_method: { provider_id: "default_provider", @@ -182,7 +182,7 @@ export const orders = { quantity: 10, }, ], - region: IdMap.getId("region-france"), + region_id: IdMap.getId("region-france"), customer_id: IdMap.getId("test-customer"), payment_method: { provider_id: "default_provider", diff --git a/packages/medusa/src/models/cart.js b/packages/medusa/src/models/cart.js index d89eae225f..1393e3b088 100644 --- a/packages/medusa/src/models/cart.js +++ b/packages/medusa/src/models/cart.js @@ -8,7 +8,7 @@ import LineItemSchema from "./schemas/line-item" import PaymentMethodSchema from "./schemas/payment-method" import ShippingMethodSchema from "./schemas/shipping-method" import AddressSchema from "./schemas/address" -import DiscountModel from "./discount" +import DiscountSchema from "./schemas/discount" class CartModel extends BaseModel { static modelName = "Cart" @@ -19,7 +19,7 @@ class CartModel extends BaseModel { shipping_address: { type: AddressSchema }, items: { type: [LineItemSchema], default: [] }, region_id: { type: String, required: true }, - discounts: { type: [DiscountModel.schema], default: [] }, + discounts: { type: [DiscountSchema], default: [] }, customer_id: { type: String, default: "" }, payment_sessions: { type: [PaymentMethodSchema], default: [] }, shipping_options: { type: [ShippingMethodSchema], default: [] }, diff --git a/packages/medusa/src/models/order.js b/packages/medusa/src/models/order.js index 03cfb03371..53e4601570 100644 --- a/packages/medusa/src/models/order.js +++ b/packages/medusa/src/models/order.js @@ -21,7 +21,7 @@ class OrderModel extends BaseModel { billing_address: { type: AddressSchema, required: true }, shipping_address: { type: AddressSchema, required: true }, items: { type: [LineItemSchema], required: true }, - region: { type: String, required: true }, + region_id: { type: String, required: true }, discounts: { type: [DiscountModel.schema], default: [] }, customer_id: { type: String, required: true }, payment_method: { type: PaymentMethodSchema, required: true }, diff --git a/packages/medusa/src/models/schemas/discount.js b/packages/medusa/src/models/schemas/discount.js new file mode 100644 index 0000000000..3ccf038215 --- /dev/null +++ b/packages/medusa/src/models/schemas/discount.js @@ -0,0 +1,14 @@ +import mongoose from "mongoose" + +import DiscountRule from "./discount-rule" + +export default new mongoose.Schema({ + code: { type: String }, + discount_rule: { type: DiscountRule }, + usage_count: { type: Number }, + disabled: { type: Boolean }, + starts_at: { type: Date }, + ends_at: { type: Date }, + regions: { type: [String], default: [] }, + metadata: { type: mongoose.Schema.Types.Mixed, default: {} }, +}) diff --git a/packages/medusa/src/services/__mocks__/auth.js b/packages/medusa/src/services/__mocks__/auth.js index fd6f3411c8..6cc537c01b 100644 --- a/packages/medusa/src/services/__mocks__/auth.js +++ b/packages/medusa/src/services/__mocks__/auth.js @@ -1,7 +1,7 @@ import { IdMap } from "medusa-test-utils" const adminUser = { - _id: IdMap.getId("admin_user"), + _id: IdMap.getId("admin_user", true), password: "1235", name: "hi", } diff --git a/packages/medusa/src/services/__mocks__/cart.js b/packages/medusa/src/services/__mocks__/cart.js index 462f2f0fda..4d8b8c61c7 100644 --- a/packages/medusa/src/services/__mocks__/cart.js +++ b/packages/medusa/src/services/__mocks__/cart.js @@ -208,7 +208,7 @@ export const CartServiceMock = { if (cartId === IdMap.getId("cartWithPaySessions")) { return Promise.resolve(carts.cartWithPaySessions) } - return Promise.resolve(undefined) + throw new MedusaError(MedusaError.Types.NOT_FOUND, "cart not found") }), addLineItem: jest.fn().mockImplementation((cartId, lineItem) => { return Promise.resolve() diff --git a/packages/medusa/src/services/__mocks__/order.js b/packages/medusa/src/services/__mocks__/order.js index 781cbbf565..0d3eee56fa 100644 --- a/packages/medusa/src/services/__mocks__/order.js +++ b/packages/medusa/src/services/__mocks__/order.js @@ -41,7 +41,7 @@ export const orders = { quantity: 10, }, ], - region: IdMap.getId("testRegion"), + region_id: IdMap.getId("testRegion"), customer_id: IdMap.getId("testCustomer"), payment_method: { provider_id: "default_provider", @@ -94,7 +94,7 @@ export const orders = { quantity: 10, }, ], - region: IdMap.getId("region-france"), + region_id: IdMap.getId("region-france"), customer_id: IdMap.getId("test-customer"), payment_method: { provider_id: "default_provider", diff --git a/packages/medusa/src/services/__mocks__/product-variant.js b/packages/medusa/src/services/__mocks__/product-variant.js index 20bc943116..2498abec2c 100644 --- a/packages/medusa/src/services/__mocks__/product-variant.js +++ b/packages/medusa/src/services/__mocks__/product-variant.js @@ -103,6 +103,7 @@ const emptyVariant = { const eur10us12 = { _id: IdMap.getId("eur-10-us-12"), + title: "EUR10US-12", } export const variants = { diff --git a/packages/medusa/src/services/__mocks__/product.js b/packages/medusa/src/services/__mocks__/product.js index e8bdcfd3a9..470351c8ca 100644 --- a/packages/medusa/src/services/__mocks__/product.js +++ b/packages/medusa/src/services/__mocks__/product.js @@ -101,6 +101,7 @@ export const ProductServiceMock = { { _id: "1234", title: "test", + thumbnail: "test.1234", }, ]) } diff --git a/packages/medusa/src/services/__mocks__/region.js b/packages/medusa/src/services/__mocks__/region.js index 7685b15711..3df3e94cb9 100644 --- a/packages/medusa/src/services/__mocks__/region.js +++ b/packages/medusa/src/services/__mocks__/region.js @@ -21,18 +21,21 @@ export const regions = { }, regionUs: { _id: IdMap.getId("region-us"), + tax_rate: 0.25, name: "USA", countries: ["US"], currency_code: "usd", }, regionGermany: { _id: IdMap.getId("region-de"), + tax_rate: 0.25, name: "Germany", countries: ["DE"], currency_code: "eur", }, regionSweden: { _id: IdMap.getId("region-se"), + tax_rate: 0.25, name: "Sweden", countries: ["SE"], currency_code: "sek", @@ -56,7 +59,7 @@ export const RegionServiceMock = { if (regionId === IdMap.getId("region-se")) { return Promise.resolve(regions.regionSweden) } - return Promise.resolve(undefined) + throw Error(regionId + "not found") }), delete: jest.fn().mockImplementation(data => Promise.resolve()), create: jest.fn().mockImplementation(data => Promise.resolve()), diff --git a/packages/medusa/src/services/__tests__/line-item.js b/packages/medusa/src/services/__tests__/line-item.js index d496eaaea2..ac8e2e29bf 100644 --- a/packages/medusa/src/services/__tests__/line-item.js +++ b/packages/medusa/src/services/__tests__/line-item.js @@ -24,24 +24,22 @@ describe("LineItemService", () => { it("generates line item and successfully defaults quantity of content to 1", () => { expect(result).toEqual({ + title: "test", + description: "EUR10US-12", + thumbnail: "test.1234", content: { unit_price: 10, variant: { _id: IdMap.getId("eur-10-us-12"), + title: "EUR10US-12", }, product: { _id: "1234", title: "test", + thumbnail: "test.1234", }, quantity: 1, }, - product: { - _id: "1234", - title: "test", - }, - variant: { - _id: IdMap.getId("eur-10-us-12"), - }, quantity: 2, }) }) diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index b6767d8c6a..ec39c9710d 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -23,6 +23,7 @@ class CartService extends BaseService { shippingOptionService, shippingProfileService, discountService, + totalsService, }) { super() @@ -55,6 +56,9 @@ class CartService extends BaseService { /** @private @const {DiscountService} */ this.discountService_ = discountService + + /** @private @const {DiscountService} */ + this.totalsService_ = totalsService } /** @@ -64,7 +68,7 @@ class CartService extends BaseService { */ validateId_(rawId) { const schema = Validator.objectId() - const { value, error } = schema.validate(rawId) + const { value, error } = schema.validate(rawId.toString()) if (error) { throw new MedusaError( MedusaError.Types.INVALID_ARGUMENT, @@ -221,7 +225,9 @@ class CartService extends BaseService { * @return {Cart} return the decorated cart. */ async decorate(cart, fields, expandFields = []) { - return cart + const c = cart.toObject() + c.total = await this.totalsService_.getTotal(cart) + return c } /** diff --git a/packages/medusa/src/services/line-item.js b/packages/medusa/src/services/line-item.js index f8f60c6b92..92c5e5ec0e 100644 --- a/packages/medusa/src/services/line-item.js +++ b/packages/medusa/src/services/line-item.js @@ -101,9 +101,10 @@ class LineItemService extends BaseService { ) return { - variant, - product, + title: product.title, + description: variant.title, quantity, + thumbnail: product.thumbnail, content: { unit_price, variant, diff --git a/packages/medusa/src/services/product-variant.js b/packages/medusa/src/services/product-variant.js index 26ab7599cf..3de62e2174 100644 --- a/packages/medusa/src/services/product-variant.js +++ b/packages/medusa/src/services/product-variant.js @@ -28,7 +28,7 @@ class ProductVariantService extends BaseService { */ validateId_(rawId) { const schema = Validator.objectId() - const { value, error } = schema.validate(rawId) + const { value, error } = schema.validate(rawId.toString()) if (error) { throw new MedusaError( MedusaError.Types.INVALID_ARGUMENT, diff --git a/packages/medusa/src/services/product.js b/packages/medusa/src/services/product.js index bc6b1acf45..af2cea350b 100644 --- a/packages/medusa/src/services/product.js +++ b/packages/medusa/src/services/product.js @@ -29,7 +29,7 @@ class ProductService extends BaseService { */ validateId_(rawId) { const schema = Validator.objectId() - const { value, error } = schema.validate(rawId) + const { value, error } = schema.validate(rawId.toString()) if (error) { throw new MedusaError( MedusaError.Types.INVALID_ARGUMENT, @@ -193,7 +193,7 @@ class ProductService extends BaseService { }) let combinationExists = false - if (product.variants) { + if (product.variants && product.variants.length) { // Check if option value of the variant to add already exists. Go through // each existing variant. Check if this variants option values are // identical to the option values of the variant being added. diff --git a/packages/medusa/src/services/region.js b/packages/medusa/src/services/region.js index 48a35f60e7..ba9a5661e4 100644 --- a/packages/medusa/src/services/region.js +++ b/packages/medusa/src/services/region.js @@ -166,7 +166,7 @@ class RegionService extends BaseService { */ validateId_(rawId) { const schema = Validator.objectId() - const { value, error } = schema.validate(rawId) + const { value, error } = schema.validate(rawId.toString()) if (error) { throw new MedusaError( MedusaError.Types.INVALID_ARGUMENT, @@ -195,6 +195,16 @@ class RegionService extends BaseService { return region } + /** + * Lists all regions based on a query + * @param {string} regionId - the id of the region to retrieve + * @return {Region} the region + */ + async list(query) { + const regions = await this.regionModel_.find(query) + return regions + } + /** * Deletes a region. * @param {string} regionId - the region to delete diff --git a/packages/medusa/src/services/totals.js b/packages/medusa/src/services/totals.js index 1e039f4405..0d13ba2d88 100644 --- a/packages/medusa/src/services/totals.js +++ b/packages/medusa/src/services/totals.js @@ -74,7 +74,7 @@ class TotalsService extends BaseService { async getTaxTotal(object) { const subtotal = this.getSubtotal(object) const shippingTotal = this.getShippingTotal(object) - const region = await this.regionService_.retrieve(object.region) + const region = await this.regionService_.retrieve(object.region_id) const { tax_rate } = region return (subtotal + shippingTotal) * tax_rate } @@ -101,7 +101,7 @@ class TotalsService extends BaseService { const subtotal = this.getSubtotal({ items: lineItems }) - const region = await this.regionService_.retrieve(order.region) + const region = await this.regionService_.retrieve(order.region_id) // if nothing is discounted, return the subtotal of line items if (!discount) { diff --git a/packages/medusa/src/services/user.js b/packages/medusa/src/services/user.js index c0ccff3a08..7c7a6207a6 100644 --- a/packages/medusa/src/services/user.js +++ b/packages/medusa/src/services/user.js @@ -26,7 +26,7 @@ class UserService extends BaseService { */ validateId_(rawId) { const schema = Validator.objectId() - const { value, error } = schema.validate(rawId) + const { value, error } = schema.validate(rawId.toString()) if (error) { throw new MedusaError( MedusaError.Types.INVALID_ARGUMENT, diff --git a/packages/medusa/yarn.lock b/packages/medusa/yarn.lock index db34658fff..a9d4ee9261 100644 --- a/packages/medusa/yarn.lock +++ b/packages/medusa/yarn.lock @@ -4522,14 +4522,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -medusa-core-utils@^0.3.0: - version "0.1.39" - resolved "https://registry.yarnpkg.com/medusa-core-utils/-/medusa-core-utils-0.1.39.tgz#d57816c9bd43f9a92883650c1e66add1665291df" - integrity sha512-R8+U1ile7if+nR6Cjh5exunx0ETV0OfkWUUBUpz1KmHSDv0V0CcvQqU9lcZesPFDEbu3Y2iEjsCqidVA4nG2nQ== - dependencies: - "@hapi/joi" "^16.1.8" - joi-objectid "^3.0.1" - medusa-interfaces@^0.1.27: version "0.1.27" resolved "https://registry.yarnpkg.com/medusa-interfaces/-/medusa-interfaces-0.1.27.tgz#e77f9a9f82a7118eac8b35c1498ef8a5cec78898" @@ -4537,13 +4529,6 @@ medusa-interfaces@^0.1.27: dependencies: mongoose "^5.8.0" -medusa-test-utils@^0.3.0: - version "0.1.39" - resolved "https://registry.yarnpkg.com/medusa-test-utils/-/medusa-test-utils-0.1.39.tgz#b7c166006a2fa4f02e52ab3bfafc19a3ae787f3e" - integrity sha512-M/Br8/HYvl7x2oLnme4NxdQwoyV0XUyOWiCyvPp7q1HUTB684lhJf1MikZVrcSjsh2L1rpyi3GRbKdf4cpJWvw== - dependencies: - mongoose "^5.8.0" - memory-pager@^1.0.2: version "1.5.0" resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5"