feature: swaps (#137)

* feat: swap schema

* chore(refactor): move returns to separate service

* swap order creates return

* fix: adds returns/fulfillments/shipments and cart creation to swaps

* search products by variants

* feat: swaps ready

* fix: test passing

* chore: include customer expand fields on order

* add tests

* fix: add brightpearl plugin support

* fix: adds swap link template setting

* fix: tests

* fix(medusa-plugin-brightpearl): add swap status option

* docs: add swap description

* fix: adds GET swap in store api

* chore: unmock axios

* fix: passing klarna tests

* fix: pr
This commit is contained in:
Sebastian Rindom
2020-11-24 14:02:49 +01:00
committed by GitHub
parent c6996dd530
commit fd04233238
56 changed files with 3266 additions and 564 deletions
@@ -1,5 +0,0 @@
const mockAxios = jest.genMockFromModule("axios")
mockAxios.create = jest.fn(() => mockAxios)
export default mockAxios
@@ -10,17 +10,23 @@ export default async (req, res) => {
const klarnaOrder = await klarnaProviderService.retrieveCompletedOrder(
klarna_order_id
).then(({ data }) => data)
)
const cartId = klarnaOrder.merchant_data
try {
const order = await orderService.retrieveByCartId(cartId)
await klarnaProviderService.acknowledgeOrder(klarnaOrder.order_id, order._id)
await klarnaProviderService.acknowledgeOrder(
klarnaOrder.order_id,
order._id
)
} catch (err) {
if (err.type === MedusaError.Types.NOT_FOUND) {
const cart = await cartService.retrieve(cartId)
const order = await orderService.createFromCart(cart)
await klarnaProviderService.acknowledgeOrder(klarnaOrder.order_id, order._id)
await klarnaProviderService.acknowledgeOrder(
klarnaOrder.order_id,
order._id
)
}
}
@@ -1,14 +1,11 @@
import MockAdapter from "axios-mock-adapter"
import KlarnaProviderService from "../klarna-provider"
import mockAxios from "../../__mocks__/axios"
import { carts } from "../../__mocks__/cart"
import { TotalsServiceMock } from "../../__mocks__/totals"
import { RegionServiceMock } from "../../__mocks__/region"
describe("KlarnaProviderService", () => {
beforeEach(() => {
mockAxios.mockClear()
})
describe("createPayment", () => {
const klarnaProviderService = new KlarnaProviderService(
{
@@ -27,22 +24,19 @@ describe("KlarnaProviderService", () => {
}
)
const mockServer = new MockAdapter(klarnaProviderService.klarna_)
mockServer.onPost("/checkout/v3/orders").reply(() => {
return [200, { order_id: "123456789", order_amount: 100 }]
})
beforeEach(() => {
jest.clearAllMocks()
})
it("creates Klarna order", async () => {
mockAxios.post = jest.fn().mockImplementation(() => {
return Promise.resolve({
data: {
order_id: "123456789",
order_amount: 100,
},
})
})
const result = await klarnaProviderService.createPayment(carts.frCart)
expect(mockAxios.post).toHaveBeenCalledTimes(1)
// expect(mockAxios.post).toHaveBeenCalledTimes(1)
expect(result).toEqual({
order_id: "123456789",
order_amount: 100,
@@ -67,21 +61,14 @@ describe("KlarnaProviderService", () => {
}
)
it("returns Klarna order", async () => {
mockAxios.get.mockImplementation((data) => {
return Promise.resolve({
data: {
order_id: "123456789",
},
})
})
const mockServer = new MockAdapter(klarnaProviderService.klarna_)
mockServer.onGet("/checkout/v3/orders/123456789").reply(() => {
return [200, { order_id: "123456789" }]
})
it("returns Klarna order", async () => {
result = await klarnaProviderService.retrievePayment({
payment_method: {
data: {
id: "123456789",
},
},
order_id: "123456789",
})
expect(result).toEqual({
@@ -107,20 +94,13 @@ describe("KlarnaProviderService", () => {
}
)
it("returns completed Klarna order", async () => {
mockAxios.get.mockImplementation((data) => {
return Promise.resolve({
order_id: "123456789",
})
})
const mockServer = new MockAdapter(klarnaProviderService.klarna_)
mockServer.onGet("/ordermanagement/v1/orders/123456789").reply(() => {
return [200, { order_id: "123456789" }]
})
result = await klarnaProviderService.retrieveCompletedOrder({
payment_method: {
data: {
id: "123456789",
},
},
})
it("returns completed Klarna order", async () => {
result = await klarnaProviderService.retrieveCompletedOrder("123456789")
expect(result).toEqual({
order_id: "123456789",
@@ -150,24 +130,21 @@ describe("KlarnaProviderService", () => {
},
}
)
const mockServer = new MockAdapter(klarnaProviderService.klarna_)
mockServer.onPost("/checkout/v3/orders/123456789").reply(() => {
return [
200,
{
order_id: "123456789",
order_amount: 1000,
},
]
})
it("returns updated Klarna order", async () => {
mockAxios.post.mockImplementation((data) => {
return Promise.resolve({
data: {
order_id: "123456789",
order_amount: 1000,
},
})
})
result = await klarnaProviderService.updatePayment(
{
payment_method: {
data: {
id: "123456789",
},
},
order_id: "123456789",
},
carts.frCart
)
@@ -195,12 +172,14 @@ describe("KlarnaProviderService", () => {
password: "123456789",
}
)
it("returns order id", async () => {
mockAxios.post.mockImplementation((data) => {
return Promise.resolve()
const mockServer = new MockAdapter(klarnaProviderService.klarna_)
mockServer
.onPost("/ordermanagement/v1/orders/123456789/cancel")
.reply(() => {
return [200]
})
it("returns order id", async () => {
result = await klarnaProviderService.cancelPayment({
order_id: "123456789",
})
@@ -226,12 +205,20 @@ describe("KlarnaProviderService", () => {
password: "123456789",
}
)
it("returns order id", async () => {
mockAxios.post.mockImplementation((data) => {
return Promise.resolve({})
const mockServer = new MockAdapter(klarnaProviderService.klarna_)
mockServer
.onPost("/ordermanagement/v1/orders/123456789/acknowledge")
.reply(() => {
return [200]
})
mockServer
.onPatch("/ordermanagement/v1/orders/123456789/merchant-references")
.reply(() => {
return [200]
})
it("returns order id", async () => {
result = await klarnaProviderService.acknowledgeOrder("123456789")
expect(result).toEqual("123456789")
@@ -255,12 +242,14 @@ describe("KlarnaProviderService", () => {
password: "123456789",
}
)
it("returns order id", async () => {
mockAxios.post.mockImplementation((data) => {
return Promise.resolve()
const mockServer = new MockAdapter(klarnaProviderService.klarna_)
mockServer
.onPost("/ordermanagement/v1/orders/123456789/merchant-references")
.reply(() => {
return [200]
})
it("returns order id", async () => {
result = await klarnaProviderService.addOrderToKlarnaOrder(
"123456789",
"order123456789"
@@ -287,20 +276,23 @@ describe("KlarnaProviderService", () => {
password: "123456789",
}
)
const mockServer = new MockAdapter(klarnaProviderService.klarna_)
mockServer.onGet("/ordermanagement/v1/orders/123456789").reply(() => {
return [
200,
{
order: { order_amount: 1000 },
},
]
})
mockServer
.onPost("/ordermanagement/v1/orders/123456789/captures")
.reply(() => {
return [200]
})
it("returns order id", async () => {
mockAxios.get.mockImplementation((data) => {
return Promise.resolve({
data: {
order: { order_amount: 1000 },
},
})
})
mockAxios.post.mockImplementation((data) => {
return Promise.resolve()
})
result = await klarnaProviderService.capturePayment({
order_id: "123456789",
})
@@ -326,12 +318,14 @@ describe("KlarnaProviderService", () => {
password: "123456789",
}
)
it("returns order id", async () => {
mockAxios.post.mockImplementation((data) => {
return Promise.resolve()
const mockServer = new MockAdapter(klarnaProviderService.klarna_)
mockServer
.onPost("/ordermanagement/v1/orders/123456789/refunds")
.reply(() => {
return [200]
})
it("returns order id", async () => {
result = await klarnaProviderService.refundPayment(
{
order_id: "123456789",
@@ -279,9 +279,9 @@ class KlarnaProviderService extends PaymentService {
*/
async retrieveCompletedOrder(klarnaOrderId) {
try {
return this.klarna_.get(
`${this.klarnaOrderManagementUrl_}/${klarnaOrderId}`
)
return this.klarna_
.get(`${this.klarnaOrderManagementUrl_}/${klarnaOrderId}`)
.then(({ data }) => data)
} catch (error) {
throw error
}