[{"data":1,"prerenderedAt":3782},["ShallowReactive",2],{"navigation_docs_en":3,"-en-recipes-testing":342,"-en-recipes-testing-surround":3777},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","/en/getting-started","en/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"What is Qora?","/en/getting-started/what-is-qora","en/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/en/getting-started/installation","en/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick Start","/en/getting-started/quick-start","en/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparison","/en/getting-started/comparison","en/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Coming from TanStack Query","/en/getting-started/coming-from-tanstack-query","en/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrating from Other Libraries","/en/getting-started/migrating-from-other-libraries","en/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"AI Assistants","/en/getting-started/ai-assistants","en/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Core Concepts","i-lucide-book-open","/en/core-concepts","en/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Queries","/en/core-concepts/queries","en/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Query Keys","/en/core-concepts/query-keys","en/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"Query States","/en/core-concepts/query-states","en/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Caching","/en/core-concepts/caching","en/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/en/core-concepts/stale-while-revalidate","en/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Deduplication","/en/core-concepts/deduplication","en/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations & Invalidation","/en/core-concepts/mutations","en/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Offline & Network","/en/core-concepts/offline","en/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Flutter Integration","i-lucide-smartphone","/en/flutter-integration","en/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Setup","/en/flutter-integration/setup","en/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/en/flutter-integration/qora-scope","en/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/en/flutter-integration/qora-builder","en/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/en/flutter-integration/qora-mutation-builder","en/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/en/flutter-integration/infinite-query-builder","en/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/en/flutter-integration/hooks","en/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Network Status Widgets","/en/flutter-integration/network-status","en/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Best Practices","/en/flutter-integration/best-practices","en/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Recipes","i-lucide-chef-hat","/en/recipes","en/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/en/recipes/mutations","en/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Optimistic Updates","/en/recipes/optimistic-updates","en/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistence","/en/recipes/persistence","en/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Network Aware","/en/recipes/network-aware","en/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Infinite Queries","/en/recipes/infinite-queries","en/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Dependent Queries","/en/recipes/dependent-queries","en/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Cancellation","/en/recipes/cancel-token","en/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"SSR Hydration","/en/recipes/ssr-hydration","en/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Error Handling","/en/recipes/error-handling","en/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Testing","/en/recipes/testing","en/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Route-Level Prefetching","/en/recipes/prefetch","en/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"API Reference","i-lucide-file-code","/en/api-reference","en/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/en/api-reference/qora-client","en/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/en/api-reference/qora-key","en/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/en/api-reference/qora-state","en/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/en/api-reference/qora-options","en/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/en/api-reference/qora-client-config","en/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"Mutation API","/en/api-reference/qora-mutation","en/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/en/api-reference/persist-qora-client","en/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Infinite Query","/en/api-reference/infinite-query","en/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"DevTools","i-lucide-bug","/en/devtools","en/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Overview","/en/devtools/overview","en/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"In-App Overlay","/en/devtools/overlay","en/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Data Serialization","/en/devtools/data-display","en/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Third Party","i-lucide-puzzle","/en/third-party","en/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"With Provider","/en/third-party/with-provider","en/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"With BLoC","/en/third-party/with-bloc","en/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"With Riverpod","/en/third-party/with-riverpod","en/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"With RxDart","/en/third-party/with-rxdart","en/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"With Dio","/en/third-party/with-dio","en/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"With GraphQL","/en/third-party/with-graphql","en/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Examples","/en/examples","en/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Case Study: User List & Detail","/en/examples/basic-query","en/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Case Study: Optimistic Mutations & Rollback","/en/examples/mutations-optimistic","en/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Case Study: Infinite Scroll Feed","/en/examples/infinite-scroll","en/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Case Study: Offline-First Todo App","/en/examples/offline-first","en/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Case Study: Network Awareness","/en/examples/network-awareness","en/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Case Study: Hooks Integration","/en/examples/hooks-integration","en/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Case Study: Complete Todo App","/en/examples/complete-todo-app","en/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Help","i-lucide-life-buoy","/en/help","en/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/en/help/faq","en/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Troubleshooting","/en/help/troubleshooting","en/09.help/2.troubleshooting",{"id":343,"title":187,"body":344,"description":3770,"extension":3771,"links":3772,"meta":3773,"navigation":3774,"path":188,"seo":3775,"stem":189,"__hash__":3776},"docs_en/en/04.recipes/11.testing.md",{"type":345,"value":346,"toc":3757},"minimark",[347,355,358,362,369,424,426,430,440,1277,1279,1286,1296,1867,1869,1873,1887,2230,2232,2236,2243,2572,2574,2580,2590,3181,3183,3187,3190,3595,3597,3601,3711,3713,3717,3753],[348,349,350,351,354],"p",{},"Core principle: replace real I/O with deterministic fakes. Qora has no global state, and each ",[352,353,202],"code",{}," instance is isolated for deterministic test execution.",[356,357],"hr",{},[359,360,98],"h2",{"id":361},"setup",[348,363,364,365,368],{},"No extra packages are required for the core patterns. Add ",[352,366,367],{},"mocktail"," if you want to mock API classes:",[370,371,377],"pre",{"className":372,"code":373,"filename":374,"language":375,"meta":376,"style":376},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dev_dependencies:\n  mocktail: ^0.3.0\n  flutter_test:\n    sdk: flutter\n","pubspec.yaml","yaml","",[352,378,379,392,405,413],{"__ignoreMap":376},[380,381,384,388],"span",{"class":382,"line":383},"line",1,[380,385,387],{"class":386},"swJcz","dev_dependencies",[380,389,391],{"class":390},"sMK4o",":\n",[380,393,395,398,401],{"class":382,"line":394},2,[380,396,397],{"class":386},"  mocktail",[380,399,400],{"class":390},":",[380,402,404],{"class":403},"sfazB"," ^0.3.0\n",[380,406,408,411],{"class":382,"line":407},3,[380,409,410],{"class":386},"  flutter_test",[380,412,391],{"class":390},[380,414,416,419,421],{"class":382,"line":415},4,[380,417,418],{"class":386},"    sdk",[380,420,400],{"class":390},[380,422,423],{"class":403}," flutter\n",[356,425],{},[359,427,429],{"id":428},"unit-testing","Unit Testing",[348,431,432,433,436,437,439],{},"For ",[352,434,435],{},"packages/qora"," tests (no Flutter), use ",[352,438,202],{}," directly:",[370,441,446],{"className":442,"code":443,"filename":444,"language":445,"meta":376,"style":376},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:qora/qora.dart';\nimport 'package:test/test.dart';\n\nvoid main() {\n  late QoraClient client;\n\n  setUp(() {\n    client = QoraClient(\n      config: const QoraClientConfig(\n        defaultOptions: QoraOptions(\n          retryCount: 0, // disable retries for fail-fast tests\n        ),\n      ),\n    );\n  });\n\n  tearDown(() => client.dispose());\n\n  test('fetchQuery returns data on success', () async {\n    final user = await client.fetchQuery\u003CUser>(\n      key: const ['users', 1],\n      fetcher: () async => User(id: 1, name: 'Alice'),\n    );\n\n    expect(user.name, 'Alice');\n  });\n\n  test('fetchQuery throws on fetcher error', () {\n    expect(\n      () => client.fetchQuery\u003CUser>(\n        key: const ['users', 99],\n        fetcher: () async => throw Exception('not found'),\n        options: const QoraOptions(retryCount: 0),\n      ),\n      throwsException,\n    );\n  });\n\n  test('second fetchQuery returns cached data without calling fetcher', () async {\n    var callCount = 0;\n\n    await client.fetchQuery\u003CUser>(\n      key: const ['users', 1],\n      fetcher: () async { callCount++; return User(id: 1, name: 'Alice'); },\n      options: const QoraOptions(staleTime: Duration(minutes: 5)),\n    );\n    await client.fetchQuery\u003CUser>(\n      key: const ['users', 1],\n      fetcher: () async { callCount++; return User(id: 1, name: 'Alice'); },\n      options: const QoraOptions(staleTime: Duration(minutes: 5)),\n    );\n\n    expect(callCount, 1); // cache hit on second call\n  });\n}\n","test/queries_test.dart","dart",[352,447,448,460,469,475,489,504,509,518,532,548,561,579,588,596,604,612,617,642,647,671,701,727,767,774,779,801,808,813,828,835,855,878,907,930,937,945,952,959,964,982,997,1002,1020,1041,1087,1120,1127,1144,1165,1206,1233,1240,1245,1264,1271],{"__ignoreMap":376},[380,449,450,454,457],{"class":382,"line":383},[380,451,453],{"class":452},"sbssI","import",[380,455,456],{"class":403}," 'package:qora/qora.dart'",[380,458,459],{"class":390},";\n",[380,461,462,464,467],{"class":382,"line":394},[380,463,453],{"class":452},[380,465,466],{"class":403}," 'package:test/test.dart'",[380,468,459],{"class":390},[380,470,471],{"class":382,"line":407},[380,472,474],{"emptyLinePlaceholder":473},true,"\n",[380,476,477,481,485],{"class":382,"line":415},[380,478,480],{"class":479},"spNyl","void",[380,482,484],{"class":483},"s2Zo4"," main",[380,486,488],{"class":487},"sTEyZ","() {\n",[380,490,492,495,499,502],{"class":382,"line":491},5,[380,493,494],{"class":479},"  late",[380,496,498],{"class":497},"sBMFI"," QoraClient",[380,500,501],{"class":487}," client",[380,503,459],{"class":390},[380,505,507],{"class":382,"line":506},6,[380,508,474],{"emptyLinePlaceholder":473},[380,510,512,515],{"class":382,"line":511},7,[380,513,514],{"class":483},"  setUp",[380,516,517],{"class":487},"(() {\n",[380,519,521,524,527,529],{"class":382,"line":520},8,[380,522,523],{"class":487},"    client ",[380,525,526],{"class":390},"=",[380,528,498],{"class":497},[380,530,531],{"class":487},"(\n",[380,533,535,538,540,543,546],{"class":382,"line":534},9,[380,536,537],{"class":487},"      config",[380,539,400],{"class":390},[380,541,542],{"class":479}," const",[380,544,545],{"class":497}," QoraClientConfig",[380,547,531],{"class":487},[380,549,551,554,556,559],{"class":382,"line":550},10,[380,552,553],{"class":487},"        defaultOptions",[380,555,400],{"class":390},[380,557,558],{"class":497}," QoraOptions",[380,560,531],{"class":487},[380,562,564,567,569,572,575],{"class":382,"line":563},11,[380,565,566],{"class":487},"          retryCount",[380,568,400],{"class":390},[380,570,571],{"class":452}," 0",[380,573,574],{"class":390},",",[380,576,578],{"class":577},"sHwdD"," // disable retries for fail-fast tests\n",[380,580,582,585],{"class":382,"line":581},12,[380,583,584],{"class":487},"        )",[380,586,587],{"class":390},",\n",[380,589,591,594],{"class":382,"line":590},13,[380,592,593],{"class":487},"      )",[380,595,587],{"class":390},[380,597,599,602],{"class":382,"line":598},14,[380,600,601],{"class":487},"    )",[380,603,459],{"class":390},[380,605,607,610],{"class":382,"line":606},15,[380,608,609],{"class":487},"  })",[380,611,459],{"class":390},[380,613,615],{"class":382,"line":614},16,[380,616,474],{"emptyLinePlaceholder":473},[380,618,620,623,626,629,631,634,637,640],{"class":382,"line":619},17,[380,621,622],{"class":483},"  tearDown",[380,624,625],{"class":487},"(() ",[380,627,628],{"class":390},"=>",[380,630,501],{"class":487},[380,632,633],{"class":390},".",[380,635,636],{"class":483},"dispose",[380,638,639],{"class":487},"())",[380,641,459],{"class":390},[380,643,645],{"class":382,"line":644},18,[380,646,474],{"emptyLinePlaceholder":473},[380,648,650,653,656,659,661,664,668],{"class":382,"line":649},19,[380,651,652],{"class":483},"  test",[380,654,655],{"class":487},"(",[380,657,658],{"class":403},"'fetchQuery returns data on success'",[380,660,574],{"class":390},[380,662,663],{"class":487}," () ",[380,665,667],{"class":666},"s7zQu","async",[380,669,670],{"class":487}," {\n",[380,672,674,677,680,682,685,687,689,692,695,698],{"class":382,"line":673},20,[380,675,676],{"class":479},"    final",[380,678,679],{"class":487}," user ",[380,681,526],{"class":390},[380,683,684],{"class":666}," await",[380,686,501],{"class":487},[380,688,633],{"class":390},[380,690,691],{"class":483},"fetchQuery",[380,693,694],{"class":487},"\u003C",[380,696,697],{"class":497},"User",[380,699,700],{"class":487},">(\n",[380,702,704,707,709,711,714,717,719,722,725],{"class":382,"line":703},21,[380,705,706],{"class":487},"      key",[380,708,400],{"class":390},[380,710,542],{"class":479},[380,712,713],{"class":487}," [",[380,715,716],{"class":403},"'users'",[380,718,574],{"class":390},[380,720,721],{"class":452}," 1",[380,723,724],{"class":487},"]",[380,726,587],{"class":390},[380,728,730,733,735,737,739,742,745,748,750,752,754,757,759,762,765],{"class":382,"line":729},22,[380,731,732],{"class":487},"      fetcher",[380,734,400],{"class":390},[380,736,663],{"class":487},[380,738,667],{"class":666},[380,740,741],{"class":390}," =>",[380,743,744],{"class":497}," User",[380,746,747],{"class":487},"(id",[380,749,400],{"class":390},[380,751,721],{"class":452},[380,753,574],{"class":390},[380,755,756],{"class":487}," name",[380,758,400],{"class":390},[380,760,761],{"class":403}," 'Alice'",[380,763,764],{"class":487},")",[380,766,587],{"class":390},[380,768,770,772],{"class":382,"line":769},23,[380,771,601],{"class":487},[380,773,459],{"class":390},[380,775,777],{"class":382,"line":776},24,[380,778,474],{"emptyLinePlaceholder":473},[380,780,782,785,788,790,793,795,797,799],{"class":382,"line":781},25,[380,783,784],{"class":483},"    expect",[380,786,787],{"class":487},"(user",[380,789,633],{"class":390},[380,791,792],{"class":487},"name",[380,794,574],{"class":390},[380,796,761],{"class":403},[380,798,764],{"class":487},[380,800,459],{"class":390},[380,802,804,806],{"class":382,"line":803},26,[380,805,609],{"class":487},[380,807,459],{"class":390},[380,809,811],{"class":382,"line":810},27,[380,812,474],{"emptyLinePlaceholder":473},[380,814,816,818,820,823,825],{"class":382,"line":815},28,[380,817,652],{"class":483},[380,819,655],{"class":487},[380,821,822],{"class":403},"'fetchQuery throws on fetcher error'",[380,824,574],{"class":390},[380,826,827],{"class":487}," () {\n",[380,829,831,833],{"class":382,"line":830},29,[380,832,784],{"class":483},[380,834,531],{"class":487},[380,836,838,841,843,845,847,849,851,853],{"class":382,"line":837},30,[380,839,840],{"class":487},"      () ",[380,842,628],{"class":390},[380,844,501],{"class":487},[380,846,633],{"class":390},[380,848,691],{"class":483},[380,850,694],{"class":487},[380,852,697],{"class":497},[380,854,700],{"class":487},[380,856,858,861,863,865,867,869,871,874,876],{"class":382,"line":857},31,[380,859,860],{"class":487},"        key",[380,862,400],{"class":390},[380,864,542],{"class":479},[380,866,713],{"class":487},[380,868,716],{"class":403},[380,870,574],{"class":390},[380,872,873],{"class":452}," 99",[380,875,724],{"class":487},[380,877,587],{"class":390},[380,879,881,884,886,888,890,892,895,898,900,903,905],{"class":382,"line":880},32,[380,882,883],{"class":487},"        fetcher",[380,885,400],{"class":390},[380,887,663],{"class":487},[380,889,667],{"class":666},[380,891,741],{"class":390},[380,893,894],{"class":666}," throw",[380,896,897],{"class":497}," Exception",[380,899,655],{"class":487},[380,901,902],{"class":403},"'not found'",[380,904,764],{"class":487},[380,906,587],{"class":390},[380,908,910,913,915,917,919,922,924,926,928],{"class":382,"line":909},33,[380,911,912],{"class":487},"        options",[380,914,400],{"class":390},[380,916,542],{"class":479},[380,918,558],{"class":497},[380,920,921],{"class":487},"(retryCount",[380,923,400],{"class":390},[380,925,571],{"class":452},[380,927,764],{"class":487},[380,929,587],{"class":390},[380,931,933,935],{"class":382,"line":932},34,[380,934,593],{"class":487},[380,936,587],{"class":390},[380,938,940,943],{"class":382,"line":939},35,[380,941,942],{"class":487},"      throwsException",[380,944,587],{"class":390},[380,946,948,950],{"class":382,"line":947},36,[380,949,601],{"class":487},[380,951,459],{"class":390},[380,953,955,957],{"class":382,"line":954},37,[380,956,609],{"class":487},[380,958,459],{"class":390},[380,960,962],{"class":382,"line":961},38,[380,963,474],{"emptyLinePlaceholder":473},[380,965,967,969,971,974,976,978,980],{"class":382,"line":966},39,[380,968,652],{"class":483},[380,970,655],{"class":487},[380,972,973],{"class":403},"'second fetchQuery returns cached data without calling fetcher'",[380,975,574],{"class":390},[380,977,663],{"class":487},[380,979,667],{"class":666},[380,981,670],{"class":487},[380,983,985,988,991,993,995],{"class":382,"line":984},40,[380,986,987],{"class":479},"    var",[380,989,990],{"class":487}," callCount ",[380,992,526],{"class":390},[380,994,571],{"class":452},[380,996,459],{"class":390},[380,998,1000],{"class":382,"line":999},41,[380,1001,474],{"emptyLinePlaceholder":473},[380,1003,1005,1008,1010,1012,1014,1016,1018],{"class":382,"line":1004},42,[380,1006,1007],{"class":666},"    await",[380,1009,501],{"class":487},[380,1011,633],{"class":390},[380,1013,691],{"class":483},[380,1015,694],{"class":487},[380,1017,697],{"class":497},[380,1019,700],{"class":487},[380,1021,1023,1025,1027,1029,1031,1033,1035,1037,1039],{"class":382,"line":1022},43,[380,1024,706],{"class":487},[380,1026,400],{"class":390},[380,1028,542],{"class":479},[380,1030,713],{"class":487},[380,1032,716],{"class":403},[380,1034,574],{"class":390},[380,1036,721],{"class":452},[380,1038,724],{"class":487},[380,1040,587],{"class":390},[380,1042,1044,1046,1048,1050,1052,1055,1058,1061,1063,1065,1067,1069,1071,1073,1075,1077,1079,1082,1085],{"class":382,"line":1043},44,[380,1045,732],{"class":487},[380,1047,400],{"class":390},[380,1049,663],{"class":487},[380,1051,667],{"class":666},[380,1053,1054],{"class":487}," { callCount",[380,1056,1057],{"class":390},"++;",[380,1059,1060],{"class":666}," return",[380,1062,744],{"class":497},[380,1064,747],{"class":487},[380,1066,400],{"class":390},[380,1068,721],{"class":452},[380,1070,574],{"class":390},[380,1072,756],{"class":487},[380,1074,400],{"class":390},[380,1076,761],{"class":403},[380,1078,764],{"class":487},[380,1080,1081],{"class":390},";",[380,1083,1084],{"class":487}," }",[380,1086,587],{"class":390},[380,1088,1090,1093,1095,1097,1099,1102,1104,1107,1110,1112,1115,1118],{"class":382,"line":1089},45,[380,1091,1092],{"class":487},"      options",[380,1094,400],{"class":390},[380,1096,542],{"class":479},[380,1098,558],{"class":497},[380,1100,1101],{"class":487},"(staleTime",[380,1103,400],{"class":390},[380,1105,1106],{"class":497}," Duration",[380,1108,1109],{"class":487},"(minutes",[380,1111,400],{"class":390},[380,1113,1114],{"class":452}," 5",[380,1116,1117],{"class":487},"))",[380,1119,587],{"class":390},[380,1121,1123,1125],{"class":382,"line":1122},46,[380,1124,601],{"class":487},[380,1126,459],{"class":390},[380,1128,1130,1132,1134,1136,1138,1140,1142],{"class":382,"line":1129},47,[380,1131,1007],{"class":666},[380,1133,501],{"class":487},[380,1135,633],{"class":390},[380,1137,691],{"class":483},[380,1139,694],{"class":487},[380,1141,697],{"class":497},[380,1143,700],{"class":487},[380,1145,1147,1149,1151,1153,1155,1157,1159,1161,1163],{"class":382,"line":1146},48,[380,1148,706],{"class":487},[380,1150,400],{"class":390},[380,1152,542],{"class":479},[380,1154,713],{"class":487},[380,1156,716],{"class":403},[380,1158,574],{"class":390},[380,1160,721],{"class":452},[380,1162,724],{"class":487},[380,1164,587],{"class":390},[380,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204],{"class":382,"line":1167},49,[380,1169,732],{"class":487},[380,1171,400],{"class":390},[380,1173,663],{"class":487},[380,1175,667],{"class":666},[380,1177,1054],{"class":487},[380,1179,1057],{"class":390},[380,1181,1060],{"class":666},[380,1183,744],{"class":497},[380,1185,747],{"class":487},[380,1187,400],{"class":390},[380,1189,721],{"class":452},[380,1191,574],{"class":390},[380,1193,756],{"class":487},[380,1195,400],{"class":390},[380,1197,761],{"class":403},[380,1199,764],{"class":487},[380,1201,1081],{"class":390},[380,1203,1084],{"class":487},[380,1205,587],{"class":390},[380,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231],{"class":382,"line":1208},50,[380,1210,1092],{"class":487},[380,1212,400],{"class":390},[380,1214,542],{"class":479},[380,1216,558],{"class":497},[380,1218,1101],{"class":487},[380,1220,400],{"class":390},[380,1222,1106],{"class":497},[380,1224,1109],{"class":487},[380,1226,400],{"class":390},[380,1228,1114],{"class":452},[380,1230,1117],{"class":487},[380,1232,587],{"class":390},[380,1234,1236,1238],{"class":382,"line":1235},51,[380,1237,601],{"class":487},[380,1239,459],{"class":390},[380,1241,1243],{"class":382,"line":1242},52,[380,1244,474],{"emptyLinePlaceholder":473},[380,1246,1248,1250,1253,1255,1257,1259,1261],{"class":382,"line":1247},53,[380,1249,784],{"class":483},[380,1251,1252],{"class":487},"(callCount",[380,1254,574],{"class":390},[380,1256,721],{"class":452},[380,1258,764],{"class":487},[380,1260,1081],{"class":390},[380,1262,1263],{"class":577}," // cache hit on second call\n",[380,1265,1267,1269],{"class":382,"line":1266},54,[380,1268,609],{"class":487},[380,1270,459],{"class":390},[380,1272,1274],{"class":382,"line":1273},55,[380,1275,1276],{"class":487},"}\n",[356,1278],{},[359,1280,1282,1283,1285],{"id":1281},"widget-testing-qorascope-wrapper","Widget Testing: ",[352,1284,103],{}," Wrapper",[348,1287,1288,1289,1292,1293,1295],{},"Wrap ",[352,1290,1291],{},"pumpWidget"," with ",[352,1294,103],{},". Pass a custom client so each test is isolated:",[370,1297,1300],{"className":442,"code":1298,"filename":1299,"language":445,"meta":376,"style":376},"import 'package:flutter_test/flutter_test.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\nimport 'package:qora/qora.dart';\n\nWidget buildTestApp({\n  required QoraClient client,\n  required Widget child,\n}) {\n  return QoraScope(\n    client: client,\n    child: MaterialApp(home: child),\n  );\n}\n\nvoid main() {\n  testWidgets('UserScreen shows name after fetch', (tester) async {\n    final client = QoraClient(\n      config: const QoraClientConfig(\n        defaultOptions: QoraOptions(retryCount: 0),\n      ),\n    );\n    addTearDown(client.dispose);\n\n    await tester.pumpWidget(\n      buildTestApp(\n        client: client,\n        child: QoraBuilder\u003CUser>(\n          queryKey: const ['users', 1],\n          fetcher: () async => User(id: 1, name: 'Alice'),\n          builder: (context, state, _) => switch (state) {\n            Initial() || Loading() => const CircularProgressIndicator(),\n            Success(:final data) => Text(data.name),\n            Failure(:final error) => Text('Error: $error'),\n          },\n        ),\n      ),\n    );\n\n    expect(find.byType(CircularProgressIndicator), findsOneWidget);\n\n    await tester.pumpAndSettle(); // let the future resolve\n\n    expect(find.text('Alice'), findsOneWidget);\n  });\n}\n","test/user_screen_test.dart",[352,1301,1302,1311,1320,1328,1332,1343,1354,1366,1371,1381,1392,1412,1419,1423,1427,1435,1454,1467,1479,1497,1503,1509,1524,1528,1541,1548,1559,1575,1596,1629,1657,1685,1715,1752,1759,1765,1771,1777,1781,1807,1811,1829,1833,1857,1863],{"__ignoreMap":376},[380,1303,1304,1306,1309],{"class":382,"line":383},[380,1305,453],{"class":452},[380,1307,1308],{"class":403}," 'package:flutter_test/flutter_test.dart'",[380,1310,459],{"class":390},[380,1312,1313,1315,1318],{"class":382,"line":394},[380,1314,453],{"class":452},[380,1316,1317],{"class":403}," 'package:qora_flutter/qora_flutter.dart'",[380,1319,459],{"class":390},[380,1321,1322,1324,1326],{"class":382,"line":407},[380,1323,453],{"class":452},[380,1325,456],{"class":403},[380,1327,459],{"class":390},[380,1329,1330],{"class":382,"line":415},[380,1331,474],{"emptyLinePlaceholder":473},[380,1333,1334,1337,1340],{"class":382,"line":491},[380,1335,1336],{"class":497},"Widget",[380,1338,1339],{"class":483}," buildTestApp",[380,1341,1342],{"class":487},"({\n",[380,1344,1345,1348,1350,1352],{"class":382,"line":506},[380,1346,1347],{"class":479},"  required",[380,1349,498],{"class":497},[380,1351,501],{"class":487},[380,1353,587],{"class":390},[380,1355,1356,1358,1361,1364],{"class":382,"line":511},[380,1357,1347],{"class":479},[380,1359,1360],{"class":497}," Widget",[380,1362,1363],{"class":487}," child",[380,1365,587],{"class":390},[380,1367,1368],{"class":382,"line":520},[380,1369,1370],{"class":487},"}) {\n",[380,1372,1373,1376,1379],{"class":382,"line":534},[380,1374,1375],{"class":666},"  return",[380,1377,1378],{"class":497}," QoraScope",[380,1380,531],{"class":487},[380,1382,1383,1386,1388,1390],{"class":382,"line":550},[380,1384,1385],{"class":487},"    client",[380,1387,400],{"class":390},[380,1389,501],{"class":487},[380,1391,587],{"class":390},[380,1393,1394,1397,1399,1402,1405,1407,1410],{"class":382,"line":563},[380,1395,1396],{"class":487},"    child",[380,1398,400],{"class":390},[380,1400,1401],{"class":497}," MaterialApp",[380,1403,1404],{"class":487},"(home",[380,1406,400],{"class":390},[380,1408,1409],{"class":487}," child)",[380,1411,587],{"class":390},[380,1413,1414,1417],{"class":382,"line":581},[380,1415,1416],{"class":487},"  )",[380,1418,459],{"class":390},[380,1420,1421],{"class":382,"line":590},[380,1422,1276],{"class":487},[380,1424,1425],{"class":382,"line":598},[380,1426,474],{"emptyLinePlaceholder":473},[380,1428,1429,1431,1433],{"class":382,"line":606},[380,1430,480],{"class":479},[380,1432,484],{"class":483},[380,1434,488],{"class":487},[380,1436,1437,1440,1442,1445,1447,1450,1452],{"class":382,"line":614},[380,1438,1439],{"class":483},"  testWidgets",[380,1441,655],{"class":487},[380,1443,1444],{"class":403},"'UserScreen shows name after fetch'",[380,1446,574],{"class":390},[380,1448,1449],{"class":487}," (tester) ",[380,1451,667],{"class":666},[380,1453,670],{"class":487},[380,1455,1456,1458,1461,1463,1465],{"class":382,"line":619},[380,1457,676],{"class":479},[380,1459,1460],{"class":487}," client ",[380,1462,526],{"class":390},[380,1464,498],{"class":497},[380,1466,531],{"class":487},[380,1468,1469,1471,1473,1475,1477],{"class":382,"line":644},[380,1470,537],{"class":487},[380,1472,400],{"class":390},[380,1474,542],{"class":479},[380,1476,545],{"class":497},[380,1478,531],{"class":487},[380,1480,1481,1483,1485,1487,1489,1491,1493,1495],{"class":382,"line":649},[380,1482,553],{"class":487},[380,1484,400],{"class":390},[380,1486,558],{"class":497},[380,1488,921],{"class":487},[380,1490,400],{"class":390},[380,1492,571],{"class":452},[380,1494,764],{"class":487},[380,1496,587],{"class":390},[380,1498,1499,1501],{"class":382,"line":673},[380,1500,593],{"class":487},[380,1502,587],{"class":390},[380,1504,1505,1507],{"class":382,"line":703},[380,1506,601],{"class":487},[380,1508,459],{"class":390},[380,1510,1511,1514,1517,1519,1522],{"class":382,"line":729},[380,1512,1513],{"class":483},"    addTearDown",[380,1515,1516],{"class":487},"(client",[380,1518,633],{"class":390},[380,1520,1521],{"class":487},"dispose)",[380,1523,459],{"class":390},[380,1525,1526],{"class":382,"line":769},[380,1527,474],{"emptyLinePlaceholder":473},[380,1529,1530,1532,1535,1537,1539],{"class":382,"line":776},[380,1531,1007],{"class":666},[380,1533,1534],{"class":487}," tester",[380,1536,633],{"class":390},[380,1538,1291],{"class":483},[380,1540,531],{"class":487},[380,1542,1543,1546],{"class":382,"line":781},[380,1544,1545],{"class":483},"      buildTestApp",[380,1547,531],{"class":487},[380,1549,1550,1553,1555,1557],{"class":382,"line":803},[380,1551,1552],{"class":487},"        client",[380,1554,400],{"class":390},[380,1556,501],{"class":487},[380,1558,587],{"class":390},[380,1560,1561,1564,1566,1569,1571,1573],{"class":382,"line":810},[380,1562,1563],{"class":487},"        child",[380,1565,400],{"class":390},[380,1567,1568],{"class":497}," QoraBuilder",[380,1570,694],{"class":487},[380,1572,697],{"class":497},[380,1574,700],{"class":487},[380,1576,1577,1580,1582,1584,1586,1588,1590,1592,1594],{"class":382,"line":815},[380,1578,1579],{"class":487},"          queryKey",[380,1581,400],{"class":390},[380,1583,542],{"class":479},[380,1585,713],{"class":487},[380,1587,716],{"class":403},[380,1589,574],{"class":390},[380,1591,721],{"class":452},[380,1593,724],{"class":487},[380,1595,587],{"class":390},[380,1597,1598,1601,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627],{"class":382,"line":830},[380,1599,1600],{"class":487},"          fetcher",[380,1602,400],{"class":390},[380,1604,663],{"class":487},[380,1606,667],{"class":666},[380,1608,741],{"class":390},[380,1610,744],{"class":497},[380,1612,747],{"class":487},[380,1614,400],{"class":390},[380,1616,721],{"class":452},[380,1618,574],{"class":390},[380,1620,756],{"class":487},[380,1622,400],{"class":390},[380,1624,761],{"class":403},[380,1626,764],{"class":487},[380,1628,587],{"class":390},[380,1630,1631,1634,1636,1639,1641,1644,1646,1649,1651,1654],{"class":382,"line":837},[380,1632,1633],{"class":487},"          builder",[380,1635,400],{"class":390},[380,1637,1638],{"class":487}," (context",[380,1640,574],{"class":390},[380,1642,1643],{"class":487}," state",[380,1645,574],{"class":390},[380,1647,1648],{"class":487}," _) ",[380,1650,628],{"class":390},[380,1652,1653],{"class":666}," switch",[380,1655,1656],{"class":487}," (state) {\n",[380,1658,1659,1662,1665,1668,1671,1673,1675,1677,1680,1683],{"class":382,"line":857},[380,1660,1661],{"class":497},"            Initial",[380,1663,1664],{"class":487},"() ",[380,1666,1667],{"class":390},"||",[380,1669,1670],{"class":497}," Loading",[380,1672,1664],{"class":487},[380,1674,628],{"class":390},[380,1676,542],{"class":479},[380,1678,1679],{"class":497}," CircularProgressIndicator",[380,1681,1682],{"class":487},"()",[380,1684,587],{"class":390},[380,1686,1687,1690,1692,1694,1697,1700,1702,1705,1708,1710,1713],{"class":382,"line":880},[380,1688,1689],{"class":497},"            Success",[380,1691,655],{"class":487},[380,1693,400],{"class":390},[380,1695,1696],{"class":479},"final",[380,1698,1699],{"class":487}," data) ",[380,1701,628],{"class":390},[380,1703,1704],{"class":497}," Text",[380,1706,1707],{"class":487},"(data",[380,1709,633],{"class":390},[380,1711,1712],{"class":487},"name)",[380,1714,587],{"class":390},[380,1716,1717,1720,1722,1724,1726,1729,1731,1733,1735,1738,1741,1745,1748,1750],{"class":382,"line":909},[380,1718,1719],{"class":497},"            Failure",[380,1721,655],{"class":487},[380,1723,400],{"class":390},[380,1725,1696],{"class":479},[380,1727,1728],{"class":487}," error) ",[380,1730,628],{"class":390},[380,1732,1704],{"class":497},[380,1734,655],{"class":487},[380,1736,1737],{"class":403},"'Error: ",[380,1739,1740],{"class":487},"$",[380,1742,1744],{"class":1743},"sHdIc","error",[380,1746,1747],{"class":403},"'",[380,1749,764],{"class":487},[380,1751,587],{"class":390},[380,1753,1754,1757],{"class":382,"line":932},[380,1755,1756],{"class":487},"          }",[380,1758,587],{"class":390},[380,1760,1761,1763],{"class":382,"line":939},[380,1762,584],{"class":487},[380,1764,587],{"class":390},[380,1766,1767,1769],{"class":382,"line":947},[380,1768,593],{"class":487},[380,1770,587],{"class":390},[380,1772,1773,1775],{"class":382,"line":954},[380,1774,601],{"class":487},[380,1776,459],{"class":390},[380,1778,1779],{"class":382,"line":961},[380,1780,474],{"emptyLinePlaceholder":473},[380,1782,1783,1785,1788,1790,1793,1795,1798,1800,1802,1805],{"class":382,"line":966},[380,1784,784],{"class":483},[380,1786,1787],{"class":487},"(find",[380,1789,633],{"class":390},[380,1791,1792],{"class":483},"byType",[380,1794,655],{"class":487},[380,1796,1797],{"class":497},"CircularProgressIndicator",[380,1799,764],{"class":487},[380,1801,574],{"class":390},[380,1803,1804],{"class":487}," findsOneWidget)",[380,1806,459],{"class":390},[380,1808,1809],{"class":382,"line":984},[380,1810,474],{"emptyLinePlaceholder":473},[380,1812,1813,1815,1817,1819,1822,1824,1826],{"class":382,"line":999},[380,1814,1007],{"class":666},[380,1816,1534],{"class":487},[380,1818,633],{"class":390},[380,1820,1821],{"class":483},"pumpAndSettle",[380,1823,1682],{"class":487},[380,1825,1081],{"class":390},[380,1827,1828],{"class":577}," // let the future resolve\n",[380,1830,1831],{"class":382,"line":1004},[380,1832,474],{"emptyLinePlaceholder":473},[380,1834,1835,1837,1839,1841,1844,1846,1849,1851,1853,1855],{"class":382,"line":1022},[380,1836,784],{"class":483},[380,1838,1787],{"class":487},[380,1840,633],{"class":390},[380,1842,1843],{"class":483},"text",[380,1845,655],{"class":487},[380,1847,1848],{"class":403},"'Alice'",[380,1850,764],{"class":487},[380,1852,574],{"class":390},[380,1854,1804],{"class":487},[380,1856,459],{"class":390},[380,1858,1859,1861],{"class":382,"line":1043},[380,1860,609],{"class":487},[380,1862,459],{"class":390},[380,1864,1865],{"class":382,"line":1089},[380,1866,1276],{"class":487},[356,1868],{},[359,1870,1872],{"id":1871},"pre-seeding-the-cache","Pre-Seeding the Cache",[348,1874,1875,1876,1879,1880,1882,1883,1886],{},"Use ",[352,1877,1878],{},"setQueryData"," to pre-populate the cache before mounting the widget. The ",[352,1881,108],{}," receives ",[352,1884,1885],{},"Success"," immediately: no async needed:",[370,1888,1890],{"className":442,"code":1889,"filename":1299,"language":445,"meta":376,"style":376},"testWidgets('UserScreen renders pre-seeded data without fetching', (tester) async {\n  final client = QoraClient();\n  addTearDown(client.dispose);\n\n  // Seed the cache directly: widget gets Success on first frame\n  client.setQueryData\u003CUser>(const ['users', 1], User(id: 1, name: 'Bob'));\n\n  await tester.pumpWidget(\n    buildTestApp(\n      client: client,\n      child: QoraBuilder\u003CUser>(\n        queryKey: const ['users', 1],\n        fetcher: () async => throw Exception('should not be called'),\n        options: const QoraOptions(staleTime: Duration(minutes: 5)),\n        builder: (_, state, __) =>\n            Text(state.dataOrNull?.name ?? 'loading'),\n      ),\n    ),\n  );\n\n  // No pump needed: data was already in cache\n  expect(find.text('Bob'), findsOneWidget);\n});\n",[352,1891,1892,1910,1925,1938,1942,1947,1999,2003,2016,2023,2034,2049,2070,2095,2121,2143,2172,2178,2184,2190,2194,2199,2223],{"__ignoreMap":376},[380,1893,1894,1897,1899,1902,1904,1906,1908],{"class":382,"line":383},[380,1895,1896],{"class":483},"testWidgets",[380,1898,655],{"class":487},[380,1900,1901],{"class":403},"'UserScreen renders pre-seeded data without fetching'",[380,1903,574],{"class":390},[380,1905,1449],{"class":487},[380,1907,667],{"class":666},[380,1909,670],{"class":487},[380,1911,1912,1915,1917,1919,1921,1923],{"class":382,"line":394},[380,1913,1914],{"class":479},"  final",[380,1916,1460],{"class":487},[380,1918,526],{"class":390},[380,1920,498],{"class":497},[380,1922,1682],{"class":487},[380,1924,459],{"class":390},[380,1926,1927,1930,1932,1934,1936],{"class":382,"line":407},[380,1928,1929],{"class":483},"  addTearDown",[380,1931,1516],{"class":487},[380,1933,633],{"class":390},[380,1935,1521],{"class":487},[380,1937,459],{"class":390},[380,1939,1940],{"class":382,"line":415},[380,1941,474],{"emptyLinePlaceholder":473},[380,1943,1944],{"class":382,"line":491},[380,1945,1946],{"class":577},"  // Seed the cache directly: widget gets Success on first frame\n",[380,1948,1949,1952,1954,1956,1958,1960,1963,1966,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990,1992,1995,1997],{"class":382,"line":506},[380,1950,1951],{"class":487},"  client",[380,1953,633],{"class":390},[380,1955,1878],{"class":483},[380,1957,694],{"class":487},[380,1959,697],{"class":497},[380,1961,1962],{"class":487},">(",[380,1964,1965],{"class":479},"const",[380,1967,713],{"class":487},[380,1969,716],{"class":403},[380,1971,574],{"class":390},[380,1973,721],{"class":452},[380,1975,724],{"class":487},[380,1977,574],{"class":390},[380,1979,744],{"class":497},[380,1981,747],{"class":487},[380,1983,400],{"class":390},[380,1985,721],{"class":452},[380,1987,574],{"class":390},[380,1989,756],{"class":487},[380,1991,400],{"class":390},[380,1993,1994],{"class":403}," 'Bob'",[380,1996,1117],{"class":487},[380,1998,459],{"class":390},[380,2000,2001],{"class":382,"line":511},[380,2002,474],{"emptyLinePlaceholder":473},[380,2004,2005,2008,2010,2012,2014],{"class":382,"line":520},[380,2006,2007],{"class":666},"  await",[380,2009,1534],{"class":487},[380,2011,633],{"class":390},[380,2013,1291],{"class":483},[380,2015,531],{"class":487},[380,2017,2018,2021],{"class":382,"line":534},[380,2019,2020],{"class":483},"    buildTestApp",[380,2022,531],{"class":487},[380,2024,2025,2028,2030,2032],{"class":382,"line":550},[380,2026,2027],{"class":487},"      client",[380,2029,400],{"class":390},[380,2031,501],{"class":487},[380,2033,587],{"class":390},[380,2035,2036,2039,2041,2043,2045,2047],{"class":382,"line":563},[380,2037,2038],{"class":487},"      child",[380,2040,400],{"class":390},[380,2042,1568],{"class":497},[380,2044,694],{"class":487},[380,2046,697],{"class":497},[380,2048,700],{"class":487},[380,2050,2051,2054,2056,2058,2060,2062,2064,2066,2068],{"class":382,"line":581},[380,2052,2053],{"class":487},"        queryKey",[380,2055,400],{"class":390},[380,2057,542],{"class":479},[380,2059,713],{"class":487},[380,2061,716],{"class":403},[380,2063,574],{"class":390},[380,2065,721],{"class":452},[380,2067,724],{"class":487},[380,2069,587],{"class":390},[380,2071,2072,2074,2076,2078,2080,2082,2084,2086,2088,2091,2093],{"class":382,"line":590},[380,2073,883],{"class":487},[380,2075,400],{"class":390},[380,2077,663],{"class":487},[380,2079,667],{"class":666},[380,2081,741],{"class":390},[380,2083,894],{"class":666},[380,2085,897],{"class":497},[380,2087,655],{"class":487},[380,2089,2090],{"class":403},"'should not be called'",[380,2092,764],{"class":487},[380,2094,587],{"class":390},[380,2096,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119],{"class":382,"line":598},[380,2098,912],{"class":487},[380,2100,400],{"class":390},[380,2102,542],{"class":479},[380,2104,558],{"class":497},[380,2106,1101],{"class":487},[380,2108,400],{"class":390},[380,2110,1106],{"class":497},[380,2112,1109],{"class":487},[380,2114,400],{"class":390},[380,2116,1114],{"class":452},[380,2118,1117],{"class":487},[380,2120,587],{"class":390},[380,2122,2123,2126,2128,2131,2133,2135,2137,2140],{"class":382,"line":606},[380,2124,2125],{"class":487},"        builder",[380,2127,400],{"class":390},[380,2129,2130],{"class":487}," (_",[380,2132,574],{"class":390},[380,2134,1643],{"class":487},[380,2136,574],{"class":390},[380,2138,2139],{"class":487}," __) ",[380,2141,2142],{"class":390},"=>\n",[380,2144,2145,2148,2151,2153,2156,2159,2162,2165,2168,2170],{"class":382,"line":614},[380,2146,2147],{"class":497},"            Text",[380,2149,2150],{"class":487},"(state",[380,2152,633],{"class":390},[380,2154,2155],{"class":487},"dataOrNull",[380,2157,2158],{"class":390},"?.",[380,2160,2161],{"class":487},"name ",[380,2163,2164],{"class":390},"??",[380,2166,2167],{"class":403}," 'loading'",[380,2169,764],{"class":487},[380,2171,587],{"class":390},[380,2173,2174,2176],{"class":382,"line":619},[380,2175,593],{"class":487},[380,2177,587],{"class":390},[380,2179,2180,2182],{"class":382,"line":644},[380,2181,601],{"class":487},[380,2183,587],{"class":390},[380,2185,2186,2188],{"class":382,"line":649},[380,2187,1416],{"class":487},[380,2189,459],{"class":390},[380,2191,2192],{"class":382,"line":673},[380,2193,474],{"emptyLinePlaceholder":473},[380,2195,2196],{"class":382,"line":703},[380,2197,2198],{"class":577},"  // No pump needed: data was already in cache\n",[380,2200,2201,2204,2206,2208,2210,2212,2215,2217,2219,2221],{"class":382,"line":729},[380,2202,2203],{"class":483},"  expect",[380,2205,1787],{"class":487},[380,2207,633],{"class":390},[380,2209,1843],{"class":483},[380,2211,655],{"class":487},[380,2213,2214],{"class":403},"'Bob'",[380,2216,764],{"class":487},[380,2218,574],{"class":390},[380,2220,1804],{"class":487},[380,2222,459],{"class":390},[380,2224,2225,2228],{"class":382,"line":769},[380,2226,2227],{"class":487},"})",[380,2229,459],{"class":390},[356,2231],{},[359,2233,2235],{"id":2234},"testing-error-states","Testing Error States",[348,2237,2238,2239,2242],{},"Pass a fetcher that throws and check the ",[352,2240,2241],{},"Failure"," branch:",[370,2244,2246],{"className":442,"code":2245,"filename":1299,"language":445,"meta":376,"style":376},"testWidgets('shows error message when fetch fails', (tester) async {\n  final client = QoraClient(\n    config: const QoraClientConfig(\n      defaultOptions: QoraOptions(retryCount: 0), // fail immediately\n    ),\n  );\n  addTearDown(client.dispose);\n\n  await tester.pumpWidget(\n    buildTestApp(\n      client: client,\n      child: QoraBuilder\u003CUser>(\n        queryKey: const ['users', 404],\n        fetcher: () async => throw Exception('not found'),\n        builder: (_, state, __) => switch (state) {\n          Failure(:final error) => Text('Error: $error'),\n          _ => const CircularProgressIndicator(),\n        },\n      ),\n    ),\n  );\n\n  await tester.pumpAndSettle();\n\n  expect(find.textContaining('Error:'), findsOneWidget);\n});\n",[352,2247,2248,2265,2277,2290,2312,2318,2324,2336,2340,2352,2358,2368,2382,2403,2427,2449,2480,2495,2502,2508,2514,2520,2524,2538,2542,2566],{"__ignoreMap":376},[380,2249,2250,2252,2254,2257,2259,2261,2263],{"class":382,"line":383},[380,2251,1896],{"class":483},[380,2253,655],{"class":487},[380,2255,2256],{"class":403},"'shows error message when fetch fails'",[380,2258,574],{"class":390},[380,2260,1449],{"class":487},[380,2262,667],{"class":666},[380,2264,670],{"class":487},[380,2266,2267,2269,2271,2273,2275],{"class":382,"line":394},[380,2268,1914],{"class":479},[380,2270,1460],{"class":487},[380,2272,526],{"class":390},[380,2274,498],{"class":497},[380,2276,531],{"class":487},[380,2278,2279,2282,2284,2286,2288],{"class":382,"line":407},[380,2280,2281],{"class":487},"    config",[380,2283,400],{"class":390},[380,2285,542],{"class":479},[380,2287,545],{"class":497},[380,2289,531],{"class":487},[380,2291,2292,2295,2297,2299,2301,2303,2305,2307,2309],{"class":382,"line":415},[380,2293,2294],{"class":487},"      defaultOptions",[380,2296,400],{"class":390},[380,2298,558],{"class":497},[380,2300,921],{"class":487},[380,2302,400],{"class":390},[380,2304,571],{"class":452},[380,2306,764],{"class":487},[380,2308,574],{"class":390},[380,2310,2311],{"class":577}," // fail immediately\n",[380,2313,2314,2316],{"class":382,"line":491},[380,2315,601],{"class":487},[380,2317,587],{"class":390},[380,2319,2320,2322],{"class":382,"line":506},[380,2321,1416],{"class":487},[380,2323,459],{"class":390},[380,2325,2326,2328,2330,2332,2334],{"class":382,"line":511},[380,2327,1929],{"class":483},[380,2329,1516],{"class":487},[380,2331,633],{"class":390},[380,2333,1521],{"class":487},[380,2335,459],{"class":390},[380,2337,2338],{"class":382,"line":520},[380,2339,474],{"emptyLinePlaceholder":473},[380,2341,2342,2344,2346,2348,2350],{"class":382,"line":534},[380,2343,2007],{"class":666},[380,2345,1534],{"class":487},[380,2347,633],{"class":390},[380,2349,1291],{"class":483},[380,2351,531],{"class":487},[380,2353,2354,2356],{"class":382,"line":550},[380,2355,2020],{"class":483},[380,2357,531],{"class":487},[380,2359,2360,2362,2364,2366],{"class":382,"line":563},[380,2361,2027],{"class":487},[380,2363,400],{"class":390},[380,2365,501],{"class":487},[380,2367,587],{"class":390},[380,2369,2370,2372,2374,2376,2378,2380],{"class":382,"line":581},[380,2371,2038],{"class":487},[380,2373,400],{"class":390},[380,2375,1568],{"class":497},[380,2377,694],{"class":487},[380,2379,697],{"class":497},[380,2381,700],{"class":487},[380,2383,2384,2386,2388,2390,2392,2394,2396,2399,2401],{"class":382,"line":590},[380,2385,2053],{"class":487},[380,2387,400],{"class":390},[380,2389,542],{"class":479},[380,2391,713],{"class":487},[380,2393,716],{"class":403},[380,2395,574],{"class":390},[380,2397,2398],{"class":452}," 404",[380,2400,724],{"class":487},[380,2402,587],{"class":390},[380,2404,2405,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425],{"class":382,"line":598},[380,2406,883],{"class":487},[380,2408,400],{"class":390},[380,2410,663],{"class":487},[380,2412,667],{"class":666},[380,2414,741],{"class":390},[380,2416,894],{"class":666},[380,2418,897],{"class":497},[380,2420,655],{"class":487},[380,2422,902],{"class":403},[380,2424,764],{"class":487},[380,2426,587],{"class":390},[380,2428,2429,2431,2433,2435,2437,2439,2441,2443,2445,2447],{"class":382,"line":606},[380,2430,2125],{"class":487},[380,2432,400],{"class":390},[380,2434,2130],{"class":487},[380,2436,574],{"class":390},[380,2438,1643],{"class":487},[380,2440,574],{"class":390},[380,2442,2139],{"class":487},[380,2444,628],{"class":390},[380,2446,1653],{"class":666},[380,2448,1656],{"class":487},[380,2450,2451,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474,2476,2478],{"class":382,"line":614},[380,2452,2453],{"class":497},"          Failure",[380,2455,655],{"class":487},[380,2457,400],{"class":390},[380,2459,1696],{"class":479},[380,2461,1728],{"class":487},[380,2463,628],{"class":390},[380,2465,1704],{"class":497},[380,2467,655],{"class":487},[380,2469,1737],{"class":403},[380,2471,1740],{"class":487},[380,2473,1744],{"class":1743},[380,2475,1747],{"class":403},[380,2477,764],{"class":487},[380,2479,587],{"class":390},[380,2481,2482,2485,2487,2489,2491,2493],{"class":382,"line":619},[380,2483,2484],{"class":487},"          _ ",[380,2486,628],{"class":390},[380,2488,542],{"class":479},[380,2490,1679],{"class":497},[380,2492,1682],{"class":487},[380,2494,587],{"class":390},[380,2496,2497,2500],{"class":382,"line":644},[380,2498,2499],{"class":487},"        }",[380,2501,587],{"class":390},[380,2503,2504,2506],{"class":382,"line":649},[380,2505,593],{"class":487},[380,2507,587],{"class":390},[380,2509,2510,2512],{"class":382,"line":673},[380,2511,601],{"class":487},[380,2513,587],{"class":390},[380,2515,2516,2518],{"class":382,"line":703},[380,2517,1416],{"class":487},[380,2519,459],{"class":390},[380,2521,2522],{"class":382,"line":729},[380,2523,474],{"emptyLinePlaceholder":473},[380,2525,2526,2528,2530,2532,2534,2536],{"class":382,"line":769},[380,2527,2007],{"class":666},[380,2529,1534],{"class":487},[380,2531,633],{"class":390},[380,2533,1821],{"class":483},[380,2535,1682],{"class":487},[380,2537,459],{"class":390},[380,2539,2540],{"class":382,"line":776},[380,2541,474],{"emptyLinePlaceholder":473},[380,2543,2544,2546,2548,2550,2553,2555,2558,2560,2562,2564],{"class":382,"line":781},[380,2545,2203],{"class":483},[380,2547,1787],{"class":487},[380,2549,633],{"class":390},[380,2551,2552],{"class":483},"textContaining",[380,2554,655],{"class":487},[380,2556,2557],{"class":403},"'Error:'",[380,2559,764],{"class":487},[380,2561,574],{"class":390},[380,2563,1804],{"class":487},[380,2565,459],{"class":390},[380,2567,2568,2570],{"class":382,"line":803},[380,2569,2227],{"class":487},[380,2571,459],{"class":390},[356,2573],{},[359,2575,2577,2578],{"id":2576},"testing-persistqoraclient","Testing ",[352,2579,229],{},[348,2581,1875,2582,2585,2586,2589],{},[352,2583,2584],{},"InMemoryStorageAdapter",": it satisfies the ",[352,2587,2588],{},"StorageAdapter"," interface with no file I/O, making persistence tests deterministic and fast:",[370,2591,2594],{"className":442,"code":2592,"filename":2593,"language":445,"meta":376,"style":376},"import 'package:qora/qora.dart';\nimport 'package:test/test.dart';\n\nvoid main() {\n  test('data survives a simulated restart', () async {\n    final storage = InMemoryStorageAdapter();\n    await storage.init();\n\n    // ── First \"launch\" ────────────────────────────────────────────────────\n    final client1 = PersistQoraClient(\n      storage: storage,\n      persistDuration: const Duration(days: 7),\n    );\n    client1.registerSerializer\u003CUser>(\n      QoraSerializer(toJson: (u) => u.toJson(), fromJson: User.fromJson),\n      name: 'User',\n    );\n    await client1.hydrate();\n\n    await client1.fetchQuery\u003CUser>(\n      key: const ['user'],\n      fetcher: () async => User(id: 1, name: 'Alice'),\n    );\n    client1.dispose();\n\n    // ── Second \"launch\": same storage ────────────────────────────────────\n    final client2 = PersistQoraClient(\n      storage: storage,\n      persistDuration: const Duration(days: 7),\n    );\n    client2.registerSerializer\u003CUser>(\n      QoraSerializer(toJson: (u) => u.toJson(), fromJson: User.fromJson),\n      name: 'User',\n    );\n    await client2.hydrate();\n\n    // Data is in cache without any network call\n    final state = client2.getQueryState\u003CUser>(const ['user']);\n    expect(state, isA\u003CSuccess\u003CUser>>());\n    expect((state as Success\u003CUser>).data.name, 'Alice');\n\n    client2.dispose();\n  });\n}\n","test/persistence_test.dart",[352,2595,2596,2604,2612,2616,2624,2641,2657,2673,2677,2682,2696,2707,2730,2736,2752,2793,2805,2811,2827,2831,2847,2864,2896,2902,2914,2918,2923,2936,2946,2966,2972,2987,3021,3031,3037,3052,3056,3061,3094,3118,3155,3159,3171,3177],{"__ignoreMap":376},[380,2597,2598,2600,2602],{"class":382,"line":383},[380,2599,453],{"class":452},[380,2601,456],{"class":403},[380,2603,459],{"class":390},[380,2605,2606,2608,2610],{"class":382,"line":394},[380,2607,453],{"class":452},[380,2609,466],{"class":403},[380,2611,459],{"class":390},[380,2613,2614],{"class":382,"line":407},[380,2615,474],{"emptyLinePlaceholder":473},[380,2617,2618,2620,2622],{"class":382,"line":415},[380,2619,480],{"class":479},[380,2621,484],{"class":483},[380,2623,488],{"class":487},[380,2625,2626,2628,2630,2633,2635,2637,2639],{"class":382,"line":491},[380,2627,652],{"class":483},[380,2629,655],{"class":487},[380,2631,2632],{"class":403},"'data survives a simulated restart'",[380,2634,574],{"class":390},[380,2636,663],{"class":487},[380,2638,667],{"class":666},[380,2640,670],{"class":487},[380,2642,2643,2645,2648,2650,2653,2655],{"class":382,"line":506},[380,2644,676],{"class":479},[380,2646,2647],{"class":487}," storage ",[380,2649,526],{"class":390},[380,2651,2652],{"class":497}," InMemoryStorageAdapter",[380,2654,1682],{"class":487},[380,2656,459],{"class":390},[380,2658,2659,2661,2664,2666,2669,2671],{"class":382,"line":511},[380,2660,1007],{"class":666},[380,2662,2663],{"class":487}," storage",[380,2665,633],{"class":390},[380,2667,2668],{"class":483},"init",[380,2670,1682],{"class":487},[380,2672,459],{"class":390},[380,2674,2675],{"class":382,"line":520},[380,2676,474],{"emptyLinePlaceholder":473},[380,2678,2679],{"class":382,"line":534},[380,2680,2681],{"class":577},"    // ── First \"launch\" ────────────────────────────────────────────────────\n",[380,2683,2684,2686,2689,2691,2694],{"class":382,"line":550},[380,2685,676],{"class":479},[380,2687,2688],{"class":487}," client1 ",[380,2690,526],{"class":390},[380,2692,2693],{"class":497}," PersistQoraClient",[380,2695,531],{"class":487},[380,2697,2698,2701,2703,2705],{"class":382,"line":563},[380,2699,2700],{"class":487},"      storage",[380,2702,400],{"class":390},[380,2704,2663],{"class":487},[380,2706,587],{"class":390},[380,2708,2709,2712,2714,2716,2718,2721,2723,2726,2728],{"class":382,"line":581},[380,2710,2711],{"class":487},"      persistDuration",[380,2713,400],{"class":390},[380,2715,542],{"class":479},[380,2717,1106],{"class":497},[380,2719,2720],{"class":487},"(days",[380,2722,400],{"class":390},[380,2724,2725],{"class":452}," 7",[380,2727,764],{"class":487},[380,2729,587],{"class":390},[380,2731,2732,2734],{"class":382,"line":590},[380,2733,601],{"class":487},[380,2735,459],{"class":390},[380,2737,2738,2741,2743,2746,2748,2750],{"class":382,"line":598},[380,2739,2740],{"class":487},"    client1",[380,2742,633],{"class":390},[380,2744,2745],{"class":483},"registerSerializer",[380,2747,694],{"class":487},[380,2749,697],{"class":497},[380,2751,700],{"class":487},[380,2753,2754,2757,2760,2762,2765,2767,2770,2772,2775,2777,2779,2782,2784,2786,2788,2791],{"class":382,"line":606},[380,2755,2756],{"class":497},"      QoraSerializer",[380,2758,2759],{"class":487},"(toJson",[380,2761,400],{"class":390},[380,2763,2764],{"class":487}," (u) ",[380,2766,628],{"class":390},[380,2768,2769],{"class":487}," u",[380,2771,633],{"class":390},[380,2773,2774],{"class":483},"toJson",[380,2776,1682],{"class":487},[380,2778,574],{"class":390},[380,2780,2781],{"class":487}," fromJson",[380,2783,400],{"class":390},[380,2785,744],{"class":497},[380,2787,633],{"class":390},[380,2789,2790],{"class":487},"fromJson)",[380,2792,587],{"class":390},[380,2794,2795,2798,2800,2803],{"class":382,"line":614},[380,2796,2797],{"class":487},"      name",[380,2799,400],{"class":390},[380,2801,2802],{"class":403}," 'User'",[380,2804,587],{"class":390},[380,2806,2807,2809],{"class":382,"line":619},[380,2808,601],{"class":487},[380,2810,459],{"class":390},[380,2812,2813,2815,2818,2820,2823,2825],{"class":382,"line":644},[380,2814,1007],{"class":666},[380,2816,2817],{"class":487}," client1",[380,2819,633],{"class":390},[380,2821,2822],{"class":483},"hydrate",[380,2824,1682],{"class":487},[380,2826,459],{"class":390},[380,2828,2829],{"class":382,"line":649},[380,2830,474],{"emptyLinePlaceholder":473},[380,2832,2833,2835,2837,2839,2841,2843,2845],{"class":382,"line":673},[380,2834,1007],{"class":666},[380,2836,2817],{"class":487},[380,2838,633],{"class":390},[380,2840,691],{"class":483},[380,2842,694],{"class":487},[380,2844,697],{"class":497},[380,2846,700],{"class":487},[380,2848,2849,2851,2853,2855,2857,2860,2862],{"class":382,"line":703},[380,2850,706],{"class":487},[380,2852,400],{"class":390},[380,2854,542],{"class":479},[380,2856,713],{"class":487},[380,2858,2859],{"class":403},"'user'",[380,2861,724],{"class":487},[380,2863,587],{"class":390},[380,2865,2866,2868,2870,2872,2874,2876,2878,2880,2882,2884,2886,2888,2890,2892,2894],{"class":382,"line":729},[380,2867,732],{"class":487},[380,2869,400],{"class":390},[380,2871,663],{"class":487},[380,2873,667],{"class":666},[380,2875,741],{"class":390},[380,2877,744],{"class":497},[380,2879,747],{"class":487},[380,2881,400],{"class":390},[380,2883,721],{"class":452},[380,2885,574],{"class":390},[380,2887,756],{"class":487},[380,2889,400],{"class":390},[380,2891,761],{"class":403},[380,2893,764],{"class":487},[380,2895,587],{"class":390},[380,2897,2898,2900],{"class":382,"line":769},[380,2899,601],{"class":487},[380,2901,459],{"class":390},[380,2903,2904,2906,2908,2910,2912],{"class":382,"line":776},[380,2905,2740],{"class":487},[380,2907,633],{"class":390},[380,2909,636],{"class":483},[380,2911,1682],{"class":487},[380,2913,459],{"class":390},[380,2915,2916],{"class":382,"line":781},[380,2917,474],{"emptyLinePlaceholder":473},[380,2919,2920],{"class":382,"line":803},[380,2921,2922],{"class":577},"    // ── Second \"launch\": same storage ────────────────────────────────────\n",[380,2924,2925,2927,2930,2932,2934],{"class":382,"line":810},[380,2926,676],{"class":479},[380,2928,2929],{"class":487}," client2 ",[380,2931,526],{"class":390},[380,2933,2693],{"class":497},[380,2935,531],{"class":487},[380,2937,2938,2940,2942,2944],{"class":382,"line":815},[380,2939,2700],{"class":487},[380,2941,400],{"class":390},[380,2943,2663],{"class":487},[380,2945,587],{"class":390},[380,2947,2948,2950,2952,2954,2956,2958,2960,2962,2964],{"class":382,"line":830},[380,2949,2711],{"class":487},[380,2951,400],{"class":390},[380,2953,542],{"class":479},[380,2955,1106],{"class":497},[380,2957,2720],{"class":487},[380,2959,400],{"class":390},[380,2961,2725],{"class":452},[380,2963,764],{"class":487},[380,2965,587],{"class":390},[380,2967,2968,2970],{"class":382,"line":837},[380,2969,601],{"class":487},[380,2971,459],{"class":390},[380,2973,2974,2977,2979,2981,2983,2985],{"class":382,"line":857},[380,2975,2976],{"class":487},"    client2",[380,2978,633],{"class":390},[380,2980,2745],{"class":483},[380,2982,694],{"class":487},[380,2984,697],{"class":497},[380,2986,700],{"class":487},[380,2988,2989,2991,2993,2995,2997,2999,3001,3003,3005,3007,3009,3011,3013,3015,3017,3019],{"class":382,"line":880},[380,2990,2756],{"class":497},[380,2992,2759],{"class":487},[380,2994,400],{"class":390},[380,2996,2764],{"class":487},[380,2998,628],{"class":390},[380,3000,2769],{"class":487},[380,3002,633],{"class":390},[380,3004,2774],{"class":483},[380,3006,1682],{"class":487},[380,3008,574],{"class":390},[380,3010,2781],{"class":487},[380,3012,400],{"class":390},[380,3014,744],{"class":497},[380,3016,633],{"class":390},[380,3018,2790],{"class":487},[380,3020,587],{"class":390},[380,3022,3023,3025,3027,3029],{"class":382,"line":909},[380,3024,2797],{"class":487},[380,3026,400],{"class":390},[380,3028,2802],{"class":403},[380,3030,587],{"class":390},[380,3032,3033,3035],{"class":382,"line":932},[380,3034,601],{"class":487},[380,3036,459],{"class":390},[380,3038,3039,3041,3044,3046,3048,3050],{"class":382,"line":939},[380,3040,1007],{"class":666},[380,3042,3043],{"class":487}," client2",[380,3045,633],{"class":390},[380,3047,2822],{"class":483},[380,3049,1682],{"class":487},[380,3051,459],{"class":390},[380,3053,3054],{"class":382,"line":947},[380,3055,474],{"emptyLinePlaceholder":473},[380,3057,3058],{"class":382,"line":954},[380,3059,3060],{"class":577},"    // Data is in cache without any network call\n",[380,3062,3063,3065,3068,3070,3072,3074,3077,3079,3081,3083,3085,3087,3089,3092],{"class":382,"line":961},[380,3064,676],{"class":479},[380,3066,3067],{"class":487}," state ",[380,3069,526],{"class":390},[380,3071,3043],{"class":487},[380,3073,633],{"class":390},[380,3075,3076],{"class":483},"getQueryState",[380,3078,694],{"class":487},[380,3080,697],{"class":497},[380,3082,1962],{"class":487},[380,3084,1965],{"class":479},[380,3086,713],{"class":487},[380,3088,2859],{"class":403},[380,3090,3091],{"class":487},"])",[380,3093,459],{"class":390},[380,3095,3096,3098,3100,3102,3105,3107,3109,3111,3113,3116],{"class":382,"line":966},[380,3097,784],{"class":483},[380,3099,2150],{"class":487},[380,3101,574],{"class":390},[380,3103,3104],{"class":483}," isA",[380,3106,694],{"class":487},[380,3108,1885],{"class":497},[380,3110,694],{"class":487},[380,3112,697],{"class":497},[380,3114,3115],{"class":487},">>())",[380,3117,459],{"class":390},[380,3119,3120,3122,3125,3128,3131,3133,3135,3138,3140,3143,3145,3147,3149,3151,3153],{"class":382,"line":984},[380,3121,784],{"class":483},[380,3123,3124],{"class":487},"((state ",[380,3126,3127],{"class":390},"as",[380,3129,3130],{"class":497}," Success",[380,3132,694],{"class":487},[380,3134,697],{"class":497},[380,3136,3137],{"class":487},">)",[380,3139,633],{"class":390},[380,3141,3142],{"class":487},"data",[380,3144,633],{"class":390},[380,3146,792],{"class":487},[380,3148,574],{"class":390},[380,3150,761],{"class":403},[380,3152,764],{"class":487},[380,3154,459],{"class":390},[380,3156,3157],{"class":382,"line":999},[380,3158,474],{"emptyLinePlaceholder":473},[380,3160,3161,3163,3165,3167,3169],{"class":382,"line":1004},[380,3162,2976],{"class":487},[380,3164,633],{"class":390},[380,3166,636],{"class":483},[380,3168,1682],{"class":487},[380,3170,459],{"class":390},[380,3172,3173,3175],{"class":382,"line":1022},[380,3174,609],{"class":487},[380,3176,459],{"class":390},[380,3178,3179],{"class":382,"line":1043},[380,3180,1276],{"class":487},[356,3182],{},[359,3184,3186],{"id":3185},"testing-optimistic-updates","Testing Optimistic Updates",[348,3188,3189],{},"Verify that rollback restores the exact pre-mutation state:",[370,3191,3194],{"className":442,"code":3192,"filename":3193,"language":445,"meta":376,"style":376},"test('rollback restores previous state on failure', () async {\n  final client = QoraClient();\n  addTearDown(client.dispose);\n\n  // Seed initial data\n  client.setQueryData\u003CUser>(const ['user'], User(id: 1, name: 'Alice'));\n\n  final snapshot = client.getQueryData\u003CUser>(const ['user']);\n\n  // Apply optimistic update\n  client.setQueryData\u003CUser>(const ['user'], User(id: 1, name: 'Bob'));\n  expect(client.getQueryState\u003CUser>(const ['user']), isA\u003CSuccess\u003CUser>>());\n  expect(\n    (client.getQueryState\u003CUser>(const ['user']) as Success\u003CUser>).data.name,\n    'Bob',\n  );\n\n  // Simulate failure: rollback\n  client.restoreQueryData\u003CUser>(const ['user'], snapshot);\n\n  expect(\n    (client.getQueryState\u003CUser>(const ['user']) as Success\u003CUser>).data.name,\n    'Alice',\n  );\n});\n","test/optimistic_test.dart",[352,3195,3196,3214,3228,3240,3244,3249,3293,3297,3329,3333,3338,3382,3422,3428,3472,3479,3485,3489,3494,3524,3528,3534,3576,3583,3589],{"__ignoreMap":376},[380,3197,3198,3201,3203,3206,3208,3210,3212],{"class":382,"line":383},[380,3199,3200],{"class":483},"test",[380,3202,655],{"class":487},[380,3204,3205],{"class":403},"'rollback restores previous state on failure'",[380,3207,574],{"class":390},[380,3209,663],{"class":487},[380,3211,667],{"class":666},[380,3213,670],{"class":487},[380,3215,3216,3218,3220,3222,3224,3226],{"class":382,"line":394},[380,3217,1914],{"class":479},[380,3219,1460],{"class":487},[380,3221,526],{"class":390},[380,3223,498],{"class":497},[380,3225,1682],{"class":487},[380,3227,459],{"class":390},[380,3229,3230,3232,3234,3236,3238],{"class":382,"line":407},[380,3231,1929],{"class":483},[380,3233,1516],{"class":487},[380,3235,633],{"class":390},[380,3237,1521],{"class":487},[380,3239,459],{"class":390},[380,3241,3242],{"class":382,"line":415},[380,3243,474],{"emptyLinePlaceholder":473},[380,3245,3246],{"class":382,"line":491},[380,3247,3248],{"class":577},"  // Seed initial data\n",[380,3250,3251,3253,3255,3257,3259,3261,3263,3265,3267,3269,3271,3273,3275,3277,3279,3281,3283,3285,3287,3289,3291],{"class":382,"line":506},[380,3252,1951],{"class":487},[380,3254,633],{"class":390},[380,3256,1878],{"class":483},[380,3258,694],{"class":487},[380,3260,697],{"class":497},[380,3262,1962],{"class":487},[380,3264,1965],{"class":479},[380,3266,713],{"class":487},[380,3268,2859],{"class":403},[380,3270,724],{"class":487},[380,3272,574],{"class":390},[380,3274,744],{"class":497},[380,3276,747],{"class":487},[380,3278,400],{"class":390},[380,3280,721],{"class":452},[380,3282,574],{"class":390},[380,3284,756],{"class":487},[380,3286,400],{"class":390},[380,3288,761],{"class":403},[380,3290,1117],{"class":487},[380,3292,459],{"class":390},[380,3294,3295],{"class":382,"line":511},[380,3296,474],{"emptyLinePlaceholder":473},[380,3298,3299,3301,3304,3306,3308,3310,3313,3315,3317,3319,3321,3323,3325,3327],{"class":382,"line":520},[380,3300,1914],{"class":479},[380,3302,3303],{"class":487}," snapshot ",[380,3305,526],{"class":390},[380,3307,501],{"class":487},[380,3309,633],{"class":390},[380,3311,3312],{"class":483},"getQueryData",[380,3314,694],{"class":487},[380,3316,697],{"class":497},[380,3318,1962],{"class":487},[380,3320,1965],{"class":479},[380,3322,713],{"class":487},[380,3324,2859],{"class":403},[380,3326,3091],{"class":487},[380,3328,459],{"class":390},[380,3330,3331],{"class":382,"line":534},[380,3332,474],{"emptyLinePlaceholder":473},[380,3334,3335],{"class":382,"line":550},[380,3336,3337],{"class":577},"  // Apply optimistic update\n",[380,3339,3340,3342,3344,3346,3348,3350,3352,3354,3356,3358,3360,3362,3364,3366,3368,3370,3372,3374,3376,3378,3380],{"class":382,"line":563},[380,3341,1951],{"class":487},[380,3343,633],{"class":390},[380,3345,1878],{"class":483},[380,3347,694],{"class":487},[380,3349,697],{"class":497},[380,3351,1962],{"class":487},[380,3353,1965],{"class":479},[380,3355,713],{"class":487},[380,3357,2859],{"class":403},[380,3359,724],{"class":487},[380,3361,574],{"class":390},[380,3363,744],{"class":497},[380,3365,747],{"class":487},[380,3367,400],{"class":390},[380,3369,721],{"class":452},[380,3371,574],{"class":390},[380,3373,756],{"class":487},[380,3375,400],{"class":390},[380,3377,1994],{"class":403},[380,3379,1117],{"class":487},[380,3381,459],{"class":390},[380,3383,3384,3386,3388,3390,3392,3394,3396,3398,3400,3402,3404,3406,3408,3410,3412,3414,3416,3418,3420],{"class":382,"line":581},[380,3385,2203],{"class":483},[380,3387,1516],{"class":487},[380,3389,633],{"class":390},[380,3391,3076],{"class":483},[380,3393,694],{"class":487},[380,3395,697],{"class":497},[380,3397,1962],{"class":487},[380,3399,1965],{"class":479},[380,3401,713],{"class":487},[380,3403,2859],{"class":403},[380,3405,3091],{"class":487},[380,3407,574],{"class":390},[380,3409,3104],{"class":483},[380,3411,694],{"class":487},[380,3413,1885],{"class":497},[380,3415,694],{"class":487},[380,3417,697],{"class":497},[380,3419,3115],{"class":487},[380,3421,459],{"class":390},[380,3423,3424,3426],{"class":382,"line":590},[380,3425,2203],{"class":483},[380,3427,531],{"class":487},[380,3429,3430,3433,3435,3437,3439,3441,3443,3445,3447,3449,3452,3454,3456,3458,3460,3462,3464,3466,3468,3470],{"class":382,"line":598},[380,3431,3432],{"class":487},"    (client",[380,3434,633],{"class":390},[380,3436,3076],{"class":483},[380,3438,694],{"class":487},[380,3440,697],{"class":497},[380,3442,1962],{"class":487},[380,3444,1965],{"class":479},[380,3446,713],{"class":487},[380,3448,2859],{"class":403},[380,3450,3451],{"class":487},"]) ",[380,3453,3127],{"class":390},[380,3455,3130],{"class":497},[380,3457,694],{"class":487},[380,3459,697],{"class":497},[380,3461,3137],{"class":487},[380,3463,633],{"class":390},[380,3465,3142],{"class":487},[380,3467,633],{"class":390},[380,3469,792],{"class":487},[380,3471,587],{"class":390},[380,3473,3474,3477],{"class":382,"line":606},[380,3475,3476],{"class":403},"    'Bob'",[380,3478,587],{"class":390},[380,3480,3481,3483],{"class":382,"line":614},[380,3482,1416],{"class":487},[380,3484,459],{"class":390},[380,3486,3487],{"class":382,"line":619},[380,3488,474],{"emptyLinePlaceholder":473},[380,3490,3491],{"class":382,"line":644},[380,3492,3493],{"class":577},"  // Simulate failure: rollback\n",[380,3495,3496,3498,3500,3503,3505,3507,3509,3511,3513,3515,3517,3519,3522],{"class":382,"line":649},[380,3497,1951],{"class":487},[380,3499,633],{"class":390},[380,3501,3502],{"class":483},"restoreQueryData",[380,3504,694],{"class":487},[380,3506,697],{"class":497},[380,3508,1962],{"class":487},[380,3510,1965],{"class":479},[380,3512,713],{"class":487},[380,3514,2859],{"class":403},[380,3516,724],{"class":487},[380,3518,574],{"class":390},[380,3520,3521],{"class":487}," snapshot)",[380,3523,459],{"class":390},[380,3525,3526],{"class":382,"line":673},[380,3527,474],{"emptyLinePlaceholder":473},[380,3529,3530,3532],{"class":382,"line":703},[380,3531,2203],{"class":483},[380,3533,531],{"class":487},[380,3535,3536,3538,3540,3542,3544,3546,3548,3550,3552,3554,3556,3558,3560,3562,3564,3566,3568,3570,3572,3574],{"class":382,"line":729},[380,3537,3432],{"class":487},[380,3539,633],{"class":390},[380,3541,3076],{"class":483},[380,3543,694],{"class":487},[380,3545,697],{"class":497},[380,3547,1962],{"class":487},[380,3549,1965],{"class":479},[380,3551,713],{"class":487},[380,3553,2859],{"class":403},[380,3555,3451],{"class":487},[380,3557,3127],{"class":390},[380,3559,3130],{"class":497},[380,3561,694],{"class":487},[380,3563,697],{"class":497},[380,3565,3137],{"class":487},[380,3567,633],{"class":390},[380,3569,3142],{"class":487},[380,3571,633],{"class":390},[380,3573,792],{"class":487},[380,3575,587],{"class":390},[380,3577,3578,3581],{"class":382,"line":769},[380,3579,3580],{"class":403},"    'Alice'",[380,3582,587],{"class":390},[380,3584,3585,3587],{"class":382,"line":776},[380,3586,1416],{"class":487},[380,3588,459],{"class":390},[380,3590,3591,3593],{"class":382,"line":781},[380,3592,2227],{"class":487},[380,3594,459],{"class":390},[356,3596],{},[359,3598,3600],{"id":3599},"quick-reference","Quick Reference",[3602,3603,3604,3617],"table",{},[3605,3606,3607],"thead",{},[3608,3609,3610,3614],"tr",{},[3611,3612,3613],"th",{},"What to test",[3611,3615,3616],{},"How",[3618,3619,3620,3629,3643,3657,3669,3682,3697],"tbody",{},[3608,3621,3622,3626],{},[3623,3624,3625],"td",{},"Fetcher is called once (cache deduplication)",[3623,3627,3628],{},"Count calls in a closure",[3608,3630,3631,3634],{},[3623,3632,3633],{},"Data is cached across two calls",[3623,3635,3636,3639,3640],{},[352,3637,3638],{},"staleTime > 0",", call twice, check ",[352,3641,3642],{},"callCount == 1",[3608,3644,3645,3648],{},[3623,3646,3647],{},"Error state reaches the widget",[3623,3649,3650,3651,3654,3655],{},"Fetcher throws, ",[352,3652,3653],{},"retryCount: 0",", ",[352,3656,1821],{},[3608,3658,3659,3662],{},[3623,3660,3661],{},"Widget shows pre-seeded data",[3623,3663,3664,3666,3667],{},[352,3665,1878],{}," before ",[352,3668,1291],{},[3608,3670,3671,3674],{},[3623,3672,3673],{},"Persistence survives restart",[3623,3675,3676,3677,3679,3680],{},"Two ",[352,3678,229],{}," instances sharing an ",[352,3681,2584],{},[3608,3683,3684,3687],{},[3623,3685,3686],{},"Optimistic rollback",[3623,3688,3689,3691,3692,3691,3694,3696],{},[352,3690,3312],{}," → ",[352,3693,1878],{},[352,3695,3502],{}," → check state",[3608,3698,3699,3704],{},[3623,3700,3701],{},[352,3702,3703],{},"refetchOnWindowFocus",[3623,3705,3706,3707,3710],{},"Don't wire ",[352,3708,3709],{},"FlutterLifecycleManager"," in tests: avoids unwanted side effects",[356,3712],{},[359,3714,3716],{"id":3715},"related","Related",[3718,3719,3720,3734,3746],"ul",{},[3721,3722,3723,3728,3729,3654,3731,3733],"li",{},[3724,3725,3727],"a",{"href":3726},"./persistence","Persistence Guide",": ",[352,3730,229],{},[352,3732,2584],{},", serializers",[3721,3735,3736,3728,3740,3654,3742,3654,3744],{},[3724,3737,3739],{"href":3738},"./optimistic-updates","Optimistic Updates Guide",[352,3741,1878],{},[352,3743,3312],{},[352,3745,3502],{},[3721,3747,3748,3752],{},[3724,3749,3751],{"href":3750},"../api-reference/qora-client","QoraClient API",": full method reference",[3754,3755,3756],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .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}",{"title":376,"searchDepth":394,"depth":394,"links":3758},[3759,3760,3761,3763,3764,3765,3767,3768,3769],{"id":361,"depth":394,"text":98},{"id":428,"depth":394,"text":429},{"id":1281,"depth":394,"text":3762},"Widget Testing: QoraScope Wrapper",{"id":1871,"depth":394,"text":1872},{"id":2234,"depth":394,"text":2235},{"id":2576,"depth":394,"text":3766},"Testing PersistQoraClient",{"id":3185,"depth":394,"text":3186},{"id":3599,"depth":394,"text":3600},{"id":3715,"depth":394,"text":3716},"Test Qora queries, mutations, and widgets with deterministic helpers: no network, no Hive, no timers.","md",null,{},{"icon":190},{"title":187,"description":3770},"hbXBJf831-5xTx6rIwUyvEtdDNak1YUUIomjhaSTHuw",[3778,3780],{"title":182,"path":183,"stem":184,"description":3779,"icon":185,"children":-1},"Understand how Qora surfaces errors, configures retry behaviour, and enables graceful degradation with previousData.",{"title":192,"path":193,"stem":194,"description":3781,"children":-1},"[object Object]",1794040400829]