File size: 9,236 Bytes
824bf31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#!/usr/bin/env python3
"""
Script de teste local para a API de Transparência
Testa se tudo está funcionando antes do deploy
"""

import os
import asyncio
import httpx
from datetime import datetime

# Cores para output
GREEN = '\033[92m'
RED = '\033[91m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
RESET = '\033[0m'

def print_status(message: str, status: str = "info"):
    """Print colorido de status"""
    if status == "success":
        print(f"{GREEN}{message}{RESET}")
    elif status == "error":
        print(f"{RED}{message}{RESET}")
    elif status == "warning":
        print(f"{YELLOW}⚠️  {message}{RESET}")
    else:
        print(f"{BLUE}ℹ️  {message}{RESET}")

async def test_api_connection():
    """Testa conexão com a API"""
    print_status("Testando conexão com API do Portal da Transparência...", "info")
    
    api_key = os.getenv("TRANSPARENCY_API_KEY")
    
    if not api_key:
        print_status("TRANSPARENCY_API_KEY não configurada no ambiente", "error")
        print_status("Configure a variável de ambiente antes de continuar", "warning")
        return False
    
    try:
        async with httpx.AsyncClient(timeout=10.0) as client:
            headers = {
                "chave-api-dados": api_key,
                "Content-Type": "application/json"
            }
            
            # Teste simples - buscar contratos do ano atual
            params = {
                "ano": datetime.now().year,
                "pagina": 1,
                "tamanhoPagina": 1
            }
            
            response = await client.get(
                "https://api.portaldatransparencia.gov.br/api-de-dados/contratos",
                params=params,
                headers=headers
            )
            
            if response.status_code == 200:
                print_status("Conexão com API bem-sucedida!", "success")
                data = response.json()
                print_status(f"Resposta recebida: {len(str(data))} caracteres", "info")
                return True
            elif response.status_code == 401:
                print_status("API Key inválida ou não autorizada", "error")
                return False
            else:
                print_status(f"Erro na API: Status {response.status_code}", "error")
                print(f"Resposta: {response.text}")
                return False
                
    except Exception as e:
        print_status(f"Erro de conexão: {str(e)}", "error")
        return False

def test_backend_dependencies():
    """Testa se as dependências do backend estão instaladas"""
    print_status("Verificando dependências do backend...", "info")
    
    try:
        import fastapi
        import uvicorn
        print_status(f"FastAPI backend dependencies available", "success")
        return True
    except ImportError:
        print_status("Backend dependencies não estão instaladas", "error")
        print_status("Execute: pip install fastapi uvicorn", "warning")
        return False

def test_dependencies():
    """Testa todas as dependências"""
    print_status("Verificando dependências...", "info")
    
    deps = {
        "httpx": "httpx",
        "pydantic": "pydantic",
        "fastapi": "fastapi",
        "uvicorn": "uvicorn",
        "dotenv": "python-dotenv"
    }
    
    all_ok = True
    
    for name, package in deps.items():
        try:
            __import__(name)
            print_status(f"{name} ✓", "success")
        except ImportError:
            print_status(f"{name} ✗ - instale com: pip install {package}", "error")
            all_ok = False
    
    return all_ok

def check_env_vars():
    """Verifica variáveis de ambiente"""
    print_status("Verificando variáveis de ambiente...", "info")
    
    vars_status = {
        "TRANSPARENCY_API_KEY": os.getenv("TRANSPARENCY_API_KEY"),
        "GROQ_API_KEY": os.getenv("GROQ_API_KEY")
    }
    
    for var, value in vars_status.items():
        if value:
            print_status(f"{var}: Configurada ({len(value)} caracteres)", "success")
        else:
            if var == "TRANSPARENCY_API_KEY":
                print_status(f"{var}: NÃO configurada (obrigatória)", "error")
            else:
                print_status(f"{var}: Não configurada (opcional)", "warning")
    
    return bool(vars_status["TRANSPARENCY_API_KEY"])

async def test_sample_query():
    """Faz uma consulta de exemplo"""
    print_status("Fazendo consulta de exemplo...", "info")
    
    # Importar a função simplificada
    try:
        from app_transparency_api import SimplifiedTransparencyAPI
        
        api_key = os.getenv("TRANSPARENCY_API_KEY")
        if not api_key:
            print_status("Pule este teste - API key não configurada", "warning")
            return
        
        async with SimplifiedTransparencyAPI(api_key) as api:
            # Buscar contratos do MEC
            filters = {
                "ano": 2024,
                "orgao": "26000",  # MEC
                "pagina": 1,
                "tamanho": 5
            }
            
            result = await api.search_contracts(filters)
            
            if result["success"]:
                print_status("Consulta bem-sucedida!", "success")
                data = result["data"]
                
                if isinstance(data, list):
                    print_status(f"Encontrados {len(data)} contratos", "info")
                elif isinstance(data, dict) and "data" in data:
                    print_status(f"Encontrados {len(data['data'])} contratos", "info")
            else:
                print_status(f"Erro na consulta: {result['error']}", "error")
                
    except Exception as e:
        print_status(f"Erro ao executar consulta: {str(e)}", "error")

def create_env_template():
    """Cria arquivo .env de exemplo"""
    print_status("Criando arquivo .env.example...", "info")
    
    template = """# Cidadão.AI - Variáveis de Ambiente
# Copie este arquivo para .env e preencha com suas chaves

# OBRIGATÓRIO - API do Portal da Transparência
# Obtenha em: https://portaldatransparencia.gov.br/api-de-dados
TRANSPARENCY_API_KEY=sua_chave_aqui

# OPCIONAL - Groq AI para análises
# Obtenha em: https://console.groq.com
GROQ_API_KEY=

# OPCIONAL - Outras configurações
# PORT=7860
# DEBUG=False
"""
    
    with open(".env.example", "w") as f:
        f.write(template)
    
    print_status(".env.example criado com sucesso", "success")

async def main():
    """Executa todos os testes"""
    print(f"\n{BLUE}{'='*50}{RESET}")
    print(f"{BLUE}🇧🇷 Cidadão.AI - Teste de API de Transparência{RESET}")
    print(f"{BLUE}{'='*50}{RESET}\n")
    
    # 1. Verificar dependências
    print(f"\n{YELLOW}1. VERIFICANDO DEPENDÊNCIAS{RESET}\n")
    deps_ok = test_dependencies()
    
    if not deps_ok:
        print_status("\nInstale as dependências faltantes antes de continuar", "error")
        print_status("Use: pip install -r requirements_hf_api.txt", "warning")
        return
    
    # 2. Verificar variáveis de ambiente
    print(f"\n{YELLOW}2. VERIFICANDO VARIÁVEIS DE AMBIENTE{RESET}\n")
    env_ok = check_env_vars()
    
    if not env_ok:
        create_env_template()
        print_status("\nConfigure as variáveis de ambiente antes de continuar", "error")
        print_status("1. Copie .env.example para .env", "warning")
        print_status("2. Adicione sua TRANSPARENCY_API_KEY", "warning")
        return
    
    # 3. Testar conexão com API
    print(f"\n{YELLOW}3. TESTANDO CONEXÃO COM API{RESET}\n")
    api_ok = await test_api_connection()
    
    if not api_ok:
        print_status("\nVerifique sua API key e conexão com internet", "error")
        return
    
    # 4. Testar Backend Dependencies
    print(f"\n{YELLOW}4. TESTANDO DEPENDÊNCIAS BACKEND{RESET}\n")
    backend_ok = test_backend_dependencies()
    
    # 5. Fazer consulta de exemplo
    if api_ok:
        print(f"\n{YELLOW}5. FAZENDO CONSULTA DE EXEMPLO{RESET}\n")
        await test_sample_query()
    
    # Resumo final
    print(f"\n{BLUE}{'='*50}{RESET}")
    print(f"{BLUE}RESUMO DOS TESTES{RESET}")
    print(f"{BLUE}{'='*50}{RESET}\n")
    
    all_tests = deps_ok and env_ok and api_ok and backend_ok
    
    if all_tests:
        print_status("Todos os testes passaram! ✨", "success")
        print_status("Backend está pronto para deployment!", "success")
        print_status("\nPróximos passos:", "info")
        print("1. Configure variáveis de ambiente no servidor")
        print("2. Execute com: uvicorn app:app --host 0.0.0.0 --port 8000")
        print("3. Ou use Docker: docker-compose up")
        print("4. Acesse a documentação em /docs")
    else:
        print_status("Alguns testes falharam", "error")
        print_status("Corrija os problemas antes do deployment", "warning")
    
    print(f"\n{BLUE}{'='*50}{RESET}\n")

if __name__ == "__main__":
    # Carregar .env se existir
    try:
        from dotenv import load_dotenv
        load_dotenv()
    except ImportError:
        print_status("python-dotenv não instalado - variáveis de ambiente do sistema serão usadas", "warning")
    
    # Executar testes
    asyncio.run(main())