chore(orchestration): modules method context (#9669)

** What **
* Test to check if the MedusaContext is being injected when calling a Module's method
This commit is contained in:
Carlos R. L. Rodrigues
2024-10-18 18:08:06 -03:00
committed by GitHub
parent 8209d936a0
commit 6fa98b6a4d
7 changed files with 132 additions and 4 deletions

View File

@@ -0,0 +1,11 @@
import { ModuleExports } from "@medusajs/types"
import { ModuleService } from "./services/module-service"
const moduleExports: ModuleExports = {
service: ModuleService,
}
export * from "./models"
export * from "./services/module-service"
export default moduleExports

View File

@@ -0,0 +1,6 @@
import { model } from "@medusajs/utils"
export const dmlEntity = model.define("dmlEntity", {
id: model.id().primaryKey(),
name: model.text(),
})

View File

@@ -0,0 +1 @@
export * from "./dml-entity"

View File

@@ -0,0 +1,17 @@
import { IModuleService } from "@medusajs/types"
import { MedusaContext } from "@medusajs/utils"
// @ts-expect-error
export class ModuleService implements IModuleService {
public property = "value"
public dynProperty
constructor() {
this.dynProperty = {
key: "key value",
}
}
async methodName(input, @MedusaContext() context) {
return input + " called"
}
}

View File

@@ -0,0 +1,93 @@
import { Modules } from "@medusajs/framework/utils"
import {
createStep,
createWorkflow,
StepResponse,
WorkflowData,
WorkflowResponse,
} from "@medusajs/framework/workflows-sdk"
import { medusaIntegrationTestRunner } from "@medusajs/test-utils"
import {
adminHeaders,
createAdminUser,
} from "../../../helpers/create-admin-user"
jest.setTimeout(50000)
medusaIntegrationTestRunner({
testSuite: ({ dbConnection, getContainer, api }) => {
describe("Workflow Engine API", () => {
let medusaContainer
beforeAll(() => {
medusaContainer = getContainer()
})
beforeEach(async () => {
await createAdminUser(dbConnection, adminHeaders, medusaContainer)
})
describe("Testing WorkflowEngine.run", () => {
beforeAll(async () => {
const step1 = createStep(
{
name: "my-step",
},
async (input: { initial: string }, { container }) => {
const testMod = container.resolve("testingModule") as any
return new StepResponse(testMod.methodName(input.initial))
}
)
createWorkflow(
{
name: "my-workflow-name",
},
function (input: WorkflowData<{ initial: string }>) {
const stepRes = step1(input)
return new WorkflowResponse(stepRes)
}
)
})
it("Should invoke modules passing the current medusa context as argument", async () => {
const testMod = medusaContainer.resolve("testingModule") as any
const methodSpy = jest.spyOn(testMod, "methodName")
const engine = medusaContainer.resolve(Modules.WORKFLOW_ENGINE)
const res = await engine.run("my-workflow-name", {
transactionId: "trx-id",
input: {
initial: "abc",
},
context: {
meta: {
myStuff: "myStuff",
},
},
})
expect(res.result).toEqual("abc called")
expect(methodSpy).toHaveBeenCalledTimes(1)
expect(methodSpy).toHaveBeenCalledWith(
"abc",
expect.objectContaining({
transactionId: "trx-id",
__type: "MedusaContext",
eventGroupId: expect.any(String),
idempotencyKey: "my-workflow-name:trx-id:my-step:invoke",
meta: {
myStuff: "myStuff",
},
})
)
})
})
})
},
})

View File

@@ -39,6 +39,9 @@ module.exports = {
medusa_v2: enableMedusaV2,
},
modules: {
testingModule: {
resolve: "__tests__/__fixtures__/testing-module",
},
[Modules.AUTH]: {
resolve: "@medusajs/auth",
options: {

View File

@@ -107,12 +107,9 @@ export class LocalWorkflow {
return resolved
}
const nonWrappable = Object.getOwnPropertyNames(resolved)
return new Proxy(resolved, {
get: function (target, prop) {
const shouldWrap = !nonWrappable.includes(prop as string)
if (!shouldWrap) {
if (typeof target[prop] !== "function") {
return target[prop]
}