Some checks failed
Deploy production / deploy (push) Failing after 9s
Schema math (parts, chapters, sections, activity), seeded with all 100 chapters (Ch 0-94, appendix A-E), 647 sections, PDF pages, exercise counts and approximate prereqs. Triggers stamp started_at/completed_at and log status/exercise/note/section changes; math.apply_progress(jsonb) applies the JSON format bots send. Private by default via MATH_PRIVATE in #lib/math (owner-only prefix + lock in every tracker list). Overall + per-part progress, current chapter, prereq hints, quick status buttons, exercises stepper, notes, optional section ticks, activity log, dependency chart. Deploy preflight checks the math schema (4 tables, 100 chapters).
64 lines
3.4 KiB
TypeScript
64 lines
3.4 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { isOwner, isOwnerOnlyPath, isOwnerWritePath } from './owner';
|
|
import { MATH_PRIVATE } from '#lib/math.js';
|
|
|
|
const event = (user: Partial<NonNullable<App.Locals['user']>> | null) =>
|
|
({ locals: { user, session: null } }) as unknown as { locals: App.Locals };
|
|
|
|
describe('owner gate', () => {
|
|
it('is only the owner account', () => {
|
|
expect(isOwner(event(null))).toBe(false);
|
|
expect(isOwner(event({ role: 'admin', email: 'someone@example.com' }))).toBe(false);
|
|
expect(isOwner(event({ role: 'user', email: 'Stan@StanRunge.dev' }))).toBe(true);
|
|
});
|
|
it('matches owner-only paths', () => {
|
|
expect(isOwnerOnlyPath('/trackers/health')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/health/')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/Health/import')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/healthy')).toBe(false);
|
|
expect(isOwnerOnlyPath('/trackers')).toBe(false);
|
|
expect(isOwnerOnlyPath('/trackers/tasks')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/Tasks/')).toBe(true);
|
|
expect(isOwnerWritePath('/trackers/tasks')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/groceries')).toBe(true);
|
|
expect(isOwnerWritePath('/trackers/groceries')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/data-holders')).toBe(true);
|
|
expect(isOwnerWritePath('/trackers/data-holders')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/houses')).toBe(true);
|
|
expect(isOwnerWritePath('/trackers/houses')).toBe(true);
|
|
});
|
|
|
|
it('gates the book reader, files and APIs but not the catalogue', () => {
|
|
expect(isOwnerOnlyPath('/trackers/books/files/12')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/books/12/read')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/books/12/progress')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/books/12/notes/3')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/books')).toBe(false);
|
|
expect(isOwnerOnlyPath('/trackers/books/12')).toBe(false);
|
|
expect(isOwnerOnlyPath('/trackers/books/covers/12')).toBe(false);
|
|
expect(isOwnerOnlyPath('/trackers/books/12/reader-notes-public')).toBe(false);
|
|
});
|
|
it('gates the math tracker while MATH_PRIVATE is on; writes are always owner-only', () => {
|
|
expect(isOwnerOnlyPath('/trackers/math')).toBe(MATH_PRIVATE);
|
|
expect(isOwnerOnlyPath('/trackers/math/__data.json')).toBe(MATH_PRIVATE);
|
|
expect(isOwnerWritePath('/trackers/math')).toBe(true);
|
|
});
|
|
it('only lets the owner write in owner areas', () => {
|
|
expect(isOwnerWritePath('/trackers/books/12')).toBe(true);
|
|
expect(isOwnerWritePath('/trackers/books')).toBe(true);
|
|
expect(isOwnerWritePath('/trackers/health/import')).toBe(true);
|
|
expect(isOwnerWritePath('/trackers/cars/ford/mustang')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/cars/ford/mustang')).toBe(false);
|
|
expect(isOwnerWritePath('/trackers/planes/boeing/737')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/planes/boeing/737')).toBe(false);
|
|
expect(isOwnerWritePath('/trackers/trains/siemens/virm')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/trains/siemens/virm')).toBe(false);
|
|
expect(isOwnerWritePath('/trackers/wildlife/mammals/vulpes-vulpes')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/wildlife/mammals/vulpes-vulpes')).toBe(false);
|
|
expect(isOwnerWritePath('/trackers/pc')).toBe(true);
|
|
expect(isOwnerOnlyPath('/trackers/pc')).toBe(false);
|
|
expect(isOwnerWritePath('/trackers/bookshelf')).toBe(false);
|
|
expect(isOwnerWritePath('/lists/books')).toBe(false);
|
|
});
|
|
});
|