package models import "testing" // El costo se congela con el precio del plan al momento de registrar el // consumo. Si esta cuenta se rompe, se le cobra de más o de menos a un // cliente real, así que va con test. func TestCalculoCostoPorTipo(t *testing.T) { plan := &UmindPlan{ PrecioPor1kTokens: 2.5, PrecioPorOCR: 10, PrecioPorTranscripcion: 40, } casos := []struct { tipo string cantidad float64 esperado float64 }{ {UsoTipoIA, 1000, 2.5}, // exactamente 1k tokens {UsoTipoIA, 500, 1.25}, // fracción de 1k, no se redondea hacia arriba {UsoTipoIA, 3200, 8.0}, // varios miles {UsoTipoOCR, 1, 10}, // una imagen {UsoTipoOCR, 3, 30}, // varias {UsoTipoWhisper, 1, 40}, // una transcripción {"desconocido", 100, 0}, // tipo no tarifado no cobra nada } for _, cas := range casos { got := costoDeUso(plan, cas.tipo, cas.cantidad) if got != cas.esperado { t.Errorf("costoDeUso(%s, %.0f) = %.4f, esperaba %.4f", cas.tipo, cas.cantidad, got, cas.esperado) } } } // Sin plan asignado (tenants viejos) el consumo se registra pero no cuesta — // no debe explotar ni inventar un precio. func TestCalculoCostoSinPlan(t *testing.T) { if got := costoDeUso(nil, UsoTipoIA, 5000); got != 0 { t.Errorf("costoDeUso sin plan = %.4f, esperaba 0", got) } }