guided-workflow-prompts.test.ts•10.4 kB
import { generateTechnicalWriterPrompts } from '../../src/prompts/technical-writer-prompts.js';
import { promises as fs } from 'fs';
import { join } from 'path';
import { tmpdir } from 'os';
describe('Guided Workflow Prompts', () => {
let tempDir: string;
beforeEach(async () => {
tempDir = join(
tmpdir(),
`test-prompts-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
);
await fs.mkdir(tempDir, { recursive: true });
// Create a test project structure
await fs.writeFile(
join(tempDir, 'package.json'),
JSON.stringify({
name: 'test-project',
version: '1.0.0',
dependencies: { react: '^18.0.0' },
scripts: { test: 'jest', build: 'webpack' },
}),
);
await fs.writeFile(join(tempDir, 'README.md'), '# Test Project\n\nThis is a test project.');
await fs.mkdir(join(tempDir, 'src'));
await fs.writeFile(join(tempDir, 'src/index.js'), 'console.log("hello");');
await fs.mkdir(join(tempDir, 'tests'));
await fs.writeFile(join(tempDir, 'tests/index.test.js'), 'test("basic", () => {});');
});
afterEach(async () => {
try {
await fs.rm(tempDir, { recursive: true });
} catch {
// Ignore cleanup errors
}
});
describe('analyze-and-recommend prompt', () => {
it('should generate comprehensive analysis and recommendation prompt', async () => {
const messages = await generateTechnicalWriterPrompts('analyze-and-recommend', tempDir, {
analysis_depth: 'standard',
preferences: 'performance and ease of use',
});
expect(messages).toHaveLength(1);
expect(messages[0]).toHaveProperty('role', 'user');
expect(messages[0]).toHaveProperty('content');
expect(messages[0].content).toHaveProperty('type', 'text');
expect(messages[0].content.text).toContain('Execute a complete repository analysis');
expect(messages[0].content.text).toContain('SSG recommendation workflow');
expect(messages[0].content.text).toContain('Analysis Depth: standard');
expect(messages[0].content.text).toContain('Preferences: performance and ease of use');
expect(messages[0].content.text).toContain('Repository Analysis');
expect(messages[0].content.text).toContain('Implementation Guidance');
expect(messages[0].content.text).toContain('Best Practices');
});
it('should use default values when optional parameters are not provided', async () => {
const messages = await generateTechnicalWriterPrompts('analyze-and-recommend', tempDir, {});
expect(messages[0].content.text).toContain('Analysis Depth: standard');
expect(messages[0].content.text).toContain('balanced approach with good community support');
});
it('should include project context information', async () => {
const messages = await generateTechnicalWriterPrompts('analyze-and-recommend', tempDir, {
analysis_depth: 'deep',
});
expect(messages[0].content.text).toContain('Type: node_application');
expect(messages[0].content.text).toContain('Has Tests: true');
expect(messages[0].content.text).toContain('Package Manager: npm');
});
});
describe('setup-documentation prompt', () => {
it('should generate comprehensive documentation setup prompt', async () => {
const messages = await generateTechnicalWriterPrompts('setup-documentation', tempDir, {
ssg_type: 'docusaurus',
include_examples: true,
});
expect(messages).toHaveLength(1);
expect(messages[0]).toHaveProperty('role', 'user');
expect(messages[0].content.text).toContain('Create a comprehensive documentation structure');
expect(messages[0].content.text).toContain('SSG Type: docusaurus');
expect(messages[0].content.text).toContain('Include Examples: true');
expect(messages[0].content.text).toContain('Diataxis Framework Implementation');
expect(messages[0].content.text).toContain('Tutorials: Learning-oriented content');
expect(messages[0].content.text).toContain('How-to Guides: Problem-solving content');
expect(messages[0].content.text).toContain('Reference: Information-oriented content');
expect(messages[0].content.text).toContain('Explanations: Understanding-oriented content');
expect(messages[0].content.text).toContain('Configuration Setup');
expect(messages[0].content.text).toContain('GitHub Pages deployment');
expect(messages[0].content.text).toContain('with examples');
});
it('should handle minimal configuration', async () => {
const messages = await generateTechnicalWriterPrompts('setup-documentation', tempDir, {
include_examples: false,
});
expect(messages[0].content.text).toContain('SSG Type: recommended based on project analysis');
expect(messages[0].content.text).toContain('Include Examples: false');
expect(messages[0].content.text).toContain('templates');
expect(messages[0].content.text).not.toContain('with examples');
});
it('should include current documentation gaps', async () => {
const messages = await generateTechnicalWriterPrompts('setup-documentation', tempDir, {});
expect(messages[0].content.text).toContain('Current Documentation Gaps:');
expect(messages[0].content.text).toContain('Development Integration');
expect(messages[0].content.text).toContain('production-ready documentation system');
});
});
describe('troubleshoot-deployment prompt', () => {
it('should generate comprehensive troubleshooting prompt', async () => {
const messages = await generateTechnicalWriterPrompts('troubleshoot-deployment', tempDir, {
repository: 'owner/repo',
deployment_url: 'https://owner.github.io/repo',
issue_description: 'build failing on GitHub Actions',
});
expect(messages).toHaveLength(1);
expect(messages[0]).toHaveProperty('role', 'user');
expect(messages[0].content.text).toContain('Diagnose and fix GitHub Pages deployment issues');
expect(messages[0].content.text).toContain('Repository: owner/repo');
expect(messages[0].content.text).toContain('Expected URL: https://owner.github.io/repo');
expect(messages[0].content.text).toContain(
'Issue Description: build failing on GitHub Actions',
);
expect(messages[0].content.text).toContain('Troubleshooting Checklist');
expect(messages[0].content.text).toContain('Repository Settings');
expect(messages[0].content.text).toContain('Build Configuration');
expect(messages[0].content.text).toContain('Content Issues');
expect(messages[0].content.text).toContain('Deployment Workflow');
expect(messages[0].content.text).toContain('Performance and Security');
expect(messages[0].content.text).toContain('Root cause analysis');
expect(messages[0].content.text).toContain('Systematic Testing');
});
it('should use default values for optional parameters', async () => {
const messages = await generateTechnicalWriterPrompts('troubleshoot-deployment', tempDir, {
repository: 'test/repo',
});
expect(messages[0].content.text).toContain('Expected URL: GitHub Pages URL');
expect(messages[0].content.text).toContain(
'Issue Description: deployment not working as expected',
);
});
it('should include project context for troubleshooting', async () => {
const messages = await generateTechnicalWriterPrompts('troubleshoot-deployment', tempDir, {
repository: 'test/repo',
});
expect(messages[0].content.text).toContain('Project Context');
expect(messages[0].content.text).toContain('Type: node_application');
expect(messages[0].content.text).toContain('Diagnostic Approach');
expect(messages[0].content.text).toContain('Systematic Testing');
});
});
describe('Error handling', () => {
it('should throw error for unknown prompt type', async () => {
await expect(
generateTechnicalWriterPrompts('unknown-prompt-type', tempDir, {}),
).rejects.toThrow('Unknown prompt type: unknown-prompt-type');
});
it('should handle missing project directory gracefully', async () => {
const nonExistentDir = join(tmpdir(), 'non-existent-dir');
// Should not throw, but may have reduced context
const messages = await generateTechnicalWriterPrompts(
'analyze-and-recommend',
nonExistentDir,
{},
);
expect(messages).toHaveLength(1);
expect(messages[0].content.text).toContain('repository analysis');
});
it('should handle malformed package.json gracefully', async () => {
await fs.writeFile(join(tempDir, 'package.json'), 'invalid json content');
const messages = await generateTechnicalWriterPrompts('setup-documentation', tempDir, {});
expect(messages).toHaveLength(1);
expect(messages[0].content.text).toContain('documentation structure');
});
});
describe('Prompt content validation', () => {
it('should generate prompts with consistent structure', async () => {
const promptTypes = [
'analyze-and-recommend',
'setup-documentation',
'troubleshoot-deployment',
];
for (const promptType of promptTypes) {
const args = promptType === 'troubleshoot-deployment' ? { repository: 'test/repo' } : {};
const messages = await generateTechnicalWriterPrompts(promptType, tempDir, args);
expect(messages).toHaveLength(1);
expect(messages[0]).toHaveProperty('role', 'user');
expect(messages[0]).toHaveProperty('content');
expect(messages[0].content).toHaveProperty('type', 'text');
expect(messages[0].content.text).toBeTruthy();
expect(messages[0].content.text.length).toBeGreaterThan(100);
}
});
it('should include project-specific information in all prompts', async () => {
const promptTypes = ['analyze-and-recommend', 'setup-documentation'];
for (const promptType of promptTypes) {
const messages = await generateTechnicalWriterPrompts(promptType, tempDir, {});
expect(messages[0].content.text).toContain('Project Context');
expect(messages[0].content.text).toContain('Type:');
expect(messages[0].content.text).toContain('Languages:');
}
});
});
});