Files
TREK/server/tests/helpers/accommodations-service.ts
T
jubnl 3e37474a2c test(server): plan 4 — constructor ripple for the rosterUserIds/getPlaceWithTags inline
Hand-built BudgetService/BudgetMcp/TodoService call sites drop the removed
DatabaseService constructor arg (budgetRepoArgs() now appends a
TripMembersRepository so most spread call sites need no other change);
budget.service.test.ts's rosterHas() helper and svc() factory move from a
spied DatabaseService to a stubbed TripMembersRepository. The
AccommodationsService helper (tests/helpers/accommodations-service.ts) and
its two direct callers drop the same arg. PackingService call sites are
untouched (its new param is optional, so every existing hand-built instance
still resolves rosterUserIds through the DatabaseService fallback).
2026-09-24 06:18:32 +02:00

88 lines
5.3 KiB
TypeScript

import type { Database } from 'better-sqlite3';
import { AccommodationsService } from '../../src/nest/accommodations/accommodations.service';
import { AssignmentsService } from '../../src/nest/assignments/assignments.service';
import { DatabaseService } from '../../src/nest/database/database.service';
import { JourneyDomainService } from '../../src/nest/journey/journey-domain.service';
import { PermissionsService } from '../../src/nest/permissions/permissions.service';
import { QueryHelpersService } from '../../src/nest/query-helpers/query-helpers.service';
import { RealtimeService } from '../../src/nest/realtime/realtime.service';
import { TrekPhotoRegistrationService } from '../../src/nest/photos/trek-photos.repository';
import { TrekPhotos } from '../../src/db/entities/TrekPhotos.entity';
import { TripPhotos } from '../../src/db/entities/TripPhotos.entity';
import {
createTestUnitOfWork, createTestAppSettingsRepo, createTestTagsRepo, createTestPlaceRatingsRepo,
createTestAssignmentParticipantsRepo, createTestDayAssignmentsRepo, createTestDaysRepo, createTestPlacesRepo,
createTestTripMembersRepo, createTestRoadtripViasRepo, createTestDayAccommodationsRepo, createTestReservationsRepo,
sharedTestOrm, createTestTripsRepo,
} from './test-uow';
import { createTestBudgetItemsRepo } from './files-repos';
import {
createTestJourneysRepo, createTestJourneyContributorsRepo, createTestJourneyTripsRepo, createTestJourneyEntriesRepo,
createTestJourneyPhotosRepo, createTestJourneyEntryPhotosRepo,
} from './journey-repos';
/**
* AccommodationsService over a test connection.
*
* Booking a night also writes the day stop that puts it on the route, through a
* real AssignmentsService rather than a stub: the stop is a row these cases read
* back, and it has to come out of the same connection. Five collaborators deep is
* why this is a helper and not five copies across the suites.
*
* Plan 3c Task 0b: the `DatabaseService` built here needs a real
* `EntityManager` now (its `.connection` backs every repository factory
* below, and `JourneyDomainService` still takes a full `DatabaseService`).
* `AccommodationsService` itself no longer holds one (Plan 4 Task 3 —
* `stampLodging`'s old `getPlaceWithTags` delegate is
* `PlacesRepository.findWithTagsAndRatings` directly now).
*/
export async function makeAccommodationsService(conn: Database): Promise<AccommodationsService> {
return accommodationsOver(new DatabaseService(conn, (await sharedTestOrm(conn)).em));
}
/**
* The same, for a suite that already holds the DatabaseService.
*
* ReservationsService takes one now, because a hotel booking owes the day plan
* the same stop a night entered under Days does, and every suite that builds
* that service by hand needs one to hand it.
*/
export async function accommodationsOver(dbs: DatabaseService): Promise<AccommodationsService> {
const permissions = new PermissionsService(await createTestAppSettingsRepo(dbs.connection), await createTestUnitOfWork(dbs.connection));
const realtime = new RealtimeService();
const t = await sharedTestOrm(dbs.connection);
const assignments = new AssignmentsService(
await createTestTripsRepo(dbs.connection), permissions, realtime,
new QueryHelpersService(await createTestTagsRepo(dbs.connection), await createTestPlaceRatingsRepo(dbs.connection), await createTestAssignmentParticipantsRepo(dbs.connection)),
new JourneyDomainService(
dbs, realtime, new TrekPhotoRegistrationService(t.repo(TrekPhotos), t.repo(TripPhotos), await createTestJourneyPhotosRepo(dbs.connection), dbs), await createTestUnitOfWork(dbs.connection),
await createTestJourneysRepo(dbs.connection), await createTestJourneyContributorsRepo(dbs.connection),
await createTestJourneyTripsRepo(dbs.connection), await createTestJourneyEntriesRepo(dbs.connection), await createTestTripsRepo(dbs.connection),
// Plan 3g Task 2 constructor-ripple: JourneyPhotosRepository/JourneyEntryPhotosRepository/PlacesRepository.
await createTestJourneyPhotosRepo(dbs.connection), await createTestJourneyEntryPhotosRepo(dbs.connection), await createTestPlacesRepo(dbs.connection),
),
await createTestUnitOfWork(dbs.connection),
await createTestDayAssignmentsRepo(dbs.connection),
await createTestAssignmentParticipantsRepo(dbs.connection),
await createTestDaysRepo(dbs.connection),
await createTestPlacesRepo(dbs.connection),
await createTestTripMembersRepo(dbs.connection),
await createTestRoadtripViasRepo(dbs.connection),
);
return new AccommodationsService(
permissions, realtime, assignments, await createTestUnitOfWork(dbs.connection),
// Plan 4 Task 2 — AccommodationsService's own canAccessTrip delegate is now
// TripsRepository.findAccessible. Plan 4 Task 3 — stampLodging's
// getPlaceWithTags is PlacesRepository.findWithTagsAndRatings directly
// (`placesRepo` below, already injected); `dbs` no longer needed here.
await createTestTripsRepo(dbs.connection),
await createTestDayAccommodationsRepo(dbs.connection),
await createTestDayAssignmentsRepo(dbs.connection),
await createTestPlacesRepo(dbs.connection),
await createTestDaysRepo(dbs.connection),
await createTestRoadtripViasRepo(dbs.connection),
await createTestReservationsRepo(dbs.connection),
await createTestBudgetItemsRepo(dbs.connection),
);
}