113 lines
3.9 KiB
JavaScript
Executable File
113 lines
3.9 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Tests for detect-topic.js
|
|
*/
|
|
|
|
const { detectTopic, normalizeTopic, normalizeLibrary } = require('../detect-topic');
|
|
|
|
// Test counter
|
|
let passed = 0;
|
|
let failed = 0;
|
|
|
|
function assert(condition, message) {
|
|
if (condition) {
|
|
console.log(`✓ ${message}`);
|
|
passed++;
|
|
} else {
|
|
console.error(`✗ ${message}`);
|
|
failed++;
|
|
}
|
|
}
|
|
|
|
function assertEqual(actual, expected, message) {
|
|
if (actual === expected) {
|
|
console.log(`✓ ${message}`);
|
|
passed++;
|
|
} else {
|
|
console.error(`✗ ${message}`);
|
|
console.error(` Expected: ${expected}`);
|
|
console.error(` Actual: ${actual}`);
|
|
failed++;
|
|
}
|
|
}
|
|
|
|
console.log('Running detect-topic.js tests...\n');
|
|
|
|
// Test normalizeTopic
|
|
console.log('## Testing normalizeTopic()');
|
|
assertEqual(normalizeTopic('date picker'), 'date', 'Normalize multi-word topic');
|
|
assertEqual(normalizeTopic('OAuth'), 'oauth', 'Normalize OAuth');
|
|
assertEqual(normalizeTopic('Server-Side'), 'server', 'Normalize Server-Side');
|
|
assertEqual(normalizeTopic('caching'), 'caching', 'Normalize caching');
|
|
|
|
// Test normalizeLibrary
|
|
console.log('\n## Testing normalizeLibrary()');
|
|
assertEqual(normalizeLibrary('Next.js'), 'next.js', 'Normalize Next.js');
|
|
assertEqual(normalizeLibrary('shadcn/ui'), 'shadcn/ui', 'Normalize shadcn/ui');
|
|
assertEqual(normalizeLibrary('Better Auth'), 'better-auth', 'Normalize Better Auth');
|
|
|
|
// Test topic-specific queries
|
|
console.log('\n## Testing topic-specific queries');
|
|
|
|
const topicQuery1 = detectTopic('How do I use date picker in shadcn/ui?');
|
|
assert(topicQuery1 !== null, 'Detect topic-specific query 1');
|
|
assert(topicQuery1.isTopicSpecific === true, 'Query 1 is topic-specific');
|
|
assertEqual(topicQuery1.topic, 'date', 'Query 1 topic is "date"');
|
|
assertEqual(topicQuery1.library, 'shadcn/ui', 'Query 1 library is "shadcn/ui"');
|
|
|
|
const topicQuery2 = detectTopic('Next.js caching strategies');
|
|
assert(topicQuery2 !== null, 'Detect topic-specific query 2');
|
|
assert(topicQuery2 && topicQuery2.isTopicSpecific === true, 'Query 2 is topic-specific');
|
|
if (topicQuery2) {
|
|
assertEqual(topicQuery2.topic, 'caching', 'Query 2 topic is "caching"');
|
|
assertEqual(topicQuery2.library, 'next.js', 'Query 2 library is "next.js"');
|
|
}
|
|
|
|
const topicQuery3 = detectTopic('Better Auth OAuth setup');
|
|
assert(topicQuery3 !== null, 'Detect topic-specific query 3');
|
|
assert(topicQuery3.isTopicSpecific === true, 'Query 3 is topic-specific');
|
|
|
|
const topicQuery4 = detectTopic('Using authentication with Better Auth');
|
|
assert(topicQuery4 !== null, 'Detect topic-specific query 4');
|
|
assert(topicQuery4.isTopicSpecific === true, 'Query 4 is topic-specific');
|
|
|
|
const topicQuery5 = detectTopic('Implement routing in Next.js');
|
|
assert(topicQuery5 !== null, 'Detect topic-specific query 5');
|
|
assert(topicQuery5.isTopicSpecific === true, 'Query 5 is topic-specific');
|
|
|
|
// Test general queries
|
|
console.log('\n## Testing general queries');
|
|
|
|
const generalQuery1 = detectTopic('Documentation for Next.js');
|
|
assert(generalQuery1 === null, 'Detect general query 1 (returns null)');
|
|
|
|
const generalQuery2 = detectTopic('Astro getting started');
|
|
assert(generalQuery2 === null, 'Detect general query 2 (returns null)');
|
|
|
|
const generalQuery3 = detectTopic('How to use Better Auth');
|
|
assert(generalQuery3 === null, 'Detect general query 3 (returns null)');
|
|
|
|
const generalQuery4 = detectTopic('Next.js API reference');
|
|
assert(generalQuery4 === null, 'Detect general query 4 (returns null)');
|
|
|
|
// Test edge cases
|
|
console.log('\n## Testing edge cases');
|
|
|
|
const edgeCase1 = detectTopic('');
|
|
assert(edgeCase1 === null, 'Empty string returns null');
|
|
|
|
const edgeCase2 = detectTopic(null);
|
|
assert(edgeCase2 === null, 'Null returns null');
|
|
|
|
const edgeCase3 = detectTopic('Random text without pattern');
|
|
assert(edgeCase3 === null, 'Non-matching query returns null');
|
|
|
|
// Summary
|
|
console.log('\n## Test Summary');
|
|
console.log(`Passed: ${passed}`);
|
|
console.log(`Failed: ${failed}`);
|
|
console.log(`Total: ${passed + failed}`);
|
|
|
|
process.exit(failed > 0 ? 1 : 0);
|