#!/usr/bin/env node /** * Test script for unified tech stack recommendations with user authentication * Tests both anonymous and authenticated user scenarios */ const axios = require('axios'); const UNIFIED_SERVICE_URL = 'http://localhost:8013'; const USER_AUTH_URL = 'http://localhost:8011'; const COMPREHENSIVE_ENDPOINT = '/api/unified/comprehensive-recommendations'; // Test data const testRequest = { template: { id: 'test-template-123', title: 'E-commerce Platform', description: 'A comprehensive e-commerce solution', category: 'E-commerce', type: 'web-app' }, features: [ { id: 'feature-1', name: 'User Authentication', description: 'Secure user login and registration system', feature_type: 'essential', complexity: 'medium', business_rules: ['Users must verify email', 'Password must meet security requirements'], technical_requirements: ['JWT tokens', 'Password hashing', 'Email verification'] }, { id: 'feature-2', name: 'Product Catalog', description: 'Product listing and search functionality', feature_type: 'essential', complexity: 'medium', business_rules: ['Products must have valid pricing', 'Search must be fast'], technical_requirements: ['Database indexing', 'Search optimization'] } ], businessContext: { questions: [ { question: 'What is your target audience?', answer: 'Small to medium businesses selling products online' }, { question: 'What is your expected user volume?', answer: 'We expect around 10,000 users initially, growing to 100,000 within a year' } ] }, projectName: 'E-commerce Platform', projectType: 'E-commerce', templateId: 'test-template-123', budget: 15000, domain: 'ecommerce', includeClaude: true, includeTemplateBased: true, includeDomainBased: true }; async function loginUser() { try { console.log('๐Ÿ” Logging in test user...'); const response = await axios.post(`${USER_AUTH_URL}/api/auth/login`, { email: 'test@tech4biz.com', password: 'admin123' }, { timeout: 10000, headers: { 'Content-Type': 'application/json' } }); if (response.data.success) { console.log('โœ… User logged in successfully'); return response.data.data.access_token; } else { console.log('โŒ Login failed:', response.data.message); return null; } } catch (error) { console.log('โŒ Login error:', error.response?.data?.message || error.message); return null; } } async function testAnonymousRecommendations() { console.log('\n๐Ÿงช Testing Anonymous Recommendations'); console.log('=' .repeat(50)); try { const response = await axios.post( `${UNIFIED_SERVICE_URL}${COMPREHENSIVE_ENDPOINT}`, testRequest, { timeout: 60000, headers: { 'Content-Type': 'application/json' } } ); console.log('โœ… Anonymous recommendations received successfully!'); console.log('๐Ÿ“Š Response Status:', response.status); if (response.data.success) { console.log('โœ… Success: true'); console.log('๐Ÿ“ Message:', response.data.message); console.log('๐Ÿ‘ค User ID in response:', response.data.data?.metadata?.userId || 'null (anonymous)'); } else { console.log('โŒ Success: false'); console.log('Error:', response.data.error); } } catch (error) { console.log('โŒ Anonymous test failed!'); console.log('Error:', error.message); if (error.response) { console.log('Response Status:', error.response.status); console.log('Response Data:', JSON.stringify(error.response.data, null, 2)); } } } async function testAuthenticatedRecommendations(accessToken) { console.log('\n๐Ÿ” Testing Authenticated User Recommendations'); console.log('=' .repeat(50)); try { const response = await axios.post( `${UNIFIED_SERVICE_URL}${COMPREHENSIVE_ENDPOINT}`, testRequest, { timeout: 60000, headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${accessToken}` } } ); console.log('โœ… Authenticated recommendations received successfully!'); console.log('๐Ÿ“Š Response Status:', response.status); if (response.data.success) { console.log('โœ… Success: true'); console.log('๐Ÿ“ Message:', response.data.message); console.log('๐Ÿ‘ค User ID in response:', response.data.data?.metadata?.userId || 'null'); } else { console.log('โŒ Success: false'); console.log('Error:', response.data.error); } } catch (error) { console.log('โŒ Authenticated test failed!'); console.log('Error:', error.message); if (error.response) { console.log('Response Status:', error.response.status); console.log('Response Data:', JSON.stringify(error.response.data, null, 2)); } } } async function testUserStats(accessToken) { console.log('\n๐Ÿ“Š Testing User Statistics'); console.log('=' .repeat(50)); try { const response = await axios.get( `${UNIFIED_SERVICE_URL}/api/unified/user/stats`, { timeout: 10000, headers: { 'Authorization': `Bearer ${accessToken}` } } ); console.log('โœ… User stats retrieved successfully!'); console.log('๐Ÿ“Š Response Status:', response.status); if (response.data.success) { console.log('โœ… Success: true'); console.log('๐Ÿ“Š Stats:', JSON.stringify(response.data.data, null, 2)); } else { console.log('โŒ Success: false'); console.log('Error:', response.data.error); } } catch (error) { console.log('โŒ User stats test failed!'); console.log('Error:', error.message); if (error.response) { console.log('Response Status:', error.response.status); console.log('Response Data:', JSON.stringify(error.response.data, null, 2)); } } } async function testUserHistory(accessToken) { console.log('\n๐Ÿ“š Testing User Recommendation History'); console.log('=' .repeat(50)); try { const response = await axios.get( `${UNIFIED_SERVICE_URL}/api/unified/user/recommendations`, { timeout: 10000, headers: { 'Authorization': `Bearer ${accessToken}` } } ); console.log('โœ… User history retrieved successfully!'); console.log('๐Ÿ“Š Response Status:', response.status); if (response.data.success) { console.log('โœ… Success: true'); console.log('๐Ÿ“š History count:', response.data.data?.length || 0); } else { console.log('โŒ Success: false'); console.log('Error:', response.data.error); } } catch (error) { console.log('โŒ User history test failed!'); console.log('Error:', error.message); if (error.response) { console.log('Response Status:', error.response.status); console.log('Response Data:', JSON.stringify(error.response.data, null, 2)); } } } async function testServiceHealth() { console.log('\n๐Ÿฅ Testing Service Health'); console.log('=' .repeat(50)); try { const response = await axios.get(`${UNIFIED_SERVICE_URL}/health`, { timeout: 5000 }); console.log('โœ… Unified service is healthy'); console.log(` Status: ${response.data.status}`); console.log(` Version: ${response.data.version}`); // Test status endpoint const statusResponse = await axios.get(`${UNIFIED_SERVICE_URL}/api/unified/status`, { timeout: 5000 }); console.log('โœ… Service status endpoint working'); console.log(` Overall Status: ${statusResponse.data.data?.overallStatus}`); console.log(` Template Manager: ${statusResponse.data.data?.templateManager?.status}`); console.log(` Tech Stack Selector: ${statusResponse.data.data?.techStackSelector?.status}`); console.log(` User Auth: ${statusResponse.data.data?.userAuth?.status}`); } catch (error) { console.log('โŒ Service health check failed!'); console.log('Error:', error.message); } } async function runAllTests() { console.log('๐Ÿงช Testing Unified Tech Stack Service with User Authentication'); console.log('=' .repeat(70)); // Test service health first await testServiceHealth(); // Test anonymous recommendations await testAnonymousRecommendations(); // Login and test authenticated features const accessToken = await loginUser(); if (accessToken) { await testAuthenticatedRecommendations(accessToken); await testUserStats(accessToken); await testUserHistory(accessToken); } else { console.log('\nโš ๏ธ Skipping authenticated tests - login failed'); } console.log('\n๐Ÿ All tests completed!'); } // Run the tests if (require.main === module) { runAllTests().catch(console.error); } module.exports = { runAllTests };