[{"data":1,"prerenderedAt":1155},["ShallowReactive",2],{"navigation_docs":3,"-guides-testing":152,"-guides-testing-surround":1150},[4,42,68,110,131],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,12,17,22,27,32,37],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-sparkles",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F2.configuration","i-lucide-settings",{"title":23,"path":24,"stem":25,"icon":26},"Client Setup","\u002Fgetting-started\u002Fclient-setup","1.getting-started\u002F3.client-setup","i-lucide-monitor",{"title":28,"path":29,"stem":30,"icon":31},"Type Augmentation","\u002Fgetting-started\u002Ftype-augmentation","1.getting-started\u002F4.type-augmentation","i-lucide-type",{"title":33,"path":34,"stem":35,"icon":36},"Schema Generation (NuxtHub)","\u002Fgetting-started\u002Fschema-generation","1.getting-started\u002F5.schema-generation","i-lucide-database",{"title":38,"path":39,"stem":40,"icon":41},"How It Works","\u002Fgetting-started\u002Fhow-it-works","1.getting-started\u002F6.how-it-works","i-lucide-workflow",{"title":43,"path":44,"stem":45,"children":46,"page":67},"Core Concepts","\u002Fcore-concepts","2.core-concepts",[47,51,55,59,63],{"title":48,"path":49,"stem":50},"serverAuth()","\u002Fcore-concepts\u002Fserver-auth","2.core-concepts\u002F1.server-auth",{"title":52,"path":53,"stem":54},"Sessions","\u002Fcore-concepts\u002Fsessions","2.core-concepts\u002F2.sessions",{"title":56,"path":57,"stem":58},"Route Protection","\u002Fcore-concepts\u002Froute-protection","2.core-concepts\u002F3.route-protection",{"title":60,"path":61,"stem":62},"Auto‑Imports and Aliases","\u002Fcore-concepts\u002Fauto-imports-aliases","2.core-concepts\u002F4.auto-imports-aliases",{"title":64,"path":65,"stem":66},"Security & Caveats","\u002Fcore-concepts\u002Fsecurity-caveats","2.core-concepts\u002F5.security-caveats",false,{"title":69,"path":70,"stem":71,"children":72,"page":67},"Guides","\u002Fguides","3.guides",[73,77,81,85,89,94,98,102,106],{"title":74,"path":75,"stem":76},"Role‑Based Access","\u002Fguides\u002Frole-based-access","3.guides\u002F1.role-based-access",{"title":78,"path":79,"stem":80},"OAuth Providers","\u002Fguides\u002Foauth-providers","3.guides\u002F2.oauth-providers",{"title":82,"path":83,"stem":84},"Custom Database","\u002Fguides\u002Fcustom-database","3.guides\u002F3.custom-database",{"title":86,"path":87,"stem":88},"Database-less Mode","\u002Fguides\u002Fdatabase-less-mode","3.guides\u002F4.database-less-mode",{"title":90,"path":91,"stem":92,"icon":93},"External Auth Backend","\u002Fguides\u002Fexternal-auth-backend","3.guides\u002F5.external-auth-backend","i-lucide-server",{"title":95,"path":96,"stem":97},"Migrating from nuxt-auth-utils","\u002Fguides\u002Fmigrate-from-nuxt-auth-utils","3.guides\u002F6.migrate-from-nuxt-auth-utils",{"title":99,"path":100,"stem":101},"Two-Factor Authentication (TOTP + Backup Codes)","\u002Fguides\u002Ftwo-factor-auth","3.guides\u002F7.two-factor-auth",{"title":103,"path":104,"stem":105},"Testing","\u002Fguides\u002Ftesting","3.guides\u002F8.testing",{"title":107,"path":108,"stem":109},"Production Deployment","\u002Fguides\u002Fproduction-deployment","3.guides\u002F9.production-deployment",{"title":111,"path":112,"stem":113,"children":114,"page":67},"Integrations","\u002Fintegrations","4.integrations",[115,119,123,127],{"title":116,"path":117,"stem":118},"NuxtHub","\u002Fintegrations\u002Fnuxthub","4.integrations\u002F1.nuxthub",{"title":120,"path":121,"stem":122},"DevTools","\u002Fintegrations\u002Fdevtools","4.integrations\u002F2.devtools",{"title":124,"path":125,"stem":126},"Convex","\u002Fintegrations\u002Fconvex","4.integrations\u002F3.convex",{"title":128,"path":129,"stem":130},"i18n","\u002Fintegrations\u002Fi18n","4.integrations\u002F4.i18n",{"title":132,"path":133,"stem":134,"children":135,"page":67},"API Reference","\u002Fapi","5.api",[136,140,144,148],{"title":137,"path":138,"stem":139},"Composables","\u002Fapi\u002Fcomposables","5.api\u002F1.composables",{"title":141,"path":142,"stem":143},"Server Utilities","\u002Fapi\u002Fserver-utils","5.api\u002F2.server-utils",{"title":145,"path":146,"stem":147},"Components","\u002Fapi\u002Fcomponents","5.api\u002F3.components",{"title":149,"path":150,"stem":151},"Types","\u002Fapi\u002Ftypes","5.api\u002F4.types",{"id":153,"title":103,"body":154,"description":1144,"extension":1145,"links":1146,"meta":1147,"navigation":276,"path":104,"seo":1148,"stem":105,"__hash__":1149},"docs\u002F3.guides\u002F8.testing.md",{"type":155,"value":156,"toc":1140},"minimark",[157,169,174,189,192,317,320,776,808,812,819,905,908,1132,1136],[158,159,160,161,168],"p",{},"Use Nuxt's runtime test environment for components and composables. Use its end-to-end test environment for HTTP requests to a running application. See ",[162,163,167],"a",{"href":164,"rel":165},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fgetting-started\u002Ftesting",[166],"nofollow","Nuxt's testing setup"," for the Vitest configuration for each environment.",[170,171,173],"h2",{"id":172},"mocking-useusersession","Mocking useUserSession",[158,175,176,180,181,184,185,188],{},[177,178,179],"code",{},"mockNuxtImport"," is hoisted. Register it once at the top level of the test file and create the mock with ",[177,182,183],{},"vi.hoisted",". Set its return value in ",[177,186,187],{},"beforeEach"," so each test receives fresh state.",[158,190,191],{},"For example, this component reads the signed-in state:",[193,194,200],"pre",{"className":195,"code":196,"filename":197,"language":198,"meta":199,"style":199},"language-vue shiki shiki-themes one-light synthwave-84 synthwave-84","\u003Cscript setup lang=\"ts\">\nconst { loggedIn } = useUserSession()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cp>{{ loggedIn ? 'Signed in' : 'Signed out' }}\u003C\u002Fp>\n\u003C\u002Ftemplate>\n","app\u002Fcomponents\u002FAuthStatus.vue","vue","",[177,201,202,233,261,271,278,288,308],{"__ignoreMap":199},[203,204,207,211,215,219,222,226,230],"span",{"class":205,"line":206},"line",1,[203,208,210],{"class":209},"sL9le","\u003C",[203,212,214],{"class":213},"stweg","script",[203,216,218],{"class":217},"s0frj"," setup",[203,220,221],{"class":217}," lang",[203,223,225],{"class":224},"sNM9w","=",[203,227,229],{"class":228},"sPAZv","\"ts\"",[203,231,232],{"class":209},">\n",[203,234,236,240,244,248,251,254,258],{"class":205,"line":235},2,[203,237,239],{"class":238},"sqe1H","const",[203,241,243],{"class":242},"sEEOt"," { ",[203,245,247],{"class":246},"s6Rhl","loggedIn",[203,249,250],{"class":242}," } ",[203,252,225],{"class":253},"sQBpM",[203,255,257],{"class":256},"sfT9l"," useUserSession",[203,259,260],{"class":242},"()\n",[203,262,264,267,269],{"class":205,"line":263},3,[203,265,266],{"class":209},"\u003C\u002F",[203,268,214],{"class":213},[203,270,232],{"class":209},[203,272,274],{"class":205,"line":273},4,[203,275,277],{"emptyLinePlaceholder":276},true,"\n",[203,279,281,283,286],{"class":205,"line":280},5,[203,282,210],{"class":209},[203,284,285],{"class":213},"template",[203,287,232],{"class":209},[203,289,291,294,296,299,302,304,306],{"class":205,"line":290},6,[203,292,293],{"class":209},"  \u003C",[203,295,158],{"class":213},[203,297,298],{"class":209},">",[203,300,301],{"class":242},"{{ loggedIn ? 'Signed in' : 'Signed out' }}",[203,303,266],{"class":209},[203,305,158],{"class":213},[203,307,232],{"class":209},[203,309,311,313,315],{"class":205,"line":310},7,[203,312,266],{"class":209},[203,314,285],{"class":213},[203,316,232],{"class":209},[158,318,319],{},"Test it in the Nuxt runtime environment:",[193,321,326],{"className":322,"code":323,"filename":324,"language":325,"meta":199,"style":199},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","import { mockNuxtImport, mountSuspended } from '@nuxt\u002Ftest-utils\u002Fruntime'\nimport { beforeEach, describe, expect, it, vi } from 'vitest'\nimport { ref } from 'vue'\nimport AuthStatus from '~\u002Fcomponents\u002FAuthStatus.vue'\n\nconst { useUserSessionMock } = vi.hoisted(() => ({\n  useUserSessionMock: vi.fn(),\n}))\n\nmockNuxtImport('useUserSession', () => useUserSessionMock)\n\nbeforeEach(() => {\n  useUserSessionMock.mockReset()\n  useUserSessionMock.mockReturnValue({ loggedIn: ref(false) })\n})\n\ndescribe('AuthStatus', () => {\n  it('shows the signed-out state', async () => {\n    const component = await mountSuspended(AuthStatus)\n    expect(component.text()).toBe('Signed out')\n  })\n\n  it('shows the signed-in state', async () => {\n    useUserSessionMock.mockReturnValue({ loggedIn: ref(true) })\n    const component = await mountSuspended(AuthStatus)\n    expect(component.text()).toBe('Signed in')\n  })\n})\n","tests\u002Fnuxt\u002Fauth-status.nuxt.spec.ts","ts",[177,327,328,353,388,404,417,421,453,472,478,483,505,510,522,534,563,569,574,590,613,638,667,673,678,698,723,742,766,771],{"__ignoreMap":199},[203,329,330,333,336,339,342,345,347,350],{"class":205,"line":206},[203,331,332],{"class":238},"import",[203,334,243],{"class":335},"s17Py",[203,337,179],{"class":338},"sYvLG",[203,340,341],{"class":335},", ",[203,343,344],{"class":338},"mountSuspended",[203,346,250],{"class":335},[203,348,349],{"class":238},"from",[203,351,352],{"class":228}," '@nuxt\u002Ftest-utils\u002Fruntime'\n",[203,354,355,357,359,361,363,366,368,371,373,376,378,381,383,385],{"class":205,"line":235},[203,356,332],{"class":238},[203,358,243],{"class":335},[203,360,187],{"class":338},[203,362,341],{"class":335},[203,364,365],{"class":338},"describe",[203,367,341],{"class":335},[203,369,370],{"class":338},"expect",[203,372,341],{"class":335},[203,374,375],{"class":338},"it",[203,377,341],{"class":335},[203,379,380],{"class":338},"vi",[203,382,250],{"class":335},[203,384,349],{"class":238},[203,386,387],{"class":228}," 'vitest'\n",[203,389,390,392,394,397,399,401],{"class":205,"line":263},[203,391,332],{"class":238},[203,393,243],{"class":335},[203,395,396],{"class":338},"ref",[203,398,250],{"class":335},[203,400,349],{"class":238},[203,402,403],{"class":228}," 'vue'\n",[203,405,406,408,411,414],{"class":205,"line":273},[203,407,332],{"class":238},[203,409,410],{"class":338}," AuthStatus",[203,412,413],{"class":238}," from",[203,415,416],{"class":228}," '~\u002Fcomponents\u002FAuthStatus.vue'\n",[203,418,419],{"class":205,"line":280},[203,420,277],{"emptyLinePlaceholder":276},[203,422,423,425,427,430,432,434,438,441,444,447,450],{"class":205,"line":290},[203,424,239],{"class":238},[203,426,243],{"class":335},[203,428,429],{"class":246},"useUserSessionMock",[203,431,250],{"class":335},[203,433,225],{"class":253},[203,435,437],{"class":436},"svFNh"," vi",[203,439,440],{"class":335},".",[203,442,443],{"class":256},"hoisted",[203,445,446],{"class":335},"(() ",[203,448,449],{"class":238},"=>",[203,451,452],{"class":335}," ({\n",[203,454,455,458,462,464,466,469],{"class":205,"line":310},[203,456,457],{"class":338},"  useUserSessionMock",[203,459,461],{"class":460},"sVnqq",":",[203,463,437],{"class":436},[203,465,440],{"class":335},[203,467,468],{"class":256},"fn",[203,470,471],{"class":335},"(),\n",[203,473,475],{"class":205,"line":474},8,[203,476,477],{"class":335},"}))\n",[203,479,481],{"class":205,"line":480},9,[203,482,277],{"emptyLinePlaceholder":276},[203,484,486,488,491,494,497,499,502],{"class":205,"line":485},10,[203,487,179],{"class":256},[203,489,490],{"class":335},"(",[203,492,493],{"class":228},"'useUserSession'",[203,495,496],{"class":335},", () ",[203,498,449],{"class":238},[203,500,501],{"class":436}," useUserSessionMock",[203,503,504],{"class":335},")\n",[203,506,508],{"class":205,"line":507},11,[203,509,277],{"emptyLinePlaceholder":276},[203,511,513,515,517,519],{"class":205,"line":512},12,[203,514,187],{"class":256},[203,516,446],{"class":335},[203,518,449],{"class":238},[203,520,521],{"class":335}," {\n",[203,523,525,527,529,532],{"class":205,"line":524},13,[203,526,457],{"class":436},[203,528,440],{"class":335},[203,530,531],{"class":256},"mockReset",[203,533,260],{"class":335},[203,535,537,539,541,544,547,549,551,554,556,560],{"class":205,"line":536},14,[203,538,457],{"class":436},[203,540,440],{"class":335},[203,542,543],{"class":256},"mockReturnValue",[203,545,546],{"class":335},"({ ",[203,548,247],{"class":338},[203,550,461],{"class":460},[203,552,553],{"class":256}," ref",[203,555,490],{"class":335},[203,557,559],{"class":558},"s3ZNE","false",[203,561,562],{"class":335},") })\n",[203,564,566],{"class":205,"line":565},15,[203,567,568],{"class":335},"})\n",[203,570,572],{"class":205,"line":571},16,[203,573,277],{"emptyLinePlaceholder":276},[203,575,577,579,581,584,586,588],{"class":205,"line":576},17,[203,578,365],{"class":256},[203,580,490],{"class":335},[203,582,583],{"class":228},"'AuthStatus'",[203,585,496],{"class":335},[203,587,449],{"class":238},[203,589,521],{"class":335},[203,591,593,596,598,601,603,606,609,611],{"class":205,"line":592},18,[203,594,595],{"class":256},"  it",[203,597,490],{"class":335},[203,599,600],{"class":228},"'shows the signed-out state'",[203,602,341],{"class":335},[203,604,605],{"class":238},"async",[203,607,608],{"class":335}," () ",[203,610,449],{"class":238},[203,612,521],{"class":335},[203,614,616,619,622,625,628,631,633,636],{"class":205,"line":615},19,[203,617,618],{"class":238},"    const",[203,620,621],{"class":246}," component",[203,623,624],{"class":253}," =",[203,626,627],{"class":238}," await",[203,629,630],{"class":256}," mountSuspended",[203,632,490],{"class":335},[203,634,635],{"class":436},"AuthStatus",[203,637,504],{"class":335},[203,639,641,644,646,649,651,654,657,660,662,665],{"class":205,"line":640},20,[203,642,643],{"class":256},"    expect",[203,645,490],{"class":335},[203,647,648],{"class":436},"component",[203,650,440],{"class":335},[203,652,653],{"class":256},"text",[203,655,656],{"class":335},"()).",[203,658,659],{"class":256},"toBe",[203,661,490],{"class":335},[203,663,664],{"class":228},"'Signed out'",[203,666,504],{"class":335},[203,668,670],{"class":205,"line":669},21,[203,671,672],{"class":335},"  })\n",[203,674,676],{"class":205,"line":675},22,[203,677,277],{"emptyLinePlaceholder":276},[203,679,681,683,685,688,690,692,694,696],{"class":205,"line":680},23,[203,682,595],{"class":256},[203,684,490],{"class":335},[203,686,687],{"class":228},"'shows the signed-in state'",[203,689,341],{"class":335},[203,691,605],{"class":238},[203,693,608],{"class":335},[203,695,449],{"class":238},[203,697,521],{"class":335},[203,699,701,704,706,708,710,712,714,716,718,721],{"class":205,"line":700},24,[203,702,703],{"class":436},"    useUserSessionMock",[203,705,440],{"class":335},[203,707,543],{"class":256},[203,709,546],{"class":335},[203,711,247],{"class":338},[203,713,461],{"class":460},[203,715,553],{"class":256},[203,717,490],{"class":335},[203,719,720],{"class":558},"true",[203,722,562],{"class":335},[203,724,726,728,730,732,734,736,738,740],{"class":205,"line":725},25,[203,727,618],{"class":238},[203,729,621],{"class":246},[203,731,624],{"class":253},[203,733,627],{"class":238},[203,735,630],{"class":256},[203,737,490],{"class":335},[203,739,635],{"class":436},[203,741,504],{"class":335},[203,743,745,747,749,751,753,755,757,759,761,764],{"class":205,"line":744},26,[203,746,643],{"class":256},[203,748,490],{"class":335},[203,750,648],{"class":436},[203,752,440],{"class":335},[203,754,653],{"class":256},[203,756,656],{"class":335},[203,758,659],{"class":256},[203,760,490],{"class":335},[203,762,763],{"class":228},"'Signed in'",[203,765,504],{"class":335},[203,767,769],{"class":205,"line":768},27,[203,770,672],{"class":335},[203,772,774],{"class":205,"line":773},28,[203,775,568],{"class":335},[158,777,778,779,341,782,341,785,788,789,792,793,796,797,800,801,796,804,807],{},"This mock supplies the field the component reads. Add ",[177,780,781],{},"user",[177,783,784],{},"session",[177,786,787],{},"ready",", or methods when the component uses them. ",[177,790,791],{},"useUserSession"," does not return ",[177,794,795],{},"signIn"," or ",[177,798,799],{},"signUp","; mock ",[177,802,803],{},"useSignIn",[177,805,806],{},"useSignUp"," separately when testing an authentication action.",[170,809,811],{"id":810},"testing-protected-api-routes","Testing protected API routes",[158,813,814,815,818],{},"Run HTTP tests against a prepared Nuxt fixture. For example, create a minimal application in ",[177,816,817],{},"tests\u002Ffixtures\u002Fauth"," with the module configured and this route:",[193,820,823],{"className":322,"code":821,"filename":822,"language":325,"meta":199,"style":199},"export default defineEventHandler(async (event) => {\n  const { user } = await requireUserSession(event)\n  return { id: user.id }\n})\n","tests\u002Ffixtures\u002Fauth\u002Fserver\u002Fapi\u002Fprotected.get.ts",[177,824,825,855,879,901],{"__ignoreMap":199},[203,826,827,830,834,837,839,841,844,848,851,853],{"class":205,"line":206},[203,828,829],{"class":238},"export",[203,831,833],{"class":832},"sKg8T"," default",[203,835,836],{"class":256}," defineEventHandler",[203,838,490],{"class":335},[203,840,605],{"class":238},[203,842,843],{"class":335}," (",[203,845,847],{"class":846},"sgisi","event",[203,849,850],{"class":335},") ",[203,852,449],{"class":238},[203,854,521],{"class":335},[203,856,857,860,862,864,866,868,870,873,875,877],{"class":205,"line":235},[203,858,859],{"class":238},"  const",[203,861,243],{"class":335},[203,863,781],{"class":246},[203,865,250],{"class":335},[203,867,225],{"class":253},[203,869,627],{"class":238},[203,871,872],{"class":256}," requireUserSession",[203,874,490],{"class":335},[203,876,847],{"class":338},[203,878,504],{"class":335},[203,880,881,884,886,889,891,894,896,898],{"class":205,"line":263},[203,882,883],{"class":238},"  return",[203,885,243],{"class":335},[203,887,888],{"class":338},"id",[203,890,461],{"class":460},[203,892,893],{"class":436}," user",[203,895,440],{"class":335},[203,897,888],{"class":338},[203,899,900],{"class":335}," }\n",[203,902,903],{"class":205,"line":273},[203,904,568],{"class":335},[158,906,907],{},"The end-to-end setup builds and starts that fixture. Use the response's HTTP status to verify access is denied:",[193,909,912],{"className":322,"code":910,"filename":911,"language":325,"meta":199,"style":199},"import { fileURLToPath } from 'node:url'\nimport { setup, url } from '@nuxt\u002Ftest-utils\u002Fe2e'\nimport { describe, expect, it } from 'vitest'\n\ndescribe('GET \u002Fapi\u002Fprotected', async () => {\n  await setup({\n    rootDir: fileURLToPath(new URL('..\u002Ffixtures\u002Fauth', import.meta.url)),\n  })\n\n  it('returns 401 without a session', async () => {\n    const response = await fetch(url('\u002Fapi\u002Fprotected'))\n    expect(response.status).toBe(401)\n  })\n})\n","tests\u002Fe2e\u002Fprotected.test.ts",[177,913,914,930,951,973,977,996,1006,1045,1049,1053,1072,1098,1124,1128],{"__ignoreMap":199},[203,915,916,918,920,923,925,927],{"class":205,"line":206},[203,917,332],{"class":238},[203,919,243],{"class":335},[203,921,922],{"class":338},"fileURLToPath",[203,924,250],{"class":335},[203,926,349],{"class":238},[203,928,929],{"class":228}," 'node:url'\n",[203,931,932,934,936,939,941,944,946,948],{"class":205,"line":235},[203,933,332],{"class":238},[203,935,243],{"class":335},[203,937,938],{"class":338},"setup",[203,940,341],{"class":335},[203,942,943],{"class":338},"url",[203,945,250],{"class":335},[203,947,349],{"class":238},[203,949,950],{"class":228}," '@nuxt\u002Ftest-utils\u002Fe2e'\n",[203,952,953,955,957,959,961,963,965,967,969,971],{"class":205,"line":263},[203,954,332],{"class":238},[203,956,243],{"class":335},[203,958,365],{"class":338},[203,960,341],{"class":335},[203,962,370],{"class":338},[203,964,341],{"class":335},[203,966,375],{"class":338},[203,968,250],{"class":335},[203,970,349],{"class":238},[203,972,387],{"class":228},[203,974,975],{"class":205,"line":273},[203,976,277],{"emptyLinePlaceholder":276},[203,978,979,981,983,986,988,990,992,994],{"class":205,"line":280},[203,980,365],{"class":256},[203,982,490],{"class":335},[203,984,985],{"class":228},"'GET \u002Fapi\u002Fprotected'",[203,987,341],{"class":335},[203,989,605],{"class":238},[203,991,608],{"class":335},[203,993,449],{"class":238},[203,995,521],{"class":335},[203,997,998,1001,1003],{"class":205,"line":290},[203,999,1000],{"class":238},"  await",[203,1002,218],{"class":256},[203,1004,1005],{"class":335},"({\n",[203,1007,1008,1011,1013,1016,1018,1021,1024,1026,1029,1031,1033,1035,1038,1040,1042],{"class":205,"line":310},[203,1009,1010],{"class":338},"    rootDir",[203,1012,461],{"class":460},[203,1014,1015],{"class":256}," fileURLToPath",[203,1017,490],{"class":335},[203,1019,1020],{"class":238},"new",[203,1022,1023],{"class":256}," URL",[203,1025,490],{"class":335},[203,1027,1028],{"class":228},"'..\u002Ffixtures\u002Fauth'",[203,1030,341],{"class":335},[203,1032,332],{"class":238},[203,1034,440],{"class":335},[203,1036,1037],{"class":338},"meta",[203,1039,440],{"class":335},[203,1041,943],{"class":338},[203,1043,1044],{"class":335},")),\n",[203,1046,1047],{"class":205,"line":474},[203,1048,672],{"class":335},[203,1050,1051],{"class":205,"line":480},[203,1052,277],{"emptyLinePlaceholder":276},[203,1054,1055,1057,1059,1062,1064,1066,1068,1070],{"class":205,"line":485},[203,1056,595],{"class":256},[203,1058,490],{"class":335},[203,1060,1061],{"class":228},"'returns 401 without a session'",[203,1063,341],{"class":335},[203,1065,605],{"class":238},[203,1067,608],{"class":335},[203,1069,449],{"class":238},[203,1071,521],{"class":335},[203,1073,1074,1076,1079,1081,1083,1086,1088,1090,1092,1095],{"class":205,"line":507},[203,1075,618],{"class":238},[203,1077,1078],{"class":246}," response",[203,1080,624],{"class":253},[203,1082,627],{"class":238},[203,1084,1085],{"class":256}," fetch",[203,1087,490],{"class":335},[203,1089,943],{"class":256},[203,1091,490],{"class":335},[203,1093,1094],{"class":228},"'\u002Fapi\u002Fprotected'",[203,1096,1097],{"class":335},"))\n",[203,1099,1100,1102,1104,1107,1109,1112,1115,1117,1119,1122],{"class":205,"line":512},[203,1101,643],{"class":256},[203,1103,490],{"class":335},[203,1105,1106],{"class":436},"response",[203,1108,440],{"class":335},[203,1110,1111],{"class":338},"status",[203,1113,1114],{"class":335},").",[203,1116,659],{"class":256},[203,1118,490],{"class":335},[203,1120,1121],{"class":558},"401",[203,1123,504],{"class":335},[203,1125,1126],{"class":205,"line":524},[203,1127,672],{"class":335},[203,1129,1130],{"class":205,"line":536},[203,1131,568],{"class":335},[1133,1134],"read-more",{"title":1135,"to":164},"Nuxt Testing Guide",[1137,1138,1139],"style",{},"html pre.shiki code .sL9le, html code.shiki .sL9le{--shiki-light:#383A42;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .stweg, html code.shiki .stweg{--shiki-light:#E45649;--shiki-default:#72F1B8;--shiki-dark:#72F1B8}html pre.shiki code .s0frj, html code.shiki .s0frj{--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-default:#FEDE5D;--shiki-default-font-style:italic;--shiki-dark:#FEDE5D;--shiki-dark-font-style:italic}html pre.shiki code .sNM9w, html code.shiki .sNM9w{--shiki-light:#383A42;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}html pre.shiki code .sqe1H, html code.shiki .sqe1H{--shiki-light:#A626A4;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sEEOt, html code.shiki .sEEOt{--shiki-light:#383A42;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}html pre.shiki code .s6Rhl, html code.shiki .s6Rhl{--shiki-light:#986801;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sQBpM, html code.shiki .sQBpM{--shiki-light:#0184BC;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}html pre.shiki code .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}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 .s17Py, html code.shiki .s17Py{--shiki-light:#383A42;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}html pre.shiki code .sYvLG, html code.shiki .sYvLG{--shiki-light:#E45649;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sVnqq, html code.shiki .sVnqq{--shiki-light:#0184BC;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}html pre.shiki code .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sgisi, html code.shiki .sgisi{--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-default:#FF7EDB;--shiki-default-font-style:italic;--shiki-dark:#FF7EDB;--shiki-dark-font-style:italic}",{"title":199,"searchDepth":235,"depth":235,"links":1141},[1142,1143],{"id":172,"depth":235,"text":173},{"id":810,"depth":235,"text":811},"Mock authentication in component tests and verify protected API routes.","md",null,{},{"title":103,"description":1144},"5qzIH7wIgkg_oPTrV5KVz6fHre94qopk8DHadcp1hvc",[1151,1153],{"title":99,"path":100,"stem":101,"description":1152,"children":-1},"Enable two-factor auth using the Better Auth two-factor plugin.",{"title":107,"path":108,"stem":109,"description":1154,"children":-1},"Checklist and best practices for deploying Nuxt Better Auth in production.",1788606329794]