Skip to content

Commit 378ad0d

Browse files
authored
feat: as-associate support for shopping list (#361)
1 parent f6b528f commit 378ad0d

File tree

7 files changed

+133
-0
lines changed

7 files changed

+133
-0
lines changed

.changeset/young-laws-laugh.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@labdigital/commercetools-mock": minor
3+
---
4+
5+
Add support for as associate shopping lists

src/repositories/as-associate.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import type { ShoppingListDraft } from "@commercetools/platform-sdk";
12
import { describe, expect, test } from "vitest";
23
import type { Config } from "#src/config.ts";
34
import { InMemoryStorage } from "#src/storage/index.ts";
45
import {
56
AsAssociateCartRepository,
67
AsAssociateOrderRepository,
78
AsAssociateQuoteRequestRepository,
9+
AsAssociateShoppingListRepository,
810
} from "./as-associate.ts";
911
import { CustomerRepository } from "./customer/index.ts";
1012

@@ -123,4 +125,27 @@ describe("As Associate Repositories", () => {
123125
expect(retrieved).toBeDefined();
124126
expect(retrieved?.id).toBe(quoteRequest.id);
125127
});
128+
129+
test("AsAssociateShoppingListRepository can create and retrieve shopping lists", () => {
130+
const repository = new AsAssociateShoppingListRepository(config);
131+
const ctx = { projectKey: "test-project" };
132+
133+
const shoppingListDraft: ShoppingListDraft = {
134+
name: { "en-US": "My Shopping List" },
135+
};
136+
137+
const shoppingList = repository.create(ctx, shoppingListDraft);
138+
expect(shoppingList.id).toBeDefined();
139+
expect(shoppingList.version).toBe(1);
140+
141+
// Test query
142+
const result = repository.query(ctx);
143+
expect(result.count).toBe(1);
144+
expect(result.results[0].id).toBe(shoppingList.id);
145+
146+
// Test get
147+
const retrieved = repository.get(ctx, shoppingList.id);
148+
expect(retrieved).toBeDefined();
149+
expect(retrieved?.id).toBe(shoppingList.id);
150+
});
126151
});

src/repositories/as-associate.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { CartRepository } from "./cart/index.ts";
22
import { OrderRepository } from "./order/index.ts";
33
import { QuoteRequestRepository } from "./quote-request/index.ts";
4+
import { ShoppingListRepository } from "./shopping-list/index.ts";
45

56
export class AsAssociateOrderRepository extends OrderRepository {}
67
export class AsAssociateCartRepository extends CartRepository {}
78
export class AsAssociateQuoteRequestRepository extends QuoteRequestRepository {}
9+
export class AsAssociateShoppingListRepository extends ShoppingListRepository {}

src/repositories/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
AsAssociateCartRepository,
55
AsAssociateOrderRepository,
66
AsAssociateQuoteRequestRepository,
7+
AsAssociateShoppingListRepository,
78
} from "./as-associate.ts";
89
import { AssociateRoleRepository } from "./associate-role.ts";
910
import { AttributeGroupRepository } from "./attribute-group.ts";
@@ -53,6 +54,7 @@ export const createRepositories = (config: Config) => ({
5354
cart: new AsAssociateCartRepository(config),
5455
order: new AsAssociateOrderRepository(config),
5556
"quote-request": new AsAssociateQuoteRequestRepository(config),
57+
"shopping-list": new AsAssociateShoppingListRepository(config),
5658
},
5759
"associate-role": new AssociateRoleRepository(config),
5860
"attribute-group": new AttributeGroupRepository(config),
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import supertest from "supertest";
2+
import { describe, expect, test } from "vitest";
3+
import { CommercetoolsMock } from "../index.ts";
4+
5+
const ctMock = new CommercetoolsMock();
6+
const projectKey = "dummy";
7+
const customerId = "5fac8fca-2484-4b14-a1d1-cfdce2f8d3c4";
8+
const businessUnitKey = "test-business-unit";
9+
10+
describe("AsAssociateShoppingList", () => {
11+
test("Create shopping list", async () => {
12+
const draft = {
13+
name: { en: "My list" },
14+
};
15+
const response = await supertest(ctMock.app)
16+
.post(
17+
`/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists`,
18+
)
19+
.send(draft);
20+
21+
expect(response.status).toBe(201);
22+
expect(response.body.id).toBeDefined();
23+
});
24+
25+
test("Get shopping list", async () => {
26+
const createResponse = await supertest(ctMock.app)
27+
.post(
28+
`/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists`,
29+
)
30+
.send({ name: { en: "Groceries" } });
31+
32+
expect(createResponse.status).toBe(201);
33+
34+
const response = await supertest(ctMock.app).get(
35+
`/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists/${createResponse.body.id}`,
36+
);
37+
38+
expect(response.status).toBe(200);
39+
expect(response.body).toEqual(createResponse.body);
40+
});
41+
42+
test("Query shopping lists", async () => {
43+
const createResponse = await supertest(ctMock.app)
44+
.post(
45+
`/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists`,
46+
)
47+
.send({ name: { en: "Errands" } });
48+
49+
expect(createResponse.status).toBe(201);
50+
51+
const response = await supertest(ctMock.app).get(
52+
`/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists`,
53+
);
54+
55+
expect(response.status).toBe(200);
56+
expect(response.body.count).toBeGreaterThan(0);
57+
});
58+
});
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { Router } from "express";
2+
import type { ShoppingListRepository } from "#src/repositories/shopping-list/index.ts";
3+
import AbstractService from "./abstract.ts";
4+
5+
export class AsAssociateShoppingListService extends AbstractService {
6+
public repository: ShoppingListRepository;
7+
8+
constructor(parent: Router, repository: ShoppingListRepository) {
9+
super(parent);
10+
this.repository = repository;
11+
}
12+
13+
getBasePath() {
14+
return "shopping-lists";
15+
}
16+
17+
registerRoutes(parent: Router) {
18+
const basePath = this.getBasePath();
19+
const router = Router({ mergeParams: true });
20+
21+
this.extraRoutes(router);
22+
23+
router.get("/", this.get.bind(this));
24+
router.get("/:id", this.getWithId.bind(this));
25+
26+
router.delete("/:id", this.deleteWithId.bind(this));
27+
28+
router.post("/", this.post.bind(this));
29+
router.post("/:id", this.postWithId.bind(this));
30+
31+
parent.use(`/${basePath}`, router);
32+
}
33+
}

src/services/as-associate.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@ import type {
33
AsAssociateCartRepository,
44
AsAssociateOrderRepository,
55
AsAssociateQuoteRequestRepository,
6+
AsAssociateShoppingListRepository,
67
} from "#src/repositories/as-associate.ts";
78
import { AsAssociateCartService } from "./as-associate-cart.ts";
89
import { AsAssociateOrderService } from "./as-associate-order.ts";
910
import { AsAssociateQuoteRequestService } from "./as-associate-quote-request.ts";
11+
import { AsAssociateShoppingListService } from "./as-associate-shopping-list.ts";
1012

1113
type Repositories = {
1214
cart: AsAssociateCartRepository;
1315
order: AsAssociateOrderRepository;
1416
"quote-request": AsAssociateQuoteRequestRepository;
17+
"shopping-list": AsAssociateShoppingListRepository;
1518
};
1619

1720
export class AsAssociateService {
@@ -21,6 +24,7 @@ export class AsAssociateService {
2124
cart: AsAssociateCartService;
2225
order: AsAssociateOrderService;
2326
"quote-request": AsAssociateQuoteRequestService;
27+
"shopping-list": AsAssociateShoppingListService;
2428
};
2529

2630
constructor(parent: Router, repositories: Repositories) {
@@ -33,6 +37,10 @@ export class AsAssociateService {
3337
this.router,
3438
repositories["quote-request"],
3539
),
40+
"shopping-list": new AsAssociateShoppingListService(
41+
this.router,
42+
repositories["shopping-list"],
43+
),
3644
};
3745
parent.use(
3846
"/as-associate/:associateId/in-business-unit/key=:businessUnitId",

0 commit comments

Comments
 (0)