From 574acf3e8739a7ca08a492445894b6f00a40fb1d Mon Sep 17 00:00:00 2001 From: Eric Gullickson <16152721+ericgullickson@users.noreply.github.com> Date: Sat, 17 Jan 2026 22:08:23 -0600 Subject: [PATCH 1/2] fix: return raw rows from enhanced repository methods (refs #47) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enhanced repository methods were incorrectly calling mapRow() which converts snake_case to camelCase, but the service's toEnhancedResponse() expects raw database rows with snake_case properties. This caused "Invalid time value" errors when calling new Date(row.created_at). Fixed methods: - createEnhanced - findByVehicleIdEnhanced - findByUserIdEnhanced - findByIdEnhanced - getPreviousLogByOdometer - getLatestLogForVehicle - updateEnhanced 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../fuel-logs/data/fuel-logs.repository.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/features/fuel-logs/data/fuel-logs.repository.ts b/backend/src/features/fuel-logs/data/fuel-logs.repository.ts index 934936e..f2b9501 100644 --- a/backend/src/features/fuel-logs/data/fuel-logs.repository.ts +++ b/backend/src/features/fuel-logs/data/fuel-logs.repository.ts @@ -293,7 +293,7 @@ export class FuelLogsRepository { data.notes ?? null ]; const res = await this.pool.query(query, values); - return res.rows[0] ? this.mapRow(res.rows[0]) : null; + return res.rows[0] ?? null; } async findByVehicleIdEnhanced(vehicleId: string): Promise { @@ -301,7 +301,7 @@ export class FuelLogsRepository { `SELECT * FROM fuel_logs WHERE vehicle_id = $1 ORDER BY date_time DESC NULLS LAST, date DESC NULLS LAST, created_at DESC`, [vehicleId] ); - return res.rows.map(row => this.mapRow(row)); + return res.rows; } async findByUserIdEnhanced(userId: string): Promise { @@ -309,12 +309,12 @@ export class FuelLogsRepository { `SELECT * FROM fuel_logs WHERE user_id = $1 ORDER BY date_time DESC NULLS LAST, date DESC NULLS LAST, created_at DESC`, [userId] ); - return res.rows.map(row => this.mapRow(row)); + return res.rows; } async findByIdEnhanced(id: string): Promise { const res = await this.pool.query(`SELECT * FROM fuel_logs WHERE id = $1`, [id]); - return res.rows[0] ? this.mapRow(res.rows[0]) : null; + return res.rows[0] ?? null; } async getPreviousLogByOdometer(vehicleId: string, odometerReading: number): Promise { @@ -322,7 +322,7 @@ export class FuelLogsRepository { `SELECT * FROM fuel_logs WHERE vehicle_id = $1 AND odometer IS NOT NULL AND odometer < $2 ORDER BY odometer DESC LIMIT 1`, [vehicleId, odometerReading] ); - return res.rows[0] ? this.mapRow(res.rows[0]) : null; + return res.rows[0] ?? null; } async getLatestLogForVehicle(vehicleId: string): Promise { @@ -330,7 +330,7 @@ export class FuelLogsRepository { `SELECT * FROM fuel_logs WHERE vehicle_id = $1 ORDER BY date_time DESC NULLS LAST, date DESC NULLS LAST, created_at DESC LIMIT 1`, [vehicleId] ); - return res.rows[0] ? this.mapRow(res.rows[0]) : null; + return res.rows[0] ?? null; } async updateEnhanced(id: string, data: { @@ -416,6 +416,6 @@ export class FuelLogsRepository { return null; } - return this.mapRow(result.rows[0]); + return result.rows[0]; } } -- 2.49.1 From 444abf225526d591cc70d1d37b4f27a8fb2221f0 Mon Sep 17 00:00:00 2001 From: Eric Gullickson <16152721+ericgullickson@users.noreply.github.com> Date: Sat, 17 Jan 2026 22:27:17 -0600 Subject: [PATCH 2/2] chore: updates --- frontend/.claude/tdd-guard/data/test.json | 802 ++++++++++++++++++ frontend/package-lock.json | 139 +++ frontend/package.json | 67 +- .../AdminSectionHeader.test.tsx.snap | 146 ++++ .../__snapshots__/AdminSkeleton.test.tsx.snap | 516 +++++++++++ .../BulkActionDialog.test.tsx.snap | 7 + .../__snapshots__/EmptyState.test.tsx.snap | 48 ++ .../__snapshots__/ErrorState.test.tsx.snap | 45 + .../SelectionToolbar.test.tsx.snap | 59 ++ 9 files changed, 1796 insertions(+), 33 deletions(-) create mode 100644 frontend/.claude/tdd-guard/data/test.json create mode 100644 frontend/src/features/admin/__tests__/components/__snapshots__/AdminSectionHeader.test.tsx.snap create mode 100644 frontend/src/features/admin/__tests__/components/__snapshots__/AdminSkeleton.test.tsx.snap create mode 100644 frontend/src/features/admin/__tests__/components/__snapshots__/BulkActionDialog.test.tsx.snap create mode 100644 frontend/src/features/admin/__tests__/components/__snapshots__/EmptyState.test.tsx.snap create mode 100644 frontend/src/features/admin/__tests__/components/__snapshots__/ErrorState.test.tsx.snap create mode 100644 frontend/src/features/admin/__tests__/components/__snapshots__/SelectionToolbar.test.tsx.snap diff --git a/frontend/.claude/tdd-guard/data/test.json b/frontend/.claude/tdd-guard/data/test.json new file mode 100644 index 0000000..cbf0c94 --- /dev/null +++ b/frontend/.claude/tdd-guard/data/test.json @@ -0,0 +1,802 @@ +{ + "testModules": [ + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/catalogShared.test.ts", + "tests": [ + { + "name": "describes dependent counts for makes", + "fullName": "getCascadeSummary describes dependent counts for makes", + "state": "passed" + }, + { + "name": "returns empty string when nothing selected", + "fullName": "getCascadeSummary returns empty string when nothing selected", + "state": "passed" + }, + { + "name": "prefills parent context for create operations", + "fullName": "buildDefaultValues prefills parent context for create operations", + "state": "passed" + }, + { + "name": "hydrates existing entity data for editing engines", + "fullName": "buildDefaultValues hydrates existing entity data for editing engines", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/utils/navigation-links.test.ts", + "tests": [ + { + "name": "uses coordinates when valid", + "fullName": "buildNavigationLinks uses coordinates when valid", + "state": "passed" + }, + { + "name": "falls back to query when coordinates are missing", + "fullName": "buildNavigationLinks falls back to query when coordinates are missing", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/documents/components/DocumentCardMetadata.test.tsx", + "tests": [ + { + "name": "displays expiration date", + "fullName": "DocumentCardMetadata insurance documents displays expiration date", + "state": "passed" + }, + { + "name": "displays policy number", + "fullName": "DocumentCardMetadata insurance documents displays policy number", + "state": "passed" + }, + { + "name": "displays insurance company", + "fullName": "DocumentCardMetadata insurance documents displays insurance company", + "state": "passed" + }, + { + "name": "limits to 3 fields in card variant", + "fullName": "DocumentCardMetadata insurance documents limits to 3 fields in card variant", + "state": "passed" + }, + { + "name": "shows all fields in detail variant", + "fullName": "DocumentCardMetadata insurance documents shows all fields in detail variant", + "state": "passed" + }, + { + "name": "displays expiration date", + "fullName": "DocumentCardMetadata registration documents displays expiration date", + "state": "passed" + }, + { + "name": "displays license plate", + "fullName": "DocumentCardMetadata registration documents displays license plate", + "state": "passed" + }, + { + "name": "shows cost in detail variant only", + "fullName": "DocumentCardMetadata registration documents shows cost in detail variant only", + "state": "passed" + }, + { + "name": "displays issued date if set", + "fullName": "DocumentCardMetadata manual documents displays issued date if set", + "state": "passed" + }, + { + "name": "shows notes preview in detail variant only", + "fullName": "DocumentCardMetadata manual documents shows notes preview in detail variant only", + "state": "passed" + }, + { + "name": "truncates long notes in detail variant", + "fullName": "DocumentCardMetadata manual documents truncates long notes in detail variant", + "state": "passed" + }, + { + "name": "returns null when no metadata to display", + "fullName": "DocumentCardMetadata empty states returns null when no metadata to display", + "state": "passed" + }, + { + "name": "handles missing details gracefully", + "fullName": "DocumentCardMetadata empty states handles missing details gracefully", + "state": "passed" + }, + { + "name": "uses text-xs for mobile variant", + "fullName": "DocumentCardMetadata variant styling uses text-xs for mobile variant", + "state": "passed" + }, + { + "name": "uses text-sm for card variant", + "fullName": "DocumentCardMetadata variant styling uses text-sm for card variant", + "state": "passed" + }, + { + "name": "uses grid layout for detail variant", + "fullName": "DocumentCardMetadata variant styling uses grid layout for detail variant", + "state": "passed" + }, + { + "name": "formats premium correctly", + "fullName": "DocumentCardMetadata currency formatting formats premium correctly", + "state": "passed" + }, + { + "name": "handles string numbers", + "fullName": "DocumentCardMetadata currency formatting handles string numbers", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/documents/components/ExpirationBadge.test.tsx", + "tests": [ + { + "name": "renders nothing for null", + "fullName": "ExpirationBadge when no expiration date is provided renders nothing for null", + "state": "passed" + }, + { + "name": "renders nothing for undefined", + "fullName": "ExpirationBadge when no expiration date is provided renders nothing for undefined", + "state": "passed" + }, + { + "name": "renders nothing for empty string", + "fullName": "ExpirationBadge when no expiration date is provided renders nothing for empty string", + "state": "passed" + }, + { + "name": "shows \"Expired\" badge for past dates", + "fullName": "ExpirationBadge when document is expired shows \"Expired\" badge for past dates", + "state": "passed" + }, + { + "name": "shows \"Expired\" badge for dates far in the past", + "fullName": "ExpirationBadge when document is expired shows \"Expired\" badge for dates far in the past", + "state": "passed" + }, + { + "name": "has red styling for expired badge", + "fullName": "ExpirationBadge when document is expired has red styling for expired badge", + "state": "passed" + }, + { + "name": "shows \"Expires today\" badge", + "fullName": "ExpirationBadge when document expires today shows \"Expires today\" badge", + "state": "passed" + }, + { + "name": "has amber styling for expiring soon badge", + "fullName": "ExpirationBadge when document expires today has amber styling for expiring soon badge", + "state": "passed" + }, + { + "name": "shows \"Expires tomorrow\" badge", + "fullName": "ExpirationBadge when document expires tomorrow shows \"Expires tomorrow\" badge", + "state": "passed" + }, + { + "name": "shows \"Expires in X days\" badge for 15 days", + "fullName": "ExpirationBadge when document expires within 30 days shows \"Expires in X days\" badge for 15 days", + "state": "passed" + }, + { + "name": "shows \"Expires in X days\" badge for 30 days", + "fullName": "ExpirationBadge when document expires within 30 days shows \"Expires in X days\" badge for 30 days", + "state": "passed" + }, + { + "name": "shows \"Expires in X days\" badge for 2 days", + "fullName": "ExpirationBadge when document expires within 30 days shows \"Expires in X days\" badge for 2 days", + "state": "passed" + }, + { + "name": "renders nothing for 31 days out", + "fullName": "ExpirationBadge when document expires after 30 days renders nothing for 31 days out", + "state": "passed" + }, + { + "name": "renders nothing for dates far in the future", + "fullName": "ExpirationBadge when document expires after 30 days renders nothing for dates far in the future", + "state": "passed" + }, + { + "name": "applies custom className to the badge", + "fullName": "ExpirationBadge className prop applies custom className to the badge", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/hooks/useBulkSelection.test.ts", + "tests": [ + { + "name": "should initialize with empty selection", + "fullName": "useBulkSelection should initialize with empty selection", + "state": "passed" + }, + { + "name": "should toggle individual item selection", + "fullName": "useBulkSelection should toggle individual item selection", + "state": "passed" + }, + { + "name": "should toggle all items", + "fullName": "useBulkSelection should toggle all items", + "state": "passed" + }, + { + "name": "should reset all selections", + "fullName": "useBulkSelection should reset all selections", + "state": "passed" + }, + { + "name": "should return selected items", + "fullName": "useBulkSelection should return selected items", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/api/stations.api.test.ts", + "tests": [ + { + "name": "Module failed to load (Error)", + "fullName": "Module failed to load (Error)", + "state": "failed", + "errors": [ + { + "message": "Cannot use 'import.meta' outside a module", + "name": "Error", + "stack": "Jest encountered an unexpected token\n\nJest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.\n\nOut of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.\n\nBy default \"node_modules\" folder is ignored by transformers.\n\nHere's what you can do:\n • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.\n • If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript\n • To have some of your \"node_modules\" files transformed, you can specify a custom \"transformIgnorePatterns\" in your config.\n • If you need a custom transformation specify a \"transform\" option in your config.\n • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the \"moduleNameMapper\" config option.\n\nYou'll find more details and examples of these config options in the docs:\nhttps://jestjs.io/docs/configuration\nFor information about custom transformations, see:\nhttps://jestjs.io/docs/code-transformation\n\nDetails:\n\n/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/core/api/client.ts:46\nconst API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api';\n ^^^^\n\nSyntaxError: Cannot use 'import.meta' outside a module\n at new Script (node:vm:117:7)\n at Runtime.createScriptFromCode (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1505:14)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1399:25)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/api/stations.api.ts:5:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/api/stations.api.test.ts:6:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/api/community-stations.api.test.ts", + "tests": [ + { + "name": "Module failed to load (Error)", + "fullName": "Module failed to load (Error)", + "state": "failed", + "errors": [ + { + "message": "Cannot use 'import.meta' outside a module", + "name": "Error", + "stack": "Jest encountered an unexpected token\n\nJest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.\n\nOut of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.\n\nBy default \"node_modules\" folder is ignored by transformers.\n\nHere's what you can do:\n • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.\n • If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript\n • To have some of your \"node_modules\" files transformed, you can specify a custom \"transformIgnorePatterns\" in your config.\n • If you need a custom transformation specify a \"transform\" option in your config.\n • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the \"moduleNameMapper\" config option.\n\nYou'll find more details and examples of these config options in the docs:\nhttps://jestjs.io/docs/configuration\nFor information about custom transformations, see:\nhttps://jestjs.io/docs/code-transformation\n\nDetails:\n\n/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/core/api/client.ts:46\nconst API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api';\n ^^^^\n\nSyntaxError: Cannot use 'import.meta' outside a module\n at new Script (node:vm:117:7)\n at Runtime.createScriptFromCode (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1505:14)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1399:25)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/api/community-stations.api.ts:5:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/api/community-stations.api.test.ts:6:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/hooks/useStationsSearch.test.ts", + "tests": [ + { + "name": "Module failed to load (Error)", + "fullName": "Module failed to load (Error)", + "state": "failed", + "errors": [ + { + "message": "Cannot use 'import.meta' outside a module", + "name": "Error", + "stack": "Jest encountered an unexpected token\n\nJest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.\n\nOut of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.\n\nBy default \"node_modules\" folder is ignored by transformers.\n\nHere's what you can do:\n • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.\n • If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript\n • To have some of your \"node_modules\" files transformed, you can specify a custom \"transformIgnorePatterns\" in your config.\n • If you need a custom transformation specify a \"transform\" option in your config.\n • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the \"moduleNameMapper\" config option.\n\nYou'll find more details and examples of these config options in the docs:\nhttps://jestjs.io/docs/configuration\nFor information about custom transformations, see:\nhttps://jestjs.io/docs/code-transformation\n\nDetails:\n\n/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/core/api/client.ts:46\nconst API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api';\n ^^^^\n\nSyntaxError: Cannot use 'import.meta' outside a module\n at new Script (node:vm:117:7)\n at Runtime.createScriptFromCode (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1505:14)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1399:25)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/api/stations.api.ts:5:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime._generateMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1690:34)\n at Runtime.requireMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:996:39)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1046:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/hooks/useStationsSearch.ts:6:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/hooks/useStationsSearch.test.ts:8:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/hooks/useCommunityStations.test.ts", + "tests": [ + { + "name": "Module failed to load (Error)", + "fullName": "Module failed to load (Error)", + "state": "failed", + "errors": [ + { + "message": "Cannot use 'import.meta' outside a module", + "name": "Error", + "stack": "Jest encountered an unexpected token\n\nJest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.\n\nOut of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.\n\nBy default \"node_modules\" folder is ignored by transformers.\n\nHere's what you can do:\n • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.\n • If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript\n • To have some of your \"node_modules\" files transformed, you can specify a custom \"transformIgnorePatterns\" in your config.\n • If you need a custom transformation specify a \"transform\" option in your config.\n • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the \"moduleNameMapper\" config option.\n\nYou'll find more details and examples of these config options in the docs:\nhttps://jestjs.io/docs/configuration\nFor information about custom transformations, see:\nhttps://jestjs.io/docs/code-transformation\n\nDetails:\n\n/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/core/api/client.ts:46\nconst API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api';\n ^^^^\n\nSyntaxError: Cannot use 'import.meta' outside a module\n at new Script (node:vm:117:7)\n at Runtime.createScriptFromCode (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1505:14)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1399:25)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/api/community-stations.api.ts:5:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime._generateMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1690:34)\n at Runtime.requireMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:996:39)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1046:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/hooks/useCommunityStations.ts:6:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/hooks/useCommunityStations.test.ts:8:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/documents/components/DocumentPreview.test.tsx", + "tests": [ + { + "name": "Module failed to load (Error)", + "fullName": "Module failed to load (Error)", + "state": "failed", + "errors": [ + { + "message": "Cannot use 'import.meta' outside a module", + "name": "Error", + "stack": "Jest encountered an unexpected token\n\nJest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.\n\nOut of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.\n\nBy default \"node_modules\" folder is ignored by transformers.\n\nHere's what you can do:\n • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.\n • If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript\n • To have some of your \"node_modules\" files transformed, you can specify a custom \"transformIgnorePatterns\" in your config.\n • If you need a custom transformation specify a \"transform\" option in your config.\n • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the \"moduleNameMapper\" config option.\n\nYou'll find more details and examples of these config options in the docs:\nhttps://jestjs.io/docs/configuration\nFor information about custom transformations, see:\nhttps://jestjs.io/docs/code-transformation\n\nDetails:\n\n/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/core/api/client.ts:46\nconst API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api';\n ^^^^\n\nSyntaxError: Cannot use 'import.meta' outside a module\n at new Script (node:vm:117:7)\n at Runtime.createScriptFromCode (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1505:14)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1399:25)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/documents/api/documents.api.ts:1:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime._generateMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1690:34)\n at Runtime.requireMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:996:39)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1046:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/documents/components/DocumentPreview.tsx:3:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/documents/components/DocumentPreview.test.tsx:7:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/documents/mobile/DocumentsMobileScreen.test.tsx", + "tests": [ + { + "name": "Module failed to load (Error)", + "fullName": "Module failed to load (Error)", + "state": "failed", + "errors": [ + { + "message": "TextEncoder is not defined", + "name": "Error", + "stack": "ReferenceError: TextEncoder is not defined\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@auth0/auth0-react/node_modules/@auth0/auth0-spa-js/dist/auth0-spa-js.production.esm.js:1:10973)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/documents/mobile/DocumentsMobileScreen.tsx:2:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/documents/mobile/DocumentsMobileScreen.test.tsx:8:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/useAdmins.test.tsx", + "tests": [ + { + "name": "Module failed to load (Error)", + "fullName": "Module failed to load (Error)", + "state": "failed", + "errors": [ + { + "message": "TextEncoder is not defined", + "name": "Error", + "stack": "ReferenceError: TextEncoder is not defined\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@auth0/auth0-react/node_modules/@auth0/auth0-spa-js/dist/auth0-spa-js.production.esm.js:1:10973)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime._generateMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1690:34)\n at Runtime.requireMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:996:39)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1046:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/useAdmins.test.tsx:7:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/useAdminAccess.test.tsx", + "tests": [ + { + "name": "Module failed to load (Error)", + "fullName": "Module failed to load (Error)", + "state": "failed", + "errors": [ + { + "message": "TextEncoder is not defined", + "name": "Error", + "stack": "ReferenceError: TextEncoder is not defined\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@auth0/auth0-react/node_modules/@auth0/auth0-spa-js/dist/auth0-spa-js.production.esm.js:1:10973)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime._generateMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1690:34)\n at Runtime.requireMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:996:39)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1046:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/useAdminAccess.test.tsx:7:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/components/SelectionToolbar.test.tsx", + "tests": [ + { + "name": "should not render when selectedCount is 0", + "fullName": "SelectionToolbar should not render when selectedCount is 0", + "state": "passed" + }, + { + "name": "should render when items are selected", + "fullName": "SelectionToolbar should render when items are selected", + "state": "passed" + }, + { + "name": "should call onClear when Clear button clicked", + "fullName": "SelectionToolbar should call onClear when Clear button clicked", + "state": "passed" + }, + { + "name": "should call onSelectAll when Select All button clicked", + "fullName": "SelectionToolbar should call onSelectAll when Select All button clicked", + "state": "passed" + }, + { + "name": "should render custom action buttons", + "fullName": "SelectionToolbar should render custom action buttons", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/components/AdminSectionHeader.test.tsx", + "tests": [ + { + "name": "should render with title and stats", + "fullName": "AdminSectionHeader should render with title and stats", + "state": "passed" + }, + { + "name": "should render with empty stats", + "fullName": "AdminSectionHeader should render with empty stats", + "state": "passed" + }, + { + "name": "should format large numbers with locale", + "fullName": "AdminSectionHeader should format large numbers with locale", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/components/EmptyState.test.tsx", + "tests": [ + { + "name": "should render with title and description", + "fullName": "EmptyState should render with title and description", + "state": "passed" + }, + { + "name": "should render with icon", + "fullName": "EmptyState should render with icon", + "state": "passed" + }, + { + "name": "should render action button when provided", + "fullName": "EmptyState should render action button when provided", + "state": "passed" + }, + { + "name": "should not render action button when not provided", + "fullName": "EmptyState should not render action button when not provided", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/components/AdminSkeleton.test.tsx", + "tests": [ + { + "name": "should render default number of rows", + "fullName": "AdminSkeleton SkeletonRow should render default number of rows", + "state": "passed" + }, + { + "name": "should render specified number of rows", + "fullName": "AdminSkeleton SkeletonRow should render specified number of rows", + "state": "failed", + "errors": [ + { + "message": "Error: expect(received).toHaveLength(expected)\n\nExpected length: 15\nReceived length: 20\nReceived object: [, , , , , , , , , , …]\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/components/AdminSkeleton.test.tsx:20:63)\n at Promise.then.completed (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at _runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + }, + { + "name": "should render default number of cards", + "fullName": "AdminSkeleton SkeletonCard should render default number of cards", + "state": "passed" + }, + { + "name": "should render specified number of cards", + "fullName": "AdminSkeleton SkeletonCard should render specified number of cards", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/components/CommunityStationCard.test.tsx", + "tests": [ + { + "name": "should render station details", + "fullName": "CommunityStationCard should render station details", + "state": "passed" + }, + { + "name": "should display 93 octane status", + "fullName": "CommunityStationCard should display 93 octane status", + "state": "passed" + }, + { + "name": "should display price when available", + "fullName": "CommunityStationCard should display price when available", + "state": "passed" + }, + { + "name": "should display status badge", + "fullName": "CommunityStationCard should display status badge", + "state": "passed" + }, + { + "name": "should show withdraw button for user view", + "fullName": "CommunityStationCard should show withdraw button for user view", + "state": "failed", + "errors": [ + { + "message": "TestingLibraryElementError: Found multiple elements with the role \"button\"\n\nHere are the matching elements:\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n\n(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)).\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShell Downtown\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mapproved\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m123 Main St\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mDenver, CO, 80202\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mBrand: Shell\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m93 Octane · w/ Ethanol\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m$3.599/gal\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNotes:\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mGood quality fuel\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mSubmitted by: \u001b[0m\n \u001b[0muser@example.com\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNavigate\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mPremium 93\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFavorite\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/config.js:37:19)\n at getElementError (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:20:35)\n at getMultipleElementsFoundError (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:23:10)\n at /Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:55:13\n at /Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:95:19\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/components/CommunityStationCard.test.tsx:66:19)\n at Promise.then.completed (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at _runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)", + "name": "TestingLibraryElementError" + } + ] + }, + { + "name": "should show approve and reject buttons for admin", + "fullName": "CommunityStationCard should show approve and reject buttons for admin", + "state": "passed" + }, + { + "name": "should call onWithdraw when withdraw button is clicked", + "fullName": "CommunityStationCard should call onWithdraw when withdraw button is clicked", + "state": "failed", + "errors": [ + { + "message": "TestingLibraryElementError: Found multiple elements with the role \"button\"\n\nHere are the matching elements:\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n\n(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)).\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShell Downtown\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mapproved\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m123 Main St\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mDenver, CO, 80202\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mBrand: Shell\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m93 Octane · w/ Ethanol\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m$3.599/gal\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNotes:\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mGood quality fuel\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mSubmitted by: \u001b[0m\n \u001b[0muser@example.com\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNavigate\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mPremium 93\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFavorite\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/config.js:37:19)\n at getElementError (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:20:35)\n at getMultipleElementsFoundError (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:23:10)\n at /Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:55:13\n at /Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:95:19\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/components/CommunityStationCard.test.tsx:94:35)\n at Promise.then.completed (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at _runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)", + "name": "TestingLibraryElementError" + } + ] + }, + { + "name": "should handle rejection with reason", + "fullName": "CommunityStationCard should handle rejection with reason", + "state": "passed" + }, + { + "name": "should work on mobile viewport", + "fullName": "CommunityStationCard should work on mobile viewport", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/shared-minimal/components/VehicleLimitDialog.test.tsx", + "tests": [ + { + "name": "renders when open", + "fullName": "VehicleLimitDialog Dialog rendering renders when open", + "state": "passed" + }, + { + "name": "does not render when closed", + "fullName": "VehicleLimitDialog Dialog rendering does not render when closed", + "state": "passed" + }, + { + "name": "displays current count and limit", + "fullName": "VehicleLimitDialog Props display displays current count and limit", + "state": "passed" + }, + { + "name": "displays free tier upgrade prompt", + "fullName": "VehicleLimitDialog Props display displays free tier upgrade prompt", + "state": "passed" + }, + { + "name": "displays pro tier upgrade prompt", + "fullName": "VehicleLimitDialog Props display displays pro tier upgrade prompt", + "state": "passed" + }, + { + "name": "shows tier chips for free user", + "fullName": "VehicleLimitDialog Props display shows tier chips for free user", + "state": "passed" + }, + { + "name": "shows tier chips for pro user", + "fullName": "VehicleLimitDialog Props display shows tier chips for pro user", + "state": "passed" + }, + { + "name": "calls onClose when \"Maybe Later\" is clicked", + "fullName": "VehicleLimitDialog User interactions calls onClose when \"Maybe Later\" is clicked", + "state": "passed" + }, + { + "name": "calls onClose when \"Upgrade (Coming Soon)\" is clicked", + "fullName": "VehicleLimitDialog User interactions calls onClose when \"Upgrade (Coming Soon)\" is clicked", + "state": "passed" + }, + { + "name": "renders fullscreen on mobile", + "fullName": "VehicleLimitDialog Mobile responsiveness renders fullscreen on mobile", + "state": "failed", + "errors": [ + { + "message": "Error: expect(received).toBeInTheDocument()\n\nreceived value must be an HTMLElement or an SVGElement.\nReceived has value: null\n at __EXTERNAL_MATCHER_TRAP__ (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/expect/build/index.js:325:30)\n at Object.throwingMatcher [as toBeInTheDocument] (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/expect/build/index.js:326:15)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/shared-minimal/components/VehicleLimitDialog.test.tsx:185:22)\n at Promise.then.completed (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at _runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + }, + { + "name": "shows close button on mobile", + "fullName": "VehicleLimitDialog Mobile responsiveness shows close button on mobile", + "state": "passed" + }, + { + "name": "hides close button on desktop", + "fullName": "VehicleLimitDialog Mobile responsiveness hides close button on desktop", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/components/BulkActionDialog.test.tsx", + "tests": [ + { + "name": "should render dialog when open", + "fullName": "BulkActionDialog should render dialog when open", + "state": "passed" + }, + { + "name": "should display list of items", + "fullName": "BulkActionDialog should display list of items", + "state": "passed" + }, + { + "name": "should call onConfirm when confirm button clicked", + "fullName": "BulkActionDialog should call onConfirm when confirm button clicked", + "state": "passed" + }, + { + "name": "should call onCancel when cancel button clicked", + "fullName": "BulkActionDialog should call onCancel when cancel button clicked", + "state": "passed" + }, + { + "name": "should disable buttons when loading", + "fullName": "BulkActionDialog should disable buttons when loading", + "state": "failed", + "errors": [ + { + "message": "TestingLibraryElementError: Unable to find an accessible element with the role \"button\" and name `/confirm/i`\n\nHere are the accessible roles:\n\n presentation:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n dialog:\n\n Name \"Delete Items?\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n heading:\n\n Name \"Delete Items?\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n list:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n listitem:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"Cancel\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n progressbar:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mDelete Items?\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mThis action cannot be undone.\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mItem 1\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mItem 2\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mItem 3\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mCancel\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/config.js:37:19)\n at /Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at /Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at /Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@testing-library/dom/dist/query-helpers.js:95:19\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/components/BulkActionDialog.test.tsx:55:34)\n at Promise.then.completed (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at _runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)", + "name": "TestingLibraryElementError" + } + ] + }, + { + "name": "should show loading spinner when loading", + "fullName": "BulkActionDialog should show loading spinner when loading", + "state": "failed", + "errors": [ + { + "message": "Error: expect(received).toBeInTheDocument()\n\nreceived value must be an HTMLElement or an SVGElement.\nReceived has value: null\n at __EXTERNAL_MATCHER_TRAP__ (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/expect/build/index.js:325:30)\n at Object.throwingMatcher [as toBeInTheDocument] (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/expect/build/index.js:326:15)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/components/BulkActionDialog.test.tsx:67:66)\n at Promise.then.completed (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at _runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + }, + { + "name": "should support custom button text", + "fullName": "BulkActionDialog should support custom button text", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/components/StationCard.test.tsx", + "tests": [ + { + "name": "should render station name and address", + "fullName": "StationCard Rendering should render station name and address", + "state": "passed" + }, + { + "name": "should render station photo if available", + "fullName": "StationCard Rendering should render station photo if available", + "state": "passed" + }, + { + "name": "should render rating when available", + "fullName": "StationCard Rendering should render rating when available", + "state": "passed" + }, + { + "name": "should render distance chip", + "fullName": "StationCard Rendering should render distance chip", + "state": "passed" + }, + { + "name": "should not crash when photo is missing", + "fullName": "StationCard Rendering should not crash when photo is missing", + "state": "passed" + }, + { + "name": "should call onSave when bookmark button clicked (not saved)", + "fullName": "StationCard Save/Delete Actions should call onSave when bookmark button clicked (not saved)", + "state": "passed" + }, + { + "name": "should call onDelete when bookmark button clicked (saved)", + "fullName": "StationCard Save/Delete Actions should call onDelete when bookmark button clicked (saved)", + "state": "passed" + }, + { + "name": "should show filled bookmark icon when saved", + "fullName": "StationCard Save/Delete Actions should show filled bookmark icon when saved", + "state": "passed" + }, + { + "name": "should show outline bookmark icon when not saved", + "fullName": "StationCard Save/Delete Actions should show outline bookmark icon when not saved", + "state": "passed" + }, + { + "name": "should open Google Maps when directions button clicked", + "fullName": "StationCard Directions Link should open Google Maps when directions button clicked", + "state": "failed", + "errors": [ + { + "message": "Error: expect(jest.fn()).toHaveBeenCalledWith(...expected)\n\nExpected: StringContaining \"google.com/maps\", \"_blank\"\n\nNumber of calls: 0\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/components/StationCard.test.tsx:120:27)\n at Promise.then.completed (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:316:40)\n at _runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + }, + { + "name": "should encode address in directions URL", + "fullName": "StationCard Directions Link should encode address in directions URL", + "state": "failed", + "errors": [ + { + "message": "Error: expect(jest.fn()).toHaveBeenCalledWith(...expected)\n\nExpected: StringContaining \"123%20Main%20St%2C%20San%20Francisco%2C%20CA%2094105\", \"_blank\"\n\nNumber of calls: 0\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/stations/__tests__/components/StationCard.test.tsx:132:27)\n at Promise.then.completed (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise ()\n at callAsyncCircusFn (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:316:40)\n at _runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at _runTestsForDescribeBlock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + }, + { + "name": "should have minimum 44px button heights", + "fullName": "StationCard Touch Targets should have minimum 44px button heights", + "state": "passed" + }, + { + "name": "should call onSelect when card is clicked", + "fullName": "StationCard Card Selection should call onSelect when card is clicked", + "state": "passed" + }, + { + "name": "should not call onSelect when button is clicked", + "fullName": "StationCard Card Selection should not call onSelect when button is clicked", + "state": "passed" + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/AdminUsersPage.test.tsx", + "tests": [ + { + "name": "Module failed to load (Error)", + "fullName": "Module failed to load (Error)", + "state": "failed", + "errors": [ + { + "message": "TextEncoder is not defined", + "name": "Error", + "stack": "ReferenceError: TextEncoder is not defined\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/@auth0/auth0-react/node_modules/@auth0/auth0-spa-js/dist/auth0-spa-js.production.esm.js:1:10973)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/core/auth/useAdminAccess.ts:7:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime._generateMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1690:34)\n at Runtime.requireMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:996:39)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1046:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/pages/admin/AdminUsersPage.tsx:52:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at Runtime.requireModuleOrMock (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1048:21)\n at Object. (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/AdminUsersPage.test.tsx:7:1)\n at Runtime._execModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1439:24)\n at Runtime._loadModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:1022:12)\n at Runtime.requireModule (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runtime/build/index.js:882:12)\n at jestAdapter (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)\n at processTicksAndRejections (node:internal/process/task_queues:103:5)\n at runTestInternal (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/runTest.js:444:34)\n at Object.worker (/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/node_modules/jest-runner/build/testWorker.js:106:12)" + } + ] + } + ] + }, + { + "moduleId": "/Users/egullickson/Documents/Technology/coding/motovaultpro/frontend/src/features/admin/__tests__/components/ErrorState.test.tsx", + "tests": [ + { + "name": "should render error message", + "fullName": "ErrorState should render error message", + "state": "passed" + }, + { + "name": "should render retry button when onRetry provided", + "fullName": "ErrorState should render retry button when onRetry provided", + "state": "passed" + }, + { + "name": "should not render retry button when onRetry not provided", + "fullName": "ErrorState should not render retry button when onRetry not provided", + "state": "passed" + }, + { + "name": "should show default message when error has no message", + "fullName": "ErrorState should show default message when error has no message", + "state": "passed" + } + ] + } + ], + "unhandledErrors": [], + "reason": "failed" +} \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e153634..efff927 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -55,6 +55,7 @@ "tailwindcss": "^3.4.17", "terser": "^5.24.0", "ts-jest": "^29.1.1", + "ts-node": "^10.9.2", "typescript": "^5.7.2", "typescript-eslint": "^8.18.1", "vite": "^6.0.0" @@ -553,6 +554,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "license": "MIT", @@ -2752,6 +2777,34 @@ "node": ">= 10" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/aria-query": { "version": "5.0.4", "dev": true, @@ -3926,6 +3979,13 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "dev": true, @@ -4091,6 +4151,16 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "dev": true, @@ -8117,6 +8187,58 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/tslib": { "version": "2.8.1", "license": "0BSD" @@ -8272,6 +8394,13 @@ "dev": true, "license": "MIT" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "dev": true, @@ -8604,6 +8733,16 @@ "node": ">=12" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "dev": true, diff --git a/frontend/package.json b/frontend/package.json index 64e4555..95218a2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,55 +12,56 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router-dom": "^6.28.1", "@auth0/auth0-react": "^2.2.3", - "axios": "^1.7.9", - "zustand": "^5.0.0", - "@tanstack/react-query": "^5.84.1", - "react-hook-form": "^7.54.2", - "@hookform/resolvers": "^3.9.1", - "zod": "^3.24.1", - "dayjs": "^1.11.13", - "clsx": "^2.0.0", - "react-hot-toast": "^2.4.1", - "react-slick": "^0.30.2", - "slick-carousel": "^1.8.1", - "framer-motion": "^12.0.0", - "@mui/material": "^6.3.0", - "@mui/x-date-pickers": "^7.23.0", - "@mui/x-data-grid": "^7.23.0", + "@emotion/cache": "^11.14.0", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.0", - "@emotion/cache": "^11.14.0", - "@mui/icons-material": "^6.3.0" + "@hookform/resolvers": "^3.9.1", + "@mui/icons-material": "^6.3.0", + "@mui/material": "^6.3.0", + "@mui/x-data-grid": "^7.23.0", + "@mui/x-date-pickers": "^7.23.0", + "@tanstack/react-query": "^5.84.1", + "axios": "^1.7.9", + "clsx": "^2.0.0", + "dayjs": "^1.11.13", + "framer-motion": "^12.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-hook-form": "^7.54.2", + "react-hot-toast": "^2.4.1", + "react-router-dom": "^6.28.1", + "react-slick": "^0.30.2", + "slick-carousel": "^1.8.1", + "zod": "^3.24.1", + "zustand": "^5.0.0" }, "devDependencies": { + "@emotion/babel-plugin": "^11.11.0", + "@eslint/js": "^9.17.0", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.1", + "@types/jest": "^29.5.10", "@types/react": "^19.0.2", "@types/react-dom": "^19.0.2", "@types/react-slick": "^0.23.13", - "typescript-eslint": "^8.18.1", "@vitejs/plugin-react": "^5.1.2", "autoprefixer": "^10.4.20", "eslint": "^9.17.0", - "@eslint/js": "^9.17.0", - "globals": "^16.5.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^16.5.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "patch-package": "^8.0.1", "postcss": "^8.4.49", "tailwindcss": "^3.4.17", "terser": "^5.24.0", - "@emotion/babel-plugin": "^11.11.0", - "typescript": "^5.7.2", - "vite": "^6.0.0", - "jest": "^29.7.0", - "@types/jest": "^29.5.10", "ts-jest": "^29.1.1", - "jest-environment-jsdom": "^29.7.0", - "@testing-library/react": "^16.0.0", - "@testing-library/jest-dom": "^6.1.5", - "@testing-library/user-event": "^14.5.1", - "patch-package": "^8.0.1" + "ts-node": "^10.9.2", + "typescript": "^5.7.2", + "typescript-eslint": "^8.18.1", + "vite": "^6.0.0" } } diff --git a/frontend/src/features/admin/__tests__/components/__snapshots__/AdminSectionHeader.test.tsx.snap b/frontend/src/features/admin/__tests__/components/__snapshots__/AdminSectionHeader.test.tsx.snap new file mode 100644 index 0000000..435a4e8 --- /dev/null +++ b/frontend/src/features/admin/__tests__/components/__snapshots__/AdminSectionHeader.test.tsx.snap @@ -0,0 +1,146 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AdminSectionHeader should format large numbers with locale 1`] = ` +
+
+

+ Station Management +

+
+
+
+
+

+ Total Stations +

+
+ 10,000 +
+
+
+
+
+
+
+`; + +exports[`AdminSectionHeader should render with empty stats 1`] = ` +
+
+

+ Admin Users +

+
+
+
+`; + +exports[`AdminSectionHeader should render with title and stats 1`] = ` +
+
+

+ Vehicle Catalog +

+
+
+
+
+

+ Makes +

+
+ 100 +
+
+
+
+
+
+
+

+ Models +

+
+ 500 +
+
+
+
+
+
+
+

+ Years +

+
+ 20 +
+
+
+
+
+
+
+`; diff --git a/frontend/src/features/admin/__tests__/components/__snapshots__/AdminSkeleton.test.tsx.snap b/frontend/src/features/admin/__tests__/components/__snapshots__/AdminSkeleton.test.tsx.snap new file mode 100644 index 0000000..ae3f6b4 --- /dev/null +++ b/frontend/src/features/admin/__tests__/components/__snapshots__/AdminSkeleton.test.tsx.snap @@ -0,0 +1,516 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AdminSkeleton SkeletonCard should render default number of cards 1`] = ` +
+
+
+
+
+ +
+ + +
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ + +
+
+
+
+
+`; + +exports[`AdminSkeleton SkeletonCard should render specified number of cards 1`] = ` +
+
+
+
+
+ +
+ + +
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ + +
+
+
+
+
+`; + +exports[`AdminSkeleton SkeletonRow should render default number of rows 1`] = ` +
+
+
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+
+
+`; + +exports[`AdminSkeleton SkeletonRow should render specified number of rows 1`] = ` +
+
+
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+
+
+`; diff --git a/frontend/src/features/admin/__tests__/components/__snapshots__/BulkActionDialog.test.tsx.snap b/frontend/src/features/admin/__tests__/components/__snapshots__/BulkActionDialog.test.tsx.snap new file mode 100644 index 0000000..dc2c8dd --- /dev/null +++ b/frontend/src/features/admin/__tests__/components/__snapshots__/BulkActionDialog.test.tsx.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`BulkActionDialog should render dialog when open 1`] = ` +