feat: add trip and trip settings with optimistic locking

This commit is contained in:
Bastian Wagner
2026-08-17 15:06:00 +02:00
parent 2eb1692216
commit ddf1d03447
13 changed files with 615 additions and 1 deletions

View File

@@ -0,0 +1,55 @@
import { ConflictException } from '@nestjs/common';
import { Kysely, PostgresDialect } from 'kysely';
import { Pool } from 'pg';
import type { Database } from '../../database/src';
import { TripsRepository } from '../src/trips.repository';
import { TripsService } from '../src/trips.service';
import { UsersRepository } from '../../users/src/users.repository';
describe('Trip optimistic locking (integration)', () => {
let db: Kysely<Database>;
let tripsService: TripsService;
let ownerId: string;
beforeAll(async () => {
db = new Kysely<Database>({
dialect: new PostgresDialect({
pool: new Pool({ connectionString: process.env.DATABASE_URL }),
}),
});
const usersRepository = new UsersRepository(db);
const owner = await usersRepository.upsertByExternalSubjectId(
'optimistic-locking-test-sub',
{
email: 'owner@example.test',
displayName: 'Owner',
},
);
ownerId = owner.id;
tripsService = new TripsService(new TripsRepository(db));
});
afterAll(async () => {
await db.destroy();
});
it('rejects a second update that used a stale version', async () => {
const trip = await tripsService.createTrip(ownerId, {
name: 'Slovenia 2027',
});
expect(trip.version).toBe(1);
const firstUpdate = await tripsService.updateTrip(trip.id, {
name: 'Slovenia 2027 (v2)',
version: 1,
});
expect(firstUpdate.version).toBe(2);
await expect(
tripsService.updateTrip(trip.id, {
name: 'Conflicting concurrent edit',
version: 1,
}),
).rejects.toThrow(ConflictException);
});
});