Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/as-associate-business-units.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@labdigital/commercetools-mock": minor
---

Add support for the `asAssociate` business-units endpoint.
2 changes: 2 additions & 0 deletions src/repositories/as-associate.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BusinessUnitRepository } from "./business-unit.ts";
import { CartRepository } from "./cart/index.ts";
import { OrderRepository } from "./order/index.ts";
import { QuoteRequestRepository } from "./quote-request/index.ts";
Expand All @@ -7,3 +8,4 @@ export class AsAssociateOrderRepository extends OrderRepository {}
export class AsAssociateCartRepository extends CartRepository {}
export class AsAssociateQuoteRequestRepository extends QuoteRequestRepository {}
export class AsAssociateShoppingListRepository extends ShoppingListRepository {}
export class AsAssociateBusinessUnitRepository extends BusinessUnitRepository {}
2 changes: 2 additions & 0 deletions src/repositories/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { Config } from "#src/config.ts";
import { ProductTailoringRepository } from "#src/repositories/product-tailoring.ts";
import {
AsAssociateBusinessUnitRepository,
AsAssociateCartRepository,
AsAssociateOrderRepository,
AsAssociateQuoteRequestRepository,
Expand Down Expand Up @@ -51,6 +52,7 @@ export type RepositoryMap = ReturnType<typeof createRepositories>;

export const createRepositories = (config: Config) => ({
"as-associate": {
"business-unit": new AsAssociateBusinessUnitRepository(config),
cart: new AsAssociateCartRepository(config),
order: new AsAssociateOrderRepository(config),
"quote-request": new AsAssociateQuoteRequestRepository(config),
Expand Down
70 changes: 70 additions & 0 deletions src/services/as-associate-business-unit.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { afterEach, describe, expect, test } from "vitest";
import { businessUnitDraftFactory } from "#src/testing/business-unit.ts";
import { CommercetoolsMock } from "../index.ts";

const ctMock = new CommercetoolsMock();
const projectKey = "dummy";
const associateId = "5fac8fca-2484-4b14-a1d1-cfdce2f8d3c4";

describe("AsAssociateBusinessUnit", () => {
const businessUnitFactory = businessUnitDraftFactory(ctMock);

afterEach(async () => {
await ctMock.clear();
});

test("Get business units as associate", async () => {
await businessUnitFactory.create({
key: "as-associate-bu",
unitType: "Company",
name: "As Associate BU",
contactEmail: "contact@example.com",
});

const response = await ctMock.app.inject({
method: "GET",
url: `/${projectKey}/as-associate/${associateId}/business-units`,
});

expect(response.statusCode).toBe(200);
expect(response.json().results).toBeDefined();
});

test("Get business unit by key as associate", async () => {
const businessUnit = await businessUnitFactory.create({
key: "as-associate-bu",
unitType: "Company",
name: "As Associate BU",
contactEmail: "contact@example.com",
});

const response = await ctMock.app.inject({
method: "GET",
url: `/${projectKey}/as-associate/${associateId}/business-units/key=${businessUnit.key}`,
});

expect(response.statusCode).toBe(200);
expect(response.json()).toEqual(businessUnit);
});

test("Update business unit by key as associate", async () => {
const businessUnit = await businessUnitFactory.create({
key: "as-associate-bu",
unitType: "Company",
name: "As Associate BU",
contactEmail: "contact@example.com",
});

const response = await ctMock.app.inject({
method: "POST",
url: `/${projectKey}/as-associate/${associateId}/business-units/key=${businessUnit.key}`,
payload: {
version: businessUnit.version,
actions: [{ action: "changeName", name: "Updated Name" }],
},
});

expect(response.statusCode).toBe(200);
expect(response.json().name).toBe("Updated Name");
});
});
19 changes: 19 additions & 0 deletions src/services/as-associate-business-unit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { FastifyInstance } from "fastify";
import type { AsAssociateBusinessUnitRepository } from "#src/repositories/as-associate.ts";
import AbstractService from "./abstract.ts";

export class AsAssociateBusinessUnitService extends AbstractService {
public repository: AsAssociateBusinessUnitRepository;

constructor(
parent: FastifyInstance,
repository: AsAssociateBusinessUnitRepository,
) {
super(parent);
this.repository = repository;
}

getBasePath() {
return "business-units";
}
}
52 changes: 38 additions & 14 deletions src/services/as-associate.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
import type { FastifyInstance } from "fastify";
import type {
AsAssociateBusinessUnitRepository,
AsAssociateCartRepository,
AsAssociateOrderRepository,
AsAssociateQuoteRequestRepository,
AsAssociateShoppingListRepository,
} from "#src/repositories/as-associate.ts";
import { AsAssociateBusinessUnitService } from "./as-associate-business-unit.ts";
import { AsAssociateCartService } from "./as-associate-cart.ts";
import { AsAssociateOrderService } from "./as-associate-order.ts";
import { AsAssociateQuoteRequestService } from "./as-associate-quote-request.ts";
import { AsAssociateShoppingListService } from "./as-associate-shopping-list.ts";

type Repositories = {
"business-unit": AsAssociateBusinessUnitRepository;
cart: AsAssociateCartRepository;
order: AsAssociateOrderRepository;
"quote-request": AsAssociateQuoteRequestRepository;
Expand All @@ -19,6 +22,7 @@ type Repositories = {

export class AsAssociateService {
subServices!: {
"business-unit": AsAssociateBusinessUnitService;
cart: AsAssociateCartService;
order: AsAssociateOrderService;
"quote-request": AsAssociateQuoteRequestService;
Expand All @@ -28,23 +32,43 @@ export class AsAssociateService {
constructor(parent: FastifyInstance, repositories: Repositories) {
parent.register(
(instance, opts, done) => {
this.subServices = {
order: new AsAssociateOrderService(instance, repositories.order),
cart: new AsAssociateCartService(instance, repositories.cart),
"quote-request": new AsAssociateQuoteRequestService(
instance,
repositories["quote-request"],
),
"shopping-list": new AsAssociateShoppingListService(
instance,
repositories["shopping-list"],
),
};
const businessUnitService = new AsAssociateBusinessUnitService(
instance,
repositories["business-unit"],
);

instance.register(
(scoped, _opts, scopedDone) => {
const order = new AsAssociateOrderService(
scoped,
repositories.order,
);
const cart = new AsAssociateCartService(scoped, repositories.cart);
const quoteRequest = new AsAssociateQuoteRequestService(
scoped,
repositories["quote-request"],
);
const shoppingList = new AsAssociateShoppingListService(
scoped,
repositories["shopping-list"],
);

this.subServices = {
"business-unit": businessUnitService,
order,
cart,
"quote-request": quoteRequest,
"shopping-list": shoppingList,
};
scopedDone();
},
{ prefix: "/in-business-unit/key=:businessUnitId" },
);

done();
},
{
prefix:
"/as-associate/:associateId/in-business-unit/key=:businessUnitId",
prefix: "/as-associate/:associateId",
},
);
}
Expand Down
Loading