cart service: updateShippingAddress, updateBillingAdress, updateEmail; address validator in core utils
This commit is contained in:
@@ -2,4 +2,18 @@ import Joi from "@hapi/joi"
|
||||
|
||||
Joi.objectId = require("joi-objectid")(Joi)
|
||||
|
||||
Joi.address = () => {
|
||||
return Joi.object().keys({
|
||||
first_name: Joi.string().required(),
|
||||
last_name: Joi.string().required(),
|
||||
address_1: Joi.string().required(),
|
||||
address_2: Joi.string(),
|
||||
city: Joi.string().required(),
|
||||
country_code: Joi.string().required(),
|
||||
province: Joi.string(),
|
||||
postal_code: Joi.string().required(),
|
||||
metadata: Joi.object()
|
||||
})
|
||||
}
|
||||
|
||||
export default Joi
|
||||
|
||||
@@ -6,8 +6,8 @@ import mongoose from "mongoose"
|
||||
export default new mongoose.Schema({
|
||||
first_name: { type: String, required: true },
|
||||
last_name: { type: String, required: true },
|
||||
address1: { type: String, required: true },
|
||||
address2: { type: String },
|
||||
address_1: { type: String, required: true },
|
||||
address_2: { type: String },
|
||||
city: { type: String, required: true },
|
||||
country_code: { type: String, required: true },
|
||||
province: { type: String },
|
||||
|
||||
@@ -256,4 +256,153 @@ describe("CartService", () => {
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe("updateEmail", () => {
|
||||
const cartService = new CartService({
|
||||
cartModel: CartModelMock,
|
||||
})
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully updates an email", async () => {
|
||||
await cartService.updateEmail(
|
||||
IdMap.getId("emptyCart"),
|
||||
"test@testdom.com"
|
||||
)
|
||||
|
||||
expect(CartModelMock.updateOne).toHaveBeenCalledTimes(1)
|
||||
expect(CartModelMock.updateOne).toHaveBeenCalledWith(
|
||||
{
|
||||
_id: IdMap.getId("emptyCart"),
|
||||
},
|
||||
{
|
||||
$set: { email: "test@testdom.com" },
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
it("throws on invalid email", async () => {
|
||||
try {
|
||||
await cartService.updateEmail(IdMap.getId("emptyCart"), "test@test")
|
||||
} catch (err) {
|
||||
expect(err.message).toEqual("The email is not valid")
|
||||
}
|
||||
|
||||
expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0)
|
||||
})
|
||||
})
|
||||
|
||||
describe("updateBillingAddress", () => {
|
||||
const cartService = new CartService({
|
||||
cartModel: CartModelMock,
|
||||
})
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully updates billing address", async () => {
|
||||
const address = {
|
||||
first_name: "LeBron",
|
||||
last_name: "James",
|
||||
address_1: "24 Dunks Drive",
|
||||
city: "Los Angeles",
|
||||
country_code: "US",
|
||||
province: "CA",
|
||||
postal_code: "93011",
|
||||
}
|
||||
|
||||
await cartService.updateBillingAddress(IdMap.getId("emptyCart"), address)
|
||||
|
||||
expect(CartModelMock.updateOne).toHaveBeenCalledTimes(1)
|
||||
expect(CartModelMock.updateOne).toHaveBeenCalledWith(
|
||||
{
|
||||
_id: IdMap.getId("emptyCart"),
|
||||
},
|
||||
{
|
||||
$set: { billing_address: address },
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
it("throws on invalid address", async () => {
|
||||
const address = {
|
||||
last_name: "James",
|
||||
address_1: "24 Dunks Drive",
|
||||
city: "Los Angeles",
|
||||
country_code: "US",
|
||||
province: "CA",
|
||||
postal_code: "93011",
|
||||
}
|
||||
|
||||
try {
|
||||
await cartService.updateBillingAddress(
|
||||
IdMap.getId("emptyCart"),
|
||||
address
|
||||
)
|
||||
} catch (err) {
|
||||
expect(err.message).toEqual("The address is not valid")
|
||||
}
|
||||
|
||||
expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0)
|
||||
})
|
||||
})
|
||||
|
||||
describe("updateShippingAddress", () => {
|
||||
const cartService = new CartService({
|
||||
cartModel: CartModelMock,
|
||||
})
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully updates billing address", async () => {
|
||||
const address = {
|
||||
first_name: "LeBron",
|
||||
last_name: "James",
|
||||
address_1: "24 Dunks Drive",
|
||||
city: "Los Angeles",
|
||||
country_code: "US",
|
||||
province: "CA",
|
||||
postal_code: "93011",
|
||||
}
|
||||
|
||||
await cartService.updateShippingAddress(IdMap.getId("emptyCart"), address)
|
||||
|
||||
expect(CartModelMock.updateOne).toHaveBeenCalledTimes(1)
|
||||
expect(CartModelMock.updateOne).toHaveBeenCalledWith(
|
||||
{
|
||||
_id: IdMap.getId("emptyCart"),
|
||||
},
|
||||
{
|
||||
$set: { shipping_address: address },
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
it("throws on invalid address", async () => {
|
||||
const address = {
|
||||
last_name: "James",
|
||||
address_1: "24 Dunks Drive",
|
||||
city: "Los Angeles",
|
||||
country_code: "US",
|
||||
province: "CA",
|
||||
postal_code: "93011",
|
||||
}
|
||||
|
||||
try {
|
||||
await cartService.updateShippingAddress(
|
||||
IdMap.getId("emptyCart"),
|
||||
address
|
||||
)
|
||||
} catch (err) {
|
||||
expect(err.message).toEqual("The address is not valid")
|
||||
}
|
||||
|
||||
expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -240,6 +240,72 @@ class CartService extends BaseService {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the email of a cart
|
||||
* @param {string} cartId - the id of the cart to add email to
|
||||
* @param {string} email - the email to add to cart
|
||||
* @return {Promise} the result of the update operation
|
||||
*/
|
||||
updateEmail(cartId, email) {
|
||||
const schema = Validator.string()
|
||||
.email()
|
||||
.required()
|
||||
const { value, error } = schema.validate(email)
|
||||
if (error) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.INVALID_DATA,
|
||||
"The email is not valid"
|
||||
)
|
||||
}
|
||||
|
||||
return this.cartModel_.updateOne(
|
||||
{
|
||||
_id: cartId,
|
||||
},
|
||||
{
|
||||
$set: { email: value },
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
updateBillingAddress(cartId, address) {
|
||||
const { value, error } = Validator.address().validate(address)
|
||||
if (error) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.INVALID_DATA,
|
||||
"The address is not valid"
|
||||
)
|
||||
}
|
||||
|
||||
return this.cartModel_.updateOne(
|
||||
{
|
||||
_id: cartId,
|
||||
},
|
||||
{
|
||||
$set: { billing_address: value },
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
updateShippingAddress(cartId, address) {
|
||||
const { value, error } = Validator.address().validate(address)
|
||||
if (error) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.INVALID_DATA,
|
||||
"The address is not valid"
|
||||
)
|
||||
}
|
||||
|
||||
return this.cartModel_.updateOne(
|
||||
{
|
||||
_id: cartId,
|
||||
},
|
||||
{
|
||||
$set: { shipping_address: value },
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Dedicated method to set metadata for a cart.
|
||||
* To ensure that plugins does not overwrite each
|
||||
|
||||
Reference in New Issue
Block a user