763e5611e6
- creaCliente: il codice si deduce dal massimo fra identity E longevity (non piu' solo identity), cosi' un client_code cancellato dall'anagrafica non torna mai disponibile e non si attribuiscono le misure di un vecchio cliente a uno nuovo. Compensazione se la scrittura su longevity fallisce dopo quella su identity. - ROLES unica fonte in auth.ts (Role e isRole derivati); users.astro e users/new.astro usano quella lista invece di array scritti a mano che dimenticavano cliente/trainer. - Commento falso su cosa protegge il middleware, riscritto: rimanda a isProtectedPath. - vitest.config.ts: alias per astro:middleware (stesso bersaglio della pipeline vite di Astro), cosi' src/middleware.ts e' finalmente importabile e testabile in isolamento - prima nessun test lo caricava davvero. - export.test.ts: asserzione posizionale per colonna, non piu' solo intestazioni scritte a mano; intercetta un riordino della SELECT che disallinea etichette e valori. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
124 lines
4.7 KiB
TypeScript
124 lines
4.7 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { readFileSync } from 'node:fs';
|
|
import { join } from 'node:path';
|
|
import { canAccessAdminPath, isProtectedPath, landingFor, isRole, ROLES } from '../../src/lib/auth';
|
|
|
|
describe('accesso alle rotte longevity', () => {
|
|
it('il cliente entra nel proprio spazio', () => {
|
|
expect(canAccessAdminPath('cliente', '/longevity/io')).toBe(true);
|
|
});
|
|
|
|
it('il cliente NON entra nel gestionale', () => {
|
|
expect(canAccessAdminPath('cliente', '/longevity/gestionale')).toBe(false);
|
|
});
|
|
|
|
it('il trainer entra in entrambi', () => {
|
|
expect(canAccessAdminPath('trainer', '/longevity/io')).toBe(true);
|
|
expect(canAccessAdminPath('trainer', '/longevity/gestionale')).toBe(true);
|
|
});
|
|
|
|
it('il cliente non entra nelle altre piattaforme ne nel blog', () => {
|
|
expect(canAccessAdminPath('cliente', '/campus')).toBe(false);
|
|
expect(canAccessAdminPath('cliente', '/admin/content')).toBe(false);
|
|
expect(canAccessAdminPath('cliente', '/admin/posts')).toBe(false);
|
|
});
|
|
|
|
it('il trainer non entra nelle altre piattaforme ne nel blog', () => {
|
|
expect(canAccessAdminPath('trainer', '/campus')).toBe(false);
|
|
expect(canAccessAdminPath('trainer', '/admin/content')).toBe(false);
|
|
expect(canAccessAdminPath('trainer', '/admin/posts')).toBe(false);
|
|
});
|
|
|
|
it('il ruolo piattaforme non eredita longevity', () => {
|
|
expect(canAccessAdminPath('piattaforme', '/longevity/gestionale')).toBe(false);
|
|
});
|
|
|
|
it('admin passa sempre', () => {
|
|
expect(canAccessAdminPath('admin', '/longevity/gestionale')).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('isProtectedPath — quali rotte sono protette dal middleware', () => {
|
|
it('longevity è protetto', () => {
|
|
expect(isProtectedPath('/longevity/io')).toBe(true);
|
|
expect(isProtectedPath('/longevity/gestionale')).toBe(true);
|
|
expect(isProtectedPath('/api/longevity/qualcosa')).toBe(true);
|
|
});
|
|
|
|
it('i percorsi già esistenti restano protetti', () => {
|
|
expect(isProtectedPath('/admin')).toBe(true);
|
|
expect(isProtectedPath('/admin/content')).toBe(true);
|
|
expect(isProtectedPath('/api/admin/content')).toBe(true);
|
|
expect(isProtectedPath('/campus')).toBe(true);
|
|
expect(isProtectedPath('/piattaforme')).toBe(true);
|
|
});
|
|
|
|
it('il login e le pagine pubbliche non sono protetti', () => {
|
|
expect(isProtectedPath('/admin/login')).toBe(false);
|
|
expect(isProtectedPath('/blog')).toBe(false);
|
|
expect(isProtectedPath('/')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('landingFor — indirizzo di atterraggio per ruolo', () => {
|
|
it('cliente atterra su longevity/io', () => {
|
|
expect(landingFor('cliente')).toBe('/longevity/io');
|
|
});
|
|
|
|
it('trainer atterra su longevity/gestionale', () => {
|
|
expect(landingFor('trainer')).toBe('/longevity/gestionale');
|
|
});
|
|
|
|
it('i ruoli già esistenti restano uguali', () => {
|
|
expect(landingFor('superuser')).toBe('/admin/content');
|
|
expect(landingFor('piattaforme')).toBe('/piattaforme');
|
|
expect(landingFor('admin')).toBe('/admin');
|
|
expect(landingFor('user')).toBe('/admin');
|
|
});
|
|
});
|
|
|
|
describe('isRole — validazione dei ruoli', () => {
|
|
it('cliente e trainer sono ruoli validi', () => {
|
|
expect(isRole('cliente')).toBe(true);
|
|
expect(isRole('trainer')).toBe(true);
|
|
});
|
|
|
|
it('i ruoli già esistenti restano validi', () => {
|
|
expect(isRole('admin')).toBe(true);
|
|
expect(isRole('superuser')).toBe(true);
|
|
expect(isRole('user')).toBe(true);
|
|
expect(isRole('piattaforme')).toBe(true);
|
|
});
|
|
|
|
it('campus e stringhe inventate non sono ruoli', () => {
|
|
expect(isRole('campus')).toBe(false);
|
|
expect(isRole('qualsiasi-cosa')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('ROLES — fonte unica dei ruoli, usata dal pannello utenti', () => {
|
|
it('contiene tutti e sei i ruoli, cliente e trainer inclusi', () => {
|
|
expect(ROLES).toContain('cliente');
|
|
expect(ROLES).toContain('trainer');
|
|
expect(ROLES).toContain('admin');
|
|
expect(ROLES).toContain('superuser');
|
|
expect(ROLES).toContain('user');
|
|
expect(ROLES).toContain('piattaforme');
|
|
expect(ROLES.length).toBe(6);
|
|
});
|
|
|
|
it('isRole accetta esattamente i ruoli di ROLES, nessuno in piu o in meno', () => {
|
|
for (const r of ROLES) expect(isRole(r)).toBe(true);
|
|
expect(isRole('non-un-ruolo')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('pannello utenti — la tendina dei ruoli non e piu scritta a mano', () => {
|
|
it('users.astro pesca i ruoli da ROLES, non da una lista propria che ne dimentica due', () => {
|
|
const src = readFileSync(join(process.cwd(), 'src/pages/admin/users.astro'), 'utf8');
|
|
expect(src).toContain('ROLES');
|
|
// La vecchia lista a quattro (dimenticava cliente e trainer) non deve piu comparire.
|
|
expect(src).not.toContain("['user', 'superuser', 'piattaforme', 'admin']");
|
|
});
|
|
});
|