Skip to content

Commit 3af682c

Browse files
authored
Merge branch 'develop' into feat/delete-session
2 parents 7b48ae3 + a54dc68 commit 3af682c

File tree

7 files changed

+343
-47
lines changed

7 files changed

+343
-47
lines changed

.changeset/khaki-spiders-hug.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@medusajs/medusa": patch
3+
---
4+
5+
Allow filtering of customer orders

integration-tests/api/__tests__/admin/discount.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,6 +1485,70 @@ describe("/admin/discounts", () => {
14851485
})
14861486
})
14871487

1488+
describe("POST /admin/discounts/:id", () => {
1489+
beforeEach(async () => {
1490+
await adminSeeder(dbConnection)
1491+
await dbConnection.manager.insert(DiscountRule, {
1492+
id: "test-discount-rule",
1493+
description: "Test discount rule",
1494+
type: "percentage",
1495+
value: 10,
1496+
allocation: "total",
1497+
})
1498+
await dbConnection.manager.insert(Discount, {
1499+
id: "test-discount",
1500+
code: "TESTING",
1501+
rule_id: "test-discount-rule",
1502+
is_dynamic: false,
1503+
is_disabled: false,
1504+
ends_at: new Date(),
1505+
usage_limit: 10,
1506+
valid_duration: "P1D",
1507+
})
1508+
})
1509+
1510+
afterEach(async () => {
1511+
const db = useDb()
1512+
await db.teardown()
1513+
})
1514+
1515+
it("Removes ends_at, valid_duration and usage_limit when fields are updated with null", async () => {
1516+
const api = useApi()
1517+
1518+
await api
1519+
.post(
1520+
"/admin/discounts/test-discount",
1521+
{
1522+
ends_at: null,
1523+
valid_duration: null,
1524+
usage_limit: null,
1525+
},
1526+
{
1527+
headers: {
1528+
Authorization: "Bearer test_token",
1529+
},
1530+
}
1531+
)
1532+
.catch((err) => {
1533+
console.log(err)
1534+
})
1535+
1536+
const resultingDiscount = await api.get(
1537+
"/admin/discounts/test-discount",
1538+
{ headers: { Authorization: "Bearer test_token" } }
1539+
)
1540+
1541+
expect(resultingDiscount.status).toEqual(200)
1542+
expect(resultingDiscount.data.discount).toEqual(
1543+
expect.objectContaining({
1544+
ends_at: null,
1545+
valid_duration: null,
1546+
usage_limit: null,
1547+
})
1548+
)
1549+
})
1550+
})
1551+
14881552
describe("testing for soft-deletion + uniqueness on discount codes", () => {
14891553
let manager
14901554
beforeEach(async () => {

integration-tests/api/__tests__/store/customer.js

Lines changed: 146 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const path = require("path")
2-
const { Address, Customer } = require("@medusajs/medusa")
2+
const { Address, Customer, Order, Region } = require("@medusajs/medusa")
33

44
const setupServer = require("../../../helpers/setup-server")
55
const { useApi } = require("../../../helpers/use-api")
@@ -19,7 +19,7 @@ describe("/store/customers", () => {
1919
beforeAll(async () => {
2020
const cwd = path.resolve(path.join(__dirname, "..", ".."))
2121
dbConnection = await initDb({ cwd })
22-
medusaProcess = await setupServer({ cwd })
22+
medusaProcess = await setupServer({ cwd, verbose: false })
2323
})
2424

2525
afterAll(async () => {
@@ -89,6 +89,150 @@ describe("/store/customers", () => {
8989
})
9090
})
9191

92+
describe("GET /store/customers/me/orders", () => {
93+
beforeEach(async () => {
94+
const manager = dbConnection.manager
95+
await manager.query(`ALTER SEQUENCE order_display_id_seq RESTART WITH 1`)
96+
97+
await manager.insert(Address, {
98+
id: "addr_test",
99+
first_name: "String",
100+
last_name: "Stringson",
101+
address_1: "String st",
102+
city: "Stringville",
103+
postal_code: "1236",
104+
province: "ca",
105+
country_code: "us",
106+
})
107+
108+
await manager.insert(Region, {
109+
id: "region",
110+
name: "Test Region",
111+
currency_code: "usd",
112+
tax_rate: 0,
113+
})
114+
115+
await manager.insert(Customer, {
116+
id: "test_customer",
117+
first_name: "John",
118+
last_name: "Deere",
119+
email: "john@deere.com",
120+
password_hash:
121+
"c2NyeXB0AAEAAAABAAAAAVMdaddoGjwU1TafDLLlBKnOTQga7P2dbrfgf3fB+rCD/cJOMuGzAvRdKutbYkVpuJWTU39P7OpuWNkUVoEETOVLMJafbI8qs8Qx/7jMQXkN", // password matching "test"
122+
has_account: true,
123+
})
124+
125+
await manager.insert(Customer, {
126+
id: "test_customer1",
127+
first_name: "John",
128+
last_name: "Deere",
129+
email: "joh1n@deere.com",
130+
password_hash:
131+
"c2NyeXB0AAEAAAABAAAAAVMdaddoGjwU1TafDLLlBKnOTQga7P2dbrfgf3fB+rCD/cJOMuGzAvRdKutbYkVpuJWTU39P7OpuWNkUVoEETOVLMJafbI8qs8Qx/7jMQXkN", // password matching "test"
132+
has_account: true,
133+
})
134+
135+
await manager.insert(Order, {
136+
id: "order_test_completed",
137+
email: "test1@email.com",
138+
display_id: 1,
139+
customer_id: "test_customer",
140+
region_id: "region",
141+
status: "completed",
142+
tax_rate: 0,
143+
currency_code: "usd",
144+
})
145+
146+
await manager.insert(Order, {
147+
id: "order_test_completed1",
148+
email: "test1@email.com",
149+
display_id: 2,
150+
customer_id: "test_customer1",
151+
region_id: "region",
152+
status: "completed",
153+
tax_rate: 0,
154+
currency_code: "usd",
155+
})
156+
157+
await manager.insert(Order, {
158+
id: "order_test_canceled",
159+
email: "test1@email.com",
160+
display_id: 3,
161+
customer_id: "test_customer",
162+
region_id: "region",
163+
status: "canceled",
164+
tax_rate: 0,
165+
currency_code: "usd",
166+
})
167+
})
168+
169+
afterEach(async () => {
170+
await doAfterEach()
171+
})
172+
173+
it("looks up completed orders", async () => {
174+
const api = useApi()
175+
176+
const authResponse = await api.post("/store/auth", {
177+
email: "john@deere.com",
178+
password: "test",
179+
})
180+
181+
const [authCookie] = authResponse.headers["set-cookie"][0].split(";")
182+
183+
const response = await api
184+
.get("/store/customers/me/orders?status[]=completed", {
185+
headers: {
186+
Cookie: authCookie,
187+
},
188+
})
189+
.catch((err) => {
190+
return err.response
191+
})
192+
expect(response.status).toEqual(200)
193+
expect(response.data.orders[0].display_id).toEqual(1)
194+
expect(response.data.orders[0].email).toEqual("test1@email.com")
195+
expect(response.data.orders.length).toEqual(1)
196+
})
197+
198+
it("looks up cancelled and completed orders", async () => {
199+
const api = useApi()
200+
201+
const authResponse = await api.post("/store/auth", {
202+
email: "john@deere.com",
203+
password: "test",
204+
})
205+
206+
const [authCookie] = authResponse.headers["set-cookie"][0].split(";")
207+
208+
const response = await api
209+
.get(
210+
"/store/customers/me/orders?status[]=completed&status[]=canceled",
211+
{
212+
headers: {
213+
Cookie: authCookie,
214+
},
215+
}
216+
)
217+
.catch((err) => {
218+
return console.log(err.response.data.message)
219+
})
220+
221+
expect(response.status).toEqual(200)
222+
expect(response.data.orders).toEqual([
223+
expect.objectContaining({
224+
display_id: 3,
225+
status: "canceled",
226+
}),
227+
expect.objectContaining({
228+
display_id: 1,
229+
status: "completed",
230+
}),
231+
])
232+
expect(response.data.orders.length).toEqual(2)
233+
})
234+
})
235+
92236
describe("POST /store/customers/me", () => {
93237
beforeEach(async () => {
94238
const manager = dbConnection.manager

packages/medusa/src/api/routes/store/customers/index.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import { Router } from "express"
22
import { Customer, Order } from "../../../.."
33
import { PaginatedResponse } from "../../../../types/common"
4-
import middlewares from "../../../middlewares"
4+
import middlewares, { transformQuery } from "../../../middlewares"
5+
import { StoreGetCustomersCustomerOrdersParams } from "./list-orders"
6+
import {
7+
defaultStoreOrdersRelations,
8+
defaultStoreOrdersFields,
9+
} from "../orders"
510

611
const route = Router()
712

@@ -34,7 +39,15 @@ export default (app, container) => {
3439
route.get("/me", middlewares.wrap(require("./get-customer").default))
3540
route.post("/me", middlewares.wrap(require("./update-customer").default))
3641

37-
route.get("/me/orders", middlewares.wrap(require("./list-orders").default))
42+
route.get(
43+
"/me/orders",
44+
transformQuery(StoreGetCustomersCustomerOrdersParams, {
45+
defaultFields: defaultStoreOrdersFields,
46+
defaultRelations: defaultStoreOrdersRelations,
47+
isList: true,
48+
}),
49+
middlewares.wrap(require("./list-orders").default)
50+
)
3851

3952
route.post(
4053
"/me/addresses",

0 commit comments

Comments
 (0)