task-master-neo-sdlc
Version:
Enhanced task management system with Neo SDLC agents and MCP tools for comprehensive, AI-driven software development lifecycle management.
273 lines (234 loc) • 7.92 kB
JavaScript
import { DesignSystemManager } from '../design-system-manager.js';
import { jest } from '@jest/globals';
// Mock KnowledgeGraph
const mockKnowledgeGraph = {
addNode: jest.fn(),
updateContext: jest.fn(),
};
describe('DesignSystemManager', () => {
let manager;
beforeEach(() => {
jest.clearAllMocks();
manager = new DesignSystemManager(mockKnowledgeGraph);
});
describe('Initialization', () => {
it('should initialize design system and register in knowledge graph', async () => {
await manager.initialize();
expect(mockKnowledgeGraph.addNode).toHaveBeenCalledWith({
id: 'design-system',
type: 'system',
data: {
status: 'active',
tokenCount: 0,
componentCount: 0,
templateCount: 0
}
});
});
});
describe('Token Management', () => {
const validToken = {
id: 'primary-color',
type: 'color',
value: '#007bff',
metadata: {
description: 'Primary brand color',
usage: 'Use for primary actions and highlights'
}
};
it('should add a valid token', async () => {
await manager.addToken(validToken);
expect(manager.tokens.get('primary-color')).toEqual(validToken);
expect(mockKnowledgeGraph.addNode).toHaveBeenCalledWith({
id: 'token:primary-color',
type: 'design-token',
data: validToken
});
});
it('should reject invalid token type', async () => {
const invalidToken = { ...validToken, type: 'invalid' };
await expect(manager.addToken(invalidToken)).rejects.toThrow('Invalid token type');
});
it('should update existing token', async () => {
await manager.addToken(validToken);
const updates = { value: '#0056b3' };
await manager.updateToken('primary-color', updates);
expect(manager.tokens.get('primary-color').value).toBe('#0056b3');
expect(mockKnowledgeGraph.updateContext).toHaveBeenCalled();
});
});
describe('Component Management', () => {
const validComponent = {
id: 'button',
type: 'atom',
name: 'Button',
description: 'Basic button component',
props: [{ name: 'label', type: 'string', required: true }],
dependencies: [],
tokens: ['primary-color'],
template: '<button>{{label}}</button>',
documentation: 'Basic button usage...',
tests: ['button.test.js']
};
it('should add a valid component', async () => {
// Add required token first
await manager.addToken({
id: 'primary-color',
type: 'color',
value: '#007bff'
});
await manager.addComponent(validComponent);
expect(manager.components.get('button')).toEqual(validComponent);
expect(mockKnowledgeGraph.addNode).toHaveBeenCalledWith({
id: 'component:button',
type: 'design-component',
data: validComponent
});
});
it('should detect circular dependencies', async () => {
const componentA = { ...validComponent, id: 'a', dependencies: ['b'] };
const componentB = { ...validComponent, id: 'b', dependencies: ['a'] };
await manager.addToken({
id: 'primary-color',
type: 'color',
value: '#007bff'
});
await manager.addComponent(componentB);
await expect(manager.addComponent(componentA)).rejects.toThrow('Invalid component');
});
});
describe('Grid System', () => {
const validGridConfig = {
columns: 12,
gutter: '1rem',
breakpoints: {
xs: '0px',
sm: '576px',
md: '768px',
lg: '992px'
},
containerWidth: '1200px'
};
it('should define grid system', async () => {
await manager.defineGridSystem(validGridConfig);
expect(manager.gridConfig).toEqual(validGridConfig);
expect(mockKnowledgeGraph.updateContext).toHaveBeenCalledWith({
id: 'design-system',
type: 'system',
data: { gridConfig: validGridConfig }
});
});
it('should generate grid styles', async () => {
await manager.defineGridSystem(validGridConfig);
const styles = await manager.generateGridStyles();
expect(styles).toContain('.container');
expect(styles).toContain('.row');
expect(styles).toContain('.col');
expect(styles).toContain('@media');
});
});
describe('Templates', () => {
const validTemplate = {
name: 'Basic Layout',
description: 'Two column layout',
layout: {
sections: [{
class: 'main-section',
components: [
{ id: 'header', class: 'col-12' },
{ id: 'sidebar', class: 'col-4' },
{ id: 'content', class: 'col-8' }
]
}]
},
components: ['header', 'sidebar', 'content']
};
it('should create template', async () => {
// Add required components first
const components = ['header', 'sidebar', 'content'].map(id => ({
id,
type: 'atom',
name: id,
description: `${id} component`,
props: [],
dependencies: [],
tokens: [],
template: `<div>${id}</div>`,
documentation: '',
tests: []
}));
for (const component of components) {
await manager.addComponent(component);
}
await manager.createTemplate(validTemplate);
const templateId = 'template:basic-layout';
expect(manager.templates.get(templateId)).toEqual(validTemplate);
expect(mockKnowledgeGraph.addNode).toHaveBeenCalledWith({
id: templateId,
type: 'design-template',
data: validTemplate
});
});
it('should apply template with data', async () => {
// Add required components first
const components = ['header', 'sidebar', 'content'].map(id => ({
id,
type: 'atom',
name: id,
description: `${id} component`,
props: [],
dependencies: [],
tokens: [],
template: `<div>{{content}}</div>`,
documentation: '',
tests: []
}));
for (const component of components) {
await manager.addComponent(component);
}
await manager.createTemplate(validTemplate);
const templateId = 'template:basic-layout';
const data = {
header: { content: 'Header Content' },
sidebar: { content: 'Sidebar Content' },
content: { content: 'Main Content' }
};
const rendered = await manager.applyTemplate(templateId, data);
expect(rendered).toContain('Header Content');
expect(rendered).toContain('Sidebar Content');
expect(rendered).toContain('Main Content');
});
});
describe('Documentation', () => {
it('should generate comprehensive documentation', async () => {
// Add some tokens and components first
await manager.addToken({
id: 'primary-color',
type: 'color',
value: '#007bff',
metadata: {
description: 'Primary brand color',
usage: 'Use for primary actions'
}
});
await manager.addComponent({
id: 'button',
type: 'atom',
name: 'Button',
description: 'Basic button component',
props: [{ name: 'label', type: 'string', required: true }],
dependencies: [],
tokens: ['primary-color'],
template: '<button>{{label}}</button>',
documentation: 'Button usage...',
tests: ['button.test.js']
});
const docs = await manager.generateDocumentation();
expect(docs).toContain('# Design System Documentation');
expect(docs).toContain('## Design Tokens');
expect(docs).toContain('## Components');
expect(docs).toContain('primary-color');
expect(docs).toContain('Button');
});
});
});