feat: roles SPA foundations

This commit is contained in:
Florian Sylvain committed 2026-10-27 22:21:12 +01:00
1 parent 80f7037d3a
commit 907949aa12
180 files changed
+4308 -835

No files matched your search

@@ -9,6 +9,7 @@ import type { ActivityItem } from '@/lib/activity'
import HomeView from '../HomeView.vue'
import { anonymous, makeItem, target } from './activityFixtures'
import { articleEnvelope, articleListRoute } from './articleEnvelope'
import { accessFor } from '@/test/access'
const ACTIVITY_ROUTE = 'GET /v1/activity?size=5'
const ARTICLES_ROUTE = articleListRoute({ size: 5, sort: 'updated_at:desc' })
@@ -53,7 +54,7 @@ let calls: string[] = []
async function mountHome(role: 'owner' | 'admin' | undefined, handlers: Record<string, Handler>) {
setActivePinia(createPinia())
const session = useSessionStore()
session.session = { verified: true, username: 'marta', role }
session.session = { verified: true, username: 'marta', access: accessFor(role) }
session.status = 'ready'
calls = []
global.fetch = vi.fn((url: string, init?: RequestInit) => {
@@ -123,7 +124,7 @@ describe('Home, owner or admin, the last five events with the actor name', () =>
})
describe('Home, regular user, own events only and no actor name', () => {
it.each([['editor' as const], [undefined]])('shows only the time for %s', async (role) => {
it.each([['editor' as const]])('shows only the time for %s', async (role) => {
await mountHome(role as undefined, {
[ACTIVITY_ROUTE]: () => page(recentItems(3)),
[ARTICLES_ROUTE]: () => response(200, articleEnvelope(articles, { size: 5 })),
@@ -294,7 +295,7 @@ describe('Home card, error shows a retryable alert that leaves the page alone',
describe('Home card, empty when there are no events yet', () => {
it.each([
['owner' as const, 'Actions on your site will appear here.'],
[undefined, 'Your actions will appear here.'],
['editor', 'Your actions will appear here.'],
])('says so for %s', async (role, text) => {
await mountHome(role as 'owner', {
[ACTIVITY_ROUTE]: () => page([], 0),
@@ -387,3 +388,13 @@ describe('Home card, the French interface', () => {
expect(card().text()).toContain('Aucune activité pour le moment')
})
})
describe('Home card, not shown without activity.view', () => {
it('renders no recent activity card and makes no activity request', async () => {
await mountHome(undefined, {
[ARTICLES_ROUTE]: () => response(200, articleEnvelope(articles, { size: 5 })),
})
expect(card().exists()).toBe(false)
})
})