check-safety/registry_test.go
Alex Dunmow ff4de855cc refactor: complete check 2c retarget from block/core to block/pluginsdk
Standalone plugins now build against git.dev.alexdunmow.com/block/pluginsdk.
Check 2c requires a pluginsdk module require (rule missing-pluginsdk-require)
and enforces its version against the CMS anchor (rule pluginsdk-version-mismatch)
once the CMS migrates; a coexisting block/core require stays allowed
(calcomblock keeps core for captcha).

- check_sdkboundaries.go: degrade the 2c OK message gracefully when the
  pluginsdk version anchor is empty (transition period) — omit the version
  clause instead of printing "SDK version ".
- check_rbac.go: document pluginsdk in the definitions-only module comment.
- plugin_sdk_versions_test.go: retarget fixtures to pluginsdk; add cases for
  missing-pluginsdk-require, pluginsdk-version-mismatch, a forbidden core
  replace directive, and an allowed coexisting core require.
- lint_test.go: synthesized plugin repos now require pluginsdk (replace-
  directive case replaces pluginsdk).
- registry_test.go: add checks 30 and 31 to the canonical order (were added
  to the registry without updating this test).
- golden: regenerate — check count 32 -> 34 (checks 30/31 SKIP in fixtures).
- README.md: describe 2c as the pluginsdk boundary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 11:13:42 +08:00

45 lines
1.4 KiB
Go

package main
import (
"sort"
"testing"
)
// TestRegistryOrder locks the run order of all registered checks.
//
// main() runs checks sorted by Seq, so the Seq values ARE the contract for
// output order. The golden characterization test cannot guard every position:
// the plugin-discovery check ("10disc") prints nothing when no plugin roots are
// scanned (as in the golden fixtures), so a Seq mistake that reordered it past
// Check 10b would slip through golden silently. Assert the full canonical order
// here, and reject duplicate Seq values (which would make order nondeterministic).
func TestRegistryOrder(t *testing.T) {
want := []string{
"1", "2", "2b", "2c", "2d", "2e", "2f", "3", "3b", "4",
"5", "6", "7", "8", "9", "10", "10b", "10disc", "11", "12",
"13", "14", "15", "16", "17", "18", "19", "20", "21", "22",
"28", "29", "30", "31",
}
ordered := make([]Check, len(registry))
copy(ordered, registry)
sort.Slice(ordered, func(i, j int) bool { return ordered[i].Seq < ordered[j].Seq })
if len(ordered) != len(want) {
t.Fatalf("registry has %d checks, want %d", len(ordered), len(want))
}
for i, c := range ordered {
if c.ID != want[i] {
t.Errorf("position %d: got check %q (Seq %d), want %q", i, c.ID, c.Seq, want[i])
}
}
seen := map[int]string{}
for _, c := range registry {
if prev, ok := seen[c.Seq]; ok {
t.Errorf("duplicate Seq %d on checks %q and %q", c.Seq, prev, c.ID)
}
seen[c.Seq] = c.ID
}
}