# frozen_string_literal: true require 'minitest/autorun' require_relative '../../bitacoras-db/core/bitacora_db' require 'date' module ADN class BitacoraDBTest < Minitest::Test def setup # Usar el entorno development encapsulado en transacción # Cualquier cambio persistente será anulado tras cada bloque de prueba. @db = BitacorasDB::BitacoraDB.new(env: :development) @db.connect @db.execute('BEGIN') end def teardown # Abortar la transacción para dejar la db limpia, luego desconectar @db.execute('ROLLBACK') rescue nil @db.disconnect end def test_connection_health assert @db.connection_test? salud = @db.health_check assert_equal 'healthy', salud[:status] assert salud[:bitacoras_count] >= 0 end def test_nodo_crud # Crear nodo nombre_nodo = "test_nodo_#{Time.now.to_i}" nodo = @db.create_nodo(nombre: nombre_nodo, tipo: 'servidor', descripcion: 'Nodo de pruebas UT') assert nodo['id'] assert_equal nombre_nodo, nodo['nombre'] # Listar nodos (debería encontrar al menos al nuevo nodo) nodos = @db.list_nodos encontrado = nodos.find { |n| n['nombre'] == nombre_nodo } refute_nil encontrado # Encontrar por nombre buscado = @db.find_nodo_by_nombre(nombre_nodo) assert_equal nodo['id'], buscado['id'] end def test_bitacora_crud # Usar fecha en el futuro lejano para no colisionar con reales si falla el db fecha_futura = Date.new(2050, 1, 1) # Crear Bitácora resumen_test = 'Tests unitarios automatizados' bitacora = @db.create_bitacora(fecha: fecha_futura, resumen: resumen_test) assert bitacora['id'] assert_equal fecha_futura.to_s, bitacora['fecha'] # Encontrar por fecha buscada = @db.find_bitacora_by_fecha(fecha_futura) assert_equal bitacora['id'], buscada['id'] # Listar filtrando fechas rango = @db.list_bitacoras(desde: fecha_futura.to_s, hasta: fecha_futura.to_s) assert_equal 1, rango.length assert_equal bitacora['id'], rango.first['id'] end def test_entrada_crud_con_busqueda # 1. Setup Base - Nodo y Bitacora fecha_act = Date.new(2050, 2, 2) bitacora = @db.create_bitacora(fecha: fecha_act) nodo = @db.create_nodo(nombre: "test_nodo_ev_#{Time.now.to_i}", tipo: 'vm') # 2. Crear entrada desc_unica = "Validacion especial MINITEST_#{Time.now.to_i}" entrada = @db.create_entrada( inicio: '10:00:00', descripcion: desc_unica, fin: '11:00:00', estado: '✅', modo: 'R', es_ia: true, bitacora_id: bitacora['id'], nodo_id: nodo['id'] ) assert entrada['id'] assert_equal '10:00:00', entrada['inicio'] assert_equal 'R', entrada['modo'] # 3. Consultar y verificar búsqueda/filtrado implementada en Tarea 2.2 entradas = @db.list_entradas( buscar: 'MINITEST_', desde: '2050-02-01', hasta: '2050-02-03' ) assert entradas.length >= 1 hallazgo = entradas.find { |e| e['id'] == entrada['id'] } refute_nil hallazgo assert_equal desc_unica, hallazgo['descripcion'] assert_equal bitacora['fecha'], hallazgo['bitacora_fecha'] end end end