diff --git a/README.md b/README.md
index f0abf152..6ab1ca5c 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
-
+
@@ -510,7 +510,7 @@ Operator notes for activating existing adapters, metasearch landings on the dire
| OTA Channels | Booking.com + Expedia (EQC) + SiteMinder + DerbySoft | Direct + aggregated OTA connectivity (ARI + content) |
| XML Processing | fast-xml-parser | Booking.com OTA XML protocol |
| Package Manager | pnpm workspaces | Monorepo management |
-| Testing | Vitest (2474 passing tests across 286 files with passing tests) | Unit and integration tests |
+| Testing | Vitest (2476 passing tests across 287 files with passing tests) | Unit and integration tests |
| Build | tsup (packages) + Vite (dashboard) + nest build (API) | Fast builds |
| Containers | Docker + docker-compose | Local dev and production deployment |
| CI/CD | GitHub Actions | Automated testing, builds, and releases |
@@ -648,7 +648,7 @@ Before going live, verify the items in [`docs/deployment.md`](./docs/deployment.
### Run tests
```bash
-# Passing-test count: 2474 test cases across 286 files (skipped excluded)
+# Passing-test count: 2476 test cases across 287 files (skipped excluded)
# API tests only
pnpm --filter @telivityhaip/api test
@@ -1197,7 +1197,7 @@ HAIP is built in public and contributions are welcome.
pnpm install # Install dependencies
pnpm build # Build all workspace packages
pnpm dev # Start API in dev mode (hot reload)
-pnpm test # Run all tests (2474 passing, 286 files with passes; skipped excluded)
+pnpm test # Run all tests (2476 passing, 287 files with passes; skipped excluded)
pnpm lint # ESLint
```
diff --git a/apps/dashboard/src/pages/Cashier.test.tsx b/apps/dashboard/src/pages/Cashier.test.tsx
new file mode 100644
index 00000000..71857f51
--- /dev/null
+++ b/apps/dashboard/src/pages/Cashier.test.tsx
@@ -0,0 +1,99 @@
+import { describe, it, expect, vi, beforeEach } from 'vitest';
+import { render, screen, waitFor } from '@testing-library/react';
+import { MemoryRouter, Routes, Route } from 'react-router-dom';
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import Cashier from './Cashier';
+
+vi.mock('../context/PropertyContext', () => ({
+ useProperty: () => ({
+ propertyId: 'prop-1',
+ currencyCode: 'USD',
+ properties: [{ id: 'prop-1', name: 'Test property' }],
+ }),
+}));
+
+vi.mock('../lib/api', () => ({
+ api: { get: vi.fn(), post: vi.fn(), patch: vi.fn(), delete: vi.fn() },
+}));
+
+import { api } from '../lib/api';
+
+function renderReport(sessionId = 'sess-1') {
+ const queryClient = new QueryClient({
+ defaultOptions: { queries: { retry: false, gcTime: 0 }, mutations: { retry: false } },
+ });
+ return render(
+
{t('cashier.openingFloat')}
${session?.openingFloat ?? '0.00'}
{t('cashier.expected')}
${report.expectedBalance ?? '0.00'}
{t('cashier.counted')}
${session?.countedBalance ?? '—'}
{t('cashier.variance')}
${session?.variance ?? '0.00'}
{t('cashier.counted')}
${countedBalance ?? '—'}
{t('cashier.variance')}
${variance ?? '0.00'}