Fixing frontend coverage.
Some checks failed
Tests / Build and Push CICD Image (push) Successful in 46m49s
Tests / YAML Syntax Check (push) Successful in 7m40s
Tests / TOML Syntax Check (push) Successful in 53s
Tests / Mixed Line Ending Check (push) Successful in 54s
Tests / TOML Formatting Check (push) Successful in 52s
Tests / Ruff Linting (push) Successful in 55s
Tests / Ruff Format Check (push) Successful in 59s
Tests / Trailing Whitespace Check (push) Successful in 9m41s
Tests / Pyright Type Check (push) Successful in 1m9s
Tests / No Docstring Types Check (push) Successful in 57s
Tests / Darglint Docstring Check (push) Successful in 1m16s
Tests / ESLint Check (push) Successful in 1m6s
Tests / Prettier Format Check (push) Successful in 1m14s
Tests / TypeScript Type Check (push) Successful in 1m12s
Tests / Backend Tests (push) Successful in 1m3s
Tests / TSDoc Lint Check (push) Successful in 1m37s
Tests / Frontend Tests (push) Successful in 1m23s
Tests / Backend Doctests (push) Successful in 1m7s
Tests / End of File Check (push) Successful in 13m53s
Tests / Integration Tests (push) Successful in 6m23s
Tests / End-to-End Tests (push) Has been cancelled

Signed-off-by: Cliff Hill <xlorep@darkhelm.org>
This commit is contained in:
2025-10-30 14:15:13 -04:00
parent 245169c01e
commit eb8802eea2
2 changed files with 184 additions and 0 deletions

40
frontend/src/main.test.ts Normal file
View File

@@ -0,0 +1,40 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
// Mock Vue's createApp
const mockMount = vi.fn();
const mockApp = {
mount: mockMount,
};
const mockCreateApp = vi.fn(() => mockApp);
// Mock the App component
const mockAppComponent = {};
vi.mock('vue', () => ({
createApp: mockCreateApp,
}));
vi.mock('./App.vue', () => ({
default: mockAppComponent,
}));
describe('main.ts', () => {
beforeEach(() => {
vi.clearAllMocks();
// Clear the module cache to ensure fresh imports
vi.resetModules();
});
it('should create Vue app and mount to #app', async () => {
// Import the module after setting up mocks
await import('./main');
// Verify createApp was called with the App component
expect(mockCreateApp).toHaveBeenCalledWith(mockAppComponent);
expect(mockCreateApp).toHaveBeenCalledTimes(1);
// Verify mount was called with #app selector
expect(mockMount).toHaveBeenCalledWith('#app');
expect(mockMount).toHaveBeenCalledTimes(1);
});
});

View File

@@ -0,0 +1,144 @@
import { describe, it, expect } from 'vitest';
import { PlaylistSchema, UserSchema, type Playlist, type User } from './validation';
describe('PlaylistSchema', () => {
it('should validate a valid playlist', () => {
const validPlaylist = {
id: '123e4567-e89b-12d3-a456-426614174000',
name: 'My Playlist',
description: 'A great playlist',
tracks: ['track1', 'track2'],
};
const result = PlaylistSchema.parse(validPlaylist);
expect(result).toEqual(validPlaylist);
});
it('should validate playlist with minimal required fields', () => {
const minimalPlaylist = {
id: '123e4567-e89b-12d3-a456-426614174000',
name: 'My Playlist',
};
const result = PlaylistSchema.parse(minimalPlaylist);
expect(result).toEqual({
id: '123e4567-e89b-12d3-a456-426614174000',
name: 'My Playlist',
description: undefined,
tracks: [],
});
});
it('should reject playlist with invalid UUID', () => {
const invalidPlaylist = {
id: 'invalid-uuid',
name: 'My Playlist',
};
expect(() => PlaylistSchema.parse(invalidPlaylist)).toThrow();
});
it('should reject playlist with empty name', () => {
const invalidPlaylist = {
id: '123e4567-e89b-12d3-a456-426614174000',
name: '',
};
expect(() => PlaylistSchema.parse(invalidPlaylist)).toThrow();
});
});
describe('UserSchema', () => {
it('should validate a valid user', () => {
const validUser = {
id: 123,
username: 'testuser',
email: 'test@example.com',
preferences: {
theme: 'dark' as const,
notifications: false,
},
};
const result = UserSchema.parse(validUser);
expect(result).toEqual(validUser);
});
it('should validate user with default preferences', () => {
const minimalUser = {
id: 123,
username: 'testuser',
email: 'test@example.com',
};
const result = UserSchema.parse(minimalUser);
expect(result).toEqual({
id: 123,
username: 'testuser',
email: 'test@example.com',
preferences: {
theme: 'light',
notifications: true,
},
});
});
it('should reject user with invalid email', () => {
const invalidUser = {
id: 123,
username: 'testuser',
email: 'invalid-email',
};
expect(() => UserSchema.parse(invalidUser)).toThrow();
});
it('should reject user with empty username', () => {
const invalidUser = {
id: 123,
username: '',
email: 'test@example.com',
};
expect(() => UserSchema.parse(invalidUser)).toThrow();
});
it('should reject user with invalid theme', () => {
const invalidUser = {
id: 123,
username: 'testuser',
email: 'test@example.com',
preferences: {
theme: 'invalid' as any,
notifications: true,
},
};
expect(() => UserSchema.parse(invalidUser)).toThrow();
});
});
describe('Type exports', () => {
it('should export correct TypeScript types', () => {
// Type-only test - compilation is the validation
const playlist: Playlist = {
id: '123e4567-e89b-12d3-a456-426614174000',
name: 'Test',
description: 'Test description',
tracks: ['track1'],
};
const user: User = {
id: 1,
username: 'test',
email: 'test@example.com',
preferences: {
theme: 'light',
notifications: true,
},
};
expect(playlist.id).toBeDefined();
expect(user.username).toBeDefined();
});
});