From e56607c97ca0caa4ed888cb562e5aefd693916fa Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Tue, 10 Sep 2024 14:22:21 +0200 Subject: [PATCH] fix(medusa-test-utils): Run with modules without models (#9062) * fix(medusa-test-utils): Run with modules without models * cleanup * rm dummy model * rm dummy model * improve models loading * find models * find models * find models * finalize * cleanup * fix deps * fix deps * fix deps * fix deps * fix deps --- packages/core/medusa-test-utils/package.json | 39 +---- .../src/medusa-test-runner-utils/use-db.ts | 2 - .../src/medusa-test-runner.ts | 4 +- .../src/module-test-runner.ts | 69 ++++++-- .../__tests__/module.spec.ts | 9 - yarn.lock | 156 +++++++++++++++--- 6 files changed, 201 insertions(+), 78 deletions(-) diff --git a/packages/core/medusa-test-utils/package.json b/packages/core/medusa-test-utils/package.json index ad0b6fc1d7..172017c940 100644 --- a/packages/core/medusa-test-utils/package.json +++ b/packages/core/medusa-test-utils/package.json @@ -23,51 +23,30 @@ "license": "MIT", "devDependencies": { "@medusajs/framework": "^0.0.1", + "@medusajs/modules-sdk": "*", "@medusajs/types": "^1.11.16", + "@mikro-orm/core": "5.9.7", + "@mikro-orm/migrations": "5.9.7", + "@mikro-orm/postgresql": "5.9.7", "cross-env": "^5.2.1", + "express": "^4.18.3", + "get-port": "^5.1.0", "jest": "^29.7.0", + "pg-god": "^1.0.12", "rimraf": "^3.0.2", "typescript": "^5.1.6" }, "peerDependencies": { - "@medusajs/medusa": "*", - "@medusajs/modules-sdk": "*", - "@mikro-orm/core": "5.9.7", - "@mikro-orm/migrations": "5.9.7", - "@mikro-orm/postgresql": "5.9.7", - "axios": "^0.28.0", - "express": "^4.18.3", - "pg-god": "^1.0.12" + "@medusajs/medusa": "*" }, "peerDependenciesMeta": { - "@medusajs/core": { - "optional": true - }, "@medusajs/medusa": { "optional": true - }, - "@medusajs/migrations": { - "optional": true - }, - "@medusajs/modules-sdk": { - "optional": true - }, - "@medusajs/postgresql": { - "optional": true - }, - "axios": { - "optional": true - }, - "express": { - "optional": true - }, - "pg-god": { - "optional": true } }, "dependencies": { "@medusajs/utils": "^1.11.9", - "get-port": "^5.1", + "axios": "^0.21.4", "randomatic": "^3.1.1" }, "gitHead": "81a7ff73d012fda722f6e9ef0bd9ba0232d37808" diff --git a/packages/core/medusa-test-utils/src/medusa-test-runner-utils/use-db.ts b/packages/core/medusa-test-utils/src/medusa-test-runner-utils/use-db.ts index 2243475e81..3a6415cc5c 100644 --- a/packages/core/medusa-test-utils/src/medusa-test-runner-utils/use-db.ts +++ b/packages/core/medusa-test-utils/src/medusa-test-runner-utils/use-db.ts @@ -1,6 +1,4 @@ import type { MedusaAppLoader } from "@medusajs/framework" -import { ContainerRegistrationKeys } from "@medusajs/utils" -import { asValue } from "awilix" /** * Initiates the database connection diff --git a/packages/core/medusa-test-utils/src/medusa-test-runner.ts b/packages/core/medusa-test-utils/src/medusa-test-runner.ts index a8d41185e3..608f72c35d 100644 --- a/packages/core/medusa-test-utils/src/medusa-test-runner.ts +++ b/packages/core/medusa-test-utils/src/medusa-test-runner.ts @@ -16,8 +16,6 @@ import { configLoaderOverride } from "./medusa-test-runner-utils/config" import { applyEnvVarsToProcess } from "./medusa-test-runner-utils/utils" import { clearInstances } from "./medusa-test-runner-utils/clear-instances" -const axios = require("axios").default - const DB_HOST = process.env.DB_HOST const DB_USERNAME = process.env.DB_USERNAME const DB_PASSWORD = process.env.DB_PASSWORD @@ -205,6 +203,8 @@ export function medusaIntegrationTestRunner({ await syncLinks(appLoader) } + const axios = (await import("axios")).default.default + const cancelTokenSource = axios.CancelToken.source() globalContainer = containerRes diff --git a/packages/core/medusa-test-utils/src/module-test-runner.ts b/packages/core/medusa-test-utils/src/module-test-runner.ts index ab5046a700..4226650909 100644 --- a/packages/core/medusa-test-utils/src/module-test-runner.ts +++ b/packages/core/medusa-test-utils/src/module-test-runner.ts @@ -1,11 +1,15 @@ import { ContainerRegistrationKeys, + DmlEntity, + loadModels, ModulesSdkUtils, + normalizeImportPathWithSource, toMikroOrmEntities, } from "@medusajs/utils" -import { TestDatabase, getDatabaseURL, getMikroOrmWrapper } from "./database" -import { InitModulesOptions, initModules } from "./init-modules" +import { getDatabaseURL, getMikroOrmWrapper, TestDatabase } from "./database" +import { initModules, InitModulesOptions } from "./init-modules" import { default as MockEventBusService } from "./mock-event-bus-service" +import * as fs from "fs" export interface SuiteOptions { MikroOrmWrapper: TestDatabase @@ -17,6 +21,46 @@ export interface SuiteOptions { } } +function createMikroOrmWrapper(options: { + moduleModels?: (Function | DmlEntity)[] + resolve?: string + dbConfig: any +}): { + MikroOrmWrapper: TestDatabase + models: (Function | DmlEntity)[] +} { + let moduleModels: (Function | DmlEntity)[] = + options.moduleModels ?? [] + + if (!options.moduleModels) { + const basePath = normalizeImportPathWithSource( + options.resolve ?? process.cwd() + ) + + const modelsPath = fs.existsSync(`${basePath}/dist/models`) + ? "/dist/models" + : fs.existsSync(`${basePath}/models`) + ? "/models" + : "" + + if (modelsPath) { + moduleModels = loadModels(`${basePath}${modelsPath}`) + } else { + moduleModels = [] + } + } + + moduleModels = toMikroOrmEntities(moduleModels) + + const MikroOrmWrapper = getMikroOrmWrapper({ + mikroOrmEntities: moduleModels, + clientUrl: options.dbConfig.clientUrl, + schema: options.dbConfig.schema, + }) + + return { MikroOrmWrapper, models: moduleModels } +} + export function moduleIntegrationTestRunner({ moduleName, moduleModels, @@ -43,9 +87,6 @@ export function moduleIntegrationTestRunner({ process.env.LOG_LEVEL = "error" - moduleModels ??= Object.values(require(`${process.cwd()}/src/models`)) - moduleModels = toMikroOrmEntities(moduleModels) - const tempName = parseInt(process.env.JEST_WORKER_ID || "1") const dbName = `medusa-${moduleName.toLowerCase()}-integration-${tempName}` @@ -58,12 +99,14 @@ export function moduleIntegrationTestRunner({ // Use a unique connection for all the entire suite const connection = ModulesSdkUtils.createPgConnection(dbConfig) - const MikroOrmWrapper = getMikroOrmWrapper({ - mikroOrmEntities: moduleModels, - clientUrl: dbConfig.clientUrl, - schema: dbConfig.schema, + const { MikroOrmWrapper, models } = createMikroOrmWrapper({ + moduleModels, + resolve, + dbConfig, }) + moduleModels = models + const modulesConfig_ = { [moduleName]: { definition: moduleSdkImports.ModulesDefinition[moduleName], @@ -117,7 +160,9 @@ export function moduleIntegrationTestRunner({ } as SuiteOptions const beforeEach_ = async () => { - await MikroOrmWrapper.setupDatabase() + if (moduleModels.length) { + await MikroOrmWrapper.setupDatabase() + } const output = await initModules(moduleOptions_) shutdown = output.shutdown medusaApp = output.medusaApp @@ -125,7 +170,9 @@ export function moduleIntegrationTestRunner({ } const afterEach_ = async () => { - await MikroOrmWrapper.clearDatabase() + if (moduleModels.length) { + await MikroOrmWrapper.clearDatabase() + } await shutdown() moduleService = {} medusaApp = {} diff --git a/packages/modules/file/integration-tests/__tests__/module.spec.ts b/packages/modules/file/integration-tests/__tests__/module.spec.ts index ac5fb721c9..72118d0ea3 100644 --- a/packages/modules/file/integration-tests/__tests__/module.spec.ts +++ b/packages/modules/file/integration-tests/__tests__/module.spec.ts @@ -1,19 +1,11 @@ import { resolve } from "path" import { moduleIntegrationTestRunner } from "medusa-test-utils" -import { Entity, PrimaryKey } from "@mikro-orm/core" import { IFileModuleService } from "@medusajs/types" import { Module, Modules } from "@medusajs/utils" import { FileModuleService } from "@services" jest.setTimeout(100000) -// The test runner throws if a model is not passed, so we create a dummy entity -@Entity({ tableName: "dummy_file_entity" }) -export default class DummyEntity { - @PrimaryKey() - id: string -} - const moduleOptions = { providers: [ { @@ -29,7 +21,6 @@ const moduleOptions = { moduleIntegrationTestRunner({ moduleName: Modules.FILE, moduleOptions: moduleOptions, - moduleModels: [DummyEntity], testSuite: ({ service }) => { describe("File Module Service", () => { it(`should export the appropriate linkable configuration`, () => { diff --git a/yarn.lock b/yarn.lock index f1078cac83..ed937b5bdd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6177,7 +6177,7 @@ __metadata: languageName: unknown linkType: soft -"@medusajs/modules-sdk@^1.12.11, @medusajs/modules-sdk@workspace:^, @medusajs/modules-sdk@workspace:packages/core/modules-sdk": +"@medusajs/modules-sdk@*, @medusajs/modules-sdk@^1.12.11, @medusajs/modules-sdk@workspace:^, @medusajs/modules-sdk@workspace:packages/core/modules-sdk": version: 0.0.0-use.local resolution: "@medusajs/modules-sdk@workspace:packages/core/modules-sdk" dependencies: @@ -15434,6 +15434,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: 3.1.2 + content-type: ~1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: ~1.6.18 + unpipe: 1.0.0 + checksum: 0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 + languageName: node + linkType: hard + "boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" @@ -18311,6 +18331,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + "encoding-down@npm:^6.3.0": version: 6.3.0 resolution: "encoding-down@npm:6.3.0" @@ -19546,6 +19573,45 @@ __metadata: languageName: node linkType: hard +"express@npm:^4.18.3": + version: 4.20.0 + resolution: "express@npm:4.20.0" + dependencies: + accepts: ~1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: ~1.0.4 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: ~2.0.0 + escape-html: ~1.0.3 + etag: ~1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: ~1.1.2 + on-finished: 2.4.1 + parseurl: ~1.3.3 + path-to-regexp: 0.1.10 + proxy-addr: ~2.0.7 + qs: 6.11.0 + range-parser: ~1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: ~1.6.18 + utils-merge: 1.0.1 + vary: ~1.1.2 + checksum: 626e440e9feffa3f82ebce5e7dc0ad7a74fa96079994f30048cce450f4855a258abbcabf021f691aeb72154867f0d28440a8498c62888805faf667a829fb65aa + languageName: node + linkType: hard + "extend@npm:^3.0.0, extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -20389,7 +20455,7 @@ __metadata: languageName: node linkType: hard -"get-port@npm:^5.1, get-port@npm:^5.1.1": +"get-port@npm:^5.1.0, get-port@npm:^5.1.1": version: 5.1.1 resolution: "get-port@npm:5.1.1" checksum: 2873877a469b24e6d5e0be490724a17edb39fafc795d1d662e7bea951ca649713b4a50117a473f9d162312cb0e946597bd0e049ed2f866e79e576e8e213d3d1c @@ -24471,40 +24537,26 @@ __metadata: resolution: "medusa-test-utils@workspace:packages/core/medusa-test-utils" dependencies: "@medusajs/framework": ^0.0.1 + "@medusajs/modules-sdk": "*" "@medusajs/types": ^1.11.16 "@medusajs/utils": ^1.11.9 + "@mikro-orm/core": 5.9.7 + "@mikro-orm/migrations": 5.9.7 + "@mikro-orm/postgresql": 5.9.7 + axios: ^0.21.4 cross-env: ^5.2.1 - get-port: ^5.1 + express: ^4.18.3 + get-port: ^5.1.0 jest: ^29.7.0 + pg-god: ^1.0.12 randomatic: ^3.1.1 rimraf: ^3.0.2 typescript: ^5.1.6 peerDependencies: "@medusajs/medusa": "*" - "@medusajs/modules-sdk": "*" - "@mikro-orm/core": 5.9.7 - "@mikro-orm/migrations": 5.9.7 - "@mikro-orm/postgresql": 5.9.7 - axios: ^0.28.0 - express: ^4.18.3 - pg-god: ^1.0.12 peerDependenciesMeta: - "@medusajs/core": - optional: true "@medusajs/medusa": optional: true - "@medusajs/migrations": - optional: true - "@medusajs/modules-sdk": - optional: true - "@medusajs/postgresql": - optional: true - axios: - optional: true - express: - optional: true - pg-god: - optional: true languageName: unknown linkType: soft @@ -24543,6 +24595,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -26327,6 +26386,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: 34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4 + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" @@ -27635,6 +27701,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: ^1.0.6 + checksum: 62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 + languageName: node + linkType: hard + "qs@npm:6.7.0": version: 6.7.0 resolution: "qs@npm:6.7.0" @@ -29512,6 +29587,27 @@ __metadata: languageName: node linkType: hard +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + etag: ~1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: ~1.2.1 + statuses: 2.0.1 + checksum: ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 + languageName: node + linkType: hard + "sentence-case@npm:^3.0.4": version: 3.0.4 resolution: "sentence-case@npm:3.0.4" @@ -29556,6 +29652,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:1.16.0": + version: 1.16.0 + resolution: "serve-static@npm:1.16.0" + dependencies: + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + parseurl: ~1.3.3 + send: 0.18.0 + checksum: d7a5beca08cc55f92998d8b87c111dd842d642404231c90c11f504f9650935da4599c13256747b0a988442a59851343271fe8e1946e03e92cd79c447b5f3ae01 + languageName: node + linkType: hard + "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0"