908e4e724f
The shareStockStatus UI toggle was replaced by shareMedicationOverview in
commit e0fb77d, but the backend gating logic was left intact. Users who
had previously set shareStockStatus=false were stuck with empty stock
values ('-') on the shared medication overview with no UI to change it.
- Remove showStockStatus parameter from buildSharedMedicationOverview()
- Remove visibility gating that nullified stock fields
- Remove shareStockStatus from settings API responses and PUT schema
- Remove shareStockStatus from frontend types, hooks, and context
- Clean up all related test fixtures and dead test cases
- DB column share_stock_status retained (never remove columns)
100 lines
3.0 KiB
TypeScript
100 lines
3.0 KiB
TypeScript
import { render, screen, waitFor } from "@testing-library/react";
|
|
import { MemoryRouter, Route, Routes } from "react-router-dom";
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
import { SharedSchedule } from "../../components/SharedSchedule";
|
|
|
|
function renderSharedSchedule(path: string) {
|
|
return render(
|
|
<MemoryRouter initialEntries={[path]}>
|
|
<Routes>
|
|
<Route path="/share/:token" element={<SharedSchedule />} />
|
|
</Routes>
|
|
</MemoryRouter>
|
|
);
|
|
}
|
|
|
|
function createSharedData(overrides: Record<string, unknown> = {}) {
|
|
const yesterday = new Date();
|
|
yesterday.setDate(yesterday.getDate() - 1);
|
|
yesterday.setHours(9, 0, 0, 0);
|
|
|
|
return {
|
|
sharedBy: "Owner",
|
|
takenBy: "Max",
|
|
scheduleDays: 30,
|
|
upcomingTodayOnly: false,
|
|
shareScheduleTodayOnly: true,
|
|
stockCalculationMode: "automatic",
|
|
stockThresholds: {
|
|
lowStockDays: 7,
|
|
normalStockDays: 30,
|
|
highStockDays: 90,
|
|
reminderDaysBefore: 7,
|
|
expiryWarningDays: 30,
|
|
},
|
|
medications: [
|
|
{
|
|
id: 1,
|
|
name: "Ibuprofen",
|
|
genericName: "Ibu",
|
|
takenBy: ["Max"],
|
|
packageType: "blister",
|
|
packCount: 1,
|
|
blistersPerPack: 2,
|
|
pillsPerBlister: 10,
|
|
looseTablets: 0,
|
|
pillWeightMg: null,
|
|
doseUnit: "mg",
|
|
expiryDate: null,
|
|
notes: null,
|
|
intakeRemindersEnabled: false,
|
|
blisters: [{ usage: 1, every: 1, start: yesterday.toISOString() }],
|
|
intakes: [
|
|
{ usage: 1, every: 1, start: yesterday.toISOString(), takenBy: "Max", intakeRemindersEnabled: false },
|
|
],
|
|
updatedAt: null,
|
|
dismissedUntil: null,
|
|
lastStockCorrectionAt: null,
|
|
},
|
|
],
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
describe("SharedSchedule today-only", () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
window.localStorage.clear();
|
|
vi.spyOn(globalThis, "setInterval").mockImplementation(() => 1 as unknown as ReturnType<typeof setInterval>);
|
|
vi.spyOn(globalThis, "clearInterval").mockImplementation(() => {});
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.restoreAllMocks();
|
|
});
|
|
|
|
it("hides past and future sections when shareScheduleTodayOnly is enabled even if dashboard today-only is off", async () => {
|
|
const sharedData = createSharedData();
|
|
|
|
(globalThis.fetch as ReturnType<typeof vi.fn>).mockImplementation((url: string, init?: RequestInit) => {
|
|
if (url === "/api/share/token-123/doses" && (!init || !init.method || init.method === "GET")) {
|
|
return Promise.resolve({ ok: true, json: () => Promise.resolve({ doses: [] }) });
|
|
}
|
|
if (url === "/api/share/token-123") {
|
|
return Promise.resolve({ ok: true, json: () => Promise.resolve(sharedData) });
|
|
}
|
|
return Promise.reject(new Error(`Unexpected URL: ${url}`));
|
|
});
|
|
|
|
renderSharedSchedule("/share/token-123");
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByText(/share\.scheduleFor/i)).toBeInTheDocument();
|
|
});
|
|
|
|
expect(document.querySelector(".day-block.today")).toBeInTheDocument();
|
|
expect(document.querySelector(".past-days-toggle")).not.toBeInTheDocument();
|
|
expect(document.querySelector(".future-days-toggle")).not.toBeInTheDocument();
|
|
});
|
|
});
|