erickzao-api-stats-cli
Version:
CLI oficial para configuração automática do API Stats Logger
222 lines (185 loc) • 7.28 kB
JavaScript
const axios = require('axios');
async function testAutoSetup() {
console.log('🧪 Testando fluxo automático de setup...\n');
const baseUrl = process.env.API_STATS_URL || 'http://localhost:3000';
try {
// Teste 1: Verificar se servidor está rodando
console.log('📡 Teste 1: Conectividade com servidor');
try {
const healthResponse = await axios.get(`${baseUrl}/health`, { timeout: 5000 });
console.log('✅ Servidor está rodando');
console.log(`📊 Status: ${healthResponse.status}`);
} catch (error) {
console.log('❌ Servidor não está rodando em', baseUrl);
console.log('💡 Execute: npm run start:dev no projeto principal');
throw new Error('Servidor indisponível');
}
// Teste 2: Criar projeto automaticamente
console.log('\n📦 Teste 2: Criação automática de projeto');
const projectData = {
name: 'test-auto-project',
description: 'Projeto de teste para validar auto-criação',
environment: 'test'
};
const projectResponse = await axios.post(`${baseUrl}/projects`, projectData, {
timeout: 10000,
headers: { 'Content-Type': 'application/json' }
});
const projectId = projectResponse.data._id || projectResponse.data.id;
console.log('✅ Projeto criado automaticamente');
console.log(`📋 ID: ${projectId}`);
console.log(`📝 Nome: ${projectResponse.data.name}`);
// Teste 3: Gerar API key automaticamente
console.log('\n🔑 Teste 3: Geração automática de API key');
const apiKeyData = {
projectId,
description: 'API key de teste gerada automaticamente'
};
const apiKeyResponse = await axios.post(`${baseUrl}/api-keys/generate`, apiKeyData, {
timeout: 10000,
headers: { 'Content-Type': 'application/json' }
});
const apiKey = apiKeyResponse.data.key;
console.log('✅ API key gerada automaticamente');
console.log(`🔑 Key: ${apiKey.substring(0, 8)}...`);
console.log(`📄 Descrição: ${apiKeyResponse.data.description}`);
// Teste 4: Validar API key gerada
console.log('\n🔍 Teste 4: Validação da API key');
const testLogData = [{
level: 'info',
message: 'Teste de validação automática',
service: 'test-service',
environment: 'test',
metadata: {
test: true,
timestamp: new Date().toISOString()
}
}];
const logResponse = await axios.post(`${baseUrl}/logs`, testLogData, {
headers: {
'x-api-key': apiKey,
'Content-Type': 'application/json'
},
timeout: 5000
});
console.log('✅ API key é válida e funcional');
console.log(`📊 Status: ${logResponse.status}`);
// Teste 5: Limpeza (remover projeto de teste)
console.log('\n🧹 Teste 5: Limpeza de dados de teste');
try {
// Revogar API key
await axios.delete(`${baseUrl}/api-keys/${apiKey}`, { timeout: 5000 });
console.log('✅ API key revogada');
// Deletar projeto (se endpoint existir)
try {
await axios.delete(`${baseUrl}/projects/${projectId}`, { timeout: 5000 });
console.log('✅ Projeto de teste removido');
} catch (deleteError) {
console.log('⚠️ Projeto não removido (endpoint pode não existir)');
}
} catch (cleanupError) {
console.log('⚠️ Erro na limpeza (dados de teste podem permanecer)');
}
// Resumo
console.log('\n🎉 Todos os testes passaram!');
console.log('\n📊 Resumo dos testes:');
console.log('- ✅ Conectividade com servidor');
console.log('- ✅ Criação automática de projeto');
console.log('- ✅ Geração automática de API key');
console.log('- ✅ Validação da API key');
console.log('- ✅ Limpeza de dados de teste');
console.log('\n🚀 Fluxo automático está funcionando perfeitamente!');
console.log('\n💡 Próximos passos:');
console.log('1. Execute: npx api-stats-init');
console.log('2. Siga o wizard interativo');
console.log('3. Seu projeto será criado automaticamente');
return true;
} catch (error) {
console.error('\n❌ Erro no teste:', error.message);
if (error.response) {
console.error('📊 Status:', error.response.status);
console.error('📄 Dados:', error.response.data);
}
console.log('\n🔧 Troubleshooting:');
console.log('1. Verifique se o servidor está rodando');
console.log('2. Confirme a URL do servidor:', baseUrl);
console.log('3. Verifique as configurações de CORS/firewall');
console.log('4. Tente: export API_STATS_URL=http://localhost:3000');
return false;
}
}
// Teste de funcionalidades específicas
async function testSpecificFeatures() {
console.log('\n🔬 Testando funcionalidades específicas...\n');
const baseUrl = process.env.API_STATS_URL || 'http://localhost:3000';
// Teste de múltiplos projetos
console.log('📦 Teste: Múltiplos projetos');
try {
const projects = [];
for (let i = 1; i <= 3; i++) {
const response = await axios.post(`${baseUrl}/projects`, {
name: `multi-test-${i}`,
description: `Projeto ${i} para teste de múltiplos projetos`,
environment: 'test'
});
projects.push(response.data);
console.log(`✅ Projeto ${i} criado: ${response.data.name}`);
}
// Cleanup
for (const project of projects) {
try {
await axios.delete(`${baseUrl}/projects/${project._id || project.id}`);
} catch (e) {
// Ignore cleanup errors
}
}
console.log('✅ Teste de múltiplos projetos passou');
} catch (error) {
console.log('❌ Erro no teste de múltiplos projetos:', error.message);
}
// Teste de API keys com diferentes descrições
console.log('\n🔑 Teste: API keys com descrições');
try {
const projectResponse = await axios.post(`${baseUrl}/projects`, {
name: 'descriptions-test',
description: 'Teste de descrições',
environment: 'test'
});
const projectId = projectResponse.data._id || projectResponse.data.id;
const descriptions = [
'Desenvolvimento local',
'Integração CLI',
'Produção automatizada'
];
for (const desc of descriptions) {
const keyResponse = await axios.post(`${baseUrl}/api-keys/generate`, {
projectId,
description: desc
});
console.log(`✅ API key criada: ${desc} (${keyResponse.data.key.substring(0, 8)}...)`);
// Revogar key
await axios.delete(`${baseUrl}/api-keys/${keyResponse.data.key}`);
}
// Cleanup
try {
await axios.delete(`${baseUrl}/projects/${projectId}`);
} catch (e) {
// Ignore cleanup errors
}
console.log('✅ Teste de descrições passou');
} catch (error) {
console.log('❌ Erro no teste de descrições:', error.message);
}
}
// Executar se chamado diretamente
if (require.main === module) {
(async () => {
const basicTest = await testAutoSetup();
if (basicTest) {
await testSpecificFeatures();
}
console.log('\n🏁 Testes concluídos!');
})().catch(console.error);
}
module.exports = { testAutoSetup, testSpecificFeatures };