feat(dm): add dashboard with oauth, dice, initiative, open5e, notes
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import {
|
||||
getAuthPanelState,
|
||||
getAuthLinks,
|
||||
type AuthUser,
|
||||
} from '../src/lib/client/auth-panel';
|
||||
|
||||
describe('AuthPanel', () => {
|
||||
describe('getAuthPanelState', () => {
|
||||
it('returns guest state when user is null', () => {
|
||||
const state = getAuthPanelState(null);
|
||||
expect(state.type).toBe('guest');
|
||||
});
|
||||
|
||||
it('returns guest state when user is undefined', () => {
|
||||
const state = getAuthPanelState(undefined as unknown as null);
|
||||
expect(state.type).toBe('guest');
|
||||
});
|
||||
|
||||
it('returns authenticated state when user is present', () => {
|
||||
const user: AuthUser = { name: 'Test User', avatar: 'https://example.com/avatar.png' };
|
||||
const state = getAuthPanelState(user);
|
||||
expect(state.type).toBe('authenticated');
|
||||
if (state.type === 'authenticated') {
|
||||
expect(state.user.name).toBe('Test User');
|
||||
expect(state.user.avatar).toBe('https://example.com/avatar.png');
|
||||
}
|
||||
});
|
||||
|
||||
it('handles user with null avatar', () => {
|
||||
const user: AuthUser = { name: 'No Avatar', avatar: null };
|
||||
const state = getAuthPanelState(user);
|
||||
expect(state.type).toBe('authenticated');
|
||||
if (state.type === 'authenticated') {
|
||||
expect(state.user.avatar).toBeNull();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('getAuthLinks', () => {
|
||||
it('returns VK and Yandex login links for guest', () => {
|
||||
const state = getAuthPanelState(null);
|
||||
const links = getAuthLinks(state);
|
||||
expect(links).toHaveLength(2);
|
||||
expect(links[0]).toEqual({
|
||||
href: '/api/auth/login/vk',
|
||||
label: 'Войти через VK',
|
||||
style: 'vk',
|
||||
});
|
||||
expect(links[1]).toEqual({
|
||||
href: '/api/auth/login/yandex',
|
||||
label: 'Войти через Яндекс',
|
||||
style: 'yandex',
|
||||
});
|
||||
});
|
||||
|
||||
it('returns logout link for authenticated user', () => {
|
||||
const user: AuthUser = { name: 'Test', avatar: null };
|
||||
const state = getAuthPanelState(user);
|
||||
const links = getAuthLinks(state);
|
||||
expect(links).toHaveLength(1);
|
||||
expect(links[0]).toEqual({
|
||||
href: '/api/auth/logout',
|
||||
label: 'Выйти',
|
||||
style: 'logout',
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('AuthPanel rendering logic', () => {
|
||||
it('guest view should show login buttons', () => {
|
||||
const state = getAuthPanelState(null);
|
||||
expect(state.type).toBe('guest');
|
||||
const links = getAuthLinks(state);
|
||||
const vkLink = links.find((l) => l.style === 'vk');
|
||||
const yandexLink = links.find((l) => l.style === 'yandex');
|
||||
expect(vkLink).toBeDefined();
|
||||
expect(yandexLink).toBeDefined();
|
||||
expect(vkLink!.label).toBe('Войти через VK');
|
||||
expect(yandexLink!.label).toBe('Войти через Яндекс');
|
||||
});
|
||||
|
||||
it('authenticated view should show user info', () => {
|
||||
const user: AuthUser = { name: 'Test User', avatar: 'https://example.com/avatar.png' };
|
||||
const state = getAuthPanelState(user);
|
||||
expect(state.type).toBe('authenticated');
|
||||
if (state.type === 'authenticated') {
|
||||
expect(state.user.name).toBe('Test User');
|
||||
expect(state.user.avatar).toBe('https://example.com/avatar.png');
|
||||
}
|
||||
});
|
||||
|
||||
it('logout action clears session via /api/auth/logout', () => {
|
||||
const user: AuthUser = { name: 'Test', avatar: null };
|
||||
const state = getAuthPanelState(user);
|
||||
const links = getAuthLinks(state);
|
||||
const logoutLink = links.find((l) => l.style === 'logout');
|
||||
expect(logoutLink).toBeDefined();
|
||||
expect(logoutLink!.href).toBe('/api/auth/logout');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user