Files
InsanityLab-web/apps/sito/tests/auth-piattaforme.test.ts
T
AdrianoDev 510d7ca4ec Struttura: il sito esistente si sposta sotto apps/sito
Primo passo della separazione sito / piattaforme decisa da Adriano il 03/09:
due applicazioni autosufficienti, senza workspace di root, cosi' che ognuna
resti un progetto Astro completo ed estraibile.

Qui non cambia niente del codice: solo la radice. I pattern del .gitignore
che avevano una barra erano ancorati alla radice e dopo lo spostamento non
avrebbero piu' coperto niente (data/*.db*, uploads/*): resi validi a
qualunque profondita'.

Suite: 45 file, 347 test verdi prima e dopo lo spostamento.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EndnceRA5WnA6rvA5iV9WL
2026-09-03 11:05:54 +00:00

89 lines
4.2 KiB
TypeScript

import { describe, it, expect, beforeEach, afterEach } from 'vitest';
import type Database from 'better-sqlite3';
import { mkdtempSync, rmSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { createDb } from '../src/lib/db';
import { createUser, login, getSessionUser, canAccessAdminPath, landingFor, isRole } from '../src/lib/auth';
let db: Database.Database;
beforeEach(() => { db = createDb(':memory:'); });
describe('ruolo piattaforme', () => {
it('createUser accetta piattaforme e getSessionUser lo ritorna', () => {
createUser(db, 'c', 'segreta123', 'piattaforme');
expect(getSessionUser(db, login(db, 'c', 'segreta123')!)).toMatchObject({ role: 'piattaforme' });
});
it('isRole valida piattaforme e non più il vecchio campus', () => {
expect(isRole('piattaforme')).toBe(true);
expect(isRole('campus')).toBe(false);
});
it("landingFor porta piattaforme all'indice delle piattaforme", () => {
expect(landingFor('piattaforme')).toBe('/piattaforme');
});
});
describe('canAccessAdminPath con piattaforme', () => {
it('piattaforme: sezioni riservate e logout sì, resto del pannello no', () => {
expect(canAccessAdminPath('piattaforme', '/campus')).toBe(true);
expect(canAccessAdminPath('piattaforme', '/campus/')).toBe(true);
expect(canAccessAdminPath('piattaforme', '/campus/corso-base/lezione-01')).toBe(true);
expect(canAccessAdminPath('piattaforme', '/campus/assets/slide/x.png')).toBe(true);
expect(canAccessAdminPath('piattaforme', '/piattaforme')).toBe(true);
expect(canAccessAdminPath('piattaforme', '/piattaforme/stress-index')).toBe(true);
expect(canAccessAdminPath('piattaforme', '/piattaforme/stress-index/clienti')).toBe(true);
expect(canAccessAdminPath('piattaforme', '/admin/logout')).toBe(true);
expect(canAccessAdminPath('piattaforme', '/admin')).toBe(false);
expect(canAccessAdminPath('piattaforme', '/admin/new')).toBe(false);
expect(canAccessAdminPath('piattaforme', '/admin/content')).toBe(false);
expect(canAccessAdminPath('piattaforme', '/admin/users')).toBe(false);
expect(canAccessAdminPath('piattaforme', '/api/admin/posts')).toBe(false);
expect(canAccessAdminPath('piattaforme', '/api/admin/upload')).toBe(false);
});
it('admin accede a tutte le piattaforme', () => {
expect(canAccessAdminPath('admin', '/campus')).toBe(true);
expect(canAccessAdminPath('admin', '/campus/corso-base')).toBe(true);
expect(canAccessAdminPath('admin', '/piattaforme')).toBe(true);
expect(canAccessAdminPath('admin', '/piattaforme/stress-index')).toBe(true);
});
it('superuser e user non accedono alle piattaforme', () => {
expect(canAccessAdminPath('superuser', '/campus')).toBe(false);
expect(canAccessAdminPath('superuser', '/campus/corso-base')).toBe(false);
expect(canAccessAdminPath('superuser', '/piattaforme')).toBe(false);
expect(canAccessAdminPath('superuser', '/piattaforme/stress-index')).toBe(false);
expect(canAccessAdminPath('user', '/campus')).toBe(false);
expect(canAccessAdminPath('user', '/campus/assets/slide/x.png')).toBe(false);
expect(canAccessAdminPath('user', '/piattaforme')).toBe(false);
});
});
// La rinomina del ruolo va verificata su un DB su file: le migrazioni girano all'apertura,
// quindi serve chiudere e riaprire lo stesso database con dentro una riga al vecchio valore.
describe('migrazione del ruolo campus → piattaforme', () => {
let dir: string;
beforeEach(() => { dir = mkdtempSync(join(tmpdir(), 'ilab-db-')); });
afterEach(() => { rmSync(dir, { recursive: true, force: true }); });
it('rinomina gli utenti rimasti al vecchio ruolo, lasciando stare gli altri', () => {
const file = join(dir, 'test.db');
const first = createDb(file);
createUser(first, 'vecchio', 'segreta123', 'campus' as never);
createUser(first, 'redattore', 'segreta123', 'superuser');
first.close();
const second = createDb(file);
const roles = second.prepare('SELECT username, role FROM users ORDER BY username').all() as
{ username: string; role: string }[];
second.close();
expect(roles).toEqual([
{ username: 'redattore', role: 'superuser' },
{ username: 'vecchio', role: 'piattaforme' },
]);
});
});