fix: Restore all files lost during destructive rebase
A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.
This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).
Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
164
website/__tests__/compliance/RoleSelectPage.test.tsx
Normal file
164
website/__tests__/compliance/RoleSelectPage.test.tsx
Normal file
@@ -0,0 +1,164 @@
|
||||
/**
|
||||
* Tests fuer Role-Select Landing Page
|
||||
* Sprint 4: Stakeholder-Views & Rollenbasierte Features
|
||||
*/
|
||||
|
||||
import React from 'react'
|
||||
import { render, screen, fireEvent } from '@testing-library/react'
|
||||
import '@testing-library/jest-dom'
|
||||
|
||||
// Mock next/navigation
|
||||
const mockPush = jest.fn()
|
||||
jest.mock('next/navigation', () => ({
|
||||
useRouter: () => ({
|
||||
push: mockPush,
|
||||
}),
|
||||
}))
|
||||
|
||||
// Mock localStorage
|
||||
const localStorageMock = {
|
||||
getItem: jest.fn(),
|
||||
setItem: jest.fn(),
|
||||
removeItem: jest.fn(),
|
||||
clear: jest.fn(),
|
||||
}
|
||||
Object.defineProperty(window, 'localStorage', { value: localStorageMock })
|
||||
|
||||
// Import nach Mocks
|
||||
import RoleSelectPage from '@/app/admin/compliance/role-select/page'
|
||||
|
||||
describe('RoleSelectPage', () => {
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks()
|
||||
localStorageMock.getItem.mockReturnValue(null)
|
||||
})
|
||||
|
||||
describe('Rendering', () => {
|
||||
it('rendert alle 4 Rollen-Karten', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
expect(screen.getByText('Executive')).toBeInTheDocument()
|
||||
expect(screen.getByText('Auditor')).toBeInTheDocument()
|
||||
expect(screen.getByText('Compliance Officer')).toBeInTheDocument()
|
||||
expect(screen.getByText(/Entwickler|Developer/)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('rendert Seitentitel', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
expect(screen.getByText(/Compliance Portal/i)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('zeigt Quick-Access Links', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
expect(screen.getByText(/Controls/i)).toBeInTheDocument()
|
||||
expect(screen.getByText(/Evidence/i)).toBeInTheDocument()
|
||||
expect(screen.getByText(/Risks|Risiken/i)).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
describe('Rollen-Karten Klick', () => {
|
||||
it('navigiert zu Executive Dashboard bei Klick auf Executive', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
const executiveCard = screen.getByText('Executive').closest('button')
|
||||
fireEvent.click(executiveCard!)
|
||||
|
||||
expect(mockPush).toHaveBeenCalledWith('/admin/compliance?tab=executive')
|
||||
})
|
||||
|
||||
it('navigiert zu Audit Workspace bei Klick auf Auditor', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
const auditorCard = screen.getByText('Auditor').closest('button')
|
||||
fireEvent.click(auditorCard!)
|
||||
|
||||
expect(mockPush).toHaveBeenCalledWith('/admin/compliance/audit-workspace')
|
||||
})
|
||||
|
||||
it('navigiert zum Compliance Dashboard bei Klick auf Compliance Officer', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
const complianceCard = screen.getByText('Compliance Officer').closest('button')
|
||||
fireEvent.click(complianceCard!)
|
||||
|
||||
expect(mockPush).toHaveBeenCalledWith('/admin/compliance')
|
||||
})
|
||||
|
||||
it('navigiert zu technischer Ansicht bei Klick auf Developer', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
const developerCard = screen.getByText(/Entwickler|Developer/).closest('button')
|
||||
fireEvent.click(developerCard!)
|
||||
|
||||
expect(mockPush).toHaveBeenCalledWith('/admin/compliance?tab=technisch')
|
||||
})
|
||||
})
|
||||
|
||||
describe('Sprachumschaltung', () => {
|
||||
it('zeigt deutschen Text als Standard', () => {
|
||||
localStorageMock.getItem.mockReturnValue(null)
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
// Sollte standardmaessig Deutsch sein
|
||||
expect(screen.getByText(/Wählen Sie Ihre Ansicht|Waehlen Sie Ihre Ansicht/i)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('speichert Sprachpräferenz in localStorage', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
// Finde Language Toggle und klicke
|
||||
const langToggle = screen.getByRole('button', { name: /EN/i })
|
||||
fireEvent.click(langToggle)
|
||||
|
||||
expect(localStorageMock.setItem).toHaveBeenCalledWith('compliance-language', 'en')
|
||||
})
|
||||
|
||||
it('laedt Sprachpräferenz aus localStorage', () => {
|
||||
localStorageMock.getItem.mockReturnValue('en')
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
expect(screen.getByText('Choose your view')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
describe('Rollenbeschreibungen', () => {
|
||||
it('zeigt Executive Beschreibung', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
expect(screen.getByText(/Ampel-Status|Traffic Light/i)).toBeInTheDocument()
|
||||
expect(screen.getByText(/Top-Risiken|Top Risks/i)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('zeigt Auditor Beschreibung', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
expect(screen.getByText(/Checkliste|Checklist/i)).toBeInTheDocument()
|
||||
expect(screen.getByText(/Sign-off/i)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('zeigt Compliance Officer Beschreibung', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
expect(screen.getByText(/Workflows/i)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('zeigt Developer Beschreibung', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
expect(screen.getByText(/Code-Referenzen|Code Refs/i)).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
describe('Praeferenz-Speicherung', () => {
|
||||
it('speichert letzte Rollenauswahl', () => {
|
||||
render(<RoleSelectPage />)
|
||||
|
||||
const executiveCard = screen.getByText('Executive').closest('button')
|
||||
fireEvent.click(executiveCard!)
|
||||
|
||||
expect(localStorageMock.setItem).toHaveBeenCalledWith('compliance-last-role', 'executive')
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user