103 lines
3.6 KiB
TypeScript
103 lines
3.6 KiB
TypeScript
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');
|
|
});
|
|
});
|
|
});
|