From 4c9b876407854dbd851308be470ea92a5161c4d1 Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Mon, 20 Jul 2020 16:29:27 +0200 Subject: [PATCH] Adds gift card line item generation --- .../store/carts/__tests__/create-line-item.js | 6 ++- .../medusa/src/models/schemas/line-item.js | 1 + .../src/services/__mocks__/product-variant.js | 13 +++++ .../medusa/src/services/__mocks__/product.js | 10 ++++ .../src/services/__tests__/line-item.js | 47 +++++++++++++++++++ packages/medusa/src/services/line-item.js | 12 ++++- 6 files changed, 85 insertions(+), 4 deletions(-) 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 467257c4f3..103c99f180 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 @@ -33,7 +33,8 @@ describe("POST /store/carts/:id", () => { expect(LineItemServiceMock.generate).toHaveBeenCalledWith( IdMap.getId("testVariant"), IdMap.getId("testRegion"), - 3 + 3, + undefined // no metadata ) }) @@ -72,7 +73,8 @@ describe("POST /store/carts/:id", () => { expect(LineItemServiceMock.generate).toHaveBeenCalledWith( IdMap.getId("fail"), IdMap.getId("testRegion"), - 3 + 3, + undefined // no metdata ) }) diff --git a/packages/medusa/src/models/schemas/line-item.js b/packages/medusa/src/models/schemas/line-item.js index 4409963643..1f3d1009e9 100644 --- a/packages/medusa/src/models/schemas/line-item.js +++ b/packages/medusa/src/models/schemas/line-item.js @@ -7,6 +7,7 @@ export default new mongoose.Schema({ title: { type: String, required: true }, description: { type: String }, thumbnail: { type: String }, + is_giftcard: { type: Boolean, default: false }, // mongoose doesn't allow multi-type validation but this field allows both // an object containing: diff --git a/packages/medusa/src/services/__mocks__/product-variant.js b/packages/medusa/src/services/__mocks__/product-variant.js index 3259567737..3de7a30777 100644 --- a/packages/medusa/src/services/__mocks__/product-variant.js +++ b/packages/medusa/src/services/__mocks__/product-variant.js @@ -106,6 +106,11 @@ const eur10us12 = { title: "EUR10US-12", } +const giftCardVar = { + _id: IdMap.getId("giftCardVar"), + title: "100 USD", +} + export const variants = { one: variant1, two: variant2, @@ -115,6 +120,7 @@ export const variants = { empty_variant: emptyVariant, eur10us12: eur10us12, testVariant: testVariant, + giftCard: giftCardVar, } export const ProductVariantServiceMock = { @@ -129,6 +135,9 @@ export const ProductVariantServiceMock = { }) }), retrieve: jest.fn().mockImplementation(variantId => { + if (variantId === IdMap.getId("giftCardVar")) { + return Promise.resolve(variants.giftCard) + } if (variantId === "1") { return Promise.resolve(variant1) } @@ -188,6 +197,10 @@ export const ProductVariantServiceMock = { } } + if (variantId === IdMap.getId("giftCardVar")) { + return Promise.resolve(100) + } + return Promise.reject(new Error("Not found")) }), delete: jest.fn().mockReturnValue(Promise.resolve()), diff --git a/packages/medusa/src/services/__mocks__/product.js b/packages/medusa/src/services/__mocks__/product.js index 0f77e82ba7..d495fb108e 100644 --- a/packages/medusa/src/services/__mocks__/product.js +++ b/packages/medusa/src/services/__mocks__/product.js @@ -96,6 +96,16 @@ export const ProductServiceMock = { list: jest.fn().mockImplementation(data => { // Used to retrieve a product based on a variant id see // ProductVariantService.addOptionValue + if (data.variants === IdMap.getId("giftCardVar")) { + return Promise.resolve([ + { + _id: IdMap.getId("giftCardProd"), + title: "Gift Card", + is_giftcard: true, + thumbnail: "1234", + }, + ]) + } if (data.variants === IdMap.getId("testVariant")) { return Promise.resolve([ { diff --git a/packages/medusa/src/services/__tests__/line-item.js b/packages/medusa/src/services/__tests__/line-item.js index ac8e2e29bf..74c9411576 100644 --- a/packages/medusa/src/services/__tests__/line-item.js +++ b/packages/medusa/src/services/__tests__/line-item.js @@ -44,4 +44,51 @@ describe("LineItemService", () => { }) }) }) + + describe("generate with giftcard", () => { + let result + beforeAll(async () => { + jest.clearAllMocks() + const lineItemService = new LineItemService({ + productVariantService: ProductVariantServiceMock, + productService: ProductServiceMock, + regionService: RegionServiceMock, + }) + result = await lineItemService.generate( + IdMap.getId("giftCardVar"), + IdMap.getId("region-france"), + 1, + { + name: "Test Name", + } + ) + }) + + it("results correctly", () => { + expect(result).toEqual({ + title: "Gift Card", + description: "100 USD", + thumbnail: "1234", + is_giftcard: true, + content: { + unit_price: 100, + variant: { + _id: IdMap.getId("giftCardVar"), + title: "100 USD", + }, + product: { + _id: IdMap.getId("giftCardProd"), + title: "Gift Card", + thumbnail: "1234", + is_giftcard: true, + }, + quantity: 1, + }, + metadata: { + name: "Test Name", + }, + quantity: 1, + }) + }) + }) }) diff --git a/packages/medusa/src/services/line-item.js b/packages/medusa/src/services/line-item.js index 2ce35a09a8..d9f6317a9e 100644 --- a/packages/medusa/src/services/line-item.js +++ b/packages/medusa/src/services/line-item.js @@ -83,8 +83,9 @@ class LineItemService extends BaseService { * @param {string} variantId - id of the line item variant * @param {*} regionId - id of the cart region * @param {*} quantity - number of items + * @param {object} metadata - metadata for the line item */ - async generate(variantId, regionId, quantity) { + async generate(variantId, regionId, quantity, metadata = {}) { const variant = await this.productVariantService_.retrieve(variantId) const region = await this.regionService_.retrieve(regionId) @@ -104,7 +105,7 @@ class LineItemService extends BaseService { region._id ) - return { + const line = { title: product.title, description: variant.title, quantity, @@ -116,6 +117,13 @@ class LineItemService extends BaseService { quantity: 1, }, } + + if (product.is_giftcard) { + line.is_giftcard = true + line.metadata = metadata + } + + return line } isEqual(line, match) {