wifi-etl/test_transform_load.py
Rafael Lopes 331a021d9a
Some checks failed
Deploy WiFi-ETL Prod / deploy (push) Failing after 0s
FEAT: Implementado ETL completo para Ruijie e Wifeed
- Adicionado suporte para extração de dados do Ruijie e WiFeed, incluindo autenticação e tratamento de erros.
- Adicionado suporte para watermarking em ambas as fontes para extração incremental.
- Criado script de transformação para mesclagem de MAC addresses.
- Implementado Backfill para WiFeed, permitindo extração histórica com controle de taxa.
- Adicionado script de depuração para testes de transformação do WiFeed.
- Desenvolvido scripts de implantação e configurações do Docker para setup de produção.
- Criado script de inicialização do schema do PostgreSQL em infra/init.sql.
- Adicionado teste automatizado para lógica de transformação e carregamento em test_transform_load.py.
- Atualizado documentation para implantação e setup de produção.
2026-04-22 16:55:44 -03:00

174 lines
4.9 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Script para testar transform + load com dados mockados Ruijie e WiFeed.
Não precisa de API externas, testa apenas a lógica de transformação e persistência.
"""
import sys
import psycopg2
from datetime import datetime, timezone
from app.core.config import DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD
from app.transform.merge_mac import transform_ruijie, transform_wifeed
from app.load.load_database import load
print("=" * 80)
print("TEST: Transform + Load")
print("=" * 80)
# Dados mock Ruijie (sessões)
mock_ruijie_records = [
{
"mac": "AA:BB:CC:DD:EE:FF",
"deviceAliasName": "AP-01",
"buildingName": "Prédio A",
"band": "5GHz",
"channel": 36,
"rssiInt": -45,
"userIp": "192.168.1.100",
"wifiUp": 1000000,
"wifiDown": 5000000,
"wifiUpDown": 6000000,
"sn": "SN001",
"onlineTime": 1640000000000, # epoch ms
"offlineTime": 1640001000000, # epoch ms
"activeTime": 500000,
},
{
"mac": "11:22:33:44:55:66",
"deviceAliasName": "AP-02",
"buildingName": "Prédio B",
"band": "2.4GHz",
"channel": 6,
"rssiInt": -60,
"userIp": "192.168.1.101",
"wifiUp": 2000000,
"wifiDown": 10000000,
"wifiUpDown": 12000000,
"sn": "SN002",
"onlineTime": 1640100000000,
"offlineTime": 1640101000000,
"activeTime": 600000,
}
]
# Dados mock WiFeed (usuários)
mock_wifeed_records = [
{
"hostMacAddress": "AA:BB:CC:DD:EE:FF",
"clientName": "João Silva",
"clientEmail": "joao@example.com",
"clientExtraFields": {"CPF": "12345678901"},
"clientGender": "M",
"clientBirthdate": "1990-01-15",
"clientPhoneNumber": "1198765432",
"clientId": 1001,
"hostType": "mobile",
"localName": "João Mobile",
},
{
"hostMacAddress": "11:22:33:44:55:66",
"clientName": "Maria Santos",
"clientEmail": "maria@example.com",
"clientExtraFields": {"CPF": "98765432101"},
"clientGender": "F",
"clientBirthdate": "1985-05-20",
"clientPhoneNumber": "1187654321",
"clientId": 1002,
"hostType": "desktop",
"localName": "Maria Desktop",
}
]
print("\n1⃣ Transformando dados Ruijie...")
sessions = []
for record in mock_ruijie_records:
transformed = transform_ruijie(record)
if transformed:
sessions.append(transformed)
print(f" ✓ MAC {transformed['mac_address']}{len(sessions)} sessões")
print(f"\n Total sessões: {len(sessions)}")
print(f" Exemplo: {sessions[0] if sessions else 'N/A'}")
print("\n2⃣ Transformando dados WiFeed...")
users = []
for record in mock_wifeed_records:
transformed = transform_wifeed(record)
if transformed:
users.append(transformed)
print(f" ✓ MAC {transformed['mac_address']}{len(users)} usuários")
print(f"\n Total usuários: {len(users)}")
print(f" Exemplo: {users[0] if users else 'N/A'}")
print("\n3⃣ Conectando ao banco de dados...")
try:
conn = psycopg2.connect(
host=DB_HOST,
port=DB_PORT,
dbname=DB_NAME,
user=DB_USER,
password=DB_PASSWORD
)
conn.autocommit = False
print(f" ✓ Conectado a {DB_HOST}:{DB_PORT}/{DB_NAME}")
except Exception as e:
print(f" ✗ Erro de conexão: {e}")
sys.exit(1)
print("\n4⃣ Carregando dados no banco (transform + load)...")
try:
load(conn, users, sessions)
print(" ✓ Load concluído com sucesso")
except Exception as e:
conn.rollback()
print(f" ✗ Erro no load: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
finally:
conn.close()
print("\n5⃣ Verific ando dados no banco...")
try:
conn = psycopg2.connect(
host=DB_HOST,
port=DB_PORT,
dbname=DB_NAME,
user=DB_USER,
password=DB_PASSWORD
)
cur = conn.cursor()
cur.execute("SELECT COUNT(*) FROM users;")
user_count = cur.fetchone()[0]
print(f" ✓ Users: {user_count} registros")
cur.execute("SELECT COUNT(*) FROM sessions;")
session_count = cur.fetchone()[0]
print(f" ✓ Sessions: {session_count} registros")
cur.execute("SELECT mac_address, name FROM users LIMIT 3;")
rows = cur.fetchall()
print(f" ✓ Amostra Users:")
for mac, name in rows:
print(f" - {mac}: {name}")
cur.execute("SELECT mac_address, access_point_name FROM sessions LIMIT 3;")
rows = cur.fetchall()
print(f" ✓ Amostra Sessions:")
for mac, ap in rows:
print(f" - {mac}: {ap}")
conn.close()
except Exception as e:
print(f" ✗ Erro ao verificar: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
print("\n" + "=" * 80)
print("✅ TEST PASSED: Transform + Load funcionando corretamente!")
print("=" * 80)