Files
TREK/server/tests/helpers/rpc-host-deps.ts
T
Maurice 2f6f921aef feat(dayplan): a day can be deleted from the reorder dialog, after a warning that says what goes with it
Every row of the reorder dialog, and of the days sheet on a phone, now has a delete button. It first asks, and the question lists what goes with the day: planned places stay in the place list, notes and day texts are deleted, bookings stay without a day, a stay that checks in or out on the day is cancelled with its booking and expense (shown in the danger tone), and on a dated trip the later days and their bookings move one date earlier or the trip ends a day earlier.

The server side moved from a bare DELETE into DayRemovalService, which REST, the delete_day tool and the plugin RPC all use. It closes the numbering, keeps the dates on their positions like a reorder, re-stamps the moved bookings, shifts the road trip boundaries, cancels touching stays through the accommodations domain, refuses the last day of a trip, and fans out day:deleted, day:reordered and trip:updated so collaborators renumber and see the new day count and end date. The trip query moved into a leaf file so the days domain can read it without a module cycle.

On the client the delete is online only, runs optimistically through the days slice with the same reducer collaborators apply, and the ConfirmDialog gained a slot for extra content, an Escape that only closes itself, and the danger and accent tokens.
2026-09-23 22:40:46 +02:00

90 lines
4.7 KiB
TypeScript

import { vi } from 'vitest';
import type { HostDeps } from '../../src/nest/plugins/host/rpc-host';
import { TagsRpc } from '../../src/nest/tags/tags.rpc';
import { CategoriesRpc } from '../../src/nest/categories/categories.rpc';
import { WeatherRpc } from '../../src/nest/weather/weather.rpc';
import { ExchangeRatesRpc } from '../../src/nest/budget/exchange-rates.rpc';
import { TodoRpc } from '../../src/nest/todo/todo.rpc';
import { DayNotesRpc } from '../../src/nest/day-notes/day-notes.rpc';
import { PackingRpc } from '../../src/nest/packing/packing.rpc';
import { FilesRpc } from '../../src/nest/files/files.rpc';
import { PlacesRpc } from '../../src/nest/places/places.rpc';
import { DaysRpc } from '../../src/nest/days/days.rpc';
import { ItineraryRpc } from '../../src/nest/assignments/itinerary.rpc';
import { TripsRpc } from '../../src/nest/trips/trips.rpc';
import { CostsRpc } from '../../src/nest/budget/costs.rpc';
import { ReservationsRpc } from '../../src/nest/reservations/reservations.rpc';
import { AccommodationsRpc } from '../../src/nest/accommodations/accommodations.rpc';
import { CollabRpc } from '../../src/nest/collab/collab.rpc';
import { AtlasRpc } from '../../src/nest/atlas/atlas.rpc';
import { VacayRpc } from '../../src/nest/vacay/vacay.rpc';
import { JournalRpc } from '../../src/nest/journey/journal.rpc';
import { CollectionsRpc } from '../../src/nest/collections/collections.rpc';
import { DbRpc } from '../../src/nest/plugins/host/rpc/db.rpc';
import { MetaRpc } from '../../src/nest/plugins/host/rpc/meta.rpc';
import { HostSurfaceRpc } from '../../src/nest/plugins/host/rpc/host-surface.rpc';
import { PluginHooks } from '../../src/nest/plugins/plugin-hooks.service';
/**
* The stubbed HostDeps every plugin router test builds on.
*
* It used to be a 150-line sheet of domain stubs, because the router held every
* handler. The handlers now live on the domains' `@PluginController()` classes and
* stub their own services, so what is left here is what the router itself still
* touches: the plugin's own db handle, the inter-plugin router, and the audit sink.
*/
export function makeDeps(): HostDeps {
return {
data: {
query: vi.fn(() => [{ n: 1 }]),
exec: vi.fn(() => ({ changes: 1 })),
migrate: vi.fn(() => ({ applied: true })),
tx: vi.fn(() => ({ ok: true })),
close: vi.fn(),
} as unknown as HostDeps['data'],
callPlugin: vi.fn(async (targetId: string, fn: string) => ({ calledTarget: targetId, calledFn: fn })),
emitPluginEvent: vi.fn(),
};
}
/**
* Every @PluginController() class that owns wire methods, in the order the container
* would discover them. The coverage ledger test (tests/unit/plugins/rpc-coverage.test.ts)
* is what turns a forgotten entry into a red build instead of a silent
* PERMISSION_DENIED in production.
*
* The services handed in are stubs: the ledger only binds the handlers, it never runs
* them. Behaviour is asserted in each domain's own <domain>.rpc.test.ts.
*/
export function allRpcControllers(): object[] {
const anyService = () =>
new Proxy({}, { get: () => vi.fn(() => undefined) }) as unknown as never;
return [
new TagsRpc(anyService()),
new CategoriesRpc(anyService()),
new WeatherRpc(anyService()),
new ExchangeRatesRpc(anyService()),
new TodoRpc(anyService(), anyService(), anyService()),
new DayNotesRpc(anyService(), anyService(), anyService()),
new PackingRpc(anyService(), anyService(), anyService()),
new FilesRpc(anyService(), anyService(), anyService(), anyService(), anyService()),
new PlacesRpc(anyService(), anyService(), anyService(), anyService()),
new DaysRpc(anyService(), anyService(), anyService(), anyService()),
new ItineraryRpc(anyService(), anyService(), anyService()),
new TripsRpc(anyService(), anyService(), anyService(), anyService(), anyService(), anyService(), anyService(), anyService(), anyService()),
new CostsRpc(anyService(), anyService(), anyService(), anyService(), anyService()),
new ReservationsRpc(anyService(), anyService(), anyService()),
new AccommodationsRpc(anyService(), anyService(), anyService()),
new CollabRpc(anyService(), anyService(), anyService()),
new AtlasRpc(anyService(), anyService()),
new VacayRpc(anyService(), anyService()),
new JournalRpc(anyService(), anyService(), anyService(), anyService(), anyService(), anyService()),
new CollectionsRpc(anyService(), anyService()),
new DbRpc(anyService()),
new MetaRpc(anyService(), anyService()),
new HostSurfaceRpc(anyService(), anyService(), anyService(), anyService(), anyService(), anyService()),
// Owns no wire method, but declares all 18 hook contracts, which requireTotalCoverage checks too.
new PluginHooks(anyService()),
];
}