package commandcenter import ( "testing" "github.com/shopspring/decimal" "github.com/missionworkforce/missionmatch/internal/modules/matching/engine" ) func TestWeightsSumToOne(t *testing.T) { sum := decimal.Zero for _, w := range weights { sum = sum.Add(w) } if !sum.Equal(decimal.RequireFromString("1")) { t.Fatalf("WCC composite weights sum to %s, want 1.00", sum) } if len(weights) != len(driverOrder) { t.Fatalf("weights (%d) and driverOrder (%d) out of sync", len(weights), len(driverOrder)) } for _, d := range driverOrder { if _, ok := weights[d.key]; !ok { t.Fatalf("driverOrder key %q has no weight", d.key) } } } // The mm_lvl_ord / mm_poly_ord SQL functions MUST match the engine's enum ordinals, or WCC numbers // silently contradict screenMATCH. This locks the expected mapping to the engine's iota values. func TestOrdinalsMatchEngine(t *testing.T) { levels := map[string]engine.ClearanceLevel{ "unknown": engine.ClearanceUnknown, "none": engine.ClearanceNone, "confidential": engine.ClearanceConfidential, "secret": engine.ClearanceSecret, "top_secret": engine.ClearanceTopSecret, "ts_sci": engine.ClearanceTSSCI, } // the SQL CASE in migration 0004 (kept in sync here) sqlLvl := map[string]int{"ts_sci": 5, "top_secret": 4, "secret": 3, "confidential": 2, "none": 1, "unknown": 0} for code, lvl := range levels { parsed, err := engine.ParseClearanceLevel(code) if err != nil { t.Fatalf("ParseClearanceLevel(%q): %v", code, err) } if int(parsed) != int(lvl) || int(lvl) != sqlLvl[code] { t.Fatalf("ordinal mismatch for %q: engine=%d sql=%d", code, int(lvl), sqlLvl[code]) } } polys := map[string]engine.Polygraph{"none": engine.PolyNone, "ci": engine.PolyCI, "full_scope": engine.PolyFullScope} sqlPoly := map[string]int{"full_scope": 2, "ci": 1, "none": 0} for code, p := range polys { parsed, err := engine.ParsePolygraph(code) if err != nil { t.Fatalf("ParsePolygraph(%q): %v", code, err) } if int(parsed) != int(p) || int(p) != sqlPoly[code] { t.Fatalf("poly ordinal mismatch for %q: engine=%d sql=%d", code, int(p), sqlPoly[code]) } } }