gomcp/internal/infrastructure/audit/decisions_test.go

88 lines
2.3 KiB
Go

package audit
import (
"os"
"path/filepath"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestDecisionLogger_Record(t *testing.T) {
dir := t.TempDir()
dl, err := NewDecisionLogger(dir)
require.NoError(t, err)
defer dl.Close()
err = dl.Record(ModuleSynapse, "ACCEPT_SYNAPSE", "similarity=0.92, threshold=0.85")
require.NoError(t, err)
err = dl.Record(ModulePeer, "TRUST_UPGRADE", "peer_abc: UNKNOWN → VERIFIED")
require.NoError(t, err)
err = dl.Record(ModuleMode, "MODE_TRANSITION", "ARMED → ZERO-G")
require.NoError(t, err)
assert.Equal(t, 3, dl.Count())
assert.NotEqual(t, "GENESIS", dl.PrevHash())
// Verify file content.
data, err := os.ReadFile(filepath.Join(dir, "decisions.log"))
require.NoError(t, err)
lines := strings.Split(strings.TrimSpace(string(data)), "\n")
assert.Len(t, lines, 3)
// First line should have GENESIS as PrevHash.
assert.Contains(t, lines[0], "| GENESIS")
assert.Contains(t, lines[0], "SYNAPSE")
assert.Contains(t, lines[0], "ACCEPT_SYNAPSE")
// Second line should NOT have GENESIS.
assert.NotContains(t, lines[1], "GENESIS")
assert.Contains(t, lines[1], "PEER")
}
func TestDecisionLogger_HashChain(t *testing.T) {
dir := t.TempDir()
dl, err := NewDecisionLogger(dir)
require.NoError(t, err)
// Record 10 decisions to build a chain.
for i := 0; i < 10; i++ {
err := dl.Record(ModuleDIPWatcher, "ALERT", "test alert")
require.NoError(t, err)
}
dl.Close()
assert.Equal(t, 10, dl.Count())
}
func TestDecisionLogger_AllModules(t *testing.T) {
dir := t.TempDir()
dl, err := NewDecisionLogger(dir)
require.NoError(t, err)
defer dl.Close()
modules := []DecisionModule{ModuleSynapse, ModulePeer, ModuleMode, ModuleDIPWatcher, ModuleOracle, ModuleGenome, ModuleDoctor}
for _, m := range modules {
err := dl.Record(m, "TEST", "testing module "+string(m))
require.NoError(t, err)
}
assert.Equal(t, 7, dl.Count())
}
func TestExtractPrevHash(t *testing.T) {
line := "[2026-03-09T21:00:00.000+10:00] | SYNAPSE | ACCEPT | reason | abc123hash"
hash := extractPrevHash(line)
assert.Equal(t, "abc123hash", hash)
}
func TestSplitLines(t *testing.T) {
lines := splitLines("line1\nline2\r\nline3")
assert.Len(t, lines, 3)
assert.Equal(t, "line1", lines[0])
assert.Equal(t, "line2", lines[1])
assert.Equal(t, "line3", lines[2])
}