feat(api): add activities + work_sessions domain schema and shared contracts
This commit is contained in:
60
apps/api/test/schema.test.ts
Normal file
60
apps/api/test/schema.test.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { eq } from 'drizzle-orm';
|
||||
import { db } from '../src/db/client';
|
||||
import { activities, workSessions, user } from '../src/db/schema';
|
||||
import { createApp } from '../src/app';
|
||||
|
||||
const json = { 'content-type': 'application/json' };
|
||||
|
||||
describe('domain schema', () => {
|
||||
it('creates and reads back an activity with a json insole_types array', async () => {
|
||||
const [inserted] = await db
|
||||
.insert(activities)
|
||||
.values({ name: 'Frezen', insoleTypes: ['Kurk', 'Berk'] })
|
||||
.returning();
|
||||
|
||||
const [row] = await db.select().from(activities).where(eq(activities.id, inserted.id));
|
||||
|
||||
expect(row.name).toBe('Frezen');
|
||||
expect(row.insoleTypes).toEqual(['Kurk', 'Berk']);
|
||||
});
|
||||
|
||||
it('defaults a work_sessions row to status=active, source=app, pair_count=2, null end_time', async () => {
|
||||
const app = createApp();
|
||||
const creds = {
|
||||
email: 'schema-user@example.com',
|
||||
password: 'sterk-wachtwoord-123',
|
||||
name: 'Schema User',
|
||||
};
|
||||
await app.request('/api/auth/sign-up/email', {
|
||||
method: 'POST',
|
||||
headers: json,
|
||||
body: JSON.stringify(creds),
|
||||
});
|
||||
|
||||
const [createdUser] = await db.select().from(user).where(eq(user.email, creds.email));
|
||||
expect(createdUser).toBeTruthy();
|
||||
|
||||
const [activity] = await db
|
||||
.insert(activities)
|
||||
.values({ name: 'Slijpen', insoleTypes: ['Kurk', 'Berk', '3D'] })
|
||||
.returning();
|
||||
|
||||
const [inserted] = await db
|
||||
.insert(workSessions)
|
||||
.values({
|
||||
userId: createdUser.id,
|
||||
activityId: activity.id,
|
||||
startTime: new Date(),
|
||||
})
|
||||
.returning();
|
||||
|
||||
const [row] = await db.select().from(workSessions).where(eq(workSessions.id, inserted.id));
|
||||
|
||||
expect(row.status).toBe('active');
|
||||
expect(row.source).toBe('app');
|
||||
expect(row.pairCount).toBe(2);
|
||||
expect(row.endTime).toBeNull();
|
||||
expect(row.durationSeconds).toBeNull();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user