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
This commit is contained in:
Adrien de Peretti
2024-09-10 14:22:21 +02:00
committed by GitHub
parent 36f30b4833
commit e56607c97c
6 changed files with 201 additions and 78 deletions

View File

@@ -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"

View File

@@ -1,6 +1,4 @@
import type { MedusaAppLoader } from "@medusajs/framework"
import { ContainerRegistrationKeys } from "@medusajs/utils"
import { asValue } from "awilix"
/**
* Initiates the database connection

View File

@@ -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

View File

@@ -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<TService = unknown> {
MikroOrmWrapper: TestDatabase
@@ -17,6 +21,46 @@ export interface SuiteOptions<TService = unknown> {
}
}
function createMikroOrmWrapper(options: {
moduleModels?: (Function | DmlEntity<any, any>)[]
resolve?: string
dbConfig: any
}): {
MikroOrmWrapper: TestDatabase
models: (Function | DmlEntity<any, any>)[]
} {
let moduleModels: (Function | DmlEntity<any, any>)[] =
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<TService = any>({
moduleName,
moduleModels,
@@ -43,9 +87,6 @@ export function moduleIntegrationTestRunner<TService = any>({
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<TService = any>({
// 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<TService = any>({
} as SuiteOptions<TService>
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<TService = any>({
}
const afterEach_ = async () => {
await MikroOrmWrapper.clearDatabase()
if (moduleModels.length) {
await MikroOrmWrapper.clearDatabase()
}
await shutdown()
moduleService = {}
medusaApp = {}

View File

@@ -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<IFileModuleService>({
moduleName: Modules.FILE,
moduleOptions: moduleOptions,
moduleModels: [DummyEntity],
testSuite: ({ service }) => {
describe("File Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {

156
yarn.lock
View File

@@ -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"