E1: split monolithic files — cmd/nomos (main.go → server.go + mcp.go + workers.go),
internal/mcp/tools.go → entity_tools/ops_tools/knowledge_tools/analysis_tools,
internal/httpapi/impl.go → domain files (entities, events, signals, ontology,
fleet_health, client_context, client_lifecycle, entity_mutations, query_audit).
E2: migrate raw pool.Exec queries to sqlc (entities/relationships queries + generated).
E3: unify SSH — consolidate crypto/ssh dial into actuator/client.go (+client_test).
E4/E5: add tests — db/lifecycle, checkdefaults/build, ontology/preconditions, policy/risk.
56 lines
2.1 KiB
Go
56 lines
2.1 KiB
Go
package db
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
// attrTruthy replaces a previous strings.Contains check over raw JSONB text.
|
|
// The key regression it guards: a literal attribute like
|
|
// {"backups_verified": false} must NOT satisfy the "backups-verified"
|
|
// precondition, even though the key text is present in the column.
|
|
func TestAttrTruthy(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
attrs map[string]any
|
|
key string
|
|
want bool
|
|
}{
|
|
{"absent", map[string]any{}, "backups_verified", false},
|
|
{"nil map", nil, "backups_verified", false},
|
|
{"explicit nil value", map[string]any{"backups_verified": nil}, "backups_verified", false},
|
|
{"bool true", map[string]any{"backups_verified": true}, "backups_verified", true},
|
|
{"bool false is the regression case", map[string]any{"backups_verified": false}, "backups_verified", false},
|
|
{"nonempty string age pubkey", map[string]any{"age_pubkey": "age1abc"}, "age_pubkey", true},
|
|
{"empty string is falsy", map[string]any{"mesh_ip": ""}, "mesh_ip", false},
|
|
{"number counts as present", map[string]any{"port": float64(22)}, "port", true},
|
|
{"other keys present", map[string]any{"backups_verified": true, "unrelated": "x"}, "backups_verified", true},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
if got := attrTruthy(tc.attrs, tc.key); got != tc.want {
|
|
t.Fatalf("attrTruthy(%v, %q) = %v, want %v", tc.attrs, tc.key, got, tc.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// fetchAttrs decodes the JSONB column text; verify the decode shape that
|
|
// attrTruthy then evaluates (the DB round-trip itself is covered by make test-db).
|
|
func TestAttrTruthyAfterDecode(t *testing.T) {
|
|
raw := `{"backups_verified": true, "mesh_ip": "10.0.0.5", "secrets_revoked": false}`
|
|
var got map[string]any
|
|
if err := json.Unmarshal([]byte(raw), &got); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
if !attrTruthy(got, "backups_verified") {
|
|
t.Error("backups_verified should be truthy after decode")
|
|
}
|
|
if !attrTruthy(got, "mesh_ip") {
|
|
t.Error("mesh_ip should be truthy after decode")
|
|
}
|
|
if attrTruthy(got, "secrets_revoked") {
|
|
t.Error("secrets_revoked:false is the regression — must be falsy")
|
|
}
|
|
}
|