All tests passing

This commit is contained in:
Sebastian Rindom
2020-07-15 17:47:43 +02:00
parent 312e405588
commit ec6a538877
32 changed files with 226 additions and 304 deletions
+3 -3
View File
@@ -57,7 +57,7 @@ class BaseModel {
* @return {?mongoose.Document} the retreived mongoose document or null. * @return {?mongoose.Document} the retreived mongoose document or null.
*/ */
findOne(query, options = {}) { findOne(query, options = {}) {
return this.mongooseModel_.findOne(query, options) return this.mongooseModel_.findOne(query, options).lean()
} }
/** /**
@@ -68,7 +68,7 @@ class BaseModel {
* an empty array * an empty array
*/ */
find(query, options) { find(query, options) {
return this.mongooseModel_.find(query, options) return this.mongooseModel_.find(query, options).lean()
} }
/** /**
@@ -80,7 +80,7 @@ class BaseModel {
*/ */
updateOne(query, update, options = {}) { updateOne(query, update, options = {}) {
options.new = true options.new = true
return this.mongooseModel_.findOneAndUpdate(query, update, options) return this.mongooseModel_.findOneAndUpdate(query, update, options).lean()
} }
/** /**
+9
View File
@@ -0,0 +1,9 @@
{
"plugins": ["prettier"],
"extends": ["prettier"],
"rules": {
"prettier/prettier": "error",
"semi": "error",
"no-unused-expressions": "true"
}
}
@@ -21,6 +21,7 @@ describe("POST /admin/orders", () => {
country_code: "US", country_code: "US",
province: "CA", province: "CA",
postal_code: "93011", postal_code: "93011",
phone: "+1 (222) 333 4444",
}, },
shipping_address: { shipping_address: {
first_name: "Virgil", first_name: "Virgil",
@@ -30,6 +31,7 @@ describe("POST /admin/orders", () => {
country_code: "US", country_code: "US",
province: "CA", province: "CA",
postal_code: "93011", postal_code: "93011",
phone: "+1 (222) 333 4444",
}, },
items: [ items: [
{ {
@@ -90,6 +92,7 @@ describe("POST /admin/orders", () => {
country_code: "US", country_code: "US",
province: "CA", province: "CA",
postal_code: "93011", postal_code: "93011",
phone: "+1 (222) 333 4444",
}, },
shipping_address: { shipping_address: {
first_name: "Virgil", first_name: "Virgil",
@@ -99,6 +102,7 @@ describe("POST /admin/orders", () => {
country_code: "US", country_code: "US",
province: "CA", province: "CA",
postal_code: "93011", postal_code: "93011",
phone: "+1 (222) 333 4444",
}, },
items: [ items: [
{ {
@@ -1,6 +1,9 @@
import { IdMap } from "medusa-test-utils" import { IdMap } from "medusa-test-utils"
import { request } from "../../../../../helpers/test-request" import { request } from "../../../../../helpers/test-request"
import { ProductServiceMock } from "../../../../../services/__mocks__/product" import {
ProductServiceMock,
products,
} from "../../../../../services/__mocks__/product"
describe("DELETE /admin/products/:id/options/:optionId", () => { describe("DELETE /admin/products/:id/options/:optionId", () => {
describe("successfully updates an option", () => { describe("successfully updates an option", () => {
@@ -28,6 +31,7 @@ describe("DELETE /admin/products/:id/options/:optionId", () => {
option_id: IdMap.getId("option1"), option_id: IdMap.getId("option1"),
object: "option", object: "option",
deleted: true, deleted: true,
product: products.productWithOptions,
}) })
}) })
@@ -46,7 +46,9 @@ export default async (req, res) => {
const productService = req.scope.resolve("productService") const productService = req.scope.resolve("productService")
const shippingProfileService = req.scope.resolve("shippingProfileService") const shippingProfileService = req.scope.resolve("shippingProfileService")
value.thumbnail = value.thumbnail || value.images[0] if (!value.thumbnail && value.images && value.images.length) {
value.thumbnail = value.images[0]
}
let newProduct = await productService.createDraft(value) let newProduct = await productService.createDraft(value)
if (variants) { if (variants) {
@@ -52,8 +52,13 @@ export default async (req, res) => {
const productService = req.scope.resolve("productService") const productService = req.scope.resolve("productService")
const oldProduct = await productService.retrieve(id) const oldProduct = await productService.retrieve(id)
if (!oldProduct.thumbnail && value.images) { if (
value.thumbnail = value.thumbnail || value.images[0] !oldProduct.thumbnail &&
!value.thumbnail &&
value.images &&
value.images.length
) {
value.thumbnail = value.images[0]
} }
const product = await productService.update(oldProduct._id, value) const product = await productService.update(oldProduct._id, value)
@@ -22,6 +22,8 @@ describe("POST /store/carts", () => {
it("calls CartService create", () => { it("calls CartService create", () => {
expect(CartServiceMock.create).toHaveBeenCalledTimes(1) expect(CartServiceMock.create).toHaveBeenCalledTimes(1)
expect(CartServiceMock.create).toHaveBeenCalledWith({ expect(CartServiceMock.create).toHaveBeenCalledWith({
email: "",
customer_id: "",
region_id: IdMap.getId("testRegion"), region_id: IdMap.getId("testRegion"),
}) })
}) })
@@ -14,6 +14,7 @@ describe("POST /store/carts/:id", () => {
city: "Los Angeles", city: "Los Angeles",
province: "CA", province: "CA",
postal_code: "91092", postal_code: "91092",
phone: "+1 (222) 333 4444",
} }
beforeAll(async () => { beforeAll(async () => {
@@ -73,8 +74,8 @@ describe("POST /store/carts/:id", () => {
}) })
it("applies promo code", () => { it("applies promo code", () => {
expect(CartServiceMock.applyPromoCode).toHaveBeenCalledTimes(1) expect(CartServiceMock.applyDiscount).toHaveBeenCalledTimes(1)
expect(CartServiceMock.applyPromoCode).toHaveBeenCalledWith( expect(CartServiceMock.applyDiscount).toHaveBeenCalledWith(
IdMap.getId("emptyCart"), IdMap.getId("emptyCart"),
"TESTCODE" "TESTCODE"
) )
@@ -8,14 +8,13 @@ describe("POST /store/carts/:id/line-items/:line_id", () => {
let subject let subject
beforeAll(async () => { beforeAll(async () => {
const cartId = IdMap.getId("emptyCart") const cartId = IdMap.getId("fr-cart")
const lineId = IdMap.getId("existingLine") const lineId = IdMap.getId("existingLine")
subject = await request( subject = await request(
"POST", "POST",
`/store/carts/${cartId}/line-items/${lineId}`, `/store/carts/${cartId}/line-items/${lineId}`,
{ {
payload: { payload: {
variant_id: IdMap.getId("can-cover"),
quantity: 3, quantity: 3,
}, },
} }
@@ -33,9 +32,9 @@ describe("POST /store/carts/:id/line-items/:line_id", () => {
it("calls LineItemService generate", () => { it("calls LineItemService generate", () => {
expect(LineItemServiceMock.generate).toHaveBeenCalledTimes(1) expect(LineItemServiceMock.generate).toHaveBeenCalledTimes(1)
expect(LineItemServiceMock.generate).toHaveBeenCalledWith( expect(LineItemServiceMock.generate).toHaveBeenCalledWith(
IdMap.getId("can-cover"), IdMap.getId("eur-10-us-12"),
3, IdMap.getId("region-france"),
IdMap.getId("testRegion") 3
) )
}) })
@@ -44,25 +43,23 @@ describe("POST /store/carts/:id/line-items/:line_id", () => {
}) })
it("returns the cart", () => { it("returns the cart", () => {
expect(subject.body.cart._id).toEqual(IdMap.getId("emptyCart")) expect(subject.body.cart._id).toEqual(IdMap.getId("fr-cart"))
expect(subject.body.cart.decorated).toEqual(true) expect(subject.body.cart.decorated).toEqual(true)
}) })
}) })
describe("handles unsuccessful line item generation", () => { describe("removes line item on quantity 0", () => {
let subject let subject
beforeAll(async () => { beforeAll(async () => {
const cartId = IdMap.getId("emptyCart") const cartId = IdMap.getId("fr-cart")
const lineId = IdMap.getId("existingLine") const lineId = IdMap.getId("existingLine")
subject = await request( subject = await request(
"POST", "POST",
`/store/carts/${cartId}/line-items/${lineId}`, `/store/carts/${cartId}/line-items/${lineId}`,
{ {
payload: { payload: {
variant_id: IdMap.getId("fail"), quantity: 0,
quantity: 3,
}, },
} }
) )
@@ -72,21 +69,21 @@ describe("POST /store/carts/:id/line-items/:line_id", () => {
jest.clearAllMocks() jest.clearAllMocks()
}) })
it("calls LineItemService generate", () => { it("calls CartService create", () => {
expect(LineItemServiceMock.generate).toHaveBeenCalledTimes(1) expect(CartServiceMock.removeLineItem).toHaveBeenCalledTimes(1)
expect(LineItemServiceMock.generate).toHaveBeenCalledWith( expect(CartServiceMock.removeLineItem).toHaveBeenCalledWith(
IdMap.getId("fail"), IdMap.getId("fr-cart"),
3, IdMap.getId("existingLine")
IdMap.getId("testRegion")
) )
}) })
it("returns 400", () => { it("returns 200", () => {
expect(subject.status).toEqual(400) expect(subject.status).toEqual(200)
}) })
it("returns error", () => { it("returns the cart", () => {
expect(subject.body.message).toEqual("Doesn't exist") expect(subject.body.cart._id).toEqual(IdMap.getId("fr-cart"))
expect(subject.body.cart.decorated).toEqual(true)
}) })
}) })
}) })
@@ -12,6 +12,9 @@ describe("POST /store/carts/:id/payment-method", () => {
subject = await request("POST", `/store/carts/${cartId}/payment-method`, { subject = await request("POST", `/store/carts/${cartId}/payment-method`, {
payload: { payload: {
provider_id: "default_provider", provider_id: "default_provider",
data: {
money_id: "success",
},
}, },
}) })
}) })
@@ -20,14 +23,6 @@ describe("POST /store/carts/:id/payment-method", () => {
jest.clearAllMocks() jest.clearAllMocks()
}) })
it("calls CartService retrievePaymentSession", () => {
expect(CartServiceMock.retrievePaymentSession).toHaveBeenCalledTimes(1)
expect(CartServiceMock.retrievePaymentSession).toHaveBeenCalledWith(
IdMap.getId("cartWithPaySessions"),
"default_provider"
)
})
it("calls CartService setPaymentMethod", () => { it("calls CartService setPaymentMethod", () => {
expect(CartServiceMock.setPaymentMethod).toHaveBeenCalledTimes(1) expect(CartServiceMock.setPaymentMethod).toHaveBeenCalledTimes(1)
expect(CartServiceMock.setPaymentMethod).toHaveBeenCalledWith( expect(CartServiceMock.setPaymentMethod).toHaveBeenCalledWith(
@@ -50,50 +45,4 @@ describe("POST /store/carts/:id/payment-method", () => {
expect(subject.body.cart.decorated).toEqual(true) expect(subject.body.cart.decorated).toEqual(true)
}) })
}) })
describe("fails when pay session not authorized", () => {
let subject
beforeAll(async () => {
const cartId = IdMap.getId("cartWithPaySessions")
subject = await request("POST", `/store/carts/${cartId}/payment-method`, {
payload: {
provider_id: "nono",
},
})
})
afterAll(() => {
jest.clearAllMocks()
})
it("calls CartService retrievePaymentSession", () => {
expect(CartServiceMock.retrievePaymentSession).toHaveBeenCalledTimes(1)
expect(CartServiceMock.retrievePaymentSession).toHaveBeenCalledWith(
IdMap.getId("cartWithPaySessions"),
"nono"
)
})
it("calls CartService setPaymentMethod", () => {
expect(CartServiceMock.setPaymentMethod).toHaveBeenCalledTimes(1)
expect(CartServiceMock.setPaymentMethod).toHaveBeenCalledWith(
IdMap.getId("cartWithPaySessions"),
{
provider_id: "nono",
data: {
money_id: "fail",
},
}
)
})
it("returns 400", () => {
expect(subject.status).toEqual(400)
})
it("returns the cart", () => {
expect(subject.body.message).toEqual("Not allowed")
})
})
}) })
@@ -9,6 +9,7 @@ export default async (req, res) => {
const { value, error } = schema.validate(req.body) const { value, error } = schema.validate(req.body)
if (error) { if (error) {
console.log(error)
throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details) throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details)
} }
@@ -23,6 +24,13 @@ export default async (req, res) => {
cart = await cartService.retrieve(id) cart = await cartService.retrieve(id)
const existing = cart.items.find(i => i._id.equals(line_id)) const existing = cart.items.find(i => i._id.equals(line_id))
if (!existing) {
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
"Could not find the line item"
)
}
const lineItem = await lineItemService.generate( const lineItem = await lineItemService.generate(
existing.content.variant._id, existing.content.variant._id,
cart.region_id, cart.region_id,
@@ -1,73 +0,0 @@
import { IdMap } from "medusa-test-utils"
import { request } from "../../../../../helpers/test-request"
import { CustomerServiceMock } from "../../../../../services/__mocks__/customer"
describe("POST /store/customers/:id/password", () => {
describe("successfully updates a customer", () => {
let subject
beforeAll(async () => {
subject = await request(
"POST",
`/store/customers/${IdMap.getId("lebron")}/password`,
{
payload: {
password: "NewPass",
},
clientSession: {
jwt: {
customer_id: IdMap.getId("lebron"),
},
},
}
)
})
afterAll(() => {
jest.clearAllMocks()
})
it("calls CustomerService update", () => {
expect(CustomerServiceMock.update).toHaveBeenCalledTimes(1)
expect(CustomerServiceMock.update).toHaveBeenCalledWith(
IdMap.getId("lebron"),
{
password: "NewPass",
}
)
})
it("returns product decorated", () => {
expect(subject.body.customer.first_name).toEqual("LeBron")
expect(subject.body.customer.decorated).toEqual(true)
})
})
describe("fails if not authenticated", () => {
let subject
beforeAll(async () => {
subject = await request(
"POST",
`/store/customers/${IdMap.getId("customer1")}/password`,
{
payload: {
first_name: "LeBron",
last_name: "James",
},
clientSession: {
jwt: {
customer_id: IdMap.getId("lebron"),
},
},
}
)
})
afterAll(() => {
jest.clearAllMocks()
})
it("status code 400", () => {
expect(subject.status).toEqual(400)
})
})
})
@@ -12,11 +12,6 @@ describe("POST /store/orders", () => {
payload: { payload: {
cartId: IdMap.getId("fr-cart"), cartId: IdMap.getId("fr-cart"),
}, },
adminSession: {
jwt: {
userId: IdMap.getId("admin_user"),
},
},
}) })
}) })
@@ -25,8 +20,8 @@ describe("POST /store/orders", () => {
}) })
it("calls service create", () => { it("calls service create", () => {
expect(OrderServiceMock.create).toHaveBeenCalledTimes(1) expect(OrderServiceMock.createFromCart).toHaveBeenCalledTimes(1)
expect(OrderServiceMock.create).toHaveBeenCalledWith(carts.frCart) expect(OrderServiceMock.createFromCart).toHaveBeenCalledWith(carts.frCart)
}) })
}) })
}) })
@@ -16,8 +16,6 @@ export default async (req, res) => {
const cart = await cartService.retrieve(value.cartId) const cart = await cartService.retrieve(value.cartId)
let order = await orderService.createFromCart(cart) let order = await orderService.createFromCart(cart)
order = await orderService.retrieveByCartId(value.cartId)
order = await orderService.decorate(order, [ order = await orderService.decorate(order, [
"status", "status",
"fulfillment_status", "fulfillment_status",
@@ -36,6 +34,7 @@ export default async (req, res) => {
res.status(200).json({ order }) res.status(200).json({ order })
} catch (err) { } catch (err) {
console.log(err)
// If something fails it might be because the order has already been created // If something fails it might be because the order has already been created
// if it has we find it from the cart id // if it has we find it from the cart id
const orderService = req.scope.resolve("orderService") const orderService = req.scope.resolve("orderService")
@@ -8,11 +8,10 @@ describe("GET /store/shipping-options", () => {
let subject let subject
beforeAll(async () => { beforeAll(async () => {
subject = await request("GET", `/store/shipping-options`, { subject = await request(
payload: { "GET",
cart_id: IdMap.getId("emptyCart"), `/store/shipping-options/${IdMap.getId("emptyCart")}`
}, )
})
}) })
afterAll(() => { afterAll(() => {
+12 -4
View File
@@ -168,13 +168,21 @@ export const carts = {
}, },
completeCart: { completeCart: {
_id: IdMap.getId("complete-cart"), _id: IdMap.getId("complete-cart"),
title: "test",
region_id: IdMap.getId("region-france"), region_id: IdMap.getId("region-france"),
items: [], items: [],
email: "test",
payment_sessions: [
{
provider_id: "default_provider",
data: {
money_id: "success",
},
},
],
payment_method: { payment_method: {
provider_id: "stripe", provider_id: "default_provider",
data: { data: {
yes: "sir", money_id: "success",
}, },
}, },
shipping_methods: [ shipping_methods: [
@@ -259,7 +267,7 @@ export const carts = {
shipping_methods: [ shipping_methods: [
{ {
_id: IdMap.getId("freeShipping"), _id: IdMap.getId("freeShipping"),
profile_id: "default_profile", profile_id: IdMap.getId("default_profile"),
}, },
], ],
shipping_options: [ shipping_options: [
@@ -209,11 +209,16 @@ export const orders = {
} }
export const OrderModelMock = { export const OrderModelMock = {
create: jest.fn().mockReturnValue(Promise.resolve()), create: jest.fn().mockImplementation(data => Promise.resolve(data)),
updateOne: jest.fn().mockImplementation((query, update) => { updateOne: jest.fn().mockImplementation((query, update) => {
return Promise.resolve() return Promise.resolve()
}), }),
deleteOne: jest.fn().mockReturnValue(Promise.resolve()), deleteOne: jest.fn().mockReturnValue(Promise.resolve()),
startSession: jest.fn().mockReturnValue(
Promise.resolve({
withTransaction: fn => fn(),
})
),
findOne: jest.fn().mockImplementation(query => { findOne: jest.fn().mockImplementation(query => {
if (query._id === IdMap.getId("test-order")) { if (query._id === IdMap.getId("test-order")) {
orders.testOrder.payment_status = "awaiting" orders.testOrder.payment_status = "awaiting"
@@ -240,7 +245,7 @@ export const OrderModelMock = {
orders.orderToRefund.payment_status = "captured" orders.orderToRefund.payment_status = "captured"
return Promise.resolve(orders.orderToRefund) return Promise.resolve(orders.orderToRefund)
} }
if (query.metadata.cart_id === IdMap.getId("test-cart")) { if (query.cart_id === IdMap.getId("test-cart")) {
return Promise.resolve(orders.testOrder) return Promise.resolve(orders.testOrder)
} }
return Promise.resolve(undefined) return Promise.resolve(undefined)
+30 -3
View File
@@ -215,13 +215,40 @@ export const CartServiceMock = {
}), }),
setPaymentMethod: jest.fn().mockImplementation((cartId, method) => { setPaymentMethod: jest.fn().mockImplementation((cartId, method) => {
if (method.provider_id === "default_provider") { if (method.provider_id === "default_provider") {
return Promise.resolve() return Promise.resolve(carts.cartWithPaySessions)
} }
throw new MedusaError(MedusaError.Types.NOT_ALLOWED, "Not allowed") throw new MedusaError(MedusaError.Types.NOT_ALLOWED, "Not allowed")
}), }),
removeLineItem: jest.fn().mockImplementation((cartId, lineItem) => {
if (cartId === IdMap.getId("fr-cart")) {
return Promise.resolve(carts.frCart)
}
if (cartId === IdMap.getId("regionCart")) {
return Promise.resolve(carts.regionCart)
}
if (cartId === IdMap.getId("emptyCart")) {
return Promise.resolve(carts.emptyCart)
}
if (cartId === IdMap.getId("cartWithPaySessions")) {
return Promise.resolve(carts.cartWithPaySessions)
}
throw new MedusaError(MedusaError.Types.NOT_FOUND, "cart not found")
}),
updateLineItem: jest.fn().mockImplementation((cartId, lineItem) => { updateLineItem: jest.fn().mockImplementation((cartId, lineItem) => {
return Promise.resolve() if (cartId === IdMap.getId("fr-cart")) {
return Promise.resolve(carts.frCart)
}
if (cartId === IdMap.getId("regionCart")) {
return Promise.resolve(carts.regionCart)
}
if (cartId === IdMap.getId("emptyCart")) {
return Promise.resolve(carts.emptyCart)
}
if (cartId === IdMap.getId("cartWithPaySessions")) {
return Promise.resolve(carts.cartWithPaySessions)
}
throw new MedusaError(MedusaError.Types.NOT_FOUND, "cart not found")
}), }),
setRegion: jest.fn().mockImplementation((cartId, regionId) => { setRegion: jest.fn().mockImplementation((cartId, regionId) => {
if (regionId === IdMap.getId("fail")) { if (regionId === IdMap.getId("fail")) {
@@ -238,7 +265,7 @@ export const CartServiceMock = {
updateBillingAddress: jest.fn().mockImplementation((cartId, address) => { updateBillingAddress: jest.fn().mockImplementation((cartId, address) => {
return Promise.resolve() return Promise.resolve()
}), }),
applyPromoCode: jest.fn().mockImplementation((cartId, code) => { applyDiscount: jest.fn().mockImplementation((cartId, code) => {
return Promise.resolve() return Promise.resolve()
}), }),
setPaymentSessions: jest.fn().mockImplementation(cartId => { setPaymentSessions: jest.fn().mockImplementation(cartId => {
@@ -35,6 +35,13 @@ export const CustomerServiceMock = {
password_hash: "1234", password_hash: "1234",
}) })
} }
if (email === "test@testdom.com") {
return Promise.resolve({
_id: IdMap.getId("testdom"),
email,
password_hash: "1234",
})
}
if (email === "oliver@test.dk") { if (email === "oliver@test.dk") {
return bcrypt return bcrypt
.hash("123456789", 10) .hash("123456789", 10)
@@ -8,7 +8,28 @@ export const LineItemServiceMock = {
} }
return data return data
}), }),
generate: jest.fn().mockImplementation((variantId, quantity, regionId) => { isEqual: jest.fn().mockImplementation((line, match) => {
if (Array.isArray(line.content)) {
if (
Array.isArray(match.content) &&
match.content.length === line.content.length
) {
return line.content.every(
(c, index) =>
c.variant._id === match[index].variant._id &&
c.quantity === match[index].quantity
)
}
} else if (!Array.isArray(match.content)) {
return (
line.content.variant._id === match.content.variant._id &&
line.content.quantity === match.content.quantity
)
}
return false
}),
generate: jest.fn().mockImplementation((variantId, regionId, quantity) => {
if (variantId === IdMap.getId("fail") || regionId === IdMap.getId("fail")) { if (variantId === IdMap.getId("fail") || regionId === IdMap.getId("fail")) {
throw new MedusaError(MedusaError.Types.INVALID_DATA, "Doesn't exist") throw new MedusaError(MedusaError.Types.INVALID_DATA, "Doesn't exist")
} }
@@ -125,6 +125,9 @@ export const OrderServiceMock = {
create: jest.fn().mockImplementation(data => { create: jest.fn().mockImplementation(data => {
return Promise.resolve(orders.testOrder) return Promise.resolve(orders.testOrder)
}), }),
createFromCart: jest.fn().mockImplementation(data => {
return Promise.resolve(orders.testOrder)
}),
update: jest.fn().mockImplementation(data => Promise.resolve()), update: jest.fn().mockImplementation(data => Promise.resolve()),
retrieve: jest.fn().mockImplementation(orderId => { retrieve: jest.fn().mockImplementation(orderId => {
if (orderId === IdMap.getId("test-order")) { if (orderId === IdMap.getId("test-order")) {
@@ -135,6 +138,9 @@ export const OrderServiceMock = {
} }
return Promise.resolve(undefined) return Promise.resolve(undefined)
}), }),
retrieveByCartId: jest.fn().mockImplementation(cartId => {
return Promise.resolve()
}),
decorate: jest.fn().mockImplementation(order => { decorate: jest.fn().mockImplementation(order => {
order.decorated = true order.decorated = true
return order return order
@@ -10,6 +10,9 @@ export const DefaultProviderMock = {
return Promise.resolve("initial") return Promise.resolve("initial")
}), }),
retrievePayment: jest.fn().mockImplementation(data => {
return Promise.resolve(data)
}),
capturePayment: jest.fn().mockReturnValue(Promise.resolve()), capturePayment: jest.fn().mockReturnValue(Promise.resolve()),
refundPayment: jest.fn().mockReturnValue(Promise.resolve()), refundPayment: jest.fn().mockReturnValue(Promise.resolve()),
} }
@@ -60,7 +60,9 @@ export const ProductServiceMock = {
.fn() .fn()
.mockReturnValue(Promise.resolve(products.productWithOptions)), .mockReturnValue(Promise.resolve(products.productWithOptions)),
updateOptionValue: jest.fn().mockReturnValue(Promise.resolve()), updateOptionValue: jest.fn().mockReturnValue(Promise.resolve()),
deleteOption: jest.fn().mockReturnValue(Promise.resolve()), deleteOption: jest
.fn()
.mockReturnValue(Promise.resolve(products.productWithOptions)),
retrieveVariants: jest retrieveVariants: jest
.fn() .fn()
.mockReturnValue( .mockReturnValue(
@@ -84,8 +86,8 @@ export const ProductServiceMock = {
} }
return Promise.resolve(undefined) return Promise.resolve(undefined)
}), }),
update: jest.fn().mockImplementation((userId, data) => { update: jest.fn().mockImplementation((product, data) => {
return Promise.resolve() return Promise.resolve(products.product1)
}), }),
list: jest.fn().mockImplementation(data => { list: jest.fn().mockImplementation(data => {
// Used to retrieve a product based on a variant id see // Used to retrieve a product based on a variant id see
@@ -42,10 +42,10 @@ export const ShippingProfileServiceMock = {
return Promise.resolve([]) return Promise.resolve([])
} }
if (selector.shipping_options === IdMap.getId("freeShipping")) { if (selector.shipping_options === IdMap.getId("freeShipping")) {
return Promise.resolve([{ _id: "default_profile" }]) return Promise.resolve([{ _id: IdMap.getId("default_profile") }])
} }
if (selector.shipping_options === IdMap.getId("additional")) { if (selector.shipping_options === IdMap.getId("additional")) {
return Promise.resolve([{ _id: "additional_profile" }]) return Promise.resolve([{ _id: IdMap.getId("additional_profile") }])
} }
if ( if (
selector.products && selector.products &&
+22 -93
View File
@@ -8,6 +8,7 @@ import {
import { ProductVariantServiceMock } from "../__mocks__/product-variant" import { ProductVariantServiceMock } from "../__mocks__/product-variant"
import { RegionServiceMock } from "../__mocks__/region" import { RegionServiceMock } from "../__mocks__/region"
import { EventBusServiceMock } from "../__mocks__/event-bus" import { EventBusServiceMock } from "../__mocks__/event-bus"
import { CustomerServiceMock } from "../__mocks__/customer"
import { ShippingOptionServiceMock } from "../__mocks__/shipping-option" import { ShippingOptionServiceMock } from "../__mocks__/shipping-option"
import { ShippingProfileServiceMock } from "../__mocks__/shipping-profile" import { ShippingProfileServiceMock } from "../__mocks__/shipping-profile"
import { CartModelMock, carts } from "../../models/__mocks__/cart" import { CartModelMock, carts } from "../../models/__mocks__/cart"
@@ -497,6 +498,7 @@ describe("CartService", () => {
const cartService = new CartService({ const cartService = new CartService({
cartModel: CartModelMock, cartModel: CartModelMock,
eventBusService: EventBusServiceMock, eventBusService: EventBusServiceMock,
customerService: CustomerServiceMock,
}) })
beforeEach(() => { beforeEach(() => {
@@ -509,7 +511,11 @@ describe("CartService", () => {
"test@testdom.com" "test@testdom.com"
) )
expect(EventBusServiceMock.emit).toHaveBeenCalledTimes(1) expect(EventBusServiceMock.emit).toHaveBeenCalledTimes(2)
expect(EventBusServiceMock.emit).toHaveBeenCalledWith(
"cart.customer_updated",
expect.any(Object)
)
expect(EventBusServiceMock.emit).toHaveBeenCalledWith( expect(EventBusServiceMock.emit).toHaveBeenCalledWith(
"cart.updated", "cart.updated",
expect.any(Object) expect.any(Object)
@@ -521,7 +527,10 @@ describe("CartService", () => {
_id: IdMap.getId("emptyCart"), _id: IdMap.getId("emptyCart"),
}, },
{ {
$set: { email: "test@testdom.com" }, $set: {
email: "test@testdom.com",
customer_id: IdMap.getId("testdom"),
},
} }
) )
}) })
@@ -556,6 +565,7 @@ describe("CartService", () => {
country_code: "US", country_code: "US",
province: "CA", province: "CA",
postal_code: "93011", postal_code: "93011",
phone: "+1 (222) 333 4444",
} }
await cartService.updateBillingAddress(IdMap.getId("emptyCart"), address) await cartService.updateBillingAddress(IdMap.getId("emptyCart"), address)
@@ -593,7 +603,7 @@ describe("CartService", () => {
address address
) )
} catch (err) { } catch (err) {
expect(err.message).toEqual("The address is not valid") expect(err.message).toEqual(`"first_name" is required`)
} }
expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0) expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0)
@@ -620,6 +630,7 @@ describe("CartService", () => {
country_code: "US", country_code: "US",
province: "CA", province: "CA",
postal_code: "93011", postal_code: "93011",
phone: "+1 (222) 333 4444",
} }
await cartService.updateShippingAddress(IdMap.getId("emptyCart"), address) await cartService.updateShippingAddress(IdMap.getId("emptyCart"), address)
@@ -650,6 +661,7 @@ describe("CartService", () => {
country_code: "ru", country_code: "ru",
province: "CA", province: "CA",
postal_code: "93011", postal_code: "93011",
phone: "+1 (222) 333 4444",
} }
await expect( await expect(
@@ -672,7 +684,7 @@ describe("CartService", () => {
await expect( await expect(
cartService.updateShippingAddress(IdMap.getId("emptyCart"), address) cartService.updateShippingAddress(IdMap.getId("emptyCart"), address)
).rejects.toThrow("The address is not valid") ).rejects.toThrow(`"first_name" is required`)
expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0) expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0)
}) })
@@ -779,19 +791,12 @@ describe("CartService", () => {
$set: { $set: {
region_id: IdMap.getId("region-us"), region_id: IdMap.getId("region-us"),
shipping_methods: [], shipping_methods: [],
payment_sessions: [],
payment_method: undefined, payment_method: undefined,
shipping_address: { shipping_address: {
first_name: "hi", first_name: "hi",
last_name: "you", last_name: "you",
country_code: "", country_code: "US",
city: "of lights",
address_1: "You bet street",
postal_code: "4242",
},
billing_address: {
first_name: "hi",
last_name: "you",
country_code: "",
city: "of lights", city: "of lights",
address_1: "You bet street", address_1: "You bet street",
postal_code: "4242", postal_code: "4242",
@@ -858,17 +863,6 @@ describe("CartService", () => {
IdMap.getId("testRegion") IdMap.getId("testRegion")
) )
expect(PaymentProviderServiceMock.retrieveProvider).toHaveBeenCalledTimes(
1
)
expect(PaymentProviderServiceMock.retrieveProvider).toHaveBeenCalledWith(
"default_provider"
)
expect(DefaultProviderMock.getStatus).toHaveBeenCalledTimes(1)
expect(DefaultProviderMock.getStatus).toHaveBeenCalledWith({
money_id: "success",
})
expect(CartModelMock.updateOne).toHaveBeenCalledTimes(1) expect(CartModelMock.updateOne).toHaveBeenCalledTimes(1)
expect(CartModelMock.updateOne).toHaveBeenCalledWith( expect(CartModelMock.updateOne).toHaveBeenCalledWith(
{ {
@@ -904,71 +898,6 @@ describe("CartService", () => {
) )
} }
}) })
it("fails if the payment provider is not registered", async () => {
const paymentMethod = {
provider_id: "unregistered",
data: {
money_id: "success",
},
}
try {
await cartService.setPaymentMethod(
IdMap.getId("cartWithLine"),
paymentMethod
)
} catch (err) {
expect(RegionServiceMock.retrieve).toHaveBeenCalledTimes(1)
expect(RegionServiceMock.retrieve).toHaveBeenCalledWith(
IdMap.getId("testRegion")
)
expect(
PaymentProviderServiceMock.retrieveProvider
).toHaveBeenCalledTimes(1)
expect(
PaymentProviderServiceMock.retrieveProvider
).toHaveBeenCalledWith("unregistered")
expect(err.message).toEqual(`Provider Not Found`)
}
})
it("fails if the payment is not authorized", async () => {
const paymentMethod = {
provider_id: "default_provider",
data: {
money_id: "fail",
},
}
try {
await cartService.setPaymentMethod(
IdMap.getId("cartWithLine"),
paymentMethod
)
} catch (err) {
expect(RegionServiceMock.retrieve).toHaveBeenCalledTimes(1)
expect(RegionServiceMock.retrieve).toHaveBeenCalledWith(
IdMap.getId("testRegion")
)
expect(
PaymentProviderServiceMock.retrieveProvider
).toHaveBeenCalledTimes(1)
expect(
PaymentProviderServiceMock.retrieveProvider
).toHaveBeenCalledWith("default_provider")
expect(DefaultProviderMock.getStatus).toHaveBeenCalledTimes(1)
expect(DefaultProviderMock.getStatus).toHaveBeenCalledWith({
money_id: "fail",
})
expect(err.message).toEqual(`The payment method was not authorized`)
}
})
}) })
describe("setPaymentSessions", () => { describe("setPaymentSessions", () => {
@@ -1259,7 +1188,7 @@ describe("CartService", () => {
_id: IdMap.getId("freeShipping"), _id: IdMap.getId("freeShipping"),
price: 0, price: 0,
provider_id: "default_provider", provider_id: "default_provider",
profile_id: "default_profile", profile_id: IdMap.getId("default_profile"),
data, data,
}, },
], ],
@@ -1297,7 +1226,7 @@ describe("CartService", () => {
_id: IdMap.getId("freeShipping"), _id: IdMap.getId("freeShipping"),
price: 0, price: 0,
provider_id: "default_provider", provider_id: "default_provider",
profile_id: "default_profile", profile_id: IdMap.getId("default_profile"),
data: { data: {
id: "testshipperid", id: "testshipperid",
}, },
@@ -1335,12 +1264,12 @@ describe("CartService", () => {
shipping_methods: [ shipping_methods: [
{ {
_id: IdMap.getId("freeShipping"), _id: IdMap.getId("freeShipping"),
profile_id: "default_profile", profile_id: IdMap.getId("default_profile"),
}, },
{ {
_id: IdMap.getId("additional"), _id: IdMap.getId("additional"),
price: 0, price: 0,
profile_id: "additional_profile", profile_id: IdMap.getId("additional_profile"),
provider_id: "default_provider", provider_id: "default_provider",
data, data,
}, },
@@ -107,7 +107,7 @@ describe("CustomerService", () => {
it("calls model layer create", async () => { it("calls model layer create", async () => {
await customerService.create({ await customerService.create({
email: "oliver@medusa.com", email: "new@medusa.com",
first_name: "Oliver", first_name: "Oliver",
last_name: "Juhl", last_name: "Juhl",
password: "secretsauce", password: "secretsauce",
@@ -115,7 +115,7 @@ describe("CustomerService", () => {
expect(CustomerModelMock.create).toBeCalledTimes(1) expect(CustomerModelMock.create).toBeCalledTimes(1)
expect(CustomerModelMock.create).toBeCalledWith({ expect(CustomerModelMock.create).toBeCalledWith({
email: "oliver@medusa.com", email: "new@medusa.com",
first_name: "Oliver", first_name: "Oliver",
last_name: "Juhl", last_name: "Juhl",
has_account: true, has_account: true,
@@ -200,6 +200,7 @@ describe("CustomerService", () => {
city: "Copenhagen", city: "Copenhagen",
country_code: "DK", country_code: "DK",
postal_code: "2100", postal_code: "2100",
phone: "+1 (222) 333 4444",
}, },
}) })
@@ -217,6 +218,7 @@ describe("CustomerService", () => {
city: "Copenhagen", city: "Copenhagen",
country_code: "DK", country_code: "DK",
postal_code: "2100", postal_code: "2100",
phone: "+1 (222) 333 4444",
}, },
}, },
}, },
@@ -6,6 +6,7 @@ import { PaymentProviderServiceMock } from "../__mocks__/payment-provider"
import { FulfillmentProviderServiceMock } from "../__mocks__/fulfillment-provider" import { FulfillmentProviderServiceMock } from "../__mocks__/fulfillment-provider"
import { ShippingProfileServiceMock } from "../__mocks__/shipping-profile" import { ShippingProfileServiceMock } from "../__mocks__/shipping-profile"
import { TotalsServiceMock } from "../__mocks__/totals" import { TotalsServiceMock } from "../__mocks__/totals"
import { RegionServiceMock } from "../__mocks__/region"
import { EventBusServiceMock } from "../__mocks__/event-bus" import { EventBusServiceMock } from "../__mocks__/event-bus"
describe("OrderService", () => { describe("OrderService", () => {
@@ -34,6 +35,8 @@ describe("OrderService", () => {
describe("createFromCart", () => { describe("createFromCart", () => {
const orderService = new OrderService({ const orderService = new OrderService({
orderModel: OrderModelMock, orderModel: OrderModelMock,
paymentProviderService: PaymentProviderServiceMock,
regionService: RegionServiceMock,
eventBusService: EventBusServiceMock, eventBusService: EventBusServiceMock,
}) })
@@ -44,10 +47,17 @@ describe("OrderService", () => {
it("calls order model functions", async () => { it("calls order model functions", async () => {
await orderService.createFromCart(carts.completeCart) await orderService.createFromCart(carts.completeCart)
expect(OrderModelMock.create).toHaveBeenCalledTimes(1) const order = {
expect(OrderModelMock.create).toHaveBeenCalledWith({
...carts.completeCart, ...carts.completeCart,
metadata: { cart_id: carts.completeCart._id }, currency_code: "eur",
cart_id: carts.completeCart._id,
}
delete order._id
delete order.payment_sessions
expect(OrderModelMock.create).toHaveBeenCalledTimes(1)
expect(OrderModelMock.create).toHaveBeenCalledWith([order], {
session: expect.anything(),
}) })
}) })
}) })
@@ -89,7 +99,7 @@ describe("OrderService", () => {
it("calls order model functions", async () => { it("calls order model functions", async () => {
expect(OrderModelMock.findOne).toHaveBeenCalledTimes(1) expect(OrderModelMock.findOne).toHaveBeenCalledTimes(1)
expect(OrderModelMock.findOne).toHaveBeenCalledWith({ expect(OrderModelMock.findOne).toHaveBeenCalledWith({
metadata: { cart_id: IdMap.getId("test-cart") }, cart_id: IdMap.getId("test-cart"),
}) })
}) })
@@ -281,17 +281,6 @@ describe("ProductService", () => {
expect(err.message).toEqual("Use setMetadata to update metadata fields") expect(err.message).toEqual("Use setMetadata to update metadata fields")
} }
}) })
it("throws error when trying to update variants", async () => {
const id = mongoose.Types.ObjectId()
try {
await productService.update(`${id}`, { variants: ["1", "2"] })
} catch (err) {
expect(err.message).toEqual(
"Use addVariant, reorderVariants, removeVariant to update Product Variants"
)
}
})
}) })
describe("delete", () => { describe("delete", () => {
@@ -3,6 +3,7 @@ import jwt from "jsonwebtoken"
import { IdMap } from "medusa-test-utils" import { IdMap } from "medusa-test-utils"
import UserService from "../user" import UserService from "../user"
import { UserModelMock, users } from "../../models/__mocks__/user" import { UserModelMock, users } from "../../models/__mocks__/user"
import { EventBusServiceMock } from "../__mocks__/event-bus"
describe("UserService", () => { describe("UserService", () => {
describe("retrieve", () => { describe("retrieve", () => {
@@ -144,6 +145,7 @@ describe("UserService", () => {
describe("generateResetPasswordToken", () => { describe("generateResetPasswordToken", () => {
const userService = new UserService({ const userService = new UserService({
eventBusService: EventBusServiceMock,
userModel: UserModelMock, userModel: UserModelMock,
}) })
+6 -3
View File
@@ -237,7 +237,7 @@ class CartService extends BaseService {
* @return {Cart} return the decorated cart. * @return {Cart} return the decorated cart.
*/ */
async decorate(cart, fields, expandFields = []) { async decorate(cart, fields, expandFields = []) {
const c = cart.toObject() const c = cart
c.shipping_total = await this.totalsService_.getShippingTotal(cart) c.shipping_total = await this.totalsService_.getShippingTotal(cart)
c.discount_total = await this.totalsService_.getDiscountTotal(cart) c.discount_total = await this.totalsService_.getDiscountTotal(cart)
c.tax_total = await this.totalsService_.getTaxTotal(cart) c.tax_total = await this.totalsService_.getTaxTotal(cart)
@@ -1054,11 +1054,14 @@ class CartService extends BaseService {
// Payment methods are region specific so the user needs to find a // Payment methods are region specific so the user needs to find a
// new payment method // new payment method
if (!_.isEmpty(cart.payment_method) || cart.payment_sessions.length) { if (!_.isEmpty(cart.payment_method)) {
update.payment_sessions = []
update.payment_method = undefined update.payment_method = undefined
} }
if (cart.payment_sessions && cart.payment_sessions.length) {
update.payment_sessions = []
}
return this.cartModel_ return this.cartModel_
.updateOne({ _id: cart._id }, { $set: update }) .updateOne({ _id: cart._id }, { $set: update })
.then(result => { .then(result => {
+11 -3
View File
@@ -264,9 +264,16 @@ class OrderService extends BaseService {
) )
} }
const { payment_method } = cart const { payment_method, payment_sessions } = cart
let paymentSession = cart.payment_sessions.find( if (!payment_sessions || !payment_sessions.length) {
throw new MedusaError(
MedusaError.Types.INVALID_ARGUMENT,
"cart must have payment sessions"
)
}
let paymentSession = payment_sessions.find(
ps => ps.provider_id === payment_method.provider_id ps => ps.provider_id === payment_method.provider_id
) )
@@ -301,6 +308,7 @@ class OrderService extends BaseService {
provider_id: paymentSession.provider_id, provider_id: paymentSession.provider_id,
data: paymentData, data: paymentData,
}, },
discounts: cart.discounts,
shipping_methods: cart.shipping_methods, shipping_methods: cart.shipping_methods,
items: cart.items, items: cart.items,
shipping_address: cart.shipping_address, shipping_address: cart.shipping_address,
@@ -651,7 +659,7 @@ class OrderService extends BaseService {
* @return {Order} return the decorated order. * @return {Order} return the decorated order.
*/ */
async decorate(order, fields, expandFields = []) { async decorate(order, fields, expandFields = []) {
const o = order.toObject() const o = order
o.shipping_total = await this.totalsService_.getShippingTotal(order) o.shipping_total = await this.totalsService_.getShippingTotal(order)
o.discount_total = await this.totalsService_.getDiscountTotal(order) o.discount_total = await this.totalsService_.getDiscountTotal(order)
o.tax_total = await this.totalsService_.getTaxTotal(order) o.tax_total = await this.totalsService_.getTaxTotal(order)
@@ -136,8 +136,7 @@ class ShippingOptionService extends BaseService {
* @return {ShippingOption} the validated shipping option * @return {ShippingOption} the validated shipping option
*/ */
async validateCartOption(optionId, cart) { async validateCartOption(optionId, cart) {
const optionDoc = await this.retrieve(optionId) const option = await this.retrieve(optionId)
let option = optionDoc.toObject()
if (cart.region_id !== option.region_id) { if (cart.region_id !== option.region_id) {
throw new MedusaError( throw new MedusaError(