[{"data":1,"prerenderedAt":2188},["ShallowReactive",2],{"navigation":3,"docs-path-index":340,"-docs-modules-testing-overview":446,"-docs-modules-testing-overview-surround":2183},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":64},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,30,65,293,318],{"title":11,"path":12,"stem":13,"children":14,"icon":29},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21,25],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples",{"title":26,"path":27,"stem":28},"Project Generator","\u002Fdocs\u002Fgetting-started\u002Fproject-generator","docs\u002F1.getting-started\u002F4.project-generator","i-lucide-rocket",{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":64},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[36,40,44,48,52,56,60],{"title":37,"path":38,"stem":39},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":41,"path":42,"stem":43},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":45,"path":46,"stem":47},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":49,"path":50,"stem":51},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":53,"path":54,"stem":55},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",{"title":57,"path":58,"stem":59},"Introspection","\u002Fdocs\u002Fcore-features\u002Fintrospection","docs\u002F2.core-features\u002F5.introspection",{"title":61,"path":62,"stem":63},"Health Checks","\u002Fdocs\u002Fcore-features\u002Fhealth","docs\u002F2.core-features\u002F6.health",false,{"title":66,"icon":67,"defaultOpen":68,"path":69,"stem":70,"children":71,"page":64},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[72,89,100,116,135,154,177,191,206,214,229,240,255,274,282],{"title":73,"icon":64,"defaultOpen":64,"path":74,"stem":75,"children":76,"page":64},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[77,81,85],{"title":78,"path":79,"stem":80},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":82,"path":83,"stem":84},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":86,"path":87,"stem":88},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":90,"icon":64,"defaultOpen":64,"path":91,"stem":92,"children":93,"page":64},"Devtools","\u002Fdocs\u002Fmodules\u002Fdevtools","docs\u002F3.modules\u002F10.devtools",[94,97],{"title":78,"path":95,"stem":96},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Foverview","docs\u002F3.modules\u002F10.devtools\u002F0.overview",{"title":37,"path":98,"stem":99},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Fconfiguration","docs\u002F3.modules\u002F10.devtools\u002F1.configuration",{"title":101,"icon":64,"defaultOpen":64,"path":102,"stem":103,"children":104,"page":64},"Telemetry","\u002Fdocs\u002Fmodules\u002Ftelemetry","docs\u002F3.modules\u002F11.telemetry",[105,108,112],{"title":78,"path":106,"stem":107},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Foverview","docs\u002F3.modules\u002F11.telemetry\u002F0.overview",{"title":109,"path":110,"stem":111},"API","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Fapi","docs\u002F3.modules\u002F11.telemetry\u002F1.api",{"title":113,"path":114,"stem":115},"Instrumentation","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Finstrumentation","docs\u002F3.modules\u002F11.telemetry\u002F2.instrumentation",{"title":117,"icon":64,"defaultOpen":64,"path":118,"stem":119,"children":120,"page":64},"Queue","\u002Fdocs\u002Fmodules\u002Fqueue","docs\u002F3.modules\u002F12.queue",[121,124,128,132],{"title":78,"path":122,"stem":123},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Foverview","docs\u002F3.modules\u002F12.queue\u002F0.overview",{"title":125,"path":126,"stem":127},"Consumers","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fconsumers","docs\u002F3.modules\u002F12.queue\u002F1.consumers",{"title":129,"path":130,"stem":131},"Strategies","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fstrategies","docs\u002F3.modules\u002F12.queue\u002F2.strategies",{"title":109,"path":133,"stem":134},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Fapi","docs\u002F3.modules\u002F12.queue\u002F3.api",{"title":136,"icon":64,"defaultOpen":64,"path":137,"stem":138,"children":139,"page":64},"Scheduler","\u002Fdocs\u002Fmodules\u002Fscheduler","docs\u002F3.modules\u002F13.scheduler",[140,143,147,151],{"title":78,"path":141,"stem":142},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002Foverview","docs\u002F3.modules\u002F13.scheduler\u002F0.overview",{"title":144,"path":145,"stem":146},"Jobs","\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fjobs","docs\u002F3.modules\u002F13.scheduler\u002F1.jobs",{"title":148,"path":149,"stem":150},"Clustering","\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fclustering","docs\u002F3.modules\u002F13.scheduler\u002F2.clustering",{"title":109,"path":152,"stem":153},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fapi","docs\u002F3.modules\u002F13.scheduler\u002F3.api",{"title":155,"icon":64,"defaultOpen":64,"path":156,"stem":157,"children":158,"page":64},"Testing","\u002Fdocs\u002Fmodules\u002Ftesting","docs\u002F3.modules\u002F14.testing",[159,162,166,170,174],{"title":78,"path":160,"stem":161},"\u002Fdocs\u002Fmodules\u002Ftesting\u002Foverview","docs\u002F3.modules\u002F14.testing\u002F0.overview",{"title":163,"path":164,"stem":165},"Requests","\u002Fdocs\u002Fmodules\u002Ftesting\u002Frequests","docs\u002F3.modules\u002F14.testing\u002F1.requests",{"title":167,"path":168,"stem":169},"Dependencies","\u002Fdocs\u002Fmodules\u002Ftesting\u002Fdependencies","docs\u002F3.modules\u002F14.testing\u002F2.dependencies",{"title":171,"path":172,"stem":173},"Extensions","\u002Fdocs\u002Fmodules\u002Ftesting\u002Fextensions","docs\u002F3.modules\u002F14.testing\u002F3.extensions",{"title":109,"path":175,"stem":176},"\u002Fdocs\u002Fmodules\u002Ftesting\u002Fapi","docs\u002F3.modules\u002F14.testing\u002F4.api",{"title":178,"icon":64,"defaultOpen":64,"path":179,"stem":180,"children":181,"page":64},"Client","\u002Fdocs\u002Fmodules\u002Fclient","docs\u002F3.modules\u002F15.client",[182,185,188],{"title":78,"path":183,"stem":184},"\u002Fdocs\u002Fmodules\u002Fclient\u002Foverview","docs\u002F3.modules\u002F15.client\u002F0.overview",{"title":163,"path":186,"stem":187},"\u002Fdocs\u002Fmodules\u002Fclient\u002Frequests","docs\u002F3.modules\u002F15.client\u002F1.requests",{"title":109,"path":189,"stem":190},"\u002Fdocs\u002Fmodules\u002Fclient\u002Fapi","docs\u002F3.modules\u002F15.client\u002F2.api",{"title":192,"icon":64,"defaultOpen":64,"path":193,"stem":194,"children":195,"page":64},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[196,199,203],{"title":78,"path":197,"stem":198},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":200,"path":201,"stem":202},"Drains & Adapters","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":109,"path":204,"stem":205},"\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":207,"icon":64,"defaultOpen":64,"path":208,"stem":209,"children":210,"page":64},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[211],{"title":78,"path":212,"stem":213},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":215,"icon":64,"defaultOpen":64,"path":216,"stem":217,"children":218,"page":64},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[219,222,226],{"title":78,"path":220,"stem":221},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":223,"path":224,"stem":225},"Drivers","\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":109,"path":227,"stem":228},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":230,"icon":64,"defaultOpen":64,"path":231,"stem":232,"children":233,"page":64},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[234,237],{"title":78,"path":235,"stem":236},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":109,"path":238,"stem":239},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":241,"icon":64,"defaultOpen":64,"path":242,"stem":243,"children":244,"page":64},"Schema","\u002Fdocs\u002Fmodules\u002Fschema","docs\u002F3.modules\u002F6.schema",[245,248,251],{"title":78,"path":246,"stem":247},"\u002Fdocs\u002Fmodules\u002Fschema\u002Foverview","docs\u002F3.modules\u002F6.schema\u002F0.overview",{"title":82,"path":249,"stem":250},"\u002Fdocs\u002Fmodules\u002Fschema\u002Fdecorators","docs\u002F3.modules\u002F6.schema\u002F1.decorators",{"title":252,"path":253,"stem":254},"Scalar","\u002Fdocs\u002Fmodules\u002Fschema\u002Fscalar","docs\u002F3.modules\u002F6.schema\u002F2.scalar",{"title":256,"icon":64,"defaultOpen":64,"path":257,"stem":258,"children":259,"page":64},"Nitro","\u002Fdocs\u002Fmodules\u002Fnitro","docs\u002F3.modules\u002F7.nitro",[260,263,266,270],{"title":78,"path":261,"stem":262},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Foverview","docs\u002F3.modules\u002F7.nitro\u002F0.overview",{"title":215,"path":264,"stem":265},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Fstorage","docs\u002F3.modules\u002F7.nitro\u002F1.storage",{"title":267,"path":268,"stem":269},"File-Based Routes","\u002Fdocs\u002Fmodules\u002Fnitro\u002Ffile-based-routes","docs\u002F3.modules\u002F7.nitro\u002F2.file-based-routes",{"title":271,"path":272,"stem":273},"Middleware","\u002Fdocs\u002Fmodules\u002Fnitro\u002Fmiddleware","docs\u002F3.modules\u002F7.nitro\u002F3.middleware",{"title":275,"icon":64,"defaultOpen":64,"path":276,"stem":277,"children":278,"page":64},"Vite","\u002Fdocs\u002Fmodules\u002Fvite","docs\u002F3.modules\u002F8.vite",[279],{"title":78,"path":280,"stem":281},"\u002Fdocs\u002Fmodules\u002Fvite\u002Foverview","docs\u002F3.modules\u002F8.vite\u002F0.overview",{"title":283,"icon":64,"defaultOpen":64,"path":284,"stem":285,"children":286,"page":64},"Cache","\u002Fdocs\u002Fmodules\u002Fcache","docs\u002F3.modules\u002F9.cache",[287,290],{"title":78,"path":288,"stem":289},"\u002Fdocs\u002Fmodules\u002Fcache\u002Foverview","docs\u002F3.modules\u002F9.cache\u002F0.overview",{"title":109,"path":291,"stem":292},"\u002Fdocs\u002Fmodules\u002Fcache\u002Fapi","docs\u002F3.modules\u002F9.cache\u002F1.api",{"title":294,"icon":295,"path":296,"stem":297,"children":298,"page":64},"Deployment","i-lucide-cloud-upload","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[299,302,306,310,314],{"title":78,"path":300,"stem":301},"\u002Fdocs\u002Fdeployment\u002Foverview","docs\u002F4.deployment\u002F0.overview",{"title":303,"path":304,"stem":305},"Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F4.deployment\u002F1.vercel",{"title":307,"path":308,"stem":309},"AWS Lambda","\u002Fdocs\u002Fdeployment\u002Faws-lambda","docs\u002F4.deployment\u002F2.aws-lambda",{"title":311,"path":312,"stem":313},"Azure Functions","\u002Fdocs\u002Fdeployment\u002Fazure-functions","docs\u002F4.deployment\u002F3.azure-functions",{"title":315,"path":316,"stem":317},"Node.js Server","\u002Fdocs\u002Fdeployment\u002Fnode-server","docs\u002F4.deployment\u002F4.node-server",{"title":319,"icon":320,"path":321,"stem":322,"children":323,"page":64},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[324,328,332,336],{"title":325,"path":326,"stem":327},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":329,"path":330,"stem":331},"Plugins","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",{"title":333,"path":334,"stem":335},"Custom CLI Command","\u002Fdocs\u002Fadvanced\u002Fcustom-cli-command","docs\u002F99.advanced\u002F3.custom-cli-command",{"title":337,"path":338,"stem":339},"Writing a Recipe","\u002Fdocs\u002Fadvanced\u002Fwriting-a-recipe","docs\u002F99.advanced\u002F4.writing-a-recipe",[341,343,345,346,347,348,349,351,352,353,354,355,356,357,358,360,362,363,364,365,367,368,369,371,372,373,374,376,377,378,379,380,382,383,384,385,386,388,389,390,391,392,393,395,396,397,398,400,401,402,403,405,406,408,409,410,411,413,414,415,417,418,419,420,422,423,424,425,426,428,429,431,432,433,435,436,437,438,439,440,442,443,444,445],{"path":342},"\u002Fdocs\u002F.navigation",{"path":344},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":27},{"path":350},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":38},{"path":42},{"path":46},{"path":50},{"path":54},{"path":58},{"path":62},{"path":359},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":361},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":79},{"path":83},{"path":87},{"path":366},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002F.navigation",{"path":95},{"path":98},{"path":370},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002F.navigation",{"path":106},{"path":110},{"path":114},{"path":375},"\u002Fdocs\u002Fmodules\u002Fqueue\u002F.navigation",{"path":122},{"path":126},{"path":130},{"path":133},{"path":381},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002F.navigation",{"path":141},{"path":145},{"path":149},{"path":152},{"path":387},"\u002Fdocs\u002Fmodules\u002Ftesting\u002F.navigation",{"path":160},{"path":164},{"path":168},{"path":172},{"path":175},{"path":394},"\u002Fdocs\u002Fmodules\u002Fclient\u002F.navigation",{"path":183},{"path":186},{"path":189},{"path":399},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":197},{"path":201},{"path":204},{"path":404},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":212},{"path":407},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":220},{"path":224},{"path":227},{"path":412},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":235},{"path":238},{"path":416},"\u002Fdocs\u002Fmodules\u002Fschema\u002F.navigation",{"path":246},{"path":249},{"path":253},{"path":421},"\u002Fdocs\u002Fmodules\u002Fnitro\u002F.navigation",{"path":261},{"path":264},{"path":268},{"path":272},{"path":427},"\u002Fdocs\u002Fmodules\u002Fvite\u002F.navigation",{"path":280},{"path":430},"\u002Fdocs\u002Fmodules\u002Fcache\u002F.navigation",{"path":288},{"path":291},{"path":434},"\u002Fdocs\u002Fdeployment\u002F.navigation",{"path":300},{"path":304},{"path":308},{"path":312},{"path":316},{"path":441},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":326},{"path":330},{"path":334},{"path":338},{"id":447,"title":78,"body":448,"description":2177,"extension":2178,"links":2179,"meta":2180,"navigation":68,"path":160,"seo":2181,"stem":161,"__hash__":2182},"docs\u002Fdocs\u002F3.modules\u002F14.testing\u002F0.overview.md",{"type":449,"value":450,"toc":2170},"minimark",[451,468,487,491,494,569,573,1123,1141,1266,1270,1276,1985,1996,2000,2018,2075,2081,2127,2130,2134,2166],[452,453,454,455,459,460,463,464,467],"p",{},"The Testing module boots your app for a test: real controllers, real dependency injection, real middleware and validation. Any dependency can be replaced with a fake. Requests go through ",[456,457,458],"code",{},"app.fetch()",", so no port is opened, and the project's ",[456,461,462],{},"vercube.config.ts"," and ",[456,465,466],{},".env"," are not read unless you ask for them.",[452,469,470,471,474,475,478,479,482,483,486],{},"It does not depend on a test runner. Assertions on the status and the headers are built in, everything else is your runner's ",[456,472,473],{},"expect",", and mocks are whatever you already use: ",[456,476,477],{},"vi.fn()",", ",[456,480,481],{},"mock()"," from ",[456,484,485],{},"bun:test",", or plain functions.",[488,489,18],"h2",{"id":490},"installation",[452,492,493],{},"The package is only needed by your tests, so install it as a dev dependency.",[495,496,497,529,549],"code-group",{},[498,499,505],"pre",{"className":500,"code":501,"filename":502,"language":503,"meta":504,"style":504},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ pnpm add -D @vercube\u002Ftesting\n","pnpm","bash","",[456,506,507],{"__ignoreMap":504},[508,509,512,516,520,523,526],"span",{"class":510,"line":511},"line",1,[508,513,515],{"class":514},"sBMFI","$",[508,517,519],{"class":518},"sfazB"," pnpm",[508,521,522],{"class":518}," add",[508,524,525],{"class":518}," -D",[508,527,528],{"class":518}," @vercube\u002Ftesting\n",[498,530,533],{"className":500,"code":531,"filename":532,"language":503,"meta":504,"style":504},"$ npm install -D @vercube\u002Ftesting\n","npm",[456,534,535],{"__ignoreMap":504},[508,536,537,539,542,545,547],{"class":510,"line":511},[508,538,515],{"class":514},[508,540,541],{"class":518}," npm",[508,543,544],{"class":518}," install",[508,546,525],{"class":518},[508,548,528],{"class":518},[498,550,553],{"className":500,"code":551,"filename":552,"language":503,"meta":504,"style":504},"$ bun add -d @vercube\u002Ftesting\n","bun",[456,554,555],{"__ignoreMap":504},[508,556,557,559,562,564,567],{"class":510,"line":511},[508,558,515],{"class":514},[508,560,561],{"class":518}," bun",[508,563,522],{"class":518},[508,565,566],{"class":518}," -d",[508,568,528],{"class":518},[488,570,572],{"id":571},"a-first-test","A first test",[498,574,579],{"className":575,"code":576,"filename":577,"language":578,"meta":504,"style":504},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createTestApp } from '@vercube\u002Ftesting';\nimport { afterAll, beforeAll, expect, it } from 'vitest';\nimport { UserController } from '..\u002Fsrc\u002Fcontrollers\u002FUserController';\nimport { UserRepository } from '..\u002Fsrc\u002Frepositories\u002FUserRepository';\nimport { UserService } from '..\u002Fsrc\u002Fservices\u002FUserService';\nimport type { TestApp } from '@vercube\u002Ftesting';\n\nlet app: TestApp;\n\nbeforeAll(async () => {\n  app = await createTestApp({\n    controllers: [UserController],\n    providers: [UserService],\n    overrides: [[UserRepository, { findById: async (id) => ({ id, name: 'Ada' }) }]],\n  });\n});\n\nafterAll(() => app.close());\n\nit('returns a user', async () => {\n  const res = await app.get('\u002Fusers\u002F1').expect(200);\n\n  expect(await res.json()).toEqual({ id: '1', name: 'Ada' });\n});\n","test\u002Fusers.test.ts","ts",[456,580,581,613,652,675,698,721,746,752,769,774,796,816,836,853,926,936,945,950,976,981,1006,1051,1056,1114],{"__ignoreMap":504},[508,582,583,587,591,595,598,601,604,607,610],{"class":510,"line":511},[508,584,586],{"class":585},"s7zQu","import",[508,588,590],{"class":589},"sMK4o"," {",[508,592,594],{"class":593},"sTEyZ"," createTestApp",[508,596,597],{"class":589}," }",[508,599,600],{"class":585}," from",[508,602,603],{"class":589}," '",[508,605,606],{"class":518},"@vercube\u002Ftesting",[508,608,609],{"class":589},"'",[508,611,612],{"class":589},";\n",[508,614,616,618,620,623,626,629,631,634,636,639,641,643,645,648,650],{"class":510,"line":615},2,[508,617,586],{"class":585},[508,619,590],{"class":589},[508,621,622],{"class":593}," afterAll",[508,624,625],{"class":589},",",[508,627,628],{"class":593}," beforeAll",[508,630,625],{"class":589},[508,632,633],{"class":593}," expect",[508,635,625],{"class":589},[508,637,638],{"class":593}," it",[508,640,597],{"class":589},[508,642,600],{"class":585},[508,644,603],{"class":589},[508,646,647],{"class":518},"vitest",[508,649,609],{"class":589},[508,651,612],{"class":589},[508,653,655,657,659,662,664,666,668,671,673],{"class":510,"line":654},3,[508,656,586],{"class":585},[508,658,590],{"class":589},[508,660,661],{"class":593}," UserController",[508,663,597],{"class":589},[508,665,600],{"class":585},[508,667,603],{"class":589},[508,669,670],{"class":518},"..\u002Fsrc\u002Fcontrollers\u002FUserController",[508,672,609],{"class":589},[508,674,612],{"class":589},[508,676,678,680,682,685,687,689,691,694,696],{"class":510,"line":677},4,[508,679,586],{"class":585},[508,681,590],{"class":589},[508,683,684],{"class":593}," UserRepository",[508,686,597],{"class":589},[508,688,600],{"class":585},[508,690,603],{"class":589},[508,692,693],{"class":518},"..\u002Fsrc\u002Frepositories\u002FUserRepository",[508,695,609],{"class":589},[508,697,612],{"class":589},[508,699,701,703,705,708,710,712,714,717,719],{"class":510,"line":700},5,[508,702,586],{"class":585},[508,704,590],{"class":589},[508,706,707],{"class":593}," UserService",[508,709,597],{"class":589},[508,711,600],{"class":585},[508,713,603],{"class":589},[508,715,716],{"class":518},"..\u002Fsrc\u002Fservices\u002FUserService",[508,718,609],{"class":589},[508,720,612],{"class":589},[508,722,724,726,729,731,734,736,738,740,742,744],{"class":510,"line":723},6,[508,725,586],{"class":585},[508,727,728],{"class":585}," type",[508,730,590],{"class":589},[508,732,733],{"class":593}," TestApp",[508,735,597],{"class":589},[508,737,600],{"class":585},[508,739,603],{"class":589},[508,741,606],{"class":518},[508,743,609],{"class":589},[508,745,612],{"class":589},[508,747,749],{"class":510,"line":748},7,[508,750,751],{"emptyLinePlaceholder":68},"\n",[508,753,755,759,762,765,767],{"class":510,"line":754},8,[508,756,758],{"class":757},"spNyl","let",[508,760,761],{"class":593}," app",[508,763,764],{"class":589},":",[508,766,733],{"class":514},[508,768,612],{"class":589},[508,770,772],{"class":510,"line":771},9,[508,773,751],{"emptyLinePlaceholder":68},[508,775,777,781,784,787,790,793],{"class":510,"line":776},10,[508,778,780],{"class":779},"s2Zo4","beforeAll",[508,782,783],{"class":593},"(",[508,785,786],{"class":757},"async",[508,788,789],{"class":589}," ()",[508,791,792],{"class":757}," =>",[508,794,795],{"class":589}," {\n",[508,797,799,802,805,808,810,813],{"class":510,"line":798},11,[508,800,801],{"class":593},"  app",[508,803,804],{"class":589}," =",[508,806,807],{"class":585}," await",[508,809,594],{"class":779},[508,811,783],{"class":812},"swJcz",[508,814,815],{"class":589},"{\n",[508,817,819,822,824,827,830,833],{"class":510,"line":818},12,[508,820,821],{"class":812},"    controllers",[508,823,764],{"class":589},[508,825,826],{"class":812}," [",[508,828,829],{"class":593},"UserController",[508,831,832],{"class":812},"]",[508,834,835],{"class":589},",\n",[508,837,839,842,844,846,849,851],{"class":510,"line":838},13,[508,840,841],{"class":812},"    providers",[508,843,764],{"class":589},[508,845,826],{"class":812},[508,847,848],{"class":593},"UserService",[508,850,832],{"class":812},[508,852,835],{"class":589},[508,854,856,859,861,864,867,869,871,874,876,879,882,886,889,891,893,896,899,901,904,906,908,911,913,915,918,921,924],{"class":510,"line":855},14,[508,857,858],{"class":812},"    overrides",[508,860,764],{"class":589},[508,862,863],{"class":812}," [[",[508,865,866],{"class":593},"UserRepository",[508,868,625],{"class":589},[508,870,590],{"class":589},[508,872,873],{"class":779}," findById",[508,875,764],{"class":589},[508,877,878],{"class":757}," async",[508,880,881],{"class":589}," (",[508,883,885],{"class":884},"sHdIc","id",[508,887,888],{"class":589},")",[508,890,792],{"class":757},[508,892,881],{"class":812},[508,894,895],{"class":589},"{",[508,897,898],{"class":593}," id",[508,900,625],{"class":589},[508,902,903],{"class":812}," name",[508,905,764],{"class":589},[508,907,603],{"class":589},[508,909,910],{"class":518},"Ada",[508,912,609],{"class":589},[508,914,597],{"class":589},[508,916,917],{"class":812},") ",[508,919,920],{"class":589},"}",[508,922,923],{"class":812},"]]",[508,925,835],{"class":589},[508,927,929,932,934],{"class":510,"line":928},15,[508,930,931],{"class":589},"  }",[508,933,888],{"class":812},[508,935,612],{"class":589},[508,937,939,941,943],{"class":510,"line":938},16,[508,940,920],{"class":589},[508,942,888],{"class":593},[508,944,612],{"class":589},[508,946,948],{"class":510,"line":947},17,[508,949,751],{"emptyLinePlaceholder":68},[508,951,953,956,958,961,963,965,968,971,974],{"class":510,"line":952},18,[508,954,955],{"class":779},"afterAll",[508,957,783],{"class":593},[508,959,960],{"class":589},"()",[508,962,792],{"class":757},[508,964,761],{"class":593},[508,966,967],{"class":589},".",[508,969,970],{"class":779},"close",[508,972,973],{"class":593},"())",[508,975,612],{"class":589},[508,977,979],{"class":510,"line":978},19,[508,980,751],{"emptyLinePlaceholder":68},[508,982,984,987,989,991,994,996,998,1000,1002,1004],{"class":510,"line":983},20,[508,985,986],{"class":779},"it",[508,988,783],{"class":593},[508,990,609],{"class":589},[508,992,993],{"class":518},"returns a user",[508,995,609],{"class":589},[508,997,625],{"class":589},[508,999,878],{"class":757},[508,1001,789],{"class":589},[508,1003,792],{"class":757},[508,1005,795],{"class":589},[508,1007,1009,1012,1015,1017,1019,1021,1023,1026,1028,1030,1033,1035,1037,1039,1041,1043,1047,1049],{"class":510,"line":1008},21,[508,1010,1011],{"class":757},"  const",[508,1013,1014],{"class":593}," res",[508,1016,804],{"class":589},[508,1018,807],{"class":585},[508,1020,761],{"class":593},[508,1022,967],{"class":589},[508,1024,1025],{"class":779},"get",[508,1027,783],{"class":812},[508,1029,609],{"class":589},[508,1031,1032],{"class":518},"\u002Fusers\u002F1",[508,1034,609],{"class":589},[508,1036,888],{"class":812},[508,1038,967],{"class":589},[508,1040,473],{"class":779},[508,1042,783],{"class":812},[508,1044,1046],{"class":1045},"sbssI","200",[508,1048,888],{"class":812},[508,1050,612],{"class":589},[508,1052,1054],{"class":510,"line":1053},22,[508,1055,751],{"emptyLinePlaceholder":68},[508,1057,1059,1062,1064,1067,1069,1071,1074,1076,1078,1081,1083,1085,1087,1089,1091,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112],{"class":510,"line":1058},23,[508,1060,1061],{"class":779},"  expect",[508,1063,783],{"class":812},[508,1065,1066],{"class":585},"await",[508,1068,1014],{"class":593},[508,1070,967],{"class":589},[508,1072,1073],{"class":779},"json",[508,1075,973],{"class":812},[508,1077,967],{"class":589},[508,1079,1080],{"class":779},"toEqual",[508,1082,783],{"class":812},[508,1084,895],{"class":589},[508,1086,898],{"class":812},[508,1088,764],{"class":589},[508,1090,603],{"class":589},[508,1092,1093],{"class":518},"1",[508,1095,609],{"class":589},[508,1097,625],{"class":589},[508,1099,903],{"class":812},[508,1101,764],{"class":589},[508,1103,603],{"class":589},[508,1105,910],{"class":518},[508,1107,609],{"class":589},[508,1109,597],{"class":589},[508,1111,888],{"class":812},[508,1113,612],{"class":589},[508,1115,1117,1119,1121],{"class":510,"line":1116},24,[508,1118,920],{"class":589},[508,1120,888],{"class":593},[508,1122,612],{"class":589},[452,1124,1125,1128,1129,1132,1133,1136,1137,1140],{},[456,1126,1127],{},"app.close()"," closes the app the way production does: ",[456,1130,1131],{},"onClose()"," callbacks run, then every ",[456,1134,1135],{},"@Destroy()"," method, and their promises are awaited. With ",[456,1138,1139],{},"await using"," the app closes at the end of the block:",[498,1142,1144],{"className":575,"code":1143,"language":578,"meta":504,"style":504},"it('returns a user', async () => {\n  await using app = await createTestApp({\n    controllers: [UserController],\n    providers: [UserService],\n  });\n\n  await app.get('\u002Fusers\u002F1').expect(200);\n});\n",[456,1145,1146,1168,1185,1199,1213,1221,1225,1258],{"__ignoreMap":504},[508,1147,1148,1150,1152,1154,1156,1158,1160,1162,1164,1166],{"class":510,"line":511},[508,1149,986],{"class":779},[508,1151,783],{"class":593},[508,1153,609],{"class":589},[508,1155,993],{"class":518},[508,1157,609],{"class":589},[508,1159,625],{"class":589},[508,1161,878],{"class":757},[508,1163,789],{"class":589},[508,1165,792],{"class":757},[508,1167,795],{"class":589},[508,1169,1170,1173,1175,1177,1179,1181,1183],{"class":510,"line":615},[508,1171,1172],{"class":757},"  await using",[508,1174,761],{"class":593},[508,1176,804],{"class":589},[508,1178,807],{"class":585},[508,1180,594],{"class":779},[508,1182,783],{"class":812},[508,1184,815],{"class":589},[508,1186,1187,1189,1191,1193,1195,1197],{"class":510,"line":654},[508,1188,821],{"class":812},[508,1190,764],{"class":589},[508,1192,826],{"class":812},[508,1194,829],{"class":593},[508,1196,832],{"class":812},[508,1198,835],{"class":589},[508,1200,1201,1203,1205,1207,1209,1211],{"class":510,"line":677},[508,1202,841],{"class":812},[508,1204,764],{"class":589},[508,1206,826],{"class":812},[508,1208,848],{"class":593},[508,1210,832],{"class":812},[508,1212,835],{"class":589},[508,1214,1215,1217,1219],{"class":510,"line":700},[508,1216,931],{"class":589},[508,1218,888],{"class":812},[508,1220,612],{"class":589},[508,1222,1223],{"class":510,"line":723},[508,1224,751],{"emptyLinePlaceholder":68},[508,1226,1227,1230,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256],{"class":510,"line":748},[508,1228,1229],{"class":585},"  await",[508,1231,761],{"class":593},[508,1233,967],{"class":589},[508,1235,1025],{"class":779},[508,1237,783],{"class":812},[508,1239,609],{"class":589},[508,1241,1032],{"class":518},[508,1243,609],{"class":589},[508,1245,888],{"class":812},[508,1247,967],{"class":589},[508,1249,473],{"class":779},[508,1251,783],{"class":812},[508,1253,1046],{"class":1045},[508,1255,888],{"class":812},[508,1257,612],{"class":589},[508,1259,1260,1262,1264],{"class":510,"line":754},[508,1261,920],{"class":589},[508,1263,888],{"class":593},[508,1265,612],{"class":589},[488,1267,1269],{"id":1268},"other-runners","Other runners",[452,1271,1272,1273,1275],{},"The same test runs under Bun and Deno, only the ",[456,1274,473],{}," import changes.",[495,1277,1278,1511,1739],{},[498,1279,1282],{"className":575,"code":1280,"filename":1281,"language":578,"meta":504,"style":504},"import { expect, test } from 'bun:test';\nimport { createTestApp } from '@vercube\u002Ftesting';\n\ntest('returns a user', async () => {\n  await using app = await createTestApp({\n    controllers: [UserController],\n    providers: [UserService],\n  });\n\n  expect(await (await app.get('\u002Fusers\u002F1').expect(200)).json()).toEqual({\n    id: '1',\n    name: 'Ada',\n  });\n});\n","bun test",[456,1283,1284,1309,1329,1333,1356,1372,1386,1400,1408,1412,1465,1480,1495,1503],{"__ignoreMap":504},[508,1285,1286,1288,1290,1292,1294,1297,1299,1301,1303,1305,1307],{"class":510,"line":511},[508,1287,586],{"class":585},[508,1289,590],{"class":589},[508,1291,633],{"class":593},[508,1293,625],{"class":589},[508,1295,1296],{"class":593}," test",[508,1298,597],{"class":589},[508,1300,600],{"class":585},[508,1302,603],{"class":589},[508,1304,485],{"class":518},[508,1306,609],{"class":589},[508,1308,612],{"class":589},[508,1310,1311,1313,1315,1317,1319,1321,1323,1325,1327],{"class":510,"line":615},[508,1312,586],{"class":585},[508,1314,590],{"class":589},[508,1316,594],{"class":593},[508,1318,597],{"class":589},[508,1320,600],{"class":585},[508,1322,603],{"class":589},[508,1324,606],{"class":518},[508,1326,609],{"class":589},[508,1328,612],{"class":589},[508,1330,1331],{"class":510,"line":654},[508,1332,751],{"emptyLinePlaceholder":68},[508,1334,1335,1338,1340,1342,1344,1346,1348,1350,1352,1354],{"class":510,"line":677},[508,1336,1337],{"class":779},"test",[508,1339,783],{"class":593},[508,1341,609],{"class":589},[508,1343,993],{"class":518},[508,1345,609],{"class":589},[508,1347,625],{"class":589},[508,1349,878],{"class":757},[508,1351,789],{"class":589},[508,1353,792],{"class":757},[508,1355,795],{"class":589},[508,1357,1358,1360,1362,1364,1366,1368,1370],{"class":510,"line":700},[508,1359,1172],{"class":757},[508,1361,761],{"class":593},[508,1363,804],{"class":589},[508,1365,807],{"class":585},[508,1367,594],{"class":779},[508,1369,783],{"class":812},[508,1371,815],{"class":589},[508,1373,1374,1376,1378,1380,1382,1384],{"class":510,"line":723},[508,1375,821],{"class":812},[508,1377,764],{"class":589},[508,1379,826],{"class":812},[508,1381,829],{"class":593},[508,1383,832],{"class":812},[508,1385,835],{"class":589},[508,1387,1388,1390,1392,1394,1396,1398],{"class":510,"line":748},[508,1389,841],{"class":812},[508,1391,764],{"class":589},[508,1393,826],{"class":812},[508,1395,848],{"class":593},[508,1397,832],{"class":812},[508,1399,835],{"class":589},[508,1401,1402,1404,1406],{"class":510,"line":754},[508,1403,931],{"class":589},[508,1405,888],{"class":812},[508,1407,612],{"class":589},[508,1409,1410],{"class":510,"line":771},[508,1411,751],{"emptyLinePlaceholder":68},[508,1413,1414,1416,1418,1420,1422,1424,1426,1428,1430,1432,1434,1436,1438,1440,1442,1444,1446,1448,1451,1453,1455,1457,1459,1461,1463],{"class":510,"line":776},[508,1415,1061],{"class":779},[508,1417,783],{"class":812},[508,1419,1066],{"class":585},[508,1421,881],{"class":812},[508,1423,1066],{"class":585},[508,1425,761],{"class":593},[508,1427,967],{"class":589},[508,1429,1025],{"class":779},[508,1431,783],{"class":812},[508,1433,609],{"class":589},[508,1435,1032],{"class":518},[508,1437,609],{"class":589},[508,1439,888],{"class":812},[508,1441,967],{"class":589},[508,1443,473],{"class":779},[508,1445,783],{"class":812},[508,1447,1046],{"class":1045},[508,1449,1450],{"class":812},"))",[508,1452,967],{"class":589},[508,1454,1073],{"class":779},[508,1456,973],{"class":812},[508,1458,967],{"class":589},[508,1460,1080],{"class":779},[508,1462,783],{"class":812},[508,1464,815],{"class":589},[508,1466,1467,1470,1472,1474,1476,1478],{"class":510,"line":798},[508,1468,1469],{"class":812},"    id",[508,1471,764],{"class":589},[508,1473,603],{"class":589},[508,1475,1093],{"class":518},[508,1477,609],{"class":589},[508,1479,835],{"class":589},[508,1481,1482,1485,1487,1489,1491,1493],{"class":510,"line":818},[508,1483,1484],{"class":812},"    name",[508,1486,764],{"class":589},[508,1488,603],{"class":589},[508,1490,910],{"class":518},[508,1492,609],{"class":589},[508,1494,835],{"class":589},[508,1496,1497,1499,1501],{"class":510,"line":838},[508,1498,931],{"class":589},[508,1500,888],{"class":812},[508,1502,612],{"class":589},[508,1504,1505,1507,1509],{"class":510,"line":855},[508,1506,920],{"class":589},[508,1508,888],{"class":593},[508,1510,612],{"class":589},[498,1512,1515],{"className":575,"code":1513,"filename":1514,"language":578,"meta":504,"style":504},"import { assertEquals } from 'jsr:@std\u002Fassert';\nimport { createTestApp } from '@vercube\u002Ftesting';\n\nDeno.test('returns a user', async () => {\n  await using app = await createTestApp({\n    controllers: [UserController],\n    providers: [UserService],\n  });\n\n  assertEquals(await (await app.get('\u002Fusers\u002F1').expect(200)).json(), {\n    id: '1',\n    name: 'Ada',\n  });\n});\n","deno test",[456,1516,1517,1539,1559,1563,1590,1606,1620,1634,1642,1646,1695,1709,1723,1731],{"__ignoreMap":504},[508,1518,1519,1521,1523,1526,1528,1530,1532,1535,1537],{"class":510,"line":511},[508,1520,586],{"class":585},[508,1522,590],{"class":589},[508,1524,1525],{"class":593}," assertEquals",[508,1527,597],{"class":589},[508,1529,600],{"class":585},[508,1531,603],{"class":589},[508,1533,1534],{"class":518},"jsr:@std\u002Fassert",[508,1536,609],{"class":589},[508,1538,612],{"class":589},[508,1540,1541,1543,1545,1547,1549,1551,1553,1555,1557],{"class":510,"line":615},[508,1542,586],{"class":585},[508,1544,590],{"class":589},[508,1546,594],{"class":593},[508,1548,597],{"class":589},[508,1550,600],{"class":585},[508,1552,603],{"class":589},[508,1554,606],{"class":518},[508,1556,609],{"class":589},[508,1558,612],{"class":589},[508,1560,1561],{"class":510,"line":654},[508,1562,751],{"emptyLinePlaceholder":68},[508,1564,1565,1568,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588],{"class":510,"line":677},[508,1566,1567],{"class":593},"Deno",[508,1569,967],{"class":589},[508,1571,1337],{"class":779},[508,1573,783],{"class":593},[508,1575,609],{"class":589},[508,1577,993],{"class":518},[508,1579,609],{"class":589},[508,1581,625],{"class":589},[508,1583,878],{"class":757},[508,1585,789],{"class":589},[508,1587,792],{"class":757},[508,1589,795],{"class":589},[508,1591,1592,1594,1596,1598,1600,1602,1604],{"class":510,"line":700},[508,1593,1172],{"class":757},[508,1595,761],{"class":593},[508,1597,804],{"class":589},[508,1599,807],{"class":585},[508,1601,594],{"class":779},[508,1603,783],{"class":812},[508,1605,815],{"class":589},[508,1607,1608,1610,1612,1614,1616,1618],{"class":510,"line":723},[508,1609,821],{"class":812},[508,1611,764],{"class":589},[508,1613,826],{"class":812},[508,1615,829],{"class":593},[508,1617,832],{"class":812},[508,1619,835],{"class":589},[508,1621,1622,1624,1626,1628,1630,1632],{"class":510,"line":748},[508,1623,841],{"class":812},[508,1625,764],{"class":589},[508,1627,826],{"class":812},[508,1629,848],{"class":593},[508,1631,832],{"class":812},[508,1633,835],{"class":589},[508,1635,1636,1638,1640],{"class":510,"line":754},[508,1637,931],{"class":589},[508,1639,888],{"class":812},[508,1641,612],{"class":589},[508,1643,1644],{"class":510,"line":771},[508,1645,751],{"emptyLinePlaceholder":68},[508,1647,1648,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689,1691,1693],{"class":510,"line":776},[508,1649,1650],{"class":779},"  assertEquals",[508,1652,783],{"class":812},[508,1654,1066],{"class":585},[508,1656,881],{"class":812},[508,1658,1066],{"class":585},[508,1660,761],{"class":593},[508,1662,967],{"class":589},[508,1664,1025],{"class":779},[508,1666,783],{"class":812},[508,1668,609],{"class":589},[508,1670,1032],{"class":518},[508,1672,609],{"class":589},[508,1674,888],{"class":812},[508,1676,967],{"class":589},[508,1678,473],{"class":779},[508,1680,783],{"class":812},[508,1682,1046],{"class":1045},[508,1684,1450],{"class":812},[508,1686,967],{"class":589},[508,1688,1073],{"class":779},[508,1690,960],{"class":812},[508,1692,625],{"class":589},[508,1694,795],{"class":589},[508,1696,1697,1699,1701,1703,1705,1707],{"class":510,"line":798},[508,1698,1469],{"class":812},[508,1700,764],{"class":589},[508,1702,603],{"class":589},[508,1704,1093],{"class":518},[508,1706,609],{"class":589},[508,1708,835],{"class":589},[508,1710,1711,1713,1715,1717,1719,1721],{"class":510,"line":818},[508,1712,1484],{"class":812},[508,1714,764],{"class":589},[508,1716,603],{"class":589},[508,1718,910],{"class":518},[508,1720,609],{"class":589},[508,1722,835],{"class":589},[508,1724,1725,1727,1729],{"class":510,"line":838},[508,1726,931],{"class":589},[508,1728,888],{"class":812},[508,1730,612],{"class":589},[508,1732,1733,1735,1737],{"class":510,"line":855},[508,1734,920],{"class":589},[508,1736,888],{"class":593},[508,1738,612],{"class":589},[498,1740,1743],{"className":575,"code":1741,"filename":1742,"language":578,"meta":504,"style":504},"import assert from 'node:assert\u002Fstrict';\nimport { test } from 'node:test';\nimport { createTestApp } from '@vercube\u002Ftesting';\n\ntest('returns a user', async () => {\n  await using app = await createTestApp({\n    controllers: [UserController],\n    providers: [UserService],\n  });\n\n  assert.deepEqual(await (await app.get('\u002Fusers\u002F1').expect(200)).json(), {\n    id: '1',\n    name: 'Ada',\n  });\n});\n","node --test",[456,1744,1745,1764,1785,1805,1809,1831,1847,1861,1875,1883,1887,1941,1955,1969,1977],{"__ignoreMap":504},[508,1746,1747,1749,1752,1755,1757,1760,1762],{"class":510,"line":511},[508,1748,586],{"class":585},[508,1750,1751],{"class":593}," assert ",[508,1753,1754],{"class":585},"from",[508,1756,603],{"class":589},[508,1758,1759],{"class":518},"node:assert\u002Fstrict",[508,1761,609],{"class":589},[508,1763,612],{"class":589},[508,1765,1766,1768,1770,1772,1774,1776,1778,1781,1783],{"class":510,"line":615},[508,1767,586],{"class":585},[508,1769,590],{"class":589},[508,1771,1296],{"class":593},[508,1773,597],{"class":589},[508,1775,600],{"class":585},[508,1777,603],{"class":589},[508,1779,1780],{"class":518},"node:test",[508,1782,609],{"class":589},[508,1784,612],{"class":589},[508,1786,1787,1789,1791,1793,1795,1797,1799,1801,1803],{"class":510,"line":654},[508,1788,586],{"class":585},[508,1790,590],{"class":589},[508,1792,594],{"class":593},[508,1794,597],{"class":589},[508,1796,600],{"class":585},[508,1798,603],{"class":589},[508,1800,606],{"class":518},[508,1802,609],{"class":589},[508,1804,612],{"class":589},[508,1806,1807],{"class":510,"line":677},[508,1808,751],{"emptyLinePlaceholder":68},[508,1810,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829],{"class":510,"line":700},[508,1812,1337],{"class":779},[508,1814,783],{"class":593},[508,1816,609],{"class":589},[508,1818,993],{"class":518},[508,1820,609],{"class":589},[508,1822,625],{"class":589},[508,1824,878],{"class":757},[508,1826,789],{"class":589},[508,1828,792],{"class":757},[508,1830,795],{"class":589},[508,1832,1833,1835,1837,1839,1841,1843,1845],{"class":510,"line":723},[508,1834,1172],{"class":757},[508,1836,761],{"class":593},[508,1838,804],{"class":589},[508,1840,807],{"class":585},[508,1842,594],{"class":779},[508,1844,783],{"class":812},[508,1846,815],{"class":589},[508,1848,1849,1851,1853,1855,1857,1859],{"class":510,"line":748},[508,1850,821],{"class":812},[508,1852,764],{"class":589},[508,1854,826],{"class":812},[508,1856,829],{"class":593},[508,1858,832],{"class":812},[508,1860,835],{"class":589},[508,1862,1863,1865,1867,1869,1871,1873],{"class":510,"line":754},[508,1864,841],{"class":812},[508,1866,764],{"class":589},[508,1868,826],{"class":812},[508,1870,848],{"class":593},[508,1872,832],{"class":812},[508,1874,835],{"class":589},[508,1876,1877,1879,1881],{"class":510,"line":771},[508,1878,931],{"class":589},[508,1880,888],{"class":812},[508,1882,612],{"class":589},[508,1884,1885],{"class":510,"line":776},[508,1886,751],{"emptyLinePlaceholder":68},[508,1888,1889,1892,1894,1897,1899,1901,1903,1905,1907,1909,1911,1913,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933,1935,1937,1939],{"class":510,"line":798},[508,1890,1891],{"class":593},"  assert",[508,1893,967],{"class":589},[508,1895,1896],{"class":779},"deepEqual",[508,1898,783],{"class":812},[508,1900,1066],{"class":585},[508,1902,881],{"class":812},[508,1904,1066],{"class":585},[508,1906,761],{"class":593},[508,1908,967],{"class":589},[508,1910,1025],{"class":779},[508,1912,783],{"class":812},[508,1914,609],{"class":589},[508,1916,1032],{"class":518},[508,1918,609],{"class":589},[508,1920,888],{"class":812},[508,1922,967],{"class":589},[508,1924,473],{"class":779},[508,1926,783],{"class":812},[508,1928,1046],{"class":1045},[508,1930,1450],{"class":812},[508,1932,967],{"class":589},[508,1934,1073],{"class":779},[508,1936,960],{"class":812},[508,1938,625],{"class":589},[508,1940,795],{"class":589},[508,1942,1943,1945,1947,1949,1951,1953],{"class":510,"line":818},[508,1944,1469],{"class":812},[508,1946,764],{"class":589},[508,1948,603],{"class":589},[508,1950,1093],{"class":518},[508,1952,609],{"class":589},[508,1954,835],{"class":589},[508,1956,1957,1959,1961,1963,1965,1967],{"class":510,"line":838},[508,1958,1484],{"class":812},[508,1960,764],{"class":589},[508,1962,603],{"class":589},[508,1964,910],{"class":518},[508,1966,609],{"class":589},[508,1968,835],{"class":589},[508,1970,1971,1973,1975],{"class":510,"line":855},[508,1972,931],{"class":589},[508,1974,888],{"class":812},[508,1976,612],{"class":589},[508,1978,1979,1981,1983],{"class":510,"line":928},[508,1980,920],{"class":589},[508,1982,888],{"class":593},[508,1984,612],{"class":589},[452,1986,1987,1988,1991,1992,1995],{},"Decorators still need a transpiler that supports ",[456,1989,1990],{},"experimentalDecorators",". Vitest, Bun and Deno handle it with your ",[456,1993,1994],{},"tsconfig.json",", Node's type stripping does not.",[488,1997,1999],{"id":1998},"isolation","Isolation",[452,2001,2002,2003,2006,2007,463,2010,2013,2014,2017],{},"Every ",[456,2004,2005],{},"createTestApp()"," gets its own container, router and configuration, so test files and apps within one file do not see each other's overrides. The configuration starts from the defaults with ",[456,2008,2009],{},"requestLogging: false",[456,2011,2012],{},"logLevel: 'error'",", and ",[456,2015,2016],{},"config"," is laid over it:",[498,2019,2021],{"className":575,"code":2020,"language":578,"meta":504,"style":504},"await createTestApp({ config: { runtime: { featureFlags: { checkout: true } } } });\n",[456,2022,2023],{"__ignoreMap":504},[508,2024,2025,2027,2029,2031,2033,2036,2038,2040,2043,2045,2047,2050,2052,2054,2057,2059,2063,2065,2067,2069,2071,2073],{"class":510,"line":511},[508,2026,1066],{"class":585},[508,2028,594],{"class":779},[508,2030,783],{"class":593},[508,2032,895],{"class":589},[508,2034,2035],{"class":812}," config",[508,2037,764],{"class":589},[508,2039,590],{"class":589},[508,2041,2042],{"class":812}," runtime",[508,2044,764],{"class":589},[508,2046,590],{"class":589},[508,2048,2049],{"class":812}," featureFlags",[508,2051,764],{"class":589},[508,2053,590],{"class":589},[508,2055,2056],{"class":812}," checkout",[508,2058,764],{"class":589},[508,2060,2062],{"class":2061},"sfNiH"," true",[508,2064,597],{"class":589},[508,2066,597],{"class":589},[508,2068,597],{"class":589},[508,2070,597],{"class":589},[508,2072,888],{"class":593},[508,2074,612],{"class":589},[452,2076,2077,2078,2080],{},"To boot the project as it is configured, for an end-to-end smoke test, load its config file and ",[456,2079,466],{}," explicitly:",[498,2082,2084],{"className":575,"code":2083,"language":578,"meta":504,"style":504},"await createTestApp({ configFile: { cwd: process.cwd() } });\n",[456,2085,2086],{"__ignoreMap":504},[508,2087,2088,2090,2092,2094,2096,2099,2101,2103,2106,2108,2111,2113,2116,2119,2121,2123,2125],{"class":510,"line":511},[508,2089,1066],{"class":585},[508,2091,594],{"class":779},[508,2093,783],{"class":593},[508,2095,895],{"class":589},[508,2097,2098],{"class":812}," configFile",[508,2100,764],{"class":589},[508,2102,590],{"class":589},[508,2104,2105],{"class":812}," cwd",[508,2107,764],{"class":589},[508,2109,2110],{"class":593}," process",[508,2112,967],{"class":589},[508,2114,2115],{"class":779},"cwd",[508,2117,2118],{"class":593},"() ",[508,2120,920],{"class":589},[508,2122,597],{"class":589},[508,2124,888],{"class":593},[508,2126,612],{"class":589},[452,2128,2129],{},"What is shared is what lives in the process: OpenTelemetry's global providers, and anything your own code keeps in module scope.",[488,2131,2133],{"id":2132},"where-to-go-next","Where to go next",[2135,2136,2137,2144,2156,2161],"ul",{},[2138,2139,2140,2143],"li",{},[2141,2142,163],"a",{"href":164},": the request builder, expectations, responses, server-sent events and cookies.",[2138,2145,2146,2148,2149,478,2152,2155],{},[2141,2147,167],{"href":168},": overrides, ",[456,2150,2151],{},"stub()",[456,2153,2154],{},"createTestContainer()"," and the test logger.",[2138,2157,2158,2160],{},[2141,2159,171],{"href":172},": auth, telemetry, the scheduler clock, the queue and storage.",[2138,2162,2163,2165],{},[2141,2164,109],{"href":175},": every option and method.",[2167,2168,2169],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":504,"searchDepth":511,"depth":615,"links":2171},[2172,2173,2174,2175,2176],{"id":490,"depth":615,"text":18},{"id":571,"depth":615,"text":572},{"id":1268,"depth":615,"text":1269},{"id":1998,"depth":615,"text":1999},{"id":2132,"depth":615,"text":2133},"Test a Vercube app the way you write it, with real controllers, real DI and any dependency swapped for a fake","md",null,{},{"title":78,"description":2177},"Qtm2Tx4cp7U17ZT_fe5SmFj4ncPkoAyUskHuoxGCqlw",[2184,2186],{"title":109,"path":152,"stem":153,"description":2185,"children":-1},"Reference for SchedulerPlugin, SchedulerManager, the stores, the CLI, testing helpers and errors",{"title":163,"path":164,"stem":165,"description":2187,"children":-1},"Send requests through the app under test, check the status and headers, and read the response",1794396675959]