[{"data":1,"prerenderedAt":3797},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-recipes-testing":342,"-fr-recipes-testing-surround":3792},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Prise en main","i-lucide-rocket","/fr/getting-started","fr/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Qu'est-ce que Qora ?","/fr/getting-started/what-is-qora","fr/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/fr/getting-started/installation","fr/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Démarrage rapide","/fr/getting-started/quick-start","fr/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparaison","/fr/getting-started/comparison","fr/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Venant de TanStack Query","/fr/getting-started/coming-from-tanstack-query","fr/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrer depuis d'Autres Librairies","/fr/getting-started/migrating-from-other-libraries","fr/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"Assistants IA","/fr/getting-started/ai-assistants","fr/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Concepts clés","i-lucide-book-open","/fr/core-concepts","fr/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Requêtes","/fr/core-concepts/queries","fr/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Clés de requête","/fr/core-concepts/query-keys","fr/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"États des requêtes","/fr/core-concepts/query-states","fr/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Cache","/fr/core-concepts/caching","fr/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/fr/core-concepts/stale-while-revalidate","fr/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Déduplication","/fr/core-concepts/deduplication","fr/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations et invalidation","/fr/core-concepts/mutations","fr/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Hors-ligne et réseau","/fr/core-concepts/offline","fr/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Usage avec Flutter","i-lucide-smartphone","/fr/flutter-integration","fr/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Configuration","/fr/flutter-integration/setup","fr/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/fr/flutter-integration/qora-scope","fr/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/fr/flutter-integration/qora-builder","fr/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/fr/flutter-integration/qora-mutation-builder","fr/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/fr/flutter-integration/infinite-query-builder","fr/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/fr/flutter-integration/hooks","fr/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Widgets de statut réseau","/fr/flutter-integration/network-status","fr/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Bonnes pratiques","/fr/flutter-integration/best-practices","fr/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Guides Pratiques","i-lucide-chef-hat","/fr/recipes","fr/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/fr/recipes/mutations","fr/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Mises à jour optimistes","/fr/recipes/optimistic-updates","fr/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistance","/fr/recipes/persistence","fr/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Réseau adaptatif","/fr/recipes/network-aware","fr/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Requêtes infinies","/fr/recipes/infinite-queries","fr/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Requêtes dépendantes","/fr/recipes/dependent-queries","fr/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Annulation","/fr/recipes/cancel-token","fr/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"Hydratation SSR","/fr/recipes/ssr-hydration","fr/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Gestion des erreurs","/fr/recipes/error-handling","fr/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Tests","/fr/recipes/testing","fr/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Prefetch au Niveau des Routes","/fr/recipes/prefetch","fr/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"Référence de l'API","i-lucide-file-code","/fr/api-reference","fr/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/fr/api-reference/qora-client","fr/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/fr/api-reference/qora-key","fr/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/fr/api-reference/qora-state","fr/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/fr/api-reference/qora-options","fr/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/fr/api-reference/qora-client-config","fr/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"API Mutation","/fr/api-reference/qora-mutation","fr/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/fr/api-reference/persist-qora-client","fr/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Requête infinie","/fr/api-reference/infinite-query","fr/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"Outils de debug","i-lucide-bug","/fr/devtools","fr/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Vue d'ensemble","/fr/devtools/overview","fr/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"Overlay intégré","/fr/devtools/overlay","fr/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Sérialisation des données","/fr/devtools/data-display","fr/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Intégrations tierces","i-lucide-puzzle","/fr/third-party","fr/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"Avec Provider","/fr/third-party/with-provider","fr/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"Avec BLoC","/fr/third-party/with-bloc","fr/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"Avec Riverpod","/fr/third-party/with-riverpod","fr/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"Avec RxDart","/fr/third-party/with-rxdart","fr/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"Avec Dio","/fr/third-party/with-dio","fr/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"Avec GraphQL","/fr/third-party/with-graphql","fr/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Exemples","/fr/examples","fr/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Étude de cas : Liste et détail utilisateur","/fr/examples/basic-query","fr/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Étude de cas : Mutations optimistes et rollback","/fr/examples/mutations-optimistic","fr/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Étude de cas : Feed à défilement infini","/fr/examples/infinite-scroll","fr/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Étude de cas : Application Todo offline-first","/fr/examples/offline-first","fr/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Étude de cas : Conscience réseau","/fr/examples/network-awareness","fr/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Étude de cas : Intégration des hooks","/fr/examples/hooks-integration","fr/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Étude de cas : Application Todo complète","/fr/examples/complete-todo-app","fr/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Aide","i-lucide-life-buoy","/fr/help","fr/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/fr/help/faq","fr/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Dépannage","/fr/help/troubleshooting","fr/09.help/2.troubleshooting",{"id":343,"title":187,"body":344,"description":3785,"extension":3786,"links":3787,"meta":3788,"navigation":3789,"path":188,"seo":3790,"stem":189,"__hash__":3791},"docs_fr/fr/04.recipes/11.testing.md",{"type":345,"value":346,"toc":3772},"minimark",[347,355,358,362,369,424,426,430,440,1277,1279,1285,1295,1866,1868,1872,1886,2229,2231,2235,2242,2577,2579,2585,2595,3186,3188,3192,3195,3610,3612,3616,3726,3728,3732,3768],[348,349,350,351,354],"p",{},"Principe fondamental : remplacer les I/O réelles par des fakes déterministes. Qora n'a pas d'état global, et chaque instance de ",[352,353,202],"code",{}," est isolée pour une exécution de test déterministe.",[356,357],"hr",{},[359,360,98],"h2",{"id":361},"configuration",[348,363,364,365,368],{},"Aucun package supplémentaire n'est requis pour les patterns principaux. Ajouter ",[352,366,367],{},"mocktail"," pour mocker les classes API :",[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},"tests-unitaires","Tests unitaires",[348,431,432,433,436,437,439],{},"Pour les tests de ",[352,434,435],{},"packages/qora"," (sans Flutter), utiliser ",[352,438,202],{}," directement :",[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, // désactiver les retries pour les tests fail-fast\n        ),\n      ),\n    );\n  });\n\n  tearDown(() => client.dispose());\n\n  test('fetchQuery retourne les données en cas de succès', () 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 lève une exception sur erreur du fetcher', () {\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('le second fetchQuery retourne les données en cache sans appeler le 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 au second appel\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"," // désactiver les retries pour les tests fail-fast\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 retourne les données en cas de succès'",[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 lève une exception sur erreur du fetcher'",[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},"'le second fetchQuery retourne les données en cache sans appeler le 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 au second appel\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],{"id":1281},"tests-de-widgets-wrapper-qorascope","Tests de widgets : wrapper ",[352,1284,103],{},[348,1286,1287,1288,1291,1292,1294],{},"Encapsuler ",[352,1289,1290],{},"pumpWidget"," avec ",[352,1293,103],{},". Passer un client personnalisé pour que chaque test soit isolé :",[370,1296,1299],{"className":442,"code":1297,"filename":1298,"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 affiche le nom après le 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('Erreur : $error'),\n          },\n        ),\n      ),\n    );\n\n    expect(find.byType(CircularProgressIndicator), findsOneWidget);\n\n    await tester.pumpAndSettle(); // laisser le future se résoudre\n\n    expect(find.text('Alice'), findsOneWidget);\n  });\n}\n","test/user_screen_test.dart",[352,1300,1301,1310,1319,1327,1331,1342,1353,1365,1370,1380,1391,1411,1418,1422,1426,1434,1453,1466,1478,1496,1502,1508,1523,1527,1540,1547,1558,1574,1595,1628,1656,1684,1714,1751,1758,1764,1770,1776,1780,1806,1810,1828,1832,1856,1862],{"__ignoreMap":376},[380,1302,1303,1305,1308],{"class":382,"line":383},[380,1304,453],{"class":452},[380,1306,1307],{"class":403}," 'package:flutter_test/flutter_test.dart'",[380,1309,459],{"class":390},[380,1311,1312,1314,1317],{"class":382,"line":394},[380,1313,453],{"class":452},[380,1315,1316],{"class":403}," 'package:qora_flutter/qora_flutter.dart'",[380,1318,459],{"class":390},[380,1320,1321,1323,1325],{"class":382,"line":407},[380,1322,453],{"class":452},[380,1324,456],{"class":403},[380,1326,459],{"class":390},[380,1328,1329],{"class":382,"line":415},[380,1330,474],{"emptyLinePlaceholder":473},[380,1332,1333,1336,1339],{"class":382,"line":491},[380,1334,1335],{"class":497},"Widget",[380,1337,1338],{"class":483}," buildTestApp",[380,1340,1341],{"class":487},"({\n",[380,1343,1344,1347,1349,1351],{"class":382,"line":506},[380,1345,1346],{"class":479},"  required",[380,1348,498],{"class":497},[380,1350,501],{"class":487},[380,1352,587],{"class":390},[380,1354,1355,1357,1360,1363],{"class":382,"line":511},[380,1356,1346],{"class":479},[380,1358,1359],{"class":497}," Widget",[380,1361,1362],{"class":487}," child",[380,1364,587],{"class":390},[380,1366,1367],{"class":382,"line":520},[380,1368,1369],{"class":487},"}) {\n",[380,1371,1372,1375,1378],{"class":382,"line":534},[380,1373,1374],{"class":666},"  return",[380,1376,1377],{"class":497}," QoraScope",[380,1379,531],{"class":487},[380,1381,1382,1385,1387,1389],{"class":382,"line":550},[380,1383,1384],{"class":487},"    client",[380,1386,400],{"class":390},[380,1388,501],{"class":487},[380,1390,587],{"class":390},[380,1392,1393,1396,1398,1401,1404,1406,1409],{"class":382,"line":563},[380,1394,1395],{"class":487},"    child",[380,1397,400],{"class":390},[380,1399,1400],{"class":497}," MaterialApp",[380,1402,1403],{"class":487},"(home",[380,1405,400],{"class":390},[380,1407,1408],{"class":487}," child)",[380,1410,587],{"class":390},[380,1412,1413,1416],{"class":382,"line":581},[380,1414,1415],{"class":487},"  )",[380,1417,459],{"class":390},[380,1419,1420],{"class":382,"line":590},[380,1421,1276],{"class":487},[380,1423,1424],{"class":382,"line":598},[380,1425,474],{"emptyLinePlaceholder":473},[380,1427,1428,1430,1432],{"class":382,"line":606},[380,1429,480],{"class":479},[380,1431,484],{"class":483},[380,1433,488],{"class":487},[380,1435,1436,1439,1441,1444,1446,1449,1451],{"class":382,"line":614},[380,1437,1438],{"class":483},"  testWidgets",[380,1440,655],{"class":487},[380,1442,1443],{"class":403},"'UserScreen affiche le nom après le fetch'",[380,1445,574],{"class":390},[380,1447,1448],{"class":487}," (tester) ",[380,1450,667],{"class":666},[380,1452,670],{"class":487},[380,1454,1455,1457,1460,1462,1464],{"class":382,"line":619},[380,1456,676],{"class":479},[380,1458,1459],{"class":487}," client ",[380,1461,526],{"class":390},[380,1463,498],{"class":497},[380,1465,531],{"class":487},[380,1467,1468,1470,1472,1474,1476],{"class":382,"line":644},[380,1469,537],{"class":487},[380,1471,400],{"class":390},[380,1473,542],{"class":479},[380,1475,545],{"class":497},[380,1477,531],{"class":487},[380,1479,1480,1482,1484,1486,1488,1490,1492,1494],{"class":382,"line":649},[380,1481,553],{"class":487},[380,1483,400],{"class":390},[380,1485,558],{"class":497},[380,1487,921],{"class":487},[380,1489,400],{"class":390},[380,1491,571],{"class":452},[380,1493,764],{"class":487},[380,1495,587],{"class":390},[380,1497,1498,1500],{"class":382,"line":673},[380,1499,593],{"class":487},[380,1501,587],{"class":390},[380,1503,1504,1506],{"class":382,"line":703},[380,1505,601],{"class":487},[380,1507,459],{"class":390},[380,1509,1510,1513,1516,1518,1521],{"class":382,"line":729},[380,1511,1512],{"class":483},"    addTearDown",[380,1514,1515],{"class":487},"(client",[380,1517,633],{"class":390},[380,1519,1520],{"class":487},"dispose)",[380,1522,459],{"class":390},[380,1524,1525],{"class":382,"line":769},[380,1526,474],{"emptyLinePlaceholder":473},[380,1528,1529,1531,1534,1536,1538],{"class":382,"line":776},[380,1530,1007],{"class":666},[380,1532,1533],{"class":487}," tester",[380,1535,633],{"class":390},[380,1537,1290],{"class":483},[380,1539,531],{"class":487},[380,1541,1542,1545],{"class":382,"line":781},[380,1543,1544],{"class":483},"      buildTestApp",[380,1546,531],{"class":487},[380,1548,1549,1552,1554,1556],{"class":382,"line":803},[380,1550,1551],{"class":487},"        client",[380,1553,400],{"class":390},[380,1555,501],{"class":487},[380,1557,587],{"class":390},[380,1559,1560,1563,1565,1568,1570,1572],{"class":382,"line":810},[380,1561,1562],{"class":487},"        child",[380,1564,400],{"class":390},[380,1566,1567],{"class":497}," QoraBuilder",[380,1569,694],{"class":487},[380,1571,697],{"class":497},[380,1573,700],{"class":487},[380,1575,1576,1579,1581,1583,1585,1587,1589,1591,1593],{"class":382,"line":815},[380,1577,1578],{"class":487},"          queryKey",[380,1580,400],{"class":390},[380,1582,542],{"class":479},[380,1584,713],{"class":487},[380,1586,716],{"class":403},[380,1588,574],{"class":390},[380,1590,721],{"class":452},[380,1592,724],{"class":487},[380,1594,587],{"class":390},[380,1596,1597,1600,1602,1604,1606,1608,1610,1612,1614,1616,1618,1620,1622,1624,1626],{"class":382,"line":830},[380,1598,1599],{"class":487},"          fetcher",[380,1601,400],{"class":390},[380,1603,663],{"class":487},[380,1605,667],{"class":666},[380,1607,741],{"class":390},[380,1609,744],{"class":497},[380,1611,747],{"class":487},[380,1613,400],{"class":390},[380,1615,721],{"class":452},[380,1617,574],{"class":390},[380,1619,756],{"class":487},[380,1621,400],{"class":390},[380,1623,761],{"class":403},[380,1625,764],{"class":487},[380,1627,587],{"class":390},[380,1629,1630,1633,1635,1638,1640,1643,1645,1648,1650,1653],{"class":382,"line":837},[380,1631,1632],{"class":487},"          builder",[380,1634,400],{"class":390},[380,1636,1637],{"class":487}," (context",[380,1639,574],{"class":390},[380,1641,1642],{"class":487}," state",[380,1644,574],{"class":390},[380,1646,1647],{"class":487}," _) ",[380,1649,628],{"class":390},[380,1651,1652],{"class":666}," switch",[380,1654,1655],{"class":487}," (state) {\n",[380,1657,1658,1661,1664,1667,1670,1672,1674,1676,1679,1682],{"class":382,"line":857},[380,1659,1660],{"class":497},"            Initial",[380,1662,1663],{"class":487},"() ",[380,1665,1666],{"class":390},"||",[380,1668,1669],{"class":497}," Loading",[380,1671,1663],{"class":487},[380,1673,628],{"class":390},[380,1675,542],{"class":479},[380,1677,1678],{"class":497}," CircularProgressIndicator",[380,1680,1681],{"class":487},"()",[380,1683,587],{"class":390},[380,1685,1686,1689,1691,1693,1696,1699,1701,1704,1707,1709,1712],{"class":382,"line":880},[380,1687,1688],{"class":497},"            Success",[380,1690,655],{"class":487},[380,1692,400],{"class":390},[380,1694,1695],{"class":479},"final",[380,1697,1698],{"class":487}," data) ",[380,1700,628],{"class":390},[380,1702,1703],{"class":497}," Text",[380,1705,1706],{"class":487},"(data",[380,1708,633],{"class":390},[380,1710,1711],{"class":487},"name)",[380,1713,587],{"class":390},[380,1715,1716,1719,1721,1723,1725,1728,1730,1732,1734,1737,1740,1744,1747,1749],{"class":382,"line":909},[380,1717,1718],{"class":497},"            Failure",[380,1720,655],{"class":487},[380,1722,400],{"class":390},[380,1724,1695],{"class":479},[380,1726,1727],{"class":487}," error) ",[380,1729,628],{"class":390},[380,1731,1703],{"class":497},[380,1733,655],{"class":487},[380,1735,1736],{"class":403},"'Erreur : ",[380,1738,1739],{"class":487},"$",[380,1741,1743],{"class":1742},"sHdIc","error",[380,1745,1746],{"class":403},"'",[380,1748,764],{"class":487},[380,1750,587],{"class":390},[380,1752,1753,1756],{"class":382,"line":932},[380,1754,1755],{"class":487},"          }",[380,1757,587],{"class":390},[380,1759,1760,1762],{"class":382,"line":939},[380,1761,584],{"class":487},[380,1763,587],{"class":390},[380,1765,1766,1768],{"class":382,"line":947},[380,1767,593],{"class":487},[380,1769,587],{"class":390},[380,1771,1772,1774],{"class":382,"line":954},[380,1773,601],{"class":487},[380,1775,459],{"class":390},[380,1777,1778],{"class":382,"line":961},[380,1779,474],{"emptyLinePlaceholder":473},[380,1781,1782,1784,1787,1789,1792,1794,1797,1799,1801,1804],{"class":382,"line":966},[380,1783,784],{"class":483},[380,1785,1786],{"class":487},"(find",[380,1788,633],{"class":390},[380,1790,1791],{"class":483},"byType",[380,1793,655],{"class":487},[380,1795,1796],{"class":497},"CircularProgressIndicator",[380,1798,764],{"class":487},[380,1800,574],{"class":390},[380,1802,1803],{"class":487}," findsOneWidget)",[380,1805,459],{"class":390},[380,1807,1808],{"class":382,"line":984},[380,1809,474],{"emptyLinePlaceholder":473},[380,1811,1812,1814,1816,1818,1821,1823,1825],{"class":382,"line":999},[380,1813,1007],{"class":666},[380,1815,1533],{"class":487},[380,1817,633],{"class":390},[380,1819,1820],{"class":483},"pumpAndSettle",[380,1822,1681],{"class":487},[380,1824,1081],{"class":390},[380,1826,1827],{"class":577}," // laisser le future se résoudre\n",[380,1829,1830],{"class":382,"line":1004},[380,1831,474],{"emptyLinePlaceholder":473},[380,1833,1834,1836,1838,1840,1843,1845,1848,1850,1852,1854],{"class":382,"line":1022},[380,1835,784],{"class":483},[380,1837,1786],{"class":487},[380,1839,633],{"class":390},[380,1841,1842],{"class":483},"text",[380,1844,655],{"class":487},[380,1846,1847],{"class":403},"'Alice'",[380,1849,764],{"class":487},[380,1851,574],{"class":390},[380,1853,1803],{"class":487},[380,1855,459],{"class":390},[380,1857,1858,1860],{"class":382,"line":1043},[380,1859,609],{"class":487},[380,1861,459],{"class":390},[380,1863,1864],{"class":382,"line":1089},[380,1865,1276],{"class":487},[356,1867],{},[359,1869,1871],{"id":1870},"pré-alimentation-du-cache","Pré-alimentation du cache",[348,1873,1874,1875,1878,1879,1881,1882,1885],{},"Utiliser ",[352,1876,1877],{},"setQueryData"," pour pré-peupler le cache avant de monter le widget. Le ",[352,1880,108],{}," reçoit ",[352,1883,1884],{},"Success"," immédiatement : pas d'async nécessaire :",[370,1887,1889],{"className":442,"code":1888,"filename":1298,"language":445,"meta":376,"style":376},"testWidgets('UserScreen affiche les données pré-alimentées sans fetcher', (tester) async {\n  final client = QoraClient();\n  addTearDown(client.dispose);\n\n  // Alimenter le cache directement : le widget reçoit Success à la première 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('ne devrait pas être appelé'),\n        options: const QoraOptions(staleTime: Duration(minutes: 5)),\n        builder: (_, state, __) =>\n            Text(state.dataOrNull?.name ?? 'chargement'),\n      ),\n    ),\n  );\n\n  // Pas de pump nécessaire : les données étaient déjà en cache\n  expect(find.text('Bob'), findsOneWidget);\n});\n",[352,1890,1891,1909,1924,1937,1941,1946,1998,2002,2015,2022,2033,2048,2069,2094,2120,2142,2171,2177,2183,2189,2193,2198,2222],{"__ignoreMap":376},[380,1892,1893,1896,1898,1901,1903,1905,1907],{"class":382,"line":383},[380,1894,1895],{"class":483},"testWidgets",[380,1897,655],{"class":487},[380,1899,1900],{"class":403},"'UserScreen affiche les données pré-alimentées sans fetcher'",[380,1902,574],{"class":390},[380,1904,1448],{"class":487},[380,1906,667],{"class":666},[380,1908,670],{"class":487},[380,1910,1911,1914,1916,1918,1920,1922],{"class":382,"line":394},[380,1912,1913],{"class":479},"  final",[380,1915,1459],{"class":487},[380,1917,526],{"class":390},[380,1919,498],{"class":497},[380,1921,1681],{"class":487},[380,1923,459],{"class":390},[380,1925,1926,1929,1931,1933,1935],{"class":382,"line":407},[380,1927,1928],{"class":483},"  addTearDown",[380,1930,1515],{"class":487},[380,1932,633],{"class":390},[380,1934,1520],{"class":487},[380,1936,459],{"class":390},[380,1938,1939],{"class":382,"line":415},[380,1940,474],{"emptyLinePlaceholder":473},[380,1942,1943],{"class":382,"line":491},[380,1944,1945],{"class":577},"  // Alimenter le cache directement : le widget reçoit Success à la première frame\n",[380,1947,1948,1951,1953,1955,1957,1959,1962,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1994,1996],{"class":382,"line":506},[380,1949,1950],{"class":487},"  client",[380,1952,633],{"class":390},[380,1954,1877],{"class":483},[380,1956,694],{"class":487},[380,1958,697],{"class":497},[380,1960,1961],{"class":487},">(",[380,1963,1964],{"class":479},"const",[380,1966,713],{"class":487},[380,1968,716],{"class":403},[380,1970,574],{"class":390},[380,1972,721],{"class":452},[380,1974,724],{"class":487},[380,1976,574],{"class":390},[380,1978,744],{"class":497},[380,1980,747],{"class":487},[380,1982,400],{"class":390},[380,1984,721],{"class":452},[380,1986,574],{"class":390},[380,1988,756],{"class":487},[380,1990,400],{"class":390},[380,1992,1993],{"class":403}," 'Bob'",[380,1995,1117],{"class":487},[380,1997,459],{"class":390},[380,1999,2000],{"class":382,"line":511},[380,2001,474],{"emptyLinePlaceholder":473},[380,2003,2004,2007,2009,2011,2013],{"class":382,"line":520},[380,2005,2006],{"class":666},"  await",[380,2008,1533],{"class":487},[380,2010,633],{"class":390},[380,2012,1290],{"class":483},[380,2014,531],{"class":487},[380,2016,2017,2020],{"class":382,"line":534},[380,2018,2019],{"class":483},"    buildTestApp",[380,2021,531],{"class":487},[380,2023,2024,2027,2029,2031],{"class":382,"line":550},[380,2025,2026],{"class":487},"      client",[380,2028,400],{"class":390},[380,2030,501],{"class":487},[380,2032,587],{"class":390},[380,2034,2035,2038,2040,2042,2044,2046],{"class":382,"line":563},[380,2036,2037],{"class":487},"      child",[380,2039,400],{"class":390},[380,2041,1567],{"class":497},[380,2043,694],{"class":487},[380,2045,697],{"class":497},[380,2047,700],{"class":487},[380,2049,2050,2053,2055,2057,2059,2061,2063,2065,2067],{"class":382,"line":581},[380,2051,2052],{"class":487},"        queryKey",[380,2054,400],{"class":390},[380,2056,542],{"class":479},[380,2058,713],{"class":487},[380,2060,716],{"class":403},[380,2062,574],{"class":390},[380,2064,721],{"class":452},[380,2066,724],{"class":487},[380,2068,587],{"class":390},[380,2070,2071,2073,2075,2077,2079,2081,2083,2085,2087,2090,2092],{"class":382,"line":590},[380,2072,883],{"class":487},[380,2074,400],{"class":390},[380,2076,663],{"class":487},[380,2078,667],{"class":666},[380,2080,741],{"class":390},[380,2082,894],{"class":666},[380,2084,897],{"class":497},[380,2086,655],{"class":487},[380,2088,2089],{"class":403},"'ne devrait pas être appelé'",[380,2091,764],{"class":487},[380,2093,587],{"class":390},[380,2095,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118],{"class":382,"line":598},[380,2097,912],{"class":487},[380,2099,400],{"class":390},[380,2101,542],{"class":479},[380,2103,558],{"class":497},[380,2105,1101],{"class":487},[380,2107,400],{"class":390},[380,2109,1106],{"class":497},[380,2111,1109],{"class":487},[380,2113,400],{"class":390},[380,2115,1114],{"class":452},[380,2117,1117],{"class":487},[380,2119,587],{"class":390},[380,2121,2122,2125,2127,2130,2132,2134,2136,2139],{"class":382,"line":606},[380,2123,2124],{"class":487},"        builder",[380,2126,400],{"class":390},[380,2128,2129],{"class":487}," (_",[380,2131,574],{"class":390},[380,2133,1642],{"class":487},[380,2135,574],{"class":390},[380,2137,2138],{"class":487}," __) ",[380,2140,2141],{"class":390},"=>\n",[380,2143,2144,2147,2150,2152,2155,2158,2161,2164,2167,2169],{"class":382,"line":614},[380,2145,2146],{"class":497},"            Text",[380,2148,2149],{"class":487},"(state",[380,2151,633],{"class":390},[380,2153,2154],{"class":487},"dataOrNull",[380,2156,2157],{"class":390},"?.",[380,2159,2160],{"class":487},"name ",[380,2162,2163],{"class":390},"??",[380,2165,2166],{"class":403}," 'chargement'",[380,2168,764],{"class":487},[380,2170,587],{"class":390},[380,2172,2173,2175],{"class":382,"line":619},[380,2174,593],{"class":487},[380,2176,587],{"class":390},[380,2178,2179,2181],{"class":382,"line":644},[380,2180,601],{"class":487},[380,2182,587],{"class":390},[380,2184,2185,2187],{"class":382,"line":649},[380,2186,1415],{"class":487},[380,2188,459],{"class":390},[380,2190,2191],{"class":382,"line":673},[380,2192,474],{"emptyLinePlaceholder":473},[380,2194,2195],{"class":382,"line":703},[380,2196,2197],{"class":577},"  // Pas de pump nécessaire : les données étaient déjà en cache\n",[380,2199,2200,2203,2205,2207,2209,2211,2214,2216,2218,2220],{"class":382,"line":729},[380,2201,2202],{"class":483},"  expect",[380,2204,1786],{"class":487},[380,2206,633],{"class":390},[380,2208,1842],{"class":483},[380,2210,655],{"class":487},[380,2212,2213],{"class":403},"'Bob'",[380,2215,764],{"class":487},[380,2217,574],{"class":390},[380,2219,1803],{"class":487},[380,2221,459],{"class":390},[380,2223,2224,2227],{"class":382,"line":769},[380,2225,2226],{"class":487},"})",[380,2228,459],{"class":390},[356,2230],{},[359,2232,2234],{"id":2233},"tester-les-états-derreur","Tester les états d'erreur",[348,2236,2237,2238,2241],{},"Passer un fetcher qui lève une exception et vérifier la branche ",[352,2239,2240],{},"Failure"," :",[370,2243,2245],{"className":442,"code":2244,"filename":1298,"language":445,"meta":376,"style":376},"testWidgets('affiche le message d\\'erreur quand le fetch échoue', (tester) async {\n  final client = QoraClient(\n    config: const QoraClientConfig(\n      defaultOptions: QoraOptions(retryCount: 0), // échec immédiat\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('Erreur : $error'),\n          _ => const CircularProgressIndicator(),\n        },\n      ),\n    ),\n  );\n\n  await tester.pumpAndSettle();\n\n  expect(find.textContaining('Erreur :'), findsOneWidget);\n});\n",[352,2246,2247,2270,2282,2295,2317,2323,2329,2341,2345,2357,2363,2373,2387,2408,2432,2454,2485,2500,2507,2513,2519,2525,2529,2543,2547,2571],{"__ignoreMap":376},[380,2248,2249,2251,2253,2256,2259,2262,2264,2266,2268],{"class":382,"line":383},[380,2250,1895],{"class":483},[380,2252,655],{"class":487},[380,2254,2255],{"class":403},"'affiche le message d",[380,2257,2258],{"class":487},"\\'",[380,2260,2261],{"class":403},"erreur quand le fetch échoue'",[380,2263,574],{"class":390},[380,2265,1448],{"class":487},[380,2267,667],{"class":666},[380,2269,670],{"class":487},[380,2271,2272,2274,2276,2278,2280],{"class":382,"line":394},[380,2273,1913],{"class":479},[380,2275,1459],{"class":487},[380,2277,526],{"class":390},[380,2279,498],{"class":497},[380,2281,531],{"class":487},[380,2283,2284,2287,2289,2291,2293],{"class":382,"line":407},[380,2285,2286],{"class":487},"    config",[380,2288,400],{"class":390},[380,2290,542],{"class":479},[380,2292,545],{"class":497},[380,2294,531],{"class":487},[380,2296,2297,2300,2302,2304,2306,2308,2310,2312,2314],{"class":382,"line":415},[380,2298,2299],{"class":487},"      defaultOptions",[380,2301,400],{"class":390},[380,2303,558],{"class":497},[380,2305,921],{"class":487},[380,2307,400],{"class":390},[380,2309,571],{"class":452},[380,2311,764],{"class":487},[380,2313,574],{"class":390},[380,2315,2316],{"class":577}," // échec immédiat\n",[380,2318,2319,2321],{"class":382,"line":491},[380,2320,601],{"class":487},[380,2322,587],{"class":390},[380,2324,2325,2327],{"class":382,"line":506},[380,2326,1415],{"class":487},[380,2328,459],{"class":390},[380,2330,2331,2333,2335,2337,2339],{"class":382,"line":511},[380,2332,1928],{"class":483},[380,2334,1515],{"class":487},[380,2336,633],{"class":390},[380,2338,1520],{"class":487},[380,2340,459],{"class":390},[380,2342,2343],{"class":382,"line":520},[380,2344,474],{"emptyLinePlaceholder":473},[380,2346,2347,2349,2351,2353,2355],{"class":382,"line":534},[380,2348,2006],{"class":666},[380,2350,1533],{"class":487},[380,2352,633],{"class":390},[380,2354,1290],{"class":483},[380,2356,531],{"class":487},[380,2358,2359,2361],{"class":382,"line":550},[380,2360,2019],{"class":483},[380,2362,531],{"class":487},[380,2364,2365,2367,2369,2371],{"class":382,"line":563},[380,2366,2026],{"class":487},[380,2368,400],{"class":390},[380,2370,501],{"class":487},[380,2372,587],{"class":390},[380,2374,2375,2377,2379,2381,2383,2385],{"class":382,"line":581},[380,2376,2037],{"class":487},[380,2378,400],{"class":390},[380,2380,1567],{"class":497},[380,2382,694],{"class":487},[380,2384,697],{"class":497},[380,2386,700],{"class":487},[380,2388,2389,2391,2393,2395,2397,2399,2401,2404,2406],{"class":382,"line":590},[380,2390,2052],{"class":487},[380,2392,400],{"class":390},[380,2394,542],{"class":479},[380,2396,713],{"class":487},[380,2398,716],{"class":403},[380,2400,574],{"class":390},[380,2402,2403],{"class":452}," 404",[380,2405,724],{"class":487},[380,2407,587],{"class":390},[380,2409,2410,2412,2414,2416,2418,2420,2422,2424,2426,2428,2430],{"class":382,"line":598},[380,2411,883],{"class":487},[380,2413,400],{"class":390},[380,2415,663],{"class":487},[380,2417,667],{"class":666},[380,2419,741],{"class":390},[380,2421,894],{"class":666},[380,2423,897],{"class":497},[380,2425,655],{"class":487},[380,2427,902],{"class":403},[380,2429,764],{"class":487},[380,2431,587],{"class":390},[380,2433,2434,2436,2438,2440,2442,2444,2446,2448,2450,2452],{"class":382,"line":606},[380,2435,2124],{"class":487},[380,2437,400],{"class":390},[380,2439,2129],{"class":487},[380,2441,574],{"class":390},[380,2443,1642],{"class":487},[380,2445,574],{"class":390},[380,2447,2138],{"class":487},[380,2449,628],{"class":390},[380,2451,1652],{"class":666},[380,2453,1655],{"class":487},[380,2455,2456,2459,2461,2463,2465,2467,2469,2471,2473,2475,2477,2479,2481,2483],{"class":382,"line":614},[380,2457,2458],{"class":497},"          Failure",[380,2460,655],{"class":487},[380,2462,400],{"class":390},[380,2464,1695],{"class":479},[380,2466,1727],{"class":487},[380,2468,628],{"class":390},[380,2470,1703],{"class":497},[380,2472,655],{"class":487},[380,2474,1736],{"class":403},[380,2476,1739],{"class":487},[380,2478,1743],{"class":1742},[380,2480,1746],{"class":403},[380,2482,764],{"class":487},[380,2484,587],{"class":390},[380,2486,2487,2490,2492,2494,2496,2498],{"class":382,"line":619},[380,2488,2489],{"class":487},"          _ ",[380,2491,628],{"class":390},[380,2493,542],{"class":479},[380,2495,1678],{"class":497},[380,2497,1681],{"class":487},[380,2499,587],{"class":390},[380,2501,2502,2505],{"class":382,"line":644},[380,2503,2504],{"class":487},"        }",[380,2506,587],{"class":390},[380,2508,2509,2511],{"class":382,"line":649},[380,2510,593],{"class":487},[380,2512,587],{"class":390},[380,2514,2515,2517],{"class":382,"line":673},[380,2516,601],{"class":487},[380,2518,587],{"class":390},[380,2520,2521,2523],{"class":382,"line":703},[380,2522,1415],{"class":487},[380,2524,459],{"class":390},[380,2526,2527],{"class":382,"line":729},[380,2528,474],{"emptyLinePlaceholder":473},[380,2530,2531,2533,2535,2537,2539,2541],{"class":382,"line":769},[380,2532,2006],{"class":666},[380,2534,1533],{"class":487},[380,2536,633],{"class":390},[380,2538,1820],{"class":483},[380,2540,1681],{"class":487},[380,2542,459],{"class":390},[380,2544,2545],{"class":382,"line":776},[380,2546,474],{"emptyLinePlaceholder":473},[380,2548,2549,2551,2553,2555,2558,2560,2563,2565,2567,2569],{"class":382,"line":781},[380,2550,2202],{"class":483},[380,2552,1786],{"class":487},[380,2554,633],{"class":390},[380,2556,2557],{"class":483},"textContaining",[380,2559,655],{"class":487},[380,2561,2562],{"class":403},"'Erreur :'",[380,2564,764],{"class":487},[380,2566,574],{"class":390},[380,2568,1803],{"class":487},[380,2570,459],{"class":390},[380,2572,2573,2575],{"class":382,"line":803},[380,2574,2226],{"class":487},[380,2576,459],{"class":390},[356,2578],{},[359,2580,2582,2583],{"id":2581},"tester-persistqoraclient","Tester ",[352,2584,229],{},[348,2586,1874,2587,2590,2591,2594],{},[352,2588,2589],{},"InMemoryStorageAdapter"," : il satisfait l'interface ",[352,2592,2593],{},"StorageAdapter"," sans I/O fichier, rendant les tests de persistance déterministes et rapides :",[370,2596,2599],{"className":442,"code":2597,"filename":2598,"language":445,"meta":376,"style":376},"import 'package:qora/qora.dart';\nimport 'package:test/test.dart';\n\nvoid main() {\n  test('les données survivent à un redémarrage simulé', () async {\n    final storage = InMemoryStorageAdapter();\n    await storage.init();\n\n    // ── Premier \"lancement\" ────────────────────────────────────────────────\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 \"lancement\" : même stockage ────────────────────────────────\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    // Les données sont en cache sans aucun appel réseau\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,2600,2601,2609,2617,2621,2629,2646,2662,2678,2682,2687,2701,2712,2735,2741,2757,2798,2810,2816,2832,2836,2852,2869,2901,2907,2919,2923,2928,2941,2951,2971,2977,2992,3026,3036,3042,3057,3061,3066,3099,3123,3160,3164,3176,3182],{"__ignoreMap":376},[380,2602,2603,2605,2607],{"class":382,"line":383},[380,2604,453],{"class":452},[380,2606,456],{"class":403},[380,2608,459],{"class":390},[380,2610,2611,2613,2615],{"class":382,"line":394},[380,2612,453],{"class":452},[380,2614,466],{"class":403},[380,2616,459],{"class":390},[380,2618,2619],{"class":382,"line":407},[380,2620,474],{"emptyLinePlaceholder":473},[380,2622,2623,2625,2627],{"class":382,"line":415},[380,2624,480],{"class":479},[380,2626,484],{"class":483},[380,2628,488],{"class":487},[380,2630,2631,2633,2635,2638,2640,2642,2644],{"class":382,"line":491},[380,2632,652],{"class":483},[380,2634,655],{"class":487},[380,2636,2637],{"class":403},"'les données survivent à un redémarrage simulé'",[380,2639,574],{"class":390},[380,2641,663],{"class":487},[380,2643,667],{"class":666},[380,2645,670],{"class":487},[380,2647,2648,2650,2653,2655,2658,2660],{"class":382,"line":506},[380,2649,676],{"class":479},[380,2651,2652],{"class":487}," storage ",[380,2654,526],{"class":390},[380,2656,2657],{"class":497}," InMemoryStorageAdapter",[380,2659,1681],{"class":487},[380,2661,459],{"class":390},[380,2663,2664,2666,2669,2671,2674,2676],{"class":382,"line":511},[380,2665,1007],{"class":666},[380,2667,2668],{"class":487}," storage",[380,2670,633],{"class":390},[380,2672,2673],{"class":483},"init",[380,2675,1681],{"class":487},[380,2677,459],{"class":390},[380,2679,2680],{"class":382,"line":520},[380,2681,474],{"emptyLinePlaceholder":473},[380,2683,2684],{"class":382,"line":534},[380,2685,2686],{"class":577},"    // ── Premier \"lancement\" ────────────────────────────────────────────────\n",[380,2688,2689,2691,2694,2696,2699],{"class":382,"line":550},[380,2690,676],{"class":479},[380,2692,2693],{"class":487}," client1 ",[380,2695,526],{"class":390},[380,2697,2698],{"class":497}," PersistQoraClient",[380,2700,531],{"class":487},[380,2702,2703,2706,2708,2710],{"class":382,"line":563},[380,2704,2705],{"class":487},"      storage",[380,2707,400],{"class":390},[380,2709,2668],{"class":487},[380,2711,587],{"class":390},[380,2713,2714,2717,2719,2721,2723,2726,2728,2731,2733],{"class":382,"line":581},[380,2715,2716],{"class":487},"      persistDuration",[380,2718,400],{"class":390},[380,2720,542],{"class":479},[380,2722,1106],{"class":497},[380,2724,2725],{"class":487},"(days",[380,2727,400],{"class":390},[380,2729,2730],{"class":452}," 7",[380,2732,764],{"class":487},[380,2734,587],{"class":390},[380,2736,2737,2739],{"class":382,"line":590},[380,2738,601],{"class":487},[380,2740,459],{"class":390},[380,2742,2743,2746,2748,2751,2753,2755],{"class":382,"line":598},[380,2744,2745],{"class":487},"    client1",[380,2747,633],{"class":390},[380,2749,2750],{"class":483},"registerSerializer",[380,2752,694],{"class":487},[380,2754,697],{"class":497},[380,2756,700],{"class":487},[380,2758,2759,2762,2765,2767,2770,2772,2775,2777,2780,2782,2784,2787,2789,2791,2793,2796],{"class":382,"line":606},[380,2760,2761],{"class":497},"      QoraSerializer",[380,2763,2764],{"class":487},"(toJson",[380,2766,400],{"class":390},[380,2768,2769],{"class":487}," (u) ",[380,2771,628],{"class":390},[380,2773,2774],{"class":487}," u",[380,2776,633],{"class":390},[380,2778,2779],{"class":483},"toJson",[380,2781,1681],{"class":487},[380,2783,574],{"class":390},[380,2785,2786],{"class":487}," fromJson",[380,2788,400],{"class":390},[380,2790,744],{"class":497},[380,2792,633],{"class":390},[380,2794,2795],{"class":487},"fromJson)",[380,2797,587],{"class":390},[380,2799,2800,2803,2805,2808],{"class":382,"line":614},[380,2801,2802],{"class":487},"      name",[380,2804,400],{"class":390},[380,2806,2807],{"class":403}," 'User'",[380,2809,587],{"class":390},[380,2811,2812,2814],{"class":382,"line":619},[380,2813,601],{"class":487},[380,2815,459],{"class":390},[380,2817,2818,2820,2823,2825,2828,2830],{"class":382,"line":644},[380,2819,1007],{"class":666},[380,2821,2822],{"class":487}," client1",[380,2824,633],{"class":390},[380,2826,2827],{"class":483},"hydrate",[380,2829,1681],{"class":487},[380,2831,459],{"class":390},[380,2833,2834],{"class":382,"line":649},[380,2835,474],{"emptyLinePlaceholder":473},[380,2837,2838,2840,2842,2844,2846,2848,2850],{"class":382,"line":673},[380,2839,1007],{"class":666},[380,2841,2822],{"class":487},[380,2843,633],{"class":390},[380,2845,691],{"class":483},[380,2847,694],{"class":487},[380,2849,697],{"class":497},[380,2851,700],{"class":487},[380,2853,2854,2856,2858,2860,2862,2865,2867],{"class":382,"line":703},[380,2855,706],{"class":487},[380,2857,400],{"class":390},[380,2859,542],{"class":479},[380,2861,713],{"class":487},[380,2863,2864],{"class":403},"'user'",[380,2866,724],{"class":487},[380,2868,587],{"class":390},[380,2870,2871,2873,2875,2877,2879,2881,2883,2885,2887,2889,2891,2893,2895,2897,2899],{"class":382,"line":729},[380,2872,732],{"class":487},[380,2874,400],{"class":390},[380,2876,663],{"class":487},[380,2878,667],{"class":666},[380,2880,741],{"class":390},[380,2882,744],{"class":497},[380,2884,747],{"class":487},[380,2886,400],{"class":390},[380,2888,721],{"class":452},[380,2890,574],{"class":390},[380,2892,756],{"class":487},[380,2894,400],{"class":390},[380,2896,761],{"class":403},[380,2898,764],{"class":487},[380,2900,587],{"class":390},[380,2902,2903,2905],{"class":382,"line":769},[380,2904,601],{"class":487},[380,2906,459],{"class":390},[380,2908,2909,2911,2913,2915,2917],{"class":382,"line":776},[380,2910,2745],{"class":487},[380,2912,633],{"class":390},[380,2914,636],{"class":483},[380,2916,1681],{"class":487},[380,2918,459],{"class":390},[380,2920,2921],{"class":382,"line":781},[380,2922,474],{"emptyLinePlaceholder":473},[380,2924,2925],{"class":382,"line":803},[380,2926,2927],{"class":577},"    // ── Second \"lancement\" : même stockage ────────────────────────────────\n",[380,2929,2930,2932,2935,2937,2939],{"class":382,"line":810},[380,2931,676],{"class":479},[380,2933,2934],{"class":487}," client2 ",[380,2936,526],{"class":390},[380,2938,2698],{"class":497},[380,2940,531],{"class":487},[380,2942,2943,2945,2947,2949],{"class":382,"line":815},[380,2944,2705],{"class":487},[380,2946,400],{"class":390},[380,2948,2668],{"class":487},[380,2950,587],{"class":390},[380,2952,2953,2955,2957,2959,2961,2963,2965,2967,2969],{"class":382,"line":830},[380,2954,2716],{"class":487},[380,2956,400],{"class":390},[380,2958,542],{"class":479},[380,2960,1106],{"class":497},[380,2962,2725],{"class":487},[380,2964,400],{"class":390},[380,2966,2730],{"class":452},[380,2968,764],{"class":487},[380,2970,587],{"class":390},[380,2972,2973,2975],{"class":382,"line":837},[380,2974,601],{"class":487},[380,2976,459],{"class":390},[380,2978,2979,2982,2984,2986,2988,2990],{"class":382,"line":857},[380,2980,2981],{"class":487},"    client2",[380,2983,633],{"class":390},[380,2985,2750],{"class":483},[380,2987,694],{"class":487},[380,2989,697],{"class":497},[380,2991,700],{"class":487},[380,2993,2994,2996,2998,3000,3002,3004,3006,3008,3010,3012,3014,3016,3018,3020,3022,3024],{"class":382,"line":880},[380,2995,2761],{"class":497},[380,2997,2764],{"class":487},[380,2999,400],{"class":390},[380,3001,2769],{"class":487},[380,3003,628],{"class":390},[380,3005,2774],{"class":487},[380,3007,633],{"class":390},[380,3009,2779],{"class":483},[380,3011,1681],{"class":487},[380,3013,574],{"class":390},[380,3015,2786],{"class":487},[380,3017,400],{"class":390},[380,3019,744],{"class":497},[380,3021,633],{"class":390},[380,3023,2795],{"class":487},[380,3025,587],{"class":390},[380,3027,3028,3030,3032,3034],{"class":382,"line":909},[380,3029,2802],{"class":487},[380,3031,400],{"class":390},[380,3033,2807],{"class":403},[380,3035,587],{"class":390},[380,3037,3038,3040],{"class":382,"line":932},[380,3039,601],{"class":487},[380,3041,459],{"class":390},[380,3043,3044,3046,3049,3051,3053,3055],{"class":382,"line":939},[380,3045,1007],{"class":666},[380,3047,3048],{"class":487}," client2",[380,3050,633],{"class":390},[380,3052,2827],{"class":483},[380,3054,1681],{"class":487},[380,3056,459],{"class":390},[380,3058,3059],{"class":382,"line":947},[380,3060,474],{"emptyLinePlaceholder":473},[380,3062,3063],{"class":382,"line":954},[380,3064,3065],{"class":577},"    // Les données sont en cache sans aucun appel réseau\n",[380,3067,3068,3070,3073,3075,3077,3079,3082,3084,3086,3088,3090,3092,3094,3097],{"class":382,"line":961},[380,3069,676],{"class":479},[380,3071,3072],{"class":487}," state ",[380,3074,526],{"class":390},[380,3076,3048],{"class":487},[380,3078,633],{"class":390},[380,3080,3081],{"class":483},"getQueryState",[380,3083,694],{"class":487},[380,3085,697],{"class":497},[380,3087,1961],{"class":487},[380,3089,1964],{"class":479},[380,3091,713],{"class":487},[380,3093,2864],{"class":403},[380,3095,3096],{"class":487},"])",[380,3098,459],{"class":390},[380,3100,3101,3103,3105,3107,3110,3112,3114,3116,3118,3121],{"class":382,"line":966},[380,3102,784],{"class":483},[380,3104,2149],{"class":487},[380,3106,574],{"class":390},[380,3108,3109],{"class":483}," isA",[380,3111,694],{"class":487},[380,3113,1884],{"class":497},[380,3115,694],{"class":487},[380,3117,697],{"class":497},[380,3119,3120],{"class":487},">>())",[380,3122,459],{"class":390},[380,3124,3125,3127,3130,3133,3136,3138,3140,3143,3145,3148,3150,3152,3154,3156,3158],{"class":382,"line":984},[380,3126,784],{"class":483},[380,3128,3129],{"class":487},"((state ",[380,3131,3132],{"class":390},"as",[380,3134,3135],{"class":497}," Success",[380,3137,694],{"class":487},[380,3139,697],{"class":497},[380,3141,3142],{"class":487},">)",[380,3144,633],{"class":390},[380,3146,3147],{"class":487},"data",[380,3149,633],{"class":390},[380,3151,792],{"class":487},[380,3153,574],{"class":390},[380,3155,761],{"class":403},[380,3157,764],{"class":487},[380,3159,459],{"class":390},[380,3161,3162],{"class":382,"line":999},[380,3163,474],{"emptyLinePlaceholder":473},[380,3165,3166,3168,3170,3172,3174],{"class":382,"line":1004},[380,3167,2981],{"class":487},[380,3169,633],{"class":390},[380,3171,636],{"class":483},[380,3173,1681],{"class":487},[380,3175,459],{"class":390},[380,3177,3178,3180],{"class":382,"line":1022},[380,3179,609],{"class":487},[380,3181,459],{"class":390},[380,3183,3184],{"class":382,"line":1043},[380,3185,1276],{"class":487},[356,3187],{},[359,3189,3191],{"id":3190},"tester-les-mises-à-jour-optimistes","Tester les mises à jour optimistes",[348,3193,3194],{},"Vérifier que le rollback restaure l'état exact pré-mutation :",[370,3196,3199],{"className":442,"code":3197,"filename":3198,"language":445,"meta":376,"style":376},"test('le rollback restaure l\\'état précédent en cas d\\'échec', () async {\n  final client = QoraClient();\n  addTearDown(client.dispose);\n\n  // Alimenter les données initiales\n  client.setQueryData\u003CUser>(const ['user'], User(id: 1, name: 'Alice'));\n\n  final snapshot = client.getQueryData\u003CUser>(const ['user']);\n\n  // Appliquer la mise à jour optimiste\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  // Simuler un échec : 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,3200,3201,3229,3243,3255,3259,3264,3308,3312,3344,3348,3353,3397,3437,3443,3487,3494,3500,3504,3509,3539,3543,3549,3591,3598,3604],{"__ignoreMap":376},[380,3202,3203,3206,3208,3211,3213,3216,3218,3221,3223,3225,3227],{"class":382,"line":383},[380,3204,3205],{"class":483},"test",[380,3207,655],{"class":487},[380,3209,3210],{"class":403},"'le rollback restaure l",[380,3212,2258],{"class":487},[380,3214,3215],{"class":403},"état précédent en cas d",[380,3217,2258],{"class":487},[380,3219,3220],{"class":403},"échec'",[380,3222,574],{"class":390},[380,3224,663],{"class":487},[380,3226,667],{"class":666},[380,3228,670],{"class":487},[380,3230,3231,3233,3235,3237,3239,3241],{"class":382,"line":394},[380,3232,1913],{"class":479},[380,3234,1459],{"class":487},[380,3236,526],{"class":390},[380,3238,498],{"class":497},[380,3240,1681],{"class":487},[380,3242,459],{"class":390},[380,3244,3245,3247,3249,3251,3253],{"class":382,"line":407},[380,3246,1928],{"class":483},[380,3248,1515],{"class":487},[380,3250,633],{"class":390},[380,3252,1520],{"class":487},[380,3254,459],{"class":390},[380,3256,3257],{"class":382,"line":415},[380,3258,474],{"emptyLinePlaceholder":473},[380,3260,3261],{"class":382,"line":491},[380,3262,3263],{"class":577},"  // Alimenter les données initiales\n",[380,3265,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284,3286,3288,3290,3292,3294,3296,3298,3300,3302,3304,3306],{"class":382,"line":506},[380,3267,1950],{"class":487},[380,3269,633],{"class":390},[380,3271,1877],{"class":483},[380,3273,694],{"class":487},[380,3275,697],{"class":497},[380,3277,1961],{"class":487},[380,3279,1964],{"class":479},[380,3281,713],{"class":487},[380,3283,2864],{"class":403},[380,3285,724],{"class":487},[380,3287,574],{"class":390},[380,3289,744],{"class":497},[380,3291,747],{"class":487},[380,3293,400],{"class":390},[380,3295,721],{"class":452},[380,3297,574],{"class":390},[380,3299,756],{"class":487},[380,3301,400],{"class":390},[380,3303,761],{"class":403},[380,3305,1117],{"class":487},[380,3307,459],{"class":390},[380,3309,3310],{"class":382,"line":511},[380,3311,474],{"emptyLinePlaceholder":473},[380,3313,3314,3316,3319,3321,3323,3325,3328,3330,3332,3334,3336,3338,3340,3342],{"class":382,"line":520},[380,3315,1913],{"class":479},[380,3317,3318],{"class":487}," snapshot ",[380,3320,526],{"class":390},[380,3322,501],{"class":487},[380,3324,633],{"class":390},[380,3326,3327],{"class":483},"getQueryData",[380,3329,694],{"class":487},[380,3331,697],{"class":497},[380,3333,1961],{"class":487},[380,3335,1964],{"class":479},[380,3337,713],{"class":487},[380,3339,2864],{"class":403},[380,3341,3096],{"class":487},[380,3343,459],{"class":390},[380,3345,3346],{"class":382,"line":534},[380,3347,474],{"emptyLinePlaceholder":473},[380,3349,3350],{"class":382,"line":550},[380,3351,3352],{"class":577},"  // Appliquer la mise à jour optimiste\n",[380,3354,3355,3357,3359,3361,3363,3365,3367,3369,3371,3373,3375,3377,3379,3381,3383,3385,3387,3389,3391,3393,3395],{"class":382,"line":563},[380,3356,1950],{"class":487},[380,3358,633],{"class":390},[380,3360,1877],{"class":483},[380,3362,694],{"class":487},[380,3364,697],{"class":497},[380,3366,1961],{"class":487},[380,3368,1964],{"class":479},[380,3370,713],{"class":487},[380,3372,2864],{"class":403},[380,3374,724],{"class":487},[380,3376,574],{"class":390},[380,3378,744],{"class":497},[380,3380,747],{"class":487},[380,3382,400],{"class":390},[380,3384,721],{"class":452},[380,3386,574],{"class":390},[380,3388,756],{"class":487},[380,3390,400],{"class":390},[380,3392,1993],{"class":403},[380,3394,1117],{"class":487},[380,3396,459],{"class":390},[380,3398,3399,3401,3403,3405,3407,3409,3411,3413,3415,3417,3419,3421,3423,3425,3427,3429,3431,3433,3435],{"class":382,"line":581},[380,3400,2202],{"class":483},[380,3402,1515],{"class":487},[380,3404,633],{"class":390},[380,3406,3081],{"class":483},[380,3408,694],{"class":487},[380,3410,697],{"class":497},[380,3412,1961],{"class":487},[380,3414,1964],{"class":479},[380,3416,713],{"class":487},[380,3418,2864],{"class":403},[380,3420,3096],{"class":487},[380,3422,574],{"class":390},[380,3424,3109],{"class":483},[380,3426,694],{"class":487},[380,3428,1884],{"class":497},[380,3430,694],{"class":487},[380,3432,697],{"class":497},[380,3434,3120],{"class":487},[380,3436,459],{"class":390},[380,3438,3439,3441],{"class":382,"line":590},[380,3440,2202],{"class":483},[380,3442,531],{"class":487},[380,3444,3445,3448,3450,3452,3454,3456,3458,3460,3462,3464,3467,3469,3471,3473,3475,3477,3479,3481,3483,3485],{"class":382,"line":598},[380,3446,3447],{"class":487},"    (client",[380,3449,633],{"class":390},[380,3451,3081],{"class":483},[380,3453,694],{"class":487},[380,3455,697],{"class":497},[380,3457,1961],{"class":487},[380,3459,1964],{"class":479},[380,3461,713],{"class":487},[380,3463,2864],{"class":403},[380,3465,3466],{"class":487},"]) ",[380,3468,3132],{"class":390},[380,3470,3135],{"class":497},[380,3472,694],{"class":487},[380,3474,697],{"class":497},[380,3476,3142],{"class":487},[380,3478,633],{"class":390},[380,3480,3147],{"class":487},[380,3482,633],{"class":390},[380,3484,792],{"class":487},[380,3486,587],{"class":390},[380,3488,3489,3492],{"class":382,"line":606},[380,3490,3491],{"class":403},"    'Bob'",[380,3493,587],{"class":390},[380,3495,3496,3498],{"class":382,"line":614},[380,3497,1415],{"class":487},[380,3499,459],{"class":390},[380,3501,3502],{"class":382,"line":619},[380,3503,474],{"emptyLinePlaceholder":473},[380,3505,3506],{"class":382,"line":644},[380,3507,3508],{"class":577},"  // Simuler un échec : rollback\n",[380,3510,3511,3513,3515,3518,3520,3522,3524,3526,3528,3530,3532,3534,3537],{"class":382,"line":649},[380,3512,1950],{"class":487},[380,3514,633],{"class":390},[380,3516,3517],{"class":483},"restoreQueryData",[380,3519,694],{"class":487},[380,3521,697],{"class":497},[380,3523,1961],{"class":487},[380,3525,1964],{"class":479},[380,3527,713],{"class":487},[380,3529,2864],{"class":403},[380,3531,724],{"class":487},[380,3533,574],{"class":390},[380,3535,3536],{"class":487}," snapshot)",[380,3538,459],{"class":390},[380,3540,3541],{"class":382,"line":673},[380,3542,474],{"emptyLinePlaceholder":473},[380,3544,3545,3547],{"class":382,"line":703},[380,3546,2202],{"class":483},[380,3548,531],{"class":487},[380,3550,3551,3553,3555,3557,3559,3561,3563,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589],{"class":382,"line":729},[380,3552,3447],{"class":487},[380,3554,633],{"class":390},[380,3556,3081],{"class":483},[380,3558,694],{"class":487},[380,3560,697],{"class":497},[380,3562,1961],{"class":487},[380,3564,1964],{"class":479},[380,3566,713],{"class":487},[380,3568,2864],{"class":403},[380,3570,3466],{"class":487},[380,3572,3132],{"class":390},[380,3574,3135],{"class":497},[380,3576,694],{"class":487},[380,3578,697],{"class":497},[380,3580,3142],{"class":487},[380,3582,633],{"class":390},[380,3584,3147],{"class":487},[380,3586,633],{"class":390},[380,3588,792],{"class":487},[380,3590,587],{"class":390},[380,3592,3593,3596],{"class":382,"line":769},[380,3594,3595],{"class":403},"    'Alice'",[380,3597,587],{"class":390},[380,3599,3600,3602],{"class":382,"line":776},[380,3601,1415],{"class":487},[380,3603,459],{"class":390},[380,3605,3606,3608],{"class":382,"line":781},[380,3607,2226],{"class":487},[380,3609,459],{"class":390},[356,3611],{},[359,3613,3615],{"id":3614},"référence-rapide","Référence rapide",[3617,3618,3619,3632],"table",{},[3620,3621,3622],"thead",{},[3623,3624,3625,3629],"tr",{},[3626,3627,3628],"th",{},"Que tester",[3626,3630,3631],{},"Comment",[3633,3634,3635,3644,3658,3672,3684,3697,3712],"tbody",{},[3623,3636,3637,3641],{},[3638,3639,3640],"td",{},"Le fetcher est appelé une seule fois (déduplication cache)",[3638,3642,3643],{},"Compter les appels dans une closure",[3623,3645,3646,3649],{},[3638,3647,3648],{},"Les données sont en cache entre deux appels",[3638,3650,3651,3654,3655],{},[352,3652,3653],{},"staleTime > 0",", appeler deux fois, vérifier ",[352,3656,3657],{},"callCount == 1",[3623,3659,3660,3663],{},[3638,3661,3662],{},"L'état d'erreur atteint le widget",[3638,3664,3665,3666,3669,3670],{},"Le fetcher lève, ",[352,3667,3668],{},"retryCount: 0",", ",[352,3671,1820],{},[3623,3673,3674,3677],{},[3638,3675,3676],{},"Le widget affiche les données pré-alimentées",[3638,3678,3679,3681,3682],{},[352,3680,1877],{}," avant ",[352,3683,1290],{},[3623,3685,3686,3689],{},[3638,3687,3688],{},"La persistance survit au redémarrage",[3638,3690,3691,3692,3694,3695],{},"Deux instances ",[352,3693,229],{}," partageant un ",[352,3696,2589],{},[3623,3698,3699,3702],{},[3638,3700,3701],{},"Rollback optimiste",[3638,3703,3704,3706,3707,3706,3709,3711],{},[352,3705,3327],{}," → ",[352,3708,1877],{},[352,3710,3517],{}," → vérifier l'état",[3623,3713,3714,3719],{},[3638,3715,3716],{},[352,3717,3718],{},"refetchOnWindowFocus",[3638,3720,3721,3722,3725],{},"Ne pas câbler ",[352,3723,3724],{},"FlutterLifecycleManager"," dans les tests : évite les effets secondaires indésirables",[356,3727],{},[359,3729,3731],{"id":3730},"voir-aussi","Voir aussi",[3733,3734,3735,3749,3761],"ul",{},[3736,3737,3738,3743,3744,3669,3746,3748],"li",{},[3739,3740,3742],"a",{"href":3741},"./persistence","Guide de persistance"," : ",[352,3745,229],{},[352,3747,2589],{},", sérialiseurs",[3736,3750,3751,3743,3755,3669,3757,3669,3759],{},[3739,3752,3754],{"href":3753},"./optimistic-updates","Guide des mises à jour optimistes",[352,3756,1877],{},[352,3758,3327],{},[352,3760,3517],{},[3736,3762,3763,3767],{},[3739,3764,3766],{"href":3765},"../api-reference/qora-client","API QoraClient"," : référence complète des méthodes",[3769,3770,3771],"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":3773},[3774,3775,3776,3778,3779,3780,3782,3783,3784],{"id":361,"depth":394,"text":98},{"id":428,"depth":394,"text":429},{"id":1281,"depth":394,"text":3777},"Tests de widgets : wrapper QoraScope",{"id":1870,"depth":394,"text":1871},{"id":2233,"depth":394,"text":2234},{"id":2581,"depth":394,"text":3781},"Tester PersistQoraClient",{"id":3190,"depth":394,"text":3191},{"id":3614,"depth":394,"text":3615},{"id":3730,"depth":394,"text":3731},"Tester les requêtes, mutations et widgets Qora avec des helpers déterministes : pas de réseau, pas de Hive, pas de timers.","md",null,{},{"icon":190},{"title":187,"description":3785},"RA0k5ZpzEkcBEGisW-Skl6E6PzFyFZwh9gNV2ClTaj8",[3793,3795],{"title":182,"path":183,"stem":184,"description":3794,"icon":185,"children":-1},"Comprendre comment Qora remonte les erreurs, configure le comportement de retry et active la dégradation gracieuse avec previousData.",{"title":192,"path":193,"stem":194,"description":3796,"children":-1},"[object Object]",1794040408932]