[39m)[33m;[39m
+ [90m124|[39m await waitFor(() => expect(screen.getByText('Apple')).toBeInTheDoc…
+ [90m |[39m [31m^[39m
+ [90m125|[39m
+ [90m126|[39m const syncBtn = screen.getByRole('button', { name: /Sync.*items to…
+
+[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/7]⎯[22m[39m
+
diff --git a/packages/web/test_results_utf8.txt b/packages/web/test_results_utf8.txt
new file mode 100644
index 0000000..855b019
--- /dev/null
+++ b/packages/web/test_results_utf8.txt
@@ -0,0 +1,1639 @@
+
+[1m[46m RUN [49m[22m [36mv4.1.2 [39m[90mF:/Coding/MeshiTrack/packages/web[39m
+
+node.exe : [90mstderr[2m | src/app/(dashboard)/shopping-lists/[id]/__tests__/page.test.tsx[2m >
+[22m[2mShoppingListDetailPage[2m > [22m[2mloads and displays the list
+At line:1 char:1
++ & "C:\nodejs/node.exe" "C:\nodejs/node_modules/npm/bin/npx-cli.js" vi ...
++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ + CategoryInfo : NotSpecified: ([90mstderr[2m...splays the list:String) [], RemoteException
+ + FullyQualifiedErrorId : NativeCommandError
+
+[22m[39mEach child in a list should have a unique "key" prop.
+
+Check the render method of `ShoppingListDetailsPage`. See https://react.dev/link/warning-keys for more information.
+
+[90mstderr[2m | src/app/(dashboard)/shopping-lists/[id]/__tests__/page.test.tsx[2m >
+[22m[2mShoppingListDetailPage[2m > [22m[2mloads and displays the list
+[22m[39mTypeError: fetch failed
+[90m at node:internal/deps/undici/undici:16416:13[39m
+[90m at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
+ at ApiClient.get (F:/Coding/MeshiTrack/packages/web/src/services/api-client.ts:46:17) {
+ [cause]: AggregateError:
+ [90m at internalConnectMultiple (node:net:1134:18)[39m
+ [90m at afterConnectMultiple (node:net:1715:7)[39m {
+ code: [32m'ECONNREFUSED'[39m,
+ [errors]: [ [36m[Error][39m, [36m[Error][39m ]
+ }
+}
+
+ [32mΓ£ô[39m src/components/__tests__/ThemeProvider.test.tsx [2m([22m[2m8 tests[22m[2m)[22m[32m 116[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/__tests__/page.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 123[2mms[22m[39m
+ [32mΓ£ô[39m src/components/__tests__/TopBar.test.tsx [2m([22m[2m4 tests[22m[2m)[22m[32m 277[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/products/__tests__/ImportDialog.test.tsx [2m([22m[2m11 tests[22m[2m)[22m[33m 359[2mms[22m[39m
+ [32mΓ£ô[39m src/components/__tests__/ui.test.tsx [2m([22m[2m11 tests[22m[2m)[22m[32m 285[2mms[22m[39m
+ [32mΓ£ô[39m src/app/__tests__/page.test.tsx [2m([22m[2m2 tests[22m[2m)[22m[32m 254[2mms[22m[39m
+ [32mΓ£ô[39m src/components/__tests__/Sidebar.test.tsx [2m([22m[2m8 tests[22m[2m)[22m[33m 334[2mms[22m[39m
+[90mstderr[2m | src/app/(dashboard)/dashboard/__tests__/page.test.tsx[2m > [22m[2mDashboardPage[2m >
+[22m[2mshows "good shape" message when no critical alerts
+[22m[39mEach child in a list should have a unique "key" prop.
+
+Check the render method of `DashboardPage`. See https://react.dev/link/warning-keys for more information.
+
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/schedule/__tests__/page.test.tsx [2m([22m[2m14 tests[22m[2m)[22m[33m 408[2mms[22m[39m
+[90mstderr[2m | src/app/(dashboard)/shopping-lists/__tests__/page.test.tsx[2m > [22m[2mShoppingListsPage[2m >
+[22m[2mloads and displays shopping lists
+[22m[39mEach child in a list should have a unique "key" prop.
+
+Check the render method of `ShoppingListsPage`. See https://react.dev/link/warning-keys for more information.
+
+ [32mΓ£ô[39m src/app/(dashboard)/dashboard/__tests__/page.test.tsx [2m([22m[2m13 tests[22m[2m)[22m[33m 406[2mms[22m[39m
+ [31mΓ¥»[39m src/app/(dashboard)/shopping-lists/prices/__tests__/page.test.tsx [2m([22m[2m3 tests[22m[2m | [22m[31m3 failed[39m[2m)[22m[32m 52[2mms[22m[39m
+[31m [31m×[31m renders loading initially[39m[32m 42[2mms[22m[39m
+[31m [31m×[31m loads and displays analytics[39m[32m 4[2mms[22m[39m
+[31m [31m×[31m handles fetch errors gracefully[39m[32m 3[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/shopping-lists/__tests__/page.test.tsx [2m([22m[2m6 tests[22m[2m)[22m[33m 710[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m toggles create list modal and submits [33m 319[2mms[22m[39m
+[90mstderr[2m | src/app/(dashboard)/shopping-lists/[id]/__tests__/page.test.tsx[2m >
+[22m[2mShoppingListDetailPage[2m > [22m[2mtoggles an item check
+[22m[39mTypeError: fetch failed
+[90m at node:internal/deps/undici/undici:16416:13[39m
+[90m at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
+ at ApiClient.get (F:/Coding/MeshiTrack/packages/web/src/services/api-client.ts:46:17) {
+ [cause]: AggregateError:
+ [90m at internalConnectMultiple (node:net:1134:18)[39m
+ [90m at afterConnectMultiple (node:net:1715:7)[39m {
+ code: [32m'ECONNREFUSED'[39m,
+ [errors]: [ [36m[Error][39m, [36m[Error][39m ]
+ }
+}
+
+[90mstderr[2m | src/app/(dashboard)/medicine-prices/__tests__/page.test.tsx[2m > [22m[2mMedicinePricesPage[2m >
+[22m[2mrenders Medicine Prices heading when householdId exists
+[22m[39mAn update to MedicinePricesContent inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+An update to MedicinePricesContent inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+
+[90mstderr[2m | src/app/(dashboard)/refills/__tests__/page.test.tsx[2m > [22m[2mRefillsPage[2m >
+[22m[2mrenders Refills heading when householdId exists
+[22m[39mAn update to AlertsPanel inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+An update to AlertsPanel inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+An update to RefillListsPanel inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+An update to RefillListsPanel inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+
+ [32mΓ£ô[39m src/app/(dashboard)/recipes/new/__tests__/page.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 203[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/recipes/[id]/edit/__tests__/page.test.tsx [2m([22m[2m4 tests[22m[2m)[22m[32m 283[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/recipes/[id]/__tests__/page.test.tsx [2m([22m[2m11 tests[22m[2m)[22m[33m 557[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/purchases/__tests__/page.test.tsx [2m([22m[2m26 tests[22m[2m)[22m[33m 2317[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/stores/__tests__/page.test.tsx [2m([22m[2m22 tests[22m[2m)[22m[33m 2286[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m toggles a preset tag and adds a custom tag [33m 445[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/pantry/__tests__/page.test.tsx [2m([22m[2m15 tests[22m[2m)[22m[33m 801[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/recipes/__tests__/RecipeEditor.test.tsx [2m([22m[2m9 tests[22m[2m)[22m[33m 831[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/recipes/__tests__/page.test.tsx [2m([22m[2m22 tests[22m[2m)[22m[33m 885[2mms[22m[39m
+[90mstderr[2m | src/app/(dashboard)/medicines/__tests__/ActivityTab.test.tsx[2m > [22m[2mActivityTab[2m >
+[22m[2mloads more events when Load more is clicked
+[22m[39mEncountered two children with the same key, `ev-1`. Keys should be unique so that components maintain their
+identity across updates. Non-unique keys may cause children to be duplicated and/or omitted ΓÇö the behavior is
+unsupported and could change in a future version.
+
+[90mstderr[2m | src/app/(dashboard)/shopping-lists/[id]/__tests__/page.test.tsx[2m >
+[22m[2mShoppingListDetailPage[2m > [22m[2madds a new item to the list
+[22m[39mTypeError: fetch failed
+[90m at node:internal/deps/undici/undici:16416:13[39m
+[90m at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
+ at ApiClient.get (F:/Coding/MeshiTrack/packages/web/src/services/api-client.ts:46:17) {
+ [cause]: AggregateError:
+ [90m at internalConnectMultiple (node:net:1134:18)[39m
+ [90m at afterConnectMultiple (node:net:1715:7)[39m {
+ code: [32m'ECONNREFUSED'[39m,
+ [errors]: [ [36m[Error][39m, [36m[Error][39m ]
+ }
+}
+
+[90mstderr[2m | src/app/(dashboard)/medicine-prices/__tests__/page.test.tsx[2m > [22m[2mMedicinePricesPage[2m >
+[22m[2mshows Load more button in price history
+[22m[39mEncountered two children with the same key, `pr-1`. Keys should be unique so that components maintain their
+identity across updates. Non-unique keys may cause children to be duplicated and/or omitted ΓÇö the behavior is
+unsupported and could change in a future version.
+
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/__tests__/ActivityTab.test.tsx [2m([22m[2m18 tests[22m[2m)[22m[33m 979[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/products/__tests__/page.test.tsx [2m([22m[2m11 tests[22m[2m)[22m[33m 1234[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m filters by search input with debounce [33m 413[2mms[22m[39m
+[90mstderr[2m | src/app/(dashboard)/medicines/__tests__/LibraryTab.test.tsx[2m > [22m[2mLibraryTab[2m >
+[22m[2mfilters medicines by search, category, and form
+[22m[39mAn update to LibraryTab inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+An update to LibraryTab inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+An update to LibraryTab inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+An update to LibraryTab inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+An update to LibraryTab inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/__tests__/OrganizerTab.test.tsx [2m([22m[2m20 tests[22m[2m)[22m[33m 1394[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicine-prices/__tests__/page.test.tsx [2m([22m[2m15 tests[22m[2m)[22m[33m 1432[2mms[22m[39m
+[90mstderr[2m | src/app/(dashboard)/medicines/__tests__/CabinetTab.test.tsx[2m > [22m[2mCabinetTab[2m >
+[22m[2mchanges quantity and unit in AddToCabinetForm
+[22m[39mAn update to AddToCabinetForm inside a test was not wrapped in act(...).
+
+When testing, code that causes React state updates should be wrapped into act(...):
+
+act(() => {
+ /* fire events that update state */
+});
+/* assert on the output */
+
+This ensures that you're testing the behavior the user would see in the browser. Learn more at
+https://react.dev/link/wrap-tests-with-act
+
+ [32mΓ£ô[39m src/app/(dashboard)/products/__tests__/ProductModal.test.tsx [2m([22m[2m18 tests[22m[2m)[22m[33m 1701[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m calls onSave with correct data on valid submit [33m 331[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/settings/__tests__/page.test.tsx [2m([22m[2m20 tests[22m[2m)[22m[33m 3677[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m allows editing the household name [33m 438[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m shows error when name update fails [33m 458[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m shows fallback error when non-Error thrown on name update [33m 372[2mms[22m[39m
+[90mstderr[2m | src/app/(dashboard)/shopping-lists/[id]/__tests__/page.test.tsx[2m >
+[22m[2mShoppingListDetailPage[2m > [22m[2mcompletes the trip and syncs to pantry
+[22m[39mTypeError: fetch failed
+[90m at node:internal/deps/undici/undici:16416:13[39m
+[90m at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
+ at ApiClient.get (F:/Coding/MeshiTrack/packages/web/src/services/api-client.ts:46:17) {
+ [cause]: AggregateError:
+ [90m at internalConnectMultiple (node:net:1134:18)[39m
+ [90m at afterConnectMultiple (node:net:1715:7)[39m {
+ code: [32m'ECONNREFUSED'[39m,
+ [errors]: [ [36m[Error][39m, [36m[Error][39m ]
+ }
+}
+
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/__tests__/LibraryTab.test.tsx [2m([22m[2m14 tests[22m[2m)[22m[33m 2075[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m creates medicine and refreshes list [33m 515[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m shows fallback error when non-Error is thrown on create medicine [33m 466[2mms[22m[39m
+ [31mΓ¥»[39m src/app/(dashboard)/shopping-lists/[id]/__tests__/page.test.tsx [2m([22m[2m5 tests[22m[2m | [22m[31m5 failed[39m[2m)[22m[33m 4140[2mms[22m[39m
+[31m [31m×[31m renders loading initially[39m[32m 57[2mms[22m[39m
+[31m [31m×[31m loads and displays the list[39m[33m 1035[2mms[22m[39m
+[31m [31m×[31m toggles an item check[39m[33m 1019[2mms[22m[39m
+[31m [31m×[31m adds a new item to the list[39m[33m 1016[2mms[22m[39m
+[31m [31m×[31m completes the trip and syncs to pantry[39m[33m 1009[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/refills/__tests__/page.test.tsx [2m([22m[2m26 tests[22m[2m)[22m[33m 3097[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/__tests__/CabinetTab.test.tsx [2m([22m[2m29 tests[22m[2m)[22m[33m 3172[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/__tests__/RegimensTab.test.tsx [2m([22m[2m32 tests[22m[2m)[22m[33m 3206[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/cabinet/__tests__/page.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 106[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/organizer/__tests__/page.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 108[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/regimens/__tests__/page.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 106[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/[id]/__tests__/page.test.tsx [2m([22m[2m34 tests[22m[2m)[22m[33m 3690[2mms[22m[39m
+ [33m[2mΓ£ô[22m[39m toggles Add Product form [33m 339[2mms[22m[39m
+[90mstdout[2m | src/lib/useShoppingListSync.test.ts[2m > [22m[2museShoppingListSync[2m > [22m[2mhandles incoming item_updated messages correctly
+[22m[39m🛒 Connected to shopping list real-time sync: list1
+
+[90mstdout[2m | src/lib/useShoppingListSync.test.ts[2m > [22m[2museShoppingListSync[2m > [22m[2mbroadcasts toggle item messages when connected
+[22m[39m🛒 Connected to shopping list real-time sync: list1
+
+[90mstdout[2m | src/lib/useShoppingListSync.test.ts[2m > [22m[2museShoppingListSync[2m > [22m[2mhandles disconnect and reconnect backoff
+[22m[39m🛒 Connected to shopping list real-time sync: list1
+🔌 Sync severed: test
+🔄 Attempting sync handshake reconnect (1/5)...
+
+ [32mΓ£ô[39m src/lib/useShoppingListSync.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 49[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/__tests__/layout.test.tsx [2m([22m[2m1 test[22m[2m)[22m[32m 54[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/activity/__tests__/page.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 94[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/medicines/library/__tests__/page.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 98[2mms[22m[39m
+ [32mΓ£ô[39m src/lib/__tests__/useApi.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 33[2mms[22m[39m
+ [32mΓ£ô[39m src/app/(dashboard)/__tests__/loading.test.tsx [2m([22m[2m1 test[22m[2m)[22m[32m 37[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/api-client.test.ts [2m([22m[2m14 tests[22m[2m)[22m[32m 28[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/recipes.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 17[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/products.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 18[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/regimens.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/refills.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 11[2mms[22m[39m
+ [32mΓ£ô[39m src/services/meal-plans.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 12[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/organizer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/stores.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 9[2mms[22m[39m
+ [32mΓ£ô[39m src/services/shopping-lists.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 12[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/pantry.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/cabinet.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 14[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/households.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 9[2mms[22m[39m
+ [32mΓ£ô[39m src/services/prices.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 10[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/medicines.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 14[2mms[22m[39m
+ [32mΓ£ô[39m src/services/nutrition-targets.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/purchases.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/cabinet-events.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 13[2mms[22m[39m
+ [32mΓ£ô[39m src/services/__tests__/medicine-prices.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
+
+[31m⎯⎯⎯⎯⎯⎯⎯[39m[1m[41m Failed Tests 8 [49m[22m[31m⎯⎯⎯⎯⎯⎯⎯[39m
+
+[41m[1m FAIL [22m[49m src/app/(dashboard)/shopping-lists/prices/__tests__/page.test.tsx[2m >
+[22mShoppingListPricesPage[2m > [22mrenders loading initially
+[41m[1m FAIL [22m[49m src/app/(dashboard)/shopping-lists/prices/__tests__/page.test.tsx[2m >
+[22mShoppingListPricesPage[2m > [22mloads and displays analytics
+[41m[1m FAIL [22m[49m src/app/(dashboard)/shopping-lists/prices/__tests__/page.test.tsx[2m >
+[22mShoppingListPricesPage[2m > [22mhandles fetch errors gracefully
+[31m[1mError[22m: invariant expected app router to be mounted[39m
+[90m [2mΓ¥»[22m useRouter ../../node_modules/next/src/client/components/navigation.ts:[2m179:10[22m[39m
+[36m [2mΓ¥»[22m PricesAnalyticsPage src/app/(dashboard)/shopping-lists/prices/page.tsx:[2m25:18[22m[39m
+ [90m 23|[39m [35mexport[39m [35mdefault[39m [35mfunction[39m [33mPricesAnalyticsPage[39m() {
+ [90m 24|[39m [35mconst[39m { householdId[33m,[39m isLoading } [33m=[39m [34museApi[39m()[33m;[39m
+ [90m 25|[39m [35mconst[39m router [33m=[39m [34museRouter[39m()[33m;[39m
+ [90m |[39m [31m^[39m
+ [90m 26|[39m [35mconst[39m [data[33m,[39m setData] [33m=[39m
+useState[33m<[39many[33m>[39m([35mnull[39m)[33m;[39m
+ [90m 27|[39m [35mconst[39m [loading[33m,[39m setLoading] [33m=[39m
+[34museState[39m([35mtrue[39m)[33m;[39m
+[90m [2mΓ¥»[22m Object.react_stack_bottom_frame
+../../node_modules/react-dom/cjs/react-dom-client.development.js:[2m25904:20[22m[39m
+[90m [2mΓ¥»[22m renderWithHooks
+../../node_modules/react-dom/cjs/react-dom-client.development.js:[2m7662:22[22m[39m
+[90m [2mΓ¥»[22m updateFunctionComponent
+../../node_modules/react-dom/cjs/react-dom-client.development.js:[2m10166:19[22m[39m
+[90m [2mΓ¥»[22m beginWork ../../node_modules/react-dom/cjs/react-dom-client.development.js:[2m11778:18[22m[39m
+[90m [2mΓ¥»[22m runWithFiberInDEV
+../../node_modules/react-dom/cjs/react-dom-client.development.js:[2m874:13[22m[39m
+[90m [2mΓ¥»[22m performUnitOfWork
+../../node_modules/react-dom/cjs/react-dom-client.development.js:[2m17641:22[22m[39m
+[90m [2mΓ¥»[22m workLoopSync ../../node_modules/react-dom/cjs/react-dom-client.development.js:[2m17469:41[22m[39m
+[90m [2mΓ¥»[22m renderRootSync
+../../node_modules/react-dom/cjs/react-dom-client.development.js:[2m17450:11[22m[39m
+
+[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/8]⎯[22m[39m
+
+[41m[1m FAIL [22m[49m src/app/(dashboard)/shopping-lists/[id]/__tests__/page.test.tsx[2m >
+[22mShoppingListDetailPage[2m > [22mrenders loading initially
+[31m[1mTestingLibraryElementError[22m: Unable to find an element with the text: Shopping List. This could be
+because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to
+make your matcher more flexible.
+
+Ignored nodes: comments, script, style
+[36m[31m
+ [36m
[31m
+ [36m
[31m
+ [0mHydrating session checklist...[0m
+ [36m
[31m
+ [36m
[31m
+[36m[31m[39m
+[90m [2mΓ¥»[22m Object.getElementError ../../node_modules/@testing-library/dom/dist/config.js:[2m37:19[22m[39m
+[90m [2mΓ¥»[22m ../../node_modules/@testing-library/dom/dist/query-helpers.js:[2m76:38[22m[39m
+[90m [2mΓ¥»[22m ../../node_modules/@testing-library/dom/dist/query-helpers.js:[2m52:17[22m[39m
+[90m [2mΓ¥»[22m ../../node_modules/@testing-library/dom/dist/query-helpers.js:[2m95:19[22m[39m
+[36m [2mΓ¥»[22m src/app/(dashboard)/shopping-lists/[id]/__tests__/page.test.tsx:[2m48:19[22m[39m
+ [90m 46|[39m vi.mocked(useApiModule.useApi).mockReturnValue({ householdId: null…
+ [90m 47|[39m [34mrender[39m([33m<[39m[33mShoppingListDetailPage[39m [33m/[39m[33m>[39m)[33m;[39m
+ [90m 48|[39m [34mexpect[39m(screen[33m.[39m[34mgetByText[39m([32m'Shopping
+List'[39m))[33m.[39m[34mtoBeInTheDocument[39m()[33m;[39m
+ [90m |[39m [31m^[39m
+ [90m 49|[39m })[33m;[39m
+ [90m 50|[39m
+
+[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/8]⎯[22m[39m
+
+[41m[1m FAIL [22m[49m src/app/(dashboard)/shopping-lists/[id]/__tests__/page.test.tsx[2m >
+[22mShoppingListDetailPage[2m > [22mloads and displays the list
+[31m[1mTestingLibraryElementError[22m[39m: Unable to find an element with the text: Apple. This could be because
+the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make
+your matcher more flexible.
+
+Ignored nodes: comments, script, style
+[36m[39m
+ [36m
[39m
+ [36m
[39m
+ [0mTest List[0m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [0mactive[0m
+ [36m[39m
+ [36m
[39m
+ [36m
[39m
+ [0mLive Sync Channel Operational[0m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [0mOther / Misc[0m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [36m
[39m
+ [0mIngredient Loading...[0m
+ [36m
[39m
+ [36m
[39m
+ [36m[39m
+ [0mQty: [0m
+ [0m5[0m
+ [0m [0m
+ [36m[39m
+ [36m
[39m
+ [36m
[39m
+ [36m