[{"data":1,"prerenderedAt":1855},["ShallowReactive",2],{"navigation":3,"docs-path-index":340,"-docs-modules-testing-requests":446,"-docs-modules-testing-requests-surround":1850},[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":163,"body":448,"description":1844,"extension":1845,"links":1846,"meta":1847,"navigation":68,"path":164,"seo":1848,"stem":165,"__hash__":1849},"docs\u002Fdocs\u002F3.modules\u002F14.testing\u002F1.requests.md",{"type":449,"value":450,"toc":1835},"minimark",[451,487,745,750,868,874,981,985,1000,1003,1011,1045,1052,1056,1084,1088,1111,1290,1304,1308,1318,1531,1545,1549,1566,1744,1751,1755,1775,1828,1831],[452,453,454,458,459,458,462,458,465,458,468,458,471,474,475,478,479,482,483,486],"p",{},[455,456,457],"code",{},"app.get()",", ",[455,460,461],{},"post()",[455,463,464],{},"put()",[455,466,467],{},"patch()",[455,469,470],{},"delete()",[455,472,473],{},"head()"," and ",[455,476,477],{},"options()"," start a request. Nothing is sent until it is awaited, so the builder methods can come in any order. A relative path resolves against ",[455,480,481],{},"http:\u002F\u002Flocalhost",", or the ",[455,484,485],{},"baseUrl"," option.",[488,489,494],"pre",{"className":490,"code":491,"language":492,"meta":493,"style":493},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const res = await app\n  .post('\u002Fusers')\n  .bearer(token)\n  .query({ notify: true, tags: ['admin', 'beta'] })\n  .json({ name: 'Ada' })\n  .expect(201)\n  .expect('content-type', \u002Fjson\u002F);\n\nexpect(await res.json()).toMatchObject({ name: 'Ada' });\n","ts","",[455,495,496,520,545,556,616,645,661,693,699],{"__ignoreMap":493},[497,498,501,505,509,513,517],"span",{"class":499,"line":500},"line",1,[497,502,504],{"class":503},"spNyl","const",[497,506,508],{"class":507},"sTEyZ"," res ",[497,510,512],{"class":511},"sMK4o","=",[497,514,516],{"class":515},"s7zQu"," await",[497,518,519],{"class":507}," app\n",[497,521,523,526,530,533,536,540,542],{"class":499,"line":522},2,[497,524,525],{"class":511},"  .",[497,527,529],{"class":528},"s2Zo4","post",[497,531,532],{"class":507},"(",[497,534,535],{"class":511},"'",[497,537,539],{"class":538},"sfazB","\u002Fusers",[497,541,535],{"class":511},[497,543,544],{"class":507},")\n",[497,546,548,550,553],{"class":499,"line":547},3,[497,549,525],{"class":511},[497,551,552],{"class":528},"bearer",[497,554,555],{"class":507},"(token)\n",[497,557,559,561,564,566,569,573,576,580,583,586,588,591,593,596,598,600,603,606,608,611,614],{"class":499,"line":558},4,[497,560,525],{"class":511},[497,562,563],{"class":528},"query",[497,565,532],{"class":507},[497,567,568],{"class":511},"{",[497,570,572],{"class":571},"swJcz"," notify",[497,574,575],{"class":511},":",[497,577,579],{"class":578},"sfNiH"," true",[497,581,582],{"class":511},",",[497,584,585],{"class":571}," tags",[497,587,575],{"class":511},[497,589,590],{"class":507}," [",[497,592,535],{"class":511},[497,594,595],{"class":538},"admin",[497,597,535],{"class":511},[497,599,582],{"class":511},[497,601,602],{"class":511}," '",[497,604,605],{"class":538},"beta",[497,607,535],{"class":511},[497,609,610],{"class":507},"] ",[497,612,613],{"class":511},"}",[497,615,544],{"class":507},[497,617,619,621,624,626,628,631,633,635,638,640,643],{"class":499,"line":618},5,[497,620,525],{"class":511},[497,622,623],{"class":528},"json",[497,625,532],{"class":507},[497,627,568],{"class":511},[497,629,630],{"class":571}," name",[497,632,575],{"class":511},[497,634,602],{"class":511},[497,636,637],{"class":538},"Ada",[497,639,535],{"class":511},[497,641,642],{"class":511}," }",[497,644,544],{"class":507},[497,646,648,650,653,655,659],{"class":499,"line":647},6,[497,649,525],{"class":511},[497,651,652],{"class":528},"expect",[497,654,532],{"class":507},[497,656,658],{"class":657},"sbssI","201",[497,660,544],{"class":507},[497,662,664,666,668,670,672,675,677,679,682,684,687,690],{"class":499,"line":663},7,[497,665,525],{"class":511},[497,667,652],{"class":528},[497,669,532],{"class":507},[497,671,535],{"class":511},[497,673,674],{"class":538},"content-type",[497,676,535],{"class":511},[497,678,582],{"class":511},[497,680,681],{"class":511}," \u002F",[497,683,623],{"class":538},[497,685,686],{"class":511},"\u002F",[497,688,689],{"class":507},")",[497,691,692],{"class":511},";\n",[497,694,696],{"class":499,"line":695},8,[497,697,698],{"emptyLinePlaceholder":68},"\n",[497,700,702,704,706,709,712,715,717,720,722,725,727,729,731,733,735,737,739,741,743],{"class":499,"line":701},9,[497,703,652],{"class":528},[497,705,532],{"class":507},[497,707,708],{"class":515},"await",[497,710,711],{"class":507}," res",[497,713,714],{"class":511},".",[497,716,623],{"class":528},[497,718,719],{"class":507},"())",[497,721,714],{"class":511},[497,723,724],{"class":528},"toMatchObject",[497,726,532],{"class":507},[497,728,568],{"class":511},[497,730,630],{"class":571},[497,732,575],{"class":511},[497,734,602],{"class":511},[497,736,637],{"class":538},[497,738,535],{"class":511},[497,740,642],{"class":511},[497,742,689],{"class":507},[497,744,692],{"class":511},[746,747,749],"h2",{"id":748},"bodies","Bodies",[751,752,753,769],"table",{},[754,755,756],"thead",{},[757,758,759,763,766],"tr",{},[760,761,762],"th",{},"Method",[760,764,765],{},"Sends",[760,767,768],{},"Content type",[770,771,772,790,809,833,849],"tbody",{},[757,773,774,780,785],{},[775,776,777],"td",{},[455,778,779],{},".json(value)",[775,781,782],{},[455,783,784],{},"JSON.stringify(value)",[775,786,787],{},[455,788,789],{},"application\u002Fjson",[757,791,792,797,800],{},[775,793,794],{},[455,795,796],{},".text(body, type?)",[775,798,799],{},"the string",[775,801,802,805,806],{},[455,803,804],{},"text\u002Fplain",", or ",[455,807,808],{},"type",[757,810,811,816,826],{},[775,812,813],{},[455,814,815],{},".form(fields)",[775,817,818,821,822,825],{},[455,819,820],{},"multipart\u002Fform-data",", a ",[455,823,824],{},"Blob"," becomes a file",[775,827,828,829,832],{},"set by ",[455,830,831],{},"Request",", with the boundary",[757,834,835,840,845],{},[775,836,837],{},[455,838,839],{},".urlencoded(fields)",[775,841,842],{},[455,843,844],{},"application\u002Fx-www-form-urlencoded",[775,846,828,847],{},[455,848,831],{},[757,850,851,856,862],{},[775,852,853],{},[455,854,855],{},".body(init)",[775,857,858,859,861],{},"anything ",[455,860,831],{}," accepts",[775,863,864,865],{},"none, set it with ",[455,866,867],{},".header()",[452,869,870,871,873],{},"A content type set with ",[455,872,867],{}," wins over the one a body method sets.",[488,875,877],{"className":490,"code":876,"language":492,"meta":493,"style":493},"await app\n  .post('\u002Favatars')\n  .form({ userId: '1', file: new Blob([png], { type: 'image\u002Fpng' }) })\n  .expect(201);\n",[455,878,879,885,902,967],{"__ignoreMap":493},[497,880,881,883],{"class":499,"line":500},[497,882,708],{"class":515},[497,884,519],{"class":507},[497,886,887,889,891,893,895,898,900],{"class":499,"line":522},[497,888,525],{"class":511},[497,890,529],{"class":528},[497,892,532],{"class":507},[497,894,535],{"class":511},[497,896,897],{"class":538},"\u002Favatars",[497,899,535],{"class":511},[497,901,544],{"class":507},[497,903,904,906,909,911,913,916,918,920,923,925,927,930,932,935,938,941,943,946,949,951,953,956,958,960,963,965],{"class":499,"line":547},[497,905,525],{"class":511},[497,907,908],{"class":528},"form",[497,910,532],{"class":507},[497,912,568],{"class":511},[497,914,915],{"class":571}," userId",[497,917,575],{"class":511},[497,919,602],{"class":511},[497,921,922],{"class":538},"1",[497,924,535],{"class":511},[497,926,582],{"class":511},[497,928,929],{"class":571}," file",[497,931,575],{"class":511},[497,933,934],{"class":511}," new",[497,936,937],{"class":528}," Blob",[497,939,940],{"class":507},"([png]",[497,942,582],{"class":511},[497,944,945],{"class":511}," {",[497,947,948],{"class":571}," type",[497,950,575],{"class":511},[497,952,602],{"class":511},[497,954,955],{"class":538},"image\u002Fpng",[497,957,535],{"class":511},[497,959,642],{"class":511},[497,961,962],{"class":507},") ",[497,964,613],{"class":511},[497,966,544],{"class":507},[497,968,969,971,973,975,977,979],{"class":499,"line":558},[497,970,525],{"class":511},[497,972,652],{"class":528},[497,974,532],{"class":507},[497,976,658],{"class":657},[497,978,689],{"class":507},[497,980,692],{"class":511},[746,982,984],{"id":983},"expectations","Expectations",[452,986,987,458,990,474,993,996,997,999],{},[455,988,989],{},".expect(status)",[455,991,992],{},".expect(header, value)",[455,994,995],{},".expect(check)"," run in order once the response arrives. A header value is a string compared exactly or a RegExp. A check is any function, and it fails the request by throwing, so your runner's ",[455,998,652],{}," works inside it.",[452,1001,1002],{},"When one fails, the error shows the whole exchange, with credential-bearing headers redacted:",[488,1004,1009],{"className":1005,"code":1007,"language":1008},[1006],"language-text","Expected status 201, got 422\n\n  POST http:\u002F\u002Flocalhost\u002Fusers\n  request  authorization: \u003Credacted>\n           content-type: application\u002Fjson\n           {\"name\":\"A\"}\n  response content-type: application\u002Fjson\n           {\"errors\":[{\"path\":\"name\",\"message\":\"Too short\"}]}\n","text",[455,1010,1007],{"__ignoreMap":493},[452,1012,1013,1014,458,1017,458,1020,1023,1024,458,1027,458,1030,1033,1034,1037,1038,474,1041,1044],{},"Bodies are cut at 2 KB, and a binary body is shown by its size. ",[455,1015,1016],{},"authorization",[455,1018,1019],{},"cookie",[455,1021,1022],{},"set-cookie"," and headers whose name contains ",[455,1025,1026],{},"token",[455,1028,1029],{},"secret",[455,1031,1032],{},"password"," or ",[455,1035,1036],{},"api-key"," are redacted. Bodies are not, so keep real secrets out of request bodies in tests. The error also carries ",[455,1039,1040],{},"request",[455,1042,1043],{},"response"," as properties, for runners that print them.",[452,1046,1047,1048,1051],{},"Body assertions stay with your runner: ",[455,1049,1050],{},"expect(await res.json()).toEqual(...)"," produces a far better diff than a message could.",[746,1053,1055],{"id":1054},"responses","Responses",[452,1057,1058,1059,458,1062,474,1065,1068,1069,1071,1072,1075,1076,1079,1080,1083],{},"The body is read once and kept, so ",[455,1060,1061],{},"res.json()",[455,1063,1064],{},"res.text()",[455,1066,1067],{},"res.bytes()"," can be called any number of times. ",[455,1070,1061],{}," on a body that is not JSON throws with the start of the body and its content type. ",[455,1073,1074],{},"res.cookies()"," returns the cookies the response sets, by name. ",[455,1077,1078],{},"res.raw"," is the ",[455,1081,1082],{},"Response"," the app returned.",[746,1085,1087],{"id":1086},"server-sent-events","Server-sent events",[452,1089,1090,1093,1094,1097,1098,1101,1102,458,1105,474,1108,714],{},[455,1091,1092],{},"res.events()"," reads a ",[455,1095,1096],{},"text\u002Fevent-stream"," body as it arrives, without buffering it. Each event has ",[455,1099,1100],{},"data"," and, when the server sent them, ",[455,1103,1104],{},"event",[455,1106,1107],{},"id",[455,1109,1110],{},"retry",[488,1112,1114],{"className":490,"code":1113,"language":492,"meta":493,"style":493},"const res = await app.get('\u002Forders\u002F1\u002Fevents').expect(200);\n\nfor await (const event of res.events()) {\n  expect(event.event).toBe('status');\n  expect(JSON.parse(event.data)).toEqual({ status: 'paid' });\n  break;\n}\n",[455,1115,1116,1158,1162,1193,1226,1278,1285],{"__ignoreMap":493},[497,1117,1118,1120,1122,1124,1126,1129,1131,1134,1136,1138,1141,1143,1145,1147,1149,1151,1154,1156],{"class":499,"line":500},[497,1119,504],{"class":503},[497,1121,508],{"class":507},[497,1123,512],{"class":511},[497,1125,516],{"class":515},[497,1127,1128],{"class":507}," app",[497,1130,714],{"class":511},[497,1132,1133],{"class":528},"get",[497,1135,532],{"class":507},[497,1137,535],{"class":511},[497,1139,1140],{"class":538},"\u002Forders\u002F1\u002Fevents",[497,1142,535],{"class":511},[497,1144,689],{"class":507},[497,1146,714],{"class":511},[497,1148,652],{"class":528},[497,1150,532],{"class":507},[497,1152,1153],{"class":657},"200",[497,1155,689],{"class":507},[497,1157,692],{"class":511},[497,1159,1160],{"class":499,"line":522},[497,1161,698],{"emptyLinePlaceholder":68},[497,1163,1164,1167,1169,1172,1174,1177,1180,1182,1184,1187,1190],{"class":499,"line":547},[497,1165,1166],{"class":515},"for",[497,1168,516],{"class":515},[497,1170,1171],{"class":507}," (",[497,1173,504],{"class":503},[497,1175,1176],{"class":507}," event ",[497,1178,1179],{"class":511},"of",[497,1181,711],{"class":507},[497,1183,714],{"class":511},[497,1185,1186],{"class":528},"events",[497,1188,1189],{"class":507},"()) ",[497,1191,1192],{"class":511},"{\n",[497,1194,1195,1198,1200,1202,1204,1206,1208,1210,1213,1215,1217,1220,1222,1224],{"class":499,"line":558},[497,1196,1197],{"class":528},"  expect",[497,1199,532],{"class":571},[497,1201,1104],{"class":507},[497,1203,714],{"class":511},[497,1205,1104],{"class":507},[497,1207,689],{"class":571},[497,1209,714],{"class":511},[497,1211,1212],{"class":528},"toBe",[497,1214,532],{"class":571},[497,1216,535],{"class":511},[497,1218,1219],{"class":538},"status",[497,1221,535],{"class":511},[497,1223,689],{"class":571},[497,1225,692],{"class":511},[497,1227,1228,1230,1232,1235,1237,1240,1242,1244,1246,1248,1251,1253,1256,1258,1260,1263,1265,1267,1270,1272,1274,1276],{"class":499,"line":618},[497,1229,1197],{"class":528},[497,1231,532],{"class":571},[497,1233,1234],{"class":507},"JSON",[497,1236,714],{"class":511},[497,1238,1239],{"class":528},"parse",[497,1241,532],{"class":571},[497,1243,1104],{"class":507},[497,1245,714],{"class":511},[497,1247,1100],{"class":507},[497,1249,1250],{"class":571},"))",[497,1252,714],{"class":511},[497,1254,1255],{"class":528},"toEqual",[497,1257,532],{"class":571},[497,1259,568],{"class":511},[497,1261,1262],{"class":571}," status",[497,1264,575],{"class":511},[497,1266,602],{"class":511},[497,1268,1269],{"class":538},"paid",[497,1271,535],{"class":511},[497,1273,642],{"class":511},[497,1275,689],{"class":571},[497,1277,692],{"class":511},[497,1279,1280,1283],{"class":499,"line":647},[497,1281,1282],{"class":515},"  break",[497,1284,692],{"class":511},[497,1286,1287],{"class":499,"line":663},[497,1288,1289],{"class":511},"}\n",[452,1291,1292,1293,1296,1297,1033,1300,1303],{},"Leaving the loop cancels the stream, which aborts the request signal of the handler the way a disconnecting client would. Because the stream is not kept, ",[455,1294,1295],{},"events()"," cannot be combined with ",[455,1298,1299],{},"json()",[455,1301,1302],{},"text()"," on the same response.",[746,1305,1307],{"id":1306},"cookies-and-sessions","Cookies and sessions",[452,1309,1310,1313,1314,1317],{},[455,1311,1312],{},".cookie(name, value)"," sends a cookie with one request. ",[455,1315,1316],{},"app.agent()"," returns a client that keeps the cookies responses set and sends them back, like a browser:",[488,1319,1321],{"className":490,"code":1320,"language":492,"meta":493,"style":493},"const agent = app.agent();\n\nawait agent\n  .post('\u002Flogin')\n  .json({ email: 'ada@example.com', password: 'secret' })\n  .expect(204);\nawait agent.get('\u002Fme').expect(200);\n\nawait agent.post('\u002Flogout').expect(204);\nawait agent.get('\u002Fme').expect(401);\n",[455,1322,1323,1344,1348,1355,1372,1411,1426,1460,1464,1497],{"__ignoreMap":493},[497,1324,1325,1327,1330,1332,1334,1336,1339,1342],{"class":499,"line":500},[497,1326,504],{"class":503},[497,1328,1329],{"class":507}," agent ",[497,1331,512],{"class":511},[497,1333,1128],{"class":507},[497,1335,714],{"class":511},[497,1337,1338],{"class":528},"agent",[497,1340,1341],{"class":507},"()",[497,1343,692],{"class":511},[497,1345,1346],{"class":499,"line":522},[497,1347,698],{"emptyLinePlaceholder":68},[497,1349,1350,1352],{"class":499,"line":547},[497,1351,708],{"class":515},[497,1353,1354],{"class":507}," agent\n",[497,1356,1357,1359,1361,1363,1365,1368,1370],{"class":499,"line":558},[497,1358,525],{"class":511},[497,1360,529],{"class":528},[497,1362,532],{"class":507},[497,1364,535],{"class":511},[497,1366,1367],{"class":538},"\u002Flogin",[497,1369,535],{"class":511},[497,1371,544],{"class":507},[497,1373,1374,1376,1378,1380,1382,1385,1387,1389,1392,1394,1396,1399,1401,1403,1405,1407,1409],{"class":499,"line":618},[497,1375,525],{"class":511},[497,1377,623],{"class":528},[497,1379,532],{"class":507},[497,1381,568],{"class":511},[497,1383,1384],{"class":571}," email",[497,1386,575],{"class":511},[497,1388,602],{"class":511},[497,1390,1391],{"class":538},"ada@example.com",[497,1393,535],{"class":511},[497,1395,582],{"class":511},[497,1397,1398],{"class":571}," password",[497,1400,575],{"class":511},[497,1402,602],{"class":511},[497,1404,1029],{"class":538},[497,1406,535],{"class":511},[497,1408,642],{"class":511},[497,1410,544],{"class":507},[497,1412,1413,1415,1417,1419,1422,1424],{"class":499,"line":647},[497,1414,525],{"class":511},[497,1416,652],{"class":528},[497,1418,532],{"class":507},[497,1420,1421],{"class":657},"204",[497,1423,689],{"class":507},[497,1425,692],{"class":511},[497,1427,1428,1430,1433,1435,1437,1439,1441,1444,1446,1448,1450,1452,1454,1456,1458],{"class":499,"line":663},[497,1429,708],{"class":515},[497,1431,1432],{"class":507}," agent",[497,1434,714],{"class":511},[497,1436,1133],{"class":528},[497,1438,532],{"class":507},[497,1440,535],{"class":511},[497,1442,1443],{"class":538},"\u002Fme",[497,1445,535],{"class":511},[497,1447,689],{"class":507},[497,1449,714],{"class":511},[497,1451,652],{"class":528},[497,1453,532],{"class":507},[497,1455,1153],{"class":657},[497,1457,689],{"class":507},[497,1459,692],{"class":511},[497,1461,1462],{"class":499,"line":695},[497,1463,698],{"emptyLinePlaceholder":68},[497,1465,1466,1468,1470,1472,1474,1476,1478,1481,1483,1485,1487,1489,1491,1493,1495],{"class":499,"line":701},[497,1467,708],{"class":515},[497,1469,1432],{"class":507},[497,1471,714],{"class":511},[497,1473,529],{"class":528},[497,1475,532],{"class":507},[497,1477,535],{"class":511},[497,1479,1480],{"class":538},"\u002Flogout",[497,1482,535],{"class":511},[497,1484,689],{"class":507},[497,1486,714],{"class":511},[497,1488,652],{"class":528},[497,1490,532],{"class":507},[497,1492,1421],{"class":657},[497,1494,689],{"class":507},[497,1496,692],{"class":511},[497,1498,1500,1502,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1527,1529],{"class":499,"line":1499},10,[497,1501,708],{"class":515},[497,1503,1432],{"class":507},[497,1505,714],{"class":511},[497,1507,1133],{"class":528},[497,1509,532],{"class":507},[497,1511,535],{"class":511},[497,1513,1443],{"class":538},[497,1515,535],{"class":511},[497,1517,689],{"class":507},[497,1519,714],{"class":511},[497,1521,652],{"class":528},[497,1523,532],{"class":507},[497,1525,1526],{"class":657},"401",[497,1528,689],{"class":507},[497,1530,692],{"class":511},[452,1532,1533,1534,1537,1538,1541,1542,714],{},"A cookie expired with ",[455,1535,1536],{},"Max-Age=0"," or a past ",[455,1539,1540],{},"Expires"," is dropped from the jar. Agents do not share cookies with each other or with ",[455,1543,1544],{},"app",[746,1546,1548],{"id":1547},"typed-calls","Typed calls",[452,1550,1551,1554,1555,1561,1562,1565],{},[455,1552,1553],{},"app.client"," is a ",[1556,1557,1558],"a",{"href":183},[455,1559,1560],{},"@vercube\u002Fclient"," that calls the app in memory. Give ",[455,1563,1564],{},"createTestApp"," the generated route map and every call is typed by your controllers, so a test breaks at compile time when a handler changes:",[488,1567,1569],{"className":490,"code":1568,"language":492,"meta":493,"style":493},"import type { VercubeRoutes } from '..\u002F.vercube\u002Froutes';\n\nawait using app = await createTestApp\u003CVercubeRoutes>({\n  controllers: [UserController],\n});\n\nconst user = await app.client.get('\u002Fusers\u002F:id', { params: { id: '1' } });\nexpect(user.name).toBe('Ada');\n",[455,1570,1571,1597,1601,1630,1643,1651,1655,1716],{"__ignoreMap":493},[497,1572,1573,1576,1578,1580,1583,1585,1588,1590,1593,1595],{"class":499,"line":500},[497,1574,1575],{"class":515},"import",[497,1577,948],{"class":515},[497,1579,945],{"class":511},[497,1581,1582],{"class":507}," VercubeRoutes",[497,1584,642],{"class":511},[497,1586,1587],{"class":515}," from",[497,1589,602],{"class":511},[497,1591,1592],{"class":538},"..\u002F.vercube\u002Froutes",[497,1594,535],{"class":511},[497,1596,692],{"class":511},[497,1598,1599],{"class":499,"line":522},[497,1600,698],{"emptyLinePlaceholder":68},[497,1602,1603,1606,1609,1611,1613,1616,1619,1623,1626,1628],{"class":499,"line":547},[497,1604,1605],{"class":503},"await using",[497,1607,1608],{"class":507}," app ",[497,1610,512],{"class":511},[497,1612,516],{"class":515},[497,1614,1615],{"class":528}," createTestApp",[497,1617,1618],{"class":511},"\u003C",[497,1620,1622],{"class":1621},"sBMFI","VercubeRoutes",[497,1624,1625],{"class":511},">",[497,1627,532],{"class":507},[497,1629,1192],{"class":511},[497,1631,1632,1635,1637,1640],{"class":499,"line":558},[497,1633,1634],{"class":571},"  controllers",[497,1636,575],{"class":511},[497,1638,1639],{"class":507}," [UserController]",[497,1641,1642],{"class":511},",\n",[497,1644,1645,1647,1649],{"class":499,"line":618},[497,1646,613],{"class":511},[497,1648,689],{"class":507},[497,1650,692],{"class":511},[497,1652,1653],{"class":499,"line":647},[497,1654,698],{"emptyLinePlaceholder":68},[497,1656,1657,1659,1662,1664,1666,1668,1670,1673,1675,1677,1679,1681,1684,1686,1688,1690,1693,1695,1697,1700,1702,1704,1706,1708,1710,1712,1714],{"class":499,"line":663},[497,1658,504],{"class":503},[497,1660,1661],{"class":507}," user ",[497,1663,512],{"class":511},[497,1665,516],{"class":515},[497,1667,1128],{"class":507},[497,1669,714],{"class":511},[497,1671,1672],{"class":507},"client",[497,1674,714],{"class":511},[497,1676,1133],{"class":528},[497,1678,532],{"class":507},[497,1680,535],{"class":511},[497,1682,1683],{"class":538},"\u002Fusers\u002F:id",[497,1685,535],{"class":511},[497,1687,582],{"class":511},[497,1689,945],{"class":511},[497,1691,1692],{"class":571}," params",[497,1694,575],{"class":511},[497,1696,945],{"class":511},[497,1698,1699],{"class":571}," id",[497,1701,575],{"class":511},[497,1703,602],{"class":511},[497,1705,922],{"class":538},[497,1707,535],{"class":511},[497,1709,642],{"class":511},[497,1711,642],{"class":511},[497,1713,689],{"class":507},[497,1715,692],{"class":511},[497,1717,1718,1720,1723,1725,1728,1730,1732,1734,1736,1738,1740,1742],{"class":499,"line":695},[497,1719,652],{"class":528},[497,1721,1722],{"class":507},"(user",[497,1724,714],{"class":511},[497,1726,1727],{"class":507},"name)",[497,1729,714],{"class":511},[497,1731,1212],{"class":528},[497,1733,532],{"class":507},[497,1735,535],{"class":511},[497,1737,637],{"class":538},[497,1739,535],{"class":511},[497,1741,689],{"class":507},[497,1743,692],{"class":511},[452,1745,1746,1747,1750],{},"It resolves to the parsed body and throws a ",[455,1748,1749],{},"VercubeClientError"," for an error status, which suits tests of the happy path. To assert on a status or headers, use the request builder above.",[746,1752,1754],{"id":1753},"anything-else","Anything else",[452,1756,1757,1760,1761,1763,1764,1767,1768,1079,1771,1774],{},[455,1758,1759],{},"app.fetch()"," sends a ",[455,1762,831],{},", or a path with ",[455,1765,1766],{},"RequestInit",", through the app as is. ",[455,1769,1770],{},"app.app",[455,1772,1773],{},"App"," itself.",[488,1776,1778],{"className":490,"code":1777,"language":492,"meta":493,"style":493},"const res = await app.fetch('\u002Fhealth', { method: 'HEAD' });\n",[455,1779,1780],{"__ignoreMap":493},[497,1781,1782,1784,1786,1788,1790,1792,1794,1797,1799,1801,1804,1806,1808,1810,1813,1815,1817,1820,1822,1824,1826],{"class":499,"line":500},[497,1783,504],{"class":503},[497,1785,508],{"class":507},[497,1787,512],{"class":511},[497,1789,516],{"class":515},[497,1791,1128],{"class":507},[497,1793,714],{"class":511},[497,1795,1796],{"class":528},"fetch",[497,1798,532],{"class":507},[497,1800,535],{"class":511},[497,1802,1803],{"class":538},"\u002Fhealth",[497,1805,535],{"class":511},[497,1807,582],{"class":511},[497,1809,945],{"class":511},[497,1811,1812],{"class":571}," method",[497,1814,575],{"class":511},[497,1816,602],{"class":511},[497,1818,1819],{"class":538},"HEAD",[497,1821,535],{"class":511},[497,1823,642],{"class":511},[497,1825,689],{"class":507},[497,1827,692],{"class":511},[452,1829,1830],{},"WebSockets need a real server and are not covered yet.",[1832,1833,1834],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":493,"searchDepth":500,"depth":522,"links":1836},[1837,1838,1839,1840,1841,1842,1843],{"id":748,"depth":522,"text":749},{"id":983,"depth":522,"text":984},{"id":1054,"depth":522,"text":1055},{"id":1086,"depth":522,"text":1087},{"id":1306,"depth":522,"text":1307},{"id":1547,"depth":522,"text":1548},{"id":1753,"depth":522,"text":1754},"Send requests through the app under test, check the status and headers, and read the response","md",null,{},{"title":163,"description":1844},"-uGerOxGomzUJjvYKcr0YRn1hBuOm720LP_WrFYfSz4",[1851,1853],{"title":78,"path":160,"stem":161,"description":1852,"children":-1},"Test a Vercube app the way you write it, with real controllers, real DI and any dependency swapped for a fake",{"title":167,"path":168,"stem":169,"description":1854,"children":-1},"Replace services with fakes, stub only what a test needs, test services without HTTP, and assert on logs",1794396677190]