From a9abf448c69c51107b6dfe36edd8499033be47f7 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Tue, 23 Jul 2024 14:43:46 +0200 Subject: [PATCH] fix(utils): Fix inferrence of public method name and service registration name based on configuration (#8237) --- .../__tests__/medusa-service.spec.ts | 108 +++++++++++++++++- .../utils/src/modules-sdk/medusa-service.ts | 19 +-- 2 files changed, 119 insertions(+), 8 deletions(-) diff --git a/packages/core/utils/src/modules-sdk/__tests__/medusa-service.spec.ts b/packages/core/utils/src/modules-sdk/__tests__/medusa-service.spec.ts index a9946210ff..5a84b918a4 100644 --- a/packages/core/utils/src/modules-sdk/__tests__/medusa-service.spec.ts +++ b/packages/core/utils/src/modules-sdk/__tests__/medusa-service.spec.ts @@ -1,4 +1,5 @@ import { MedusaService } from "../medusa-service" +import { model } from "../../dml" const baseRepoMock = { serialize: jest.fn().mockImplementation((item) => item), @@ -52,7 +53,7 @@ describe("Abstract Module Service Factory", () => { }) describe("Main Model Methods", () => { - let instance: medusaService + let instance: InstanceType beforeEach(() => { jest.clearAllMocks() @@ -172,4 +173,109 @@ describe("Abstract Module Service Factory", () => { ) }) }) + + describe("Custom configuration using DML", () => { + const containerMock = { + baseRepository: baseRepoMock, + mainModelMockRepository: baseRepoMock, + otherModelMock1Repository: baseRepoMock, + otherModelMock2Repository: baseRepoMock, + houseService: { + retrieve: jest.fn().mockResolvedValue({ id: "1", name: "Item" }), + list: jest.fn().mockResolvedValue([{ id: "1", name: "Item" }]), + delete: jest.fn().mockResolvedValue(undefined), + softDelete: jest.fn().mockResolvedValue([[], {}]), + restore: jest.fn().mockResolvedValue([[], {}]), + }, + carService: { + retrieve: jest.fn().mockResolvedValue({ id: "1", name: "Item" }), + list: jest.fn().mockResolvedValue([{ id: "1", name: "Item" }]), + delete: jest.fn().mockResolvedValue(undefined), + softDelete: jest.fn().mockResolvedValue([[], {}]), + restore: jest.fn().mockResolvedValue([[], {}]), + }, + userService: { + retrieve: jest.fn().mockResolvedValue({ id: "1", name: "Item" }), + list: jest.fn().mockResolvedValue([{ id: "1", name: "Item" }]), + delete: jest.fn().mockResolvedValue(undefined), + softDelete: jest.fn().mockResolvedValue([[], {}]), + restore: jest.fn().mockResolvedValue([[], {}]), + }, + } + + const MockModel = model.define("user", { + id: model.id().primaryKey(), + }) + const MockModel2 = model.define("car", { + id: model.id().primaryKey(), + }) + const MockModel3 = model.define("house", { + id: model.id().primaryKey(), + }) + + const medusaService = MedusaService({ + MockModel, + MockModel2, + MockModel3, + }) + + let instance: InstanceType + + beforeEach(() => { + jest.clearAllMocks() + instance = new medusaService(containerMock) + }) + + it("should have the correct methods name while resolving the correct underlying service representation of target models", async () => { + const prototype = Object.getPrototypeOf(instance) + + expect(prototype).toHaveProperty("retrieveMockModel") + expect(prototype).toHaveProperty("listMockModels") + expect(prototype).toHaveProperty("listAndCountMockModels") + expect(prototype).toHaveProperty("createMockModels") + expect(prototype).toHaveProperty("updateMockModels") + expect(prototype).toHaveProperty("deleteMockModels") + expect(prototype).toHaveProperty("softDeleteMockModels") + + expect(prototype).toHaveProperty("retrieveMockModel2") + expect(prototype).toHaveProperty("listMockModel2s") + expect(prototype).toHaveProperty("listAndCountMockModel2s") + expect(prototype).toHaveProperty("createMockModel2s") + expect(prototype).toHaveProperty("updateMockModel2s") + expect(prototype).toHaveProperty("deleteMockModel2s") + expect(prototype).toHaveProperty("softDeleteMockModel2s") + + expect(prototype).toHaveProperty("retrieveMockModel3") + expect(prototype).toHaveProperty("listMockModel3s") + expect(prototype).toHaveProperty("listAndCountMockModel3s") + expect(prototype).toHaveProperty("createMockModel3s") + expect(prototype).toHaveProperty("updateMockModel3s") + expect(prototype).toHaveProperty("deleteMockModel3s") + expect(prototype).toHaveProperty("softDeleteMockModel3s") + + let result = await instance.retrieveMockModel("1") + expect(result).toEqual({ id: "1", name: "Item" }) + expect(containerMock.userService.retrieve).toHaveBeenCalledWith( + "1", + undefined, + defaultContext + ) + + result = await instance.retrieveMockModel2("1") + expect(result).toEqual({ id: "1", name: "Item" }) + expect(containerMock.carService.retrieve).toHaveBeenCalledWith( + "1", + undefined, + defaultContext + ) + + result = await instance.retrieveMockModel3("1") + expect(result).toEqual({ id: "1", name: "Item" }) + expect(containerMock.houseService.retrieve).toHaveBeenCalledWith( + "1", + undefined, + defaultContext + ) + }) + }) }) diff --git a/packages/core/utils/src/modules-sdk/medusa-service.ts b/packages/core/utils/src/modules-sdk/medusa-service.ts index 953abc7f55..8ae67095fc 100644 --- a/packages/core/utils/src/modules-sdk/medusa-service.ts +++ b/packages/core/utils/src/modules-sdk/medusa-service.ts @@ -30,6 +30,7 @@ import { ModelsConfigTemplate, } from "./types/medusa-service" import { buildModelsNameToLinkableKeysMap } from "./joiner-config-builder" +import { DmlEntity } from "../dml" const readMethods = ["retrieve", "list", "listAndCount"] as BaseMethods[] const writeMethods = [ @@ -46,7 +47,7 @@ const methods: BaseMethods[] = [...readMethods, ...writeMethods] * @internal */ function buildMethodNamesFromModel( - modelName: string, + defaultMethodName: string, model: ModelEntries[keyof ModelEntries] ): Record { return methods.reduce((acc, method) => { @@ -54,10 +55,14 @@ function buildMethodNamesFromModel( if (method === "retrieve") { normalizedModelName = - "singular" in model && model.singular ? model.singular : modelName + "singular" in model && model.singular + ? model.singular + : defaultMethodName } else { normalizedModelName = - "plural" in model && model.plural ? model.plural : pluralize(modelName) + "plural" in model && model.plural + ? model.plural + : pluralize(defaultMethodName) } const methodName = `${method}${upperCaseFirst(normalizedModelName)}` @@ -406,11 +411,11 @@ export function MedusaService< */ const modelsMethods: [ - string, - TModels[keyof TModels], - Record + string, // model name + TModels[keyof TModels], // configuration (dml, conf, entity) + Record // method names ][] = Object.entries(models as {}).map(([name, config]) => [ - name, + DmlEntity.isDmlEntity(config) ? config.name : name, config as TModels[keyof TModels], buildMethodNamesFromModel(name, config as TModels[keyof TModels]), ])