Feat(ADN): Completadas tareas 2.2, 2.4 y 2.5 del manifiesto (Cierre de Fase 1)

This commit is contained in:
Ricardo Monla
2026-03-07 16:01:06 -03:00
parent e99048a83e
commit aa68893bc8
5 changed files with 517 additions and 4 deletions
+13 -1
View File
@@ -372,7 +372,7 @@ module ADN
# Comando: evento:listar [OPCIONES] - Listar entradas con filtros
def comando_evento_listar(args)
opts = { limit: 20, offset: 0, nodo: nil, estado: nil }
opts = { limit: 20, offset: 0, nodo: nil, estado: nil, buscar: nil, desde: nil, hasta: nil }
parser = OptionParser.new do |opt|
opt.banner = "Uso: adn db evento:listar [OPCIONES]"
@@ -388,6 +388,15 @@ module ADN
opt.on("--estado ESTADO", "Filtrar por estado (⏳, ✅, ❌, ⚠️, ⏸️)") do |e|
opts[:estado] = e
end
opt.on("--buscar TEXTO", "Buscar texto en descripción") do |b|
opts[:buscar] = b
end
opt.on("--desde FECHA", "Filtrar desde fecha (YYYY-MM-DD)") do |d|
opts[:desde] = d
end
opt.on("--hasta FECHA", "Filtrar hasta fecha (YYYY-MM-DD)") do |h|
opts[:hasta] = h
end
opt.on("-h", "--help", "Mostrar ayuda") do
puts opt
exit
@@ -420,6 +429,9 @@ module ADN
entradas = db.list_entradas(
nodo_id: nodo_id,
estado: opts[:estado],
buscar: opts[:buscar],
desde: opts[:desde],
hasta: opts[:hasta],
limit: opts[:limit],
offset: opts[:offset]
)
+104
View File
@@ -0,0 +1,104 @@
# 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
+16 -3
View File
@@ -412,7 +412,7 @@ module BitacorasDB
# @param offset [Integer] Desplazamiento
# @return [Array<Hash>] Lista de entradas
def list_entradas(bitacora_id: nil, nodo_id: nil, tema_id: nil, estado: nil,
desde: nil, hasta: nil, limit: 100, offset: 0)
desde: nil, hasta: nil, buscar: nil, limit: 100, offset: 0)
conditions = []
params = []
param_index = 1
@@ -442,8 +442,21 @@ module BitacorasDB
end
if desde
# Para filtrar por fecha, necesitamos join con bitácoras
# Esto es más complejo, implementaremos después
conditions << "b.fecha >= $#{param_index}"
params << Date.parse(desde.to_s).to_s
param_index += 1
end
if hasta
conditions << "b.fecha <= $#{param_index}"
params << Date.parse(hasta.to_s).to_s
param_index += 1
end
if buscar
conditions << "e.descripcion ILIKE $#{param_index}"
params << "%#{buscar}%"
param_index += 1
end
where_clause = conditions.empty? ? '' : "WHERE #{conditions.join(' AND ')}"