[{"data":1,"prerenderedAt":2316},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fcore-concepts\u002Ftesting":176,"\u002Fdocs\u002Fcore-concepts\u002Ftesting-surround":2311},[4,21,86,158],{"title":5,"path":6,"stem":7,"children":8,"status":11,"icon":20},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,16],{"title":10,"path":6,"stem":7,"status":11},"Introduction",null,{"title":13,"path":14,"stem":15,"status":11},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F2.installation",{"title":17,"path":18,"stem":19,"status":11},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","1.docs\u002F1.getting-started\u002F3.quick-start",false,{"title":22,"path":23,"stem":24,"children":25,"status":11,"icon":20},"Core Concepts","\u002Fdocs\u002Fcore-concepts","1.docs\u002F2.core-concepts\u002F1.index",[26,28,32,36,46,50,54,58,62,66,70,74,78,82],{"title":27,"path":23,"stem":24,"status":11},"Overview",{"title":29,"path":30,"stem":31,"status":11},"Response","\u002Fdocs\u002Fcore-concepts\u002Fresponse","1.docs\u002F2.core-concepts\u002F10.response",{"title":33,"path":34,"stem":35,"status":11},"Testing","\u002Fdocs\u002Fcore-concepts\u002Ftesting","1.docs\u002F2.core-concepts\u002F12.testing",{"title":37,"path":38,"stem":39,"children":40,"status":11,"icon":20,"defaultOpen":20},"Decorators","\u002Fdocs\u002Fcore-concepts\u002Fdecorators","1.docs\u002F2.core-concepts\u002F13.decorators\u002F1.index",[41,42],{"title":27,"path":38,"stem":39,"status":11},{"title":43,"path":44,"stem":45,"status":11},"Custom","\u002Fdocs\u002Fcore-concepts\u002Fdecorators\u002Fcustom","1.docs\u002F2.core-concepts\u002F13.decorators\u002F2.custom",{"title":47,"path":48,"stem":49,"status":11},"Discovery Service","\u002Fdocs\u002Fcore-concepts\u002Fdiscovery","1.docs\u002F2.core-concepts\u002F14.discovery",{"title":51,"path":52,"stem":53,"status":11},"Application Lifecycle","\u002Fdocs\u002Fcore-concepts\u002Fapp-lifecycle","1.docs\u002F2.core-concepts\u002F15.app-lifecycle",{"title":55,"path":56,"stem":57,"status":11},"Controllers","\u002Fdocs\u002Fcore-concepts\u002Fcontrollers","1.docs\u002F2.core-concepts\u002F2.controllers",{"title":59,"path":60,"stem":61,"status":11},"Routing","\u002Fdocs\u002Fcore-concepts\u002Frouting","1.docs\u002F2.core-concepts\u002F3.routing",{"title":63,"path":64,"stem":65,"status":11},"Providers","\u002Fdocs\u002Fcore-concepts\u002Fproviders","1.docs\u002F2.core-concepts\u002F4.providers",{"title":67,"path":68,"stem":69,"status":11},"Modules","\u002Fdocs\u002Fcore-concepts\u002Fmodules","1.docs\u002F2.core-concepts\u002F5.modules",{"title":71,"path":72,"stem":73,"status":11},"Configuration","\u002Fdocs\u002Fcore-concepts\u002Fconfiguration","1.docs\u002F2.core-concepts\u002F6.configuration",{"title":75,"path":76,"stem":77,"status":11},"Middleware","\u002Fdocs\u002Fcore-concepts\u002Fmiddleware","1.docs\u002F2.core-concepts\u002F7.middleware",{"title":79,"path":80,"stem":81,"status":11},"Guards","\u002Fdocs\u002Fcore-concepts\u002Fguards","1.docs\u002F2.core-concepts\u002F8.guards",{"title":83,"path":84,"stem":85,"status":11},"Exceptions","\u002Fdocs\u002Fcore-concepts\u002Fexceptions","1.docs\u002F2.core-concepts\u002F9.exceptions",{"title":87,"path":88,"stem":89,"children":90,"status":11,"icon":20},"Packages","\u002Fdocs\u002Fpackages","1.docs\u002F3.packages\u002F1.index",[91,92,97,108,112,130,134,138,142,146,150,154],{"title":27,"path":88,"stem":89,"status":11},{"title":93,"path":94,"stem":95,"status":96},"CLI","\u002Fdocs\u002Fpackages\u002Fcli","1.docs\u002F3.packages\u002F10.cli","experimental",{"title":98,"path":99,"stem":100,"children":101,"status":11,"icon":20,"defaultOpen":20},"Events","\u002Fdocs\u002Fpackages\u002Fmessaging","1.docs\u002F3.packages\u002F11.messaging\u002F1.index",[102,104],{"title":27,"path":99,"stem":100,"status":103},"beta",{"title":105,"path":106,"stem":107,"status":96},"Redis","\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis","1.docs\u002F3.packages\u002F11.messaging\u002F2.redis",{"title":109,"path":110,"stem":111,"status":103},"Serve Static","\u002Fdocs\u002Fpackages\u002Fserve-static","1.docs\u002F3.packages\u002F12.serve-static",{"title":113,"path":114,"stem":115,"children":116,"status":11,"icon":20,"defaultOpen":20},"Auth","\u002Fdocs\u002Fpackages\u002Fauth","1.docs\u002F3.packages\u002F2.auth\u002F1.index",[117,118,122,126],{"title":27,"path":114,"stem":115,"status":103},{"title":119,"path":120,"stem":121,"status":103},"JWT Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Fjwt","1.docs\u002F3.packages\u002F2.auth\u002F2.jwt",{"title":123,"path":124,"stem":125,"status":103},"Local Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Flocal","1.docs\u002F3.packages\u002F2.auth\u002F3.local",{"title":127,"path":128,"stem":129,"status":96},"OAuth2 Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Foauth2","1.docs\u002F3.packages\u002F2.auth\u002F4.oauth2",{"title":131,"path":132,"stem":133,"status":103},"JWT","\u002Fdocs\u002Fpackages\u002Fjwt","1.docs\u002F3.packages\u002F3.jwt",{"title":135,"path":136,"stem":137,"status":103},"Drizzle","\u002Fdocs\u002Fpackages\u002Fdrizzle","1.docs\u002F3.packages\u002F4.drizzle",{"title":139,"path":140,"stem":141,"status":103},"Papr","\u002Fdocs\u002Fpackages\u002Fpapr","1.docs\u002F3.packages\u002F5.papr",{"title":143,"path":144,"stem":145,"status":103},"Mongoose","\u002Fdocs\u002Fpackages\u002Fmongoose","1.docs\u002F3.packages\u002F6.mongoose",{"title":147,"path":148,"stem":149,"status":103},"Swagger","\u002Fdocs\u002Fpackages\u002Fswagger","1.docs\u002F3.packages\u002F7.swagger",{"title":151,"path":152,"stem":153,"status":103},"Node Server","\u002Fdocs\u002Fpackages\u002Fnode-server","1.docs\u002F3.packages\u002F8.node-server",{"title":155,"path":156,"stem":157,"status":103},"uWS Server","\u002Fdocs\u002Fpackages\u002Fuws-server","1.docs\u002F3.packages\u002F9.uws-server",{"title":159,"path":160,"stem":161,"children":162,"status":11,"icon":20},"Roadmap","\u002Fdocs\u002Froadmap","1.docs\u002F4.roadmap\u002F1.index",[163,164,168,172],{"title":27,"path":160,"stem":161,"status":11},{"title":165,"path":166,"stem":167,"status":11},"Short term (0-3 months)","\u002Fdocs\u002Froadmap\u002Fshort-term","1.docs\u002F4.roadmap\u002F2.short-term",{"title":169,"path":170,"stem":171,"status":11},"Mid term (3-9 months)","\u002Fdocs\u002Froadmap\u002Fmid-term","1.docs\u002F4.roadmap\u002F3.mid-term",{"title":173,"path":174,"stem":175,"status":11},"Long term (9-12+ months)","\u002Fdocs\u002Froadmap\u002Flong-term","1.docs\u002F4.roadmap\u002F4.long-term",{"id":177,"title":33,"body":178,"description":2306,"extension":2307,"meta":2308,"navigation":245,"path":34,"seo":2309,"status":11,"stem":35,"__hash__":2310},"docs\u002F1.docs\u002F2.core-concepts\u002F12.testing.md",{"type":179,"value":180,"toc":2296},"minimark",[181,194,199,303,308,392,396,438,442,445,1281,1285,1288,1602,1606,1613,1783,1843,1847,2292],[182,183,184,185,189,190,193],"p",{},"MiiaJS provides a ",[186,187,188],"code",{},"TestApp"," class for writing unit and integration tests. Import it from ",[186,191,192],{},"@miiajs\u002Fcore\u002Ftesting",".",[195,196,198],"h2",{"id":197},"testapp-api","TestApp API",[200,201,206],"pre",{"className":202,"code":203,"language":204,"meta":205,"style":205},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { TestApp } from '@miiajs\u002Fcore\u002Ftesting'\n\nconst app = await TestApp.create(AppModule)\n  .override(UserService, mockUserService)\n  .compile()\n","typescript","",[186,207,208,240,247,274,292],{"__ignoreMap":205},[209,210,213,217,221,225,228,231,234,237],"span",{"class":211,"line":212},"line",1,[209,214,216],{"class":215},"s7zQu","import",[209,218,220],{"class":219},"sMK4o"," {",[209,222,224],{"class":223},"sTEyZ"," TestApp",[209,226,227],{"class":219}," }",[209,229,230],{"class":215}," from",[209,232,233],{"class":219}," '",[209,235,192],{"class":236},"sfazB",[209,238,239],{"class":219},"'\n",[209,241,243],{"class":211,"line":242},2,[209,244,246],{"emptyLinePlaceholder":245},true,"\n",[209,248,250,254,257,260,263,265,267,271],{"class":211,"line":249},3,[209,251,253],{"class":252},"spNyl","const",[209,255,256],{"class":223}," app ",[209,258,259],{"class":219},"=",[209,261,262],{"class":215}," await",[209,264,224],{"class":223},[209,266,193],{"class":219},[209,268,270],{"class":269},"s2Zo4","create",[209,272,273],{"class":223},"(AppModule)\n",[209,275,277,280,283,286,289],{"class":211,"line":276},4,[209,278,279],{"class":219},"  .",[209,281,282],{"class":269},"override",[209,284,285],{"class":223},"(UserService",[209,287,288],{"class":219},",",[209,290,291],{"class":223}," mockUserService)\n",[209,293,295,297,300],{"class":211,"line":294},5,[209,296,279],{"class":219},[209,298,299],{"class":269},"compile",[209,301,302],{"class":223},"()\n",[304,305,307],"h3",{"id":306},"builder-methods","Builder methods",[309,310,311,324],"table",{},[312,313,314],"thead",{},[315,316,317,321],"tr",{},[318,319,320],"th",{},"Method",[318,322,323],{},"Description",[325,326,327,338,348,358,368,378],"tbody",{},[315,328,329,335],{},[330,331,332],"td",{},[186,333,334],{},"TestApp.create(...modules)",[330,336,337],{},"Create a test app from modules",[315,339,340,345],{},[330,341,342],{},[186,343,344],{},".provide(...providers)",[330,346,347],{},"Add additional providers",[315,349,350,355],{},[330,351,352],{},[186,353,354],{},".override(token, value)",[330,356,357],{},"Replace a provider with a mock",[315,359,360,365],{},[330,361,362],{},[186,363,364],{},".use(...middlewares)",[330,366,367],{},"Add middleware",[315,369,370,375],{},[330,371,372],{},[186,373,374],{},".useGuard(...guards)",[330,376,377],{},"Add guards",[315,379,380,385],{},[330,381,382],{},[186,383,384],{},".compile()",[330,386,387,388,391],{},"Build the test app (returns ",[186,389,390],{},"Promise\u003CTestApp>",")",[304,393,395],{"id":394},"instance-methods","Instance methods",[309,397,398,406],{},[312,399,400],{},[315,401,402,404],{},[318,403,320],{},[318,405,323],{},[325,407,408,418,428],{},[315,409,410,415],{},[330,411,412],{},[186,413,414],{},".request(method, path, options?)",[330,416,417],{},"Send an HTTP request",[315,419,420,425],{},[330,421,422],{},[186,423,424],{},".resolve(token)",[330,426,427],{},"Resolve a provider from the container",[315,429,430,435],{},[330,431,432],{},[186,433,434],{},".close()",[330,436,437],{},"Clean up resources",[195,439,441],{"id":440},"integration-tests","Integration tests",[182,443,444],{},"Test your HTTP endpoints end-to-end:",[200,446,448],{"className":202,"code":447,"language":204,"meta":205,"style":205},"import { describe, it, expect, beforeAll, afterAll } from 'vitest'\nimport { TestApp } from '@miiajs\u002Fcore\u002Ftesting'\nimport { AppModule } from '..\u002Fsrc\u002Fapp.module.js'\n\ndescribe('UserController', () => {\n  let app: TestApp\n\n  beforeAll(async () => {\n    app = await TestApp.create(AppModule)\n      .override(UserService, {\n        findAll: () => [{ id: 1, name: 'Alice' }],\n        create: (data) => ({ id: 2, ...data }),\n      })\n      .compile()\n  })\n\n  afterAll(() => app.close())\n\n  it('GET \u002Fusers should return users', async () => {\n    const res = await app.request('GET', '\u002Fusers')\n\n    expect(res.status).toBe(200)\n    expect(await res.json()).toEqual([{ id: 1, name: 'Alice' }])\n  })\n\n  it('POST \u002Fusers should create a user', async () => {\n    const res = await app.request('POST', '\u002Fusers', {\n      body: { name: 'Bob', email: 'bob@test.com' },\n    })\n\n    expect(res.status).toBe(201)\n    expect(await res.json()).toMatchObject({ name: 'Bob' })\n  })\n\n  it('POST \u002Fusers should validate body', async () => {\n    const res = await app.request('POST', '\u002Fusers', {\n      body: { invalid: true },\n    })\n\n    expect(res.status).toBe(422)\n  })\n})\n",[186,449,450,490,508,528,532,559,575,580,598,623,640,689,732,740,749,757,762,785,790,816,856,861,891,944,951,956,980,1018,1056,1064,1069,1095,1135,1142,1147,1171,1208,1228,1235,1240,1266,1273],{"__ignoreMap":205},[209,451,452,454,456,459,461,464,466,469,471,474,476,479,481,483,485,488],{"class":211,"line":212},[209,453,216],{"class":215},[209,455,220],{"class":219},[209,457,458],{"class":223}," describe",[209,460,288],{"class":219},[209,462,463],{"class":223}," it",[209,465,288],{"class":219},[209,467,468],{"class":223}," expect",[209,470,288],{"class":219},[209,472,473],{"class":223}," beforeAll",[209,475,288],{"class":219},[209,477,478],{"class":223}," afterAll",[209,480,227],{"class":219},[209,482,230],{"class":215},[209,484,233],{"class":219},[209,486,487],{"class":236},"vitest",[209,489,239],{"class":219},[209,491,492,494,496,498,500,502,504,506],{"class":211,"line":242},[209,493,216],{"class":215},[209,495,220],{"class":219},[209,497,224],{"class":223},[209,499,227],{"class":219},[209,501,230],{"class":215},[209,503,233],{"class":219},[209,505,192],{"class":236},[209,507,239],{"class":219},[209,509,510,512,514,517,519,521,523,526],{"class":211,"line":249},[209,511,216],{"class":215},[209,513,220],{"class":219},[209,515,516],{"class":223}," AppModule",[209,518,227],{"class":219},[209,520,230],{"class":215},[209,522,233],{"class":219},[209,524,525],{"class":236},"..\u002Fsrc\u002Fapp.module.js",[209,527,239],{"class":219},[209,529,530],{"class":211,"line":276},[209,531,246],{"emptyLinePlaceholder":245},[209,533,534,537,540,543,546,548,550,553,556],{"class":211,"line":294},[209,535,536],{"class":269},"describe",[209,538,539],{"class":223},"(",[209,541,542],{"class":219},"'",[209,544,545],{"class":236},"UserController",[209,547,542],{"class":219},[209,549,288],{"class":219},[209,551,552],{"class":219}," ()",[209,554,555],{"class":252}," =>",[209,557,558],{"class":219}," {\n",[209,560,562,565,568,571],{"class":211,"line":561},6,[209,563,564],{"class":252},"  let",[209,566,567],{"class":223}," app",[209,569,570],{"class":219},":",[209,572,574],{"class":573},"sBMFI"," TestApp\n",[209,576,578],{"class":211,"line":577},7,[209,579,246],{"emptyLinePlaceholder":245},[209,581,583,586,589,592,594,596],{"class":211,"line":582},8,[209,584,585],{"class":269},"  beforeAll",[209,587,539],{"class":588},"swJcz",[209,590,591],{"class":252},"async",[209,593,552],{"class":219},[209,595,555],{"class":252},[209,597,558],{"class":219},[209,599,601,604,607,609,611,613,615,617,620],{"class":211,"line":600},9,[209,602,603],{"class":223},"    app",[209,605,606],{"class":219}," =",[209,608,262],{"class":215},[209,610,224],{"class":223},[209,612,193],{"class":219},[209,614,270],{"class":269},[209,616,539],{"class":588},[209,618,619],{"class":223},"AppModule",[209,621,622],{"class":588},")\n",[209,624,626,629,631,633,636,638],{"class":211,"line":625},10,[209,627,628],{"class":219},"      .",[209,630,282],{"class":269},[209,632,539],{"class":588},[209,634,635],{"class":223},"UserService",[209,637,288],{"class":219},[209,639,558],{"class":219},[209,641,643,646,648,650,652,655,658,661,663,667,669,672,674,676,679,681,683,686],{"class":211,"line":642},11,[209,644,645],{"class":269},"        findAll",[209,647,570],{"class":219},[209,649,552],{"class":219},[209,651,555],{"class":252},[209,653,654],{"class":588}," [",[209,656,657],{"class":219},"{",[209,659,660],{"class":588}," id",[209,662,570],{"class":219},[209,664,666],{"class":665},"sbssI"," 1",[209,668,288],{"class":219},[209,670,671],{"class":588}," name",[209,673,570],{"class":219},[209,675,233],{"class":219},[209,677,678],{"class":236},"Alice",[209,680,542],{"class":219},[209,682,227],{"class":219},[209,684,685],{"class":588},"]",[209,687,688],{"class":219},",\n",[209,690,692,695,697,700,704,706,708,710,712,714,716,719,721,724,726,728,730],{"class":211,"line":691},12,[209,693,694],{"class":269},"        create",[209,696,570],{"class":219},[209,698,699],{"class":219}," (",[209,701,703],{"class":702},"sHdIc","data",[209,705,391],{"class":219},[209,707,555],{"class":252},[209,709,699],{"class":588},[209,711,657],{"class":219},[209,713,660],{"class":588},[209,715,570],{"class":219},[209,717,718],{"class":665}," 2",[209,720,288],{"class":219},[209,722,723],{"class":219}," ...",[209,725,703],{"class":223},[209,727,227],{"class":219},[209,729,391],{"class":588},[209,731,688],{"class":219},[209,733,735,738],{"class":211,"line":734},13,[209,736,737],{"class":219},"      }",[209,739,622],{"class":588},[209,741,743,745,747],{"class":211,"line":742},14,[209,744,628],{"class":219},[209,746,299],{"class":269},[209,748,302],{"class":588},[209,750,752,755],{"class":211,"line":751},15,[209,753,754],{"class":219},"  }",[209,756,622],{"class":588},[209,758,760],{"class":211,"line":759},16,[209,761,246],{"emptyLinePlaceholder":245},[209,763,765,768,770,773,775,777,779,782],{"class":211,"line":764},17,[209,766,767],{"class":269},"  afterAll",[209,769,539],{"class":588},[209,771,772],{"class":219},"()",[209,774,555],{"class":252},[209,776,567],{"class":223},[209,778,193],{"class":219},[209,780,781],{"class":269},"close",[209,783,784],{"class":588},"())\n",[209,786,788],{"class":211,"line":787},18,[209,789,246],{"emptyLinePlaceholder":245},[209,791,793,796,798,800,803,805,807,810,812,814],{"class":211,"line":792},19,[209,794,795],{"class":269},"  it",[209,797,539],{"class":588},[209,799,542],{"class":219},[209,801,802],{"class":236},"GET \u002Fusers should return users",[209,804,542],{"class":219},[209,806,288],{"class":219},[209,808,809],{"class":252}," async",[209,811,552],{"class":219},[209,813,555],{"class":252},[209,815,558],{"class":219},[209,817,819,822,825,827,829,831,833,836,838,840,843,845,847,849,852,854],{"class":211,"line":818},20,[209,820,821],{"class":252},"    const",[209,823,824],{"class":223}," res",[209,826,606],{"class":219},[209,828,262],{"class":215},[209,830,567],{"class":223},[209,832,193],{"class":219},[209,834,835],{"class":269},"request",[209,837,539],{"class":588},[209,839,542],{"class":219},[209,841,842],{"class":236},"GET",[209,844,542],{"class":219},[209,846,288],{"class":219},[209,848,233],{"class":219},[209,850,851],{"class":236},"\u002Fusers",[209,853,542],{"class":219},[209,855,622],{"class":588},[209,857,859],{"class":211,"line":858},21,[209,860,246],{"emptyLinePlaceholder":245},[209,862,864,867,869,872,874,877,879,881,884,886,889],{"class":211,"line":863},22,[209,865,866],{"class":269},"    expect",[209,868,539],{"class":588},[209,870,871],{"class":223},"res",[209,873,193],{"class":219},[209,875,876],{"class":223},"status",[209,878,391],{"class":588},[209,880,193],{"class":219},[209,882,883],{"class":269},"toBe",[209,885,539],{"class":588},[209,887,888],{"class":665},"200",[209,890,622],{"class":588},[209,892,894,896,898,901,903,905,908,911,913,916,919,921,923,925,927,929,931,933,935,937,939,941],{"class":211,"line":893},23,[209,895,866],{"class":269},[209,897,539],{"class":588},[209,899,900],{"class":215},"await",[209,902,824],{"class":223},[209,904,193],{"class":219},[209,906,907],{"class":269},"json",[209,909,910],{"class":588},"())",[209,912,193],{"class":219},[209,914,915],{"class":269},"toEqual",[209,917,918],{"class":588},"([",[209,920,657],{"class":219},[209,922,660],{"class":588},[209,924,570],{"class":219},[209,926,666],{"class":665},[209,928,288],{"class":219},[209,930,671],{"class":588},[209,932,570],{"class":219},[209,934,233],{"class":219},[209,936,678],{"class":236},[209,938,542],{"class":219},[209,940,227],{"class":219},[209,942,943],{"class":588},"])\n",[209,945,947,949],{"class":211,"line":946},24,[209,948,754],{"class":219},[209,950,622],{"class":588},[209,952,954],{"class":211,"line":953},25,[209,955,246],{"emptyLinePlaceholder":245},[209,957,959,961,963,965,968,970,972,974,976,978],{"class":211,"line":958},26,[209,960,795],{"class":269},[209,962,539],{"class":588},[209,964,542],{"class":219},[209,966,967],{"class":236},"POST \u002Fusers should create a user",[209,969,542],{"class":219},[209,971,288],{"class":219},[209,973,809],{"class":252},[209,975,552],{"class":219},[209,977,555],{"class":252},[209,979,558],{"class":219},[209,981,983,985,987,989,991,993,995,997,999,1001,1004,1006,1008,1010,1012,1014,1016],{"class":211,"line":982},27,[209,984,821],{"class":252},[209,986,824],{"class":223},[209,988,606],{"class":219},[209,990,262],{"class":215},[209,992,567],{"class":223},[209,994,193],{"class":219},[209,996,835],{"class":269},[209,998,539],{"class":588},[209,1000,542],{"class":219},[209,1002,1003],{"class":236},"POST",[209,1005,542],{"class":219},[209,1007,288],{"class":219},[209,1009,233],{"class":219},[209,1011,851],{"class":236},[209,1013,542],{"class":219},[209,1015,288],{"class":219},[209,1017,558],{"class":219},[209,1019,1021,1024,1026,1028,1030,1032,1034,1037,1039,1041,1044,1046,1048,1051,1053],{"class":211,"line":1020},28,[209,1022,1023],{"class":588},"      body",[209,1025,570],{"class":219},[209,1027,220],{"class":219},[209,1029,671],{"class":588},[209,1031,570],{"class":219},[209,1033,233],{"class":219},[209,1035,1036],{"class":236},"Bob",[209,1038,542],{"class":219},[209,1040,288],{"class":219},[209,1042,1043],{"class":588}," email",[209,1045,570],{"class":219},[209,1047,233],{"class":219},[209,1049,1050],{"class":236},"bob@test.com",[209,1052,542],{"class":219},[209,1054,1055],{"class":219}," },\n",[209,1057,1059,1062],{"class":211,"line":1058},29,[209,1060,1061],{"class":219},"    }",[209,1063,622],{"class":588},[209,1065,1067],{"class":211,"line":1066},30,[209,1068,246],{"emptyLinePlaceholder":245},[209,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088,1090,1093],{"class":211,"line":1071},31,[209,1073,866],{"class":269},[209,1075,539],{"class":588},[209,1077,871],{"class":223},[209,1079,193],{"class":219},[209,1081,876],{"class":223},[209,1083,391],{"class":588},[209,1085,193],{"class":219},[209,1087,883],{"class":269},[209,1089,539],{"class":588},[209,1091,1092],{"class":665},"201",[209,1094,622],{"class":588},[209,1096,1098,1100,1102,1104,1106,1108,1110,1112,1114,1117,1119,1121,1123,1125,1127,1129,1131,1133],{"class":211,"line":1097},32,[209,1099,866],{"class":269},[209,1101,539],{"class":588},[209,1103,900],{"class":215},[209,1105,824],{"class":223},[209,1107,193],{"class":219},[209,1109,907],{"class":269},[209,1111,910],{"class":588},[209,1113,193],{"class":219},[209,1115,1116],{"class":269},"toMatchObject",[209,1118,539],{"class":588},[209,1120,657],{"class":219},[209,1122,671],{"class":588},[209,1124,570],{"class":219},[209,1126,233],{"class":219},[209,1128,1036],{"class":236},[209,1130,542],{"class":219},[209,1132,227],{"class":219},[209,1134,622],{"class":588},[209,1136,1138,1140],{"class":211,"line":1137},33,[209,1139,754],{"class":219},[209,1141,622],{"class":588},[209,1143,1145],{"class":211,"line":1144},34,[209,1146,246],{"emptyLinePlaceholder":245},[209,1148,1150,1152,1154,1156,1159,1161,1163,1165,1167,1169],{"class":211,"line":1149},35,[209,1151,795],{"class":269},[209,1153,539],{"class":588},[209,1155,542],{"class":219},[209,1157,1158],{"class":236},"POST \u002Fusers should validate body",[209,1160,542],{"class":219},[209,1162,288],{"class":219},[209,1164,809],{"class":252},[209,1166,552],{"class":219},[209,1168,555],{"class":252},[209,1170,558],{"class":219},[209,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206],{"class":211,"line":1173},36,[209,1175,821],{"class":252},[209,1177,824],{"class":223},[209,1179,606],{"class":219},[209,1181,262],{"class":215},[209,1183,567],{"class":223},[209,1185,193],{"class":219},[209,1187,835],{"class":269},[209,1189,539],{"class":588},[209,1191,542],{"class":219},[209,1193,1003],{"class":236},[209,1195,542],{"class":219},[209,1197,288],{"class":219},[209,1199,233],{"class":219},[209,1201,851],{"class":236},[209,1203,542],{"class":219},[209,1205,288],{"class":219},[209,1207,558],{"class":219},[209,1209,1211,1213,1215,1217,1220,1222,1226],{"class":211,"line":1210},37,[209,1212,1023],{"class":588},[209,1214,570],{"class":219},[209,1216,220],{"class":219},[209,1218,1219],{"class":588}," invalid",[209,1221,570],{"class":219},[209,1223,1225],{"class":1224},"sfNiH"," true",[209,1227,1055],{"class":219},[209,1229,1231,1233],{"class":211,"line":1230},38,[209,1232,1061],{"class":219},[209,1234,622],{"class":588},[209,1236,1238],{"class":211,"line":1237},39,[209,1239,246],{"emptyLinePlaceholder":245},[209,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1264],{"class":211,"line":1242},40,[209,1244,866],{"class":269},[209,1246,539],{"class":588},[209,1248,871],{"class":223},[209,1250,193],{"class":219},[209,1252,876],{"class":223},[209,1254,391],{"class":588},[209,1256,193],{"class":219},[209,1258,883],{"class":269},[209,1260,539],{"class":588},[209,1262,1263],{"class":665},"422",[209,1265,622],{"class":588},[209,1267,1269,1271],{"class":211,"line":1268},41,[209,1270,754],{"class":219},[209,1272,622],{"class":588},[209,1274,1276,1279],{"class":211,"line":1275},42,[209,1277,1278],{"class":219},"}",[209,1280,622],{"class":223},[195,1282,1284],{"id":1283},"unit-tests","Unit tests",[182,1286,1287],{},"Test individual services with mocked dependencies:",[200,1289,1291],{"className":202,"code":1290,"language":204,"meta":205,"style":205},"describe('UserService', () => {\n  let app: TestApp\n  let service: UserService\n\n  beforeAll(async () => {\n    app = await TestApp.create()\n      .provide(UserService)\n      .override(DatabaseService, {\n        query: () => [{ id: 1, name: 'Alice' }],\n      })\n      .compile()\n\n    service = app.resolve(UserService)\n  })\n\n  afterAll(() => app.close())\n\n  it('should find all users', async () => {\n    const result = await service.findAll()\n    expect(result).toEqual([{ id: 1, name: 'Alice' }])\n  })\n})\n",[186,1292,1293,1313,1323,1335,1339,1353,1369,1382,1397,1436,1442,1450,1454,1474,1480,1484,1502,1506,1529,1549,1590,1596],{"__ignoreMap":205},[209,1294,1295,1297,1299,1301,1303,1305,1307,1309,1311],{"class":211,"line":212},[209,1296,536],{"class":269},[209,1298,539],{"class":223},[209,1300,542],{"class":219},[209,1302,635],{"class":236},[209,1304,542],{"class":219},[209,1306,288],{"class":219},[209,1308,552],{"class":219},[209,1310,555],{"class":252},[209,1312,558],{"class":219},[209,1314,1315,1317,1319,1321],{"class":211,"line":242},[209,1316,564],{"class":252},[209,1318,567],{"class":223},[209,1320,570],{"class":219},[209,1322,574],{"class":573},[209,1324,1325,1327,1330,1332],{"class":211,"line":249},[209,1326,564],{"class":252},[209,1328,1329],{"class":223}," service",[209,1331,570],{"class":219},[209,1333,1334],{"class":573}," UserService\n",[209,1336,1337],{"class":211,"line":276},[209,1338,246],{"emptyLinePlaceholder":245},[209,1340,1341,1343,1345,1347,1349,1351],{"class":211,"line":294},[209,1342,585],{"class":269},[209,1344,539],{"class":588},[209,1346,591],{"class":252},[209,1348,552],{"class":219},[209,1350,555],{"class":252},[209,1352,558],{"class":219},[209,1354,1355,1357,1359,1361,1363,1365,1367],{"class":211,"line":561},[209,1356,603],{"class":223},[209,1358,606],{"class":219},[209,1360,262],{"class":215},[209,1362,224],{"class":223},[209,1364,193],{"class":219},[209,1366,270],{"class":269},[209,1368,302],{"class":588},[209,1370,1371,1373,1376,1378,1380],{"class":211,"line":577},[209,1372,628],{"class":219},[209,1374,1375],{"class":269},"provide",[209,1377,539],{"class":588},[209,1379,635],{"class":223},[209,1381,622],{"class":588},[209,1383,1384,1386,1388,1390,1393,1395],{"class":211,"line":582},[209,1385,628],{"class":219},[209,1387,282],{"class":269},[209,1389,539],{"class":588},[209,1391,1392],{"class":223},"DatabaseService",[209,1394,288],{"class":219},[209,1396,558],{"class":219},[209,1398,1399,1402,1404,1406,1408,1410,1412,1414,1416,1418,1420,1422,1424,1426,1428,1430,1432,1434],{"class":211,"line":600},[209,1400,1401],{"class":269},"        query",[209,1403,570],{"class":219},[209,1405,552],{"class":219},[209,1407,555],{"class":252},[209,1409,654],{"class":588},[209,1411,657],{"class":219},[209,1413,660],{"class":588},[209,1415,570],{"class":219},[209,1417,666],{"class":665},[209,1419,288],{"class":219},[209,1421,671],{"class":588},[209,1423,570],{"class":219},[209,1425,233],{"class":219},[209,1427,678],{"class":236},[209,1429,542],{"class":219},[209,1431,227],{"class":219},[209,1433,685],{"class":588},[209,1435,688],{"class":219},[209,1437,1438,1440],{"class":211,"line":625},[209,1439,737],{"class":219},[209,1441,622],{"class":588},[209,1443,1444,1446,1448],{"class":211,"line":642},[209,1445,628],{"class":219},[209,1447,299],{"class":269},[209,1449,302],{"class":588},[209,1451,1452],{"class":211,"line":691},[209,1453,246],{"emptyLinePlaceholder":245},[209,1455,1456,1459,1461,1463,1465,1468,1470,1472],{"class":211,"line":734},[209,1457,1458],{"class":223},"    service",[209,1460,606],{"class":219},[209,1462,567],{"class":223},[209,1464,193],{"class":219},[209,1466,1467],{"class":269},"resolve",[209,1469,539],{"class":588},[209,1471,635],{"class":223},[209,1473,622],{"class":588},[209,1475,1476,1478],{"class":211,"line":742},[209,1477,754],{"class":219},[209,1479,622],{"class":588},[209,1481,1482],{"class":211,"line":751},[209,1483,246],{"emptyLinePlaceholder":245},[209,1485,1486,1488,1490,1492,1494,1496,1498,1500],{"class":211,"line":759},[209,1487,767],{"class":269},[209,1489,539],{"class":588},[209,1491,772],{"class":219},[209,1493,555],{"class":252},[209,1495,567],{"class":223},[209,1497,193],{"class":219},[209,1499,781],{"class":269},[209,1501,784],{"class":588},[209,1503,1504],{"class":211,"line":764},[209,1505,246],{"emptyLinePlaceholder":245},[209,1507,1508,1510,1512,1514,1517,1519,1521,1523,1525,1527],{"class":211,"line":787},[209,1509,795],{"class":269},[209,1511,539],{"class":588},[209,1513,542],{"class":219},[209,1515,1516],{"class":236},"should find all users",[209,1518,542],{"class":219},[209,1520,288],{"class":219},[209,1522,809],{"class":252},[209,1524,552],{"class":219},[209,1526,555],{"class":252},[209,1528,558],{"class":219},[209,1530,1531,1533,1536,1538,1540,1542,1544,1547],{"class":211,"line":792},[209,1532,821],{"class":252},[209,1534,1535],{"class":223}," result",[209,1537,606],{"class":219},[209,1539,262],{"class":215},[209,1541,1329],{"class":223},[209,1543,193],{"class":219},[209,1545,1546],{"class":269},"findAll",[209,1548,302],{"class":588},[209,1550,1551,1553,1555,1558,1560,1562,1564,1566,1568,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588],{"class":211,"line":818},[209,1552,866],{"class":269},[209,1554,539],{"class":588},[209,1556,1557],{"class":223},"result",[209,1559,391],{"class":588},[209,1561,193],{"class":219},[209,1563,915],{"class":269},[209,1565,918],{"class":588},[209,1567,657],{"class":219},[209,1569,660],{"class":588},[209,1571,570],{"class":219},[209,1573,666],{"class":665},[209,1575,288],{"class":219},[209,1577,671],{"class":588},[209,1579,570],{"class":219},[209,1581,233],{"class":219},[209,1583,678],{"class":236},[209,1585,542],{"class":219},[209,1587,227],{"class":219},[209,1589,943],{"class":588},[209,1591,1592,1594],{"class":211,"line":858},[209,1593,754],{"class":219},[209,1595,622],{"class":588},[209,1597,1598,1600],{"class":211,"line":863},[209,1599,1278],{"class":219},[209,1601,622],{"class":223},[195,1603,1605],{"id":1604},"request-options","Request options",[182,1607,1608,1609,1612],{},"The ",[186,1610,1611],{},"request()"," method accepts an options object:",[200,1614,1616],{"className":202,"code":1615,"language":204,"meta":205,"style":205},"const res = await app.request('POST', '\u002Fapi\u002Fusers', {\n  body: { name: 'Alice' },\n  headers: {\n    'Authorization': 'Bearer my-token',\n    'X-Custom': 'value',\n  },\n  query: {\n    page: '1',\n    limit: '10',\n  },\n})\n",[186,1617,1618,1656,1677,1686,1707,1727,1732,1741,1757,1773,1777],{"__ignoreMap":205},[209,1619,1620,1622,1625,1627,1629,1631,1633,1635,1637,1639,1641,1643,1645,1647,1650,1652,1654],{"class":211,"line":212},[209,1621,253],{"class":252},[209,1623,1624],{"class":223}," res ",[209,1626,259],{"class":219},[209,1628,262],{"class":215},[209,1630,567],{"class":223},[209,1632,193],{"class":219},[209,1634,835],{"class":269},[209,1636,539],{"class":223},[209,1638,542],{"class":219},[209,1640,1003],{"class":236},[209,1642,542],{"class":219},[209,1644,288],{"class":219},[209,1646,233],{"class":219},[209,1648,1649],{"class":236},"\u002Fapi\u002Fusers",[209,1651,542],{"class":219},[209,1653,288],{"class":219},[209,1655,558],{"class":219},[209,1657,1658,1661,1663,1665,1667,1669,1671,1673,1675],{"class":211,"line":242},[209,1659,1660],{"class":588},"  body",[209,1662,570],{"class":219},[209,1664,220],{"class":219},[209,1666,671],{"class":588},[209,1668,570],{"class":219},[209,1670,233],{"class":219},[209,1672,678],{"class":236},[209,1674,542],{"class":219},[209,1676,1055],{"class":219},[209,1678,1679,1682,1684],{"class":211,"line":249},[209,1680,1681],{"class":588},"  headers",[209,1683,570],{"class":219},[209,1685,558],{"class":219},[209,1687,1688,1691,1694,1696,1698,1700,1703,1705],{"class":211,"line":276},[209,1689,1690],{"class":219},"    '",[209,1692,1693],{"class":588},"Authorization",[209,1695,542],{"class":219},[209,1697,570],{"class":219},[209,1699,233],{"class":219},[209,1701,1702],{"class":236},"Bearer my-token",[209,1704,542],{"class":219},[209,1706,688],{"class":219},[209,1708,1709,1711,1714,1716,1718,1720,1723,1725],{"class":211,"line":294},[209,1710,1690],{"class":219},[209,1712,1713],{"class":588},"X-Custom",[209,1715,542],{"class":219},[209,1717,570],{"class":219},[209,1719,233],{"class":219},[209,1721,1722],{"class":236},"value",[209,1724,542],{"class":219},[209,1726,688],{"class":219},[209,1728,1729],{"class":211,"line":561},[209,1730,1731],{"class":219},"  },\n",[209,1733,1734,1737,1739],{"class":211,"line":577},[209,1735,1736],{"class":588},"  query",[209,1738,570],{"class":219},[209,1740,558],{"class":219},[209,1742,1743,1746,1748,1750,1753,1755],{"class":211,"line":582},[209,1744,1745],{"class":588},"    page",[209,1747,570],{"class":219},[209,1749,233],{"class":219},[209,1751,1752],{"class":236},"1",[209,1754,542],{"class":219},[209,1756,688],{"class":219},[209,1758,1759,1762,1764,1766,1769,1771],{"class":211,"line":600},[209,1760,1761],{"class":588},"    limit",[209,1763,570],{"class":219},[209,1765,233],{"class":219},[209,1767,1768],{"class":236},"10",[209,1770,542],{"class":219},[209,1772,688],{"class":219},[209,1774,1775],{"class":211,"line":625},[209,1776,1731],{"class":219},[209,1778,1779,1781],{"class":211,"line":642},[209,1780,1278],{"class":219},[209,1782,622],{"class":223},[309,1784,1785,1797],{},[312,1786,1787],{},[315,1788,1789,1792,1795],{},[318,1790,1791],{},"Option",[318,1793,1794],{},"Type",[318,1796,323],{},[325,1798,1799,1814,1829],{},[315,1800,1801,1806,1811],{},[330,1802,1803],{},[186,1804,1805],{},"body",[330,1807,1808],{},[186,1809,1810],{},"any",[330,1812,1813],{},"Request body (auto-serialized to JSON)",[315,1815,1816,1821,1826],{},[330,1817,1818],{},[186,1819,1820],{},"headers",[330,1822,1823],{},[186,1824,1825],{},"Record\u003Cstring, string>",[330,1827,1828],{},"Request headers",[315,1830,1831,1836,1840],{},[330,1832,1833],{},[186,1834,1835],{},"query",[330,1837,1838],{},[186,1839,1825],{},[330,1841,1842],{},"Query parameters",[195,1844,1846],{"id":1845},"testing-with-auth","Testing with auth",[200,1848,1850],{"className":202,"code":1849,"language":204,"meta":205,"style":205},"import { JwtService } from '@miiajs\u002Fauth\u002Fjwt'\n\ndescribe('Protected routes', () => {\n  let app: TestApp\n  let token: string\n\n  beforeAll(async () => {\n    app = await TestApp.create(AppModule)\n      .override(UserService, mockUserService)\n      .compile()\n\n    const jwt = app.resolve(JwtService)\n    token = await jwt.sign({ sub: '1', role: 'admin' })\n  })\n\n  it('should reject unauthenticated requests', async () => {\n    const res = await app.request('GET', '\u002Fapi\u002Fusers\u002F1')\n    expect(res.status).toBe(401)\n  })\n\n  it('should allow authenticated requests', async () => {\n    const res = await app.request('GET', '\u002Fapi\u002Fusers\u002F1', {\n      headers: { Authorization: `Bearer ${token}` },\n    })\n    expect(res.status).toBe(200)\n  })\n})\n",[186,1851,1852,1872,1876,1897,1907,1919,1923,1937,1957,1974,1982,1986,2008,2057,2063,2067,2090,2125,2150,2156,2160,2183,2219,2250,2256,2280,2286],{"__ignoreMap":205},[209,1853,1854,1856,1858,1861,1863,1865,1867,1870],{"class":211,"line":212},[209,1855,216],{"class":215},[209,1857,220],{"class":219},[209,1859,1860],{"class":223}," JwtService",[209,1862,227],{"class":219},[209,1864,230],{"class":215},[209,1866,233],{"class":219},[209,1868,1869],{"class":236},"@miiajs\u002Fauth\u002Fjwt",[209,1871,239],{"class":219},[209,1873,1874],{"class":211,"line":242},[209,1875,246],{"emptyLinePlaceholder":245},[209,1877,1878,1880,1882,1884,1887,1889,1891,1893,1895],{"class":211,"line":249},[209,1879,536],{"class":269},[209,1881,539],{"class":223},[209,1883,542],{"class":219},[209,1885,1886],{"class":236},"Protected routes",[209,1888,542],{"class":219},[209,1890,288],{"class":219},[209,1892,552],{"class":219},[209,1894,555],{"class":252},[209,1896,558],{"class":219},[209,1898,1899,1901,1903,1905],{"class":211,"line":276},[209,1900,564],{"class":252},[209,1902,567],{"class":223},[209,1904,570],{"class":219},[209,1906,574],{"class":573},[209,1908,1909,1911,1914,1916],{"class":211,"line":294},[209,1910,564],{"class":252},[209,1912,1913],{"class":223}," token",[209,1915,570],{"class":219},[209,1917,1918],{"class":573}," string\n",[209,1920,1921],{"class":211,"line":561},[209,1922,246],{"emptyLinePlaceholder":245},[209,1924,1925,1927,1929,1931,1933,1935],{"class":211,"line":577},[209,1926,585],{"class":269},[209,1928,539],{"class":588},[209,1930,591],{"class":252},[209,1932,552],{"class":219},[209,1934,555],{"class":252},[209,1936,558],{"class":219},[209,1938,1939,1941,1943,1945,1947,1949,1951,1953,1955],{"class":211,"line":582},[209,1940,603],{"class":223},[209,1942,606],{"class":219},[209,1944,262],{"class":215},[209,1946,224],{"class":223},[209,1948,193],{"class":219},[209,1950,270],{"class":269},[209,1952,539],{"class":588},[209,1954,619],{"class":223},[209,1956,622],{"class":588},[209,1958,1959,1961,1963,1965,1967,1969,1972],{"class":211,"line":600},[209,1960,628],{"class":219},[209,1962,282],{"class":269},[209,1964,539],{"class":588},[209,1966,635],{"class":223},[209,1968,288],{"class":219},[209,1970,1971],{"class":223}," mockUserService",[209,1973,622],{"class":588},[209,1975,1976,1978,1980],{"class":211,"line":625},[209,1977,628],{"class":219},[209,1979,299],{"class":269},[209,1981,302],{"class":588},[209,1983,1984],{"class":211,"line":642},[209,1985,246],{"emptyLinePlaceholder":245},[209,1987,1988,1990,1993,1995,1997,1999,2001,2003,2006],{"class":211,"line":691},[209,1989,821],{"class":252},[209,1991,1992],{"class":223}," jwt",[209,1994,606],{"class":219},[209,1996,567],{"class":223},[209,1998,193],{"class":219},[209,2000,1467],{"class":269},[209,2002,539],{"class":588},[209,2004,2005],{"class":223},"JwtService",[209,2007,622],{"class":588},[209,2009,2010,2013,2015,2017,2019,2021,2024,2026,2028,2031,2033,2035,2037,2039,2041,2044,2046,2048,2051,2053,2055],{"class":211,"line":734},[209,2011,2012],{"class":223},"    token",[209,2014,606],{"class":219},[209,2016,262],{"class":215},[209,2018,1992],{"class":223},[209,2020,193],{"class":219},[209,2022,2023],{"class":269},"sign",[209,2025,539],{"class":588},[209,2027,657],{"class":219},[209,2029,2030],{"class":588}," sub",[209,2032,570],{"class":219},[209,2034,233],{"class":219},[209,2036,1752],{"class":236},[209,2038,542],{"class":219},[209,2040,288],{"class":219},[209,2042,2043],{"class":588}," role",[209,2045,570],{"class":219},[209,2047,233],{"class":219},[209,2049,2050],{"class":236},"admin",[209,2052,542],{"class":219},[209,2054,227],{"class":219},[209,2056,622],{"class":588},[209,2058,2059,2061],{"class":211,"line":742},[209,2060,754],{"class":219},[209,2062,622],{"class":588},[209,2064,2065],{"class":211,"line":751},[209,2066,246],{"emptyLinePlaceholder":245},[209,2068,2069,2071,2073,2075,2078,2080,2082,2084,2086,2088],{"class":211,"line":759},[209,2070,795],{"class":269},[209,2072,539],{"class":588},[209,2074,542],{"class":219},[209,2076,2077],{"class":236},"should reject unauthenticated requests",[209,2079,542],{"class":219},[209,2081,288],{"class":219},[209,2083,809],{"class":252},[209,2085,552],{"class":219},[209,2087,555],{"class":252},[209,2089,558],{"class":219},[209,2091,2092,2094,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118,2121,2123],{"class":211,"line":764},[209,2093,821],{"class":252},[209,2095,824],{"class":223},[209,2097,606],{"class":219},[209,2099,262],{"class":215},[209,2101,567],{"class":223},[209,2103,193],{"class":219},[209,2105,835],{"class":269},[209,2107,539],{"class":588},[209,2109,542],{"class":219},[209,2111,842],{"class":236},[209,2113,542],{"class":219},[209,2115,288],{"class":219},[209,2117,233],{"class":219},[209,2119,2120],{"class":236},"\u002Fapi\u002Fusers\u002F1",[209,2122,542],{"class":219},[209,2124,622],{"class":588},[209,2126,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145,2148],{"class":211,"line":787},[209,2128,866],{"class":269},[209,2130,539],{"class":588},[209,2132,871],{"class":223},[209,2134,193],{"class":219},[209,2136,876],{"class":223},[209,2138,391],{"class":588},[209,2140,193],{"class":219},[209,2142,883],{"class":269},[209,2144,539],{"class":588},[209,2146,2147],{"class":665},"401",[209,2149,622],{"class":588},[209,2151,2152,2154],{"class":211,"line":792},[209,2153,754],{"class":219},[209,2155,622],{"class":588},[209,2157,2158],{"class":211,"line":818},[209,2159,246],{"emptyLinePlaceholder":245},[209,2161,2162,2164,2166,2168,2171,2173,2175,2177,2179,2181],{"class":211,"line":858},[209,2163,795],{"class":269},[209,2165,539],{"class":588},[209,2167,542],{"class":219},[209,2169,2170],{"class":236},"should allow authenticated requests",[209,2172,542],{"class":219},[209,2174,288],{"class":219},[209,2176,809],{"class":252},[209,2178,552],{"class":219},[209,2180,555],{"class":252},[209,2182,558],{"class":219},[209,2184,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211,2213,2215,2217],{"class":211,"line":863},[209,2186,821],{"class":252},[209,2188,824],{"class":223},[209,2190,606],{"class":219},[209,2192,262],{"class":215},[209,2194,567],{"class":223},[209,2196,193],{"class":219},[209,2198,835],{"class":269},[209,2200,539],{"class":588},[209,2202,542],{"class":219},[209,2204,842],{"class":236},[209,2206,542],{"class":219},[209,2208,288],{"class":219},[209,2210,233],{"class":219},[209,2212,2120],{"class":236},[209,2214,542],{"class":219},[209,2216,288],{"class":219},[209,2218,558],{"class":219},[209,2220,2221,2224,2226,2228,2231,2233,2236,2239,2242,2245,2248],{"class":211,"line":893},[209,2222,2223],{"class":588},"      headers",[209,2225,570],{"class":219},[209,2227,220],{"class":219},[209,2229,2230],{"class":588}," Authorization",[209,2232,570],{"class":219},[209,2234,2235],{"class":219}," `",[209,2237,2238],{"class":236},"Bearer ",[209,2240,2241],{"class":219},"${",[209,2243,2244],{"class":223},"token",[209,2246,2247],{"class":219},"}`",[209,2249,1055],{"class":219},[209,2251,2252,2254],{"class":211,"line":946},[209,2253,1061],{"class":219},[209,2255,622],{"class":588},[209,2257,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278],{"class":211,"line":953},[209,2259,866],{"class":269},[209,2261,539],{"class":588},[209,2263,871],{"class":223},[209,2265,193],{"class":219},[209,2267,876],{"class":223},[209,2269,391],{"class":588},[209,2271,193],{"class":219},[209,2273,883],{"class":269},[209,2275,539],{"class":588},[209,2277,888],{"class":665},[209,2279,622],{"class":588},[209,2281,2282,2284],{"class":211,"line":958},[209,2283,754],{"class":219},[209,2285,622],{"class":588},[209,2287,2288,2290],{"class":211,"line":982},[209,2289,1278],{"class":219},[209,2291,622],{"class":223},[2293,2294,2295],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":205,"searchDepth":242,"depth":242,"links":2297},[2298,2302,2303,2304,2305],{"id":197,"depth":242,"text":198,"children":2299},[2300,2301],{"id":306,"depth":249,"text":307},{"id":394,"depth":249,"text":395},{"id":440,"depth":242,"text":441},{"id":1283,"depth":242,"text":1284},{"id":1604,"depth":242,"text":1605},{"id":1845,"depth":242,"text":1846},"Test your application with the built-in TestApp utility.","md",{},{"title":33,"description":2306},"SeWnFpamDuDKpPH9qOD3eurv4_cimRUKUmR7S-w4STQ",[2312,2314],{"title":29,"path":30,"stem":31,"description":2313,"children":-1},"Build HTTP responses with the fluent ResponseBuilder API.",{"title":27,"path":38,"stem":39,"description":2315,"children":-1},"How decorators work in MiiaJS - TC39 native, Symbol.metadata, and the catalogue of built-ins.",1778575270760]