lorehub
Version:
Capture and surface the collective wisdom of your codebase
136 lines • 5.96 kB
JavaScript
import { describe, it, expect, vi, beforeEach } from 'vitest';
import React from 'react';
import { render } from 'ink-testing-library';
import { AddLore } from './AddLore.js';
import { Database } from '../../db/database.js';
// Mock database
vi.mock('../../db/database.js');
// Mock getRealmInfo to avoid async loading
import { getRealmInfo } from '../utils/realm.js';
vi.mock('../utils/realm.js', () => ({
getRealmInfo: vi.fn(),
}));
describe('AddLore Component', () => {
const mockProject = {
id: 'proj-123',
name: 'test-realm',
path: '/test/path',
isMonorepo: false,
provinces: ['api', 'worker'],
lastSeen: new Date(),
createdAt: new Date(),
};
const mockDb = {
findRealmByPath: vi.fn().mockReturnValue(mockProject),
createRealm: vi.fn().mockReturnValue(mockProject),
createLore: vi.fn().mockImplementation((input) => ({
...input,
id: 'lore-123',
createdAt: new Date(),
updatedAt: new Date(),
})),
checkForDuplicates: vi.fn().mockResolvedValue([]),
updateRealmLastSeen: vi.fn().mockReturnValue(mockProject),
close: vi.fn(),
};
beforeEach(() => {
vi.clearAllMocks();
// Default mock for getRealmInfo
getRealmInfo.mockResolvedValue({
name: 'test-realm',
path: '/test/path',
gitRemote: null,
isMonorepo: false,
provinces: [],
});
});
it('should render lore creation form', async () => {
const { lastFrame } = render(React.createElement(AddLore, { db: mockDb, realmPath: "/test/path", initialContent: "" }));
// Wait for component to load
await new Promise(resolve => setTimeout(resolve, 50));
expect(lastFrame()).toContain('Add New Lore');
expect(lastFrame()).toContain('test-realm - /test/path');
expect(lastFrame()).toContain('Content');
});
it('should show lore type selector', async () => {
const { lastFrame } = render(React.createElement(AddLore, { db: mockDb, realmPath: "/test/path", initialContent: "Test lore" }));
// Wait for component to load
await new Promise(resolve => setTimeout(resolve, 50));
expect(lastFrame()).toContain('Type');
expect(lastFrame()).toContain('Decree');
});
it('should allow navigation between fields', async () => {
const { lastFrame, stdin } = render(React.createElement(AddLore, { db: mockDb, realmPath: "/test/path", initialContent: "" }));
// Wait for component to load
await new Promise(resolve => setTimeout(resolve, 50));
// Initial state - focus on content
expect(lastFrame()).toContain('Content');
// Press tab to move to type
stdin.write('\t');
expect(lastFrame()).toContain('Type');
// Press tab to move to why
stdin.write('\t');
expect(lastFrame()).toContain('Why');
});
it('should handle monorepo province selection', async () => {
const monorepoProject = {
...mockProject,
isMonorepo: true,
provinces: ['auth', 'api', 'worker', 'web'],
};
// Mock getRealmInfo for monorepo
getRealmInfo.mockResolvedValue({
name: 'test-realm',
path: '/test/path',
gitRemote: null,
isMonorepo: true,
provinces: ['auth', 'api', 'worker', 'web'],
});
mockDb.findRealmByPath = vi.fn().mockReturnValue(monorepoProject);
const { lastFrame } = render(React.createElement(AddLore, { db: mockDb, realmPath: "/test/path", initialContent: "" }));
// Wait for component to load
await new Promise(resolve => setTimeout(resolve, 100));
const frame = lastFrame();
// Check if it's a monorepo form by looking for province-related text
expect(frame).toMatch(/Province|All provinces/);
});
it('should show confidence slider', async () => {
const { lastFrame } = render(React.createElement(AddLore, { db: mockDb, realmPath: "/test/path", initialContent: "" }));
// Wait for component to load
await new Promise(resolve => setTimeout(resolve, 50));
expect(lastFrame()).toContain('Confidence:');
expect(lastFrame()).toMatch(/\d+%/); // Should show percentage
});
it.skip('should create lore on submit', async () => {
// Skipping this test as it requires complex mocking of Ink's interactive components
// The functionality is tested through integration tests
});
it('should handle realm creation for new realms', async () => {
// Mock getRealmInfo for new realm
getRealmInfo.mockResolvedValue({
name: 'new-realm',
path: '/new/realm',
gitRemote: null,
isMonorepo: false,
provinces: [],
});
mockDb.findRealmByPath = vi.fn().mockReturnValue(null);
const { lastFrame } = render(React.createElement(AddLore, { db: mockDb, realmPath: "/new/realm", initialContent: "" }));
// Wait for component to load
await new Promise(resolve => setTimeout(resolve, 50));
expect(mockDb.createRealm).toHaveBeenCalledWith(expect.objectContaining({
path: '/new/realm',
name: 'new-realm',
}));
expect(lastFrame()).toContain('Add New Lore');
});
it.skip('should show success message after creation', async () => {
// Skipping this test as it requires complex mocking of Ink's interactive components
// The functionality is tested through integration tests
});
it.skip('should handle errors gracefully', async () => {
// Skipping this test as it requires complex mocking of Ink's interactive components
// The functionality is tested through integration tests
});
});
//# sourceMappingURL=AddLore.test.js.map