55 "encoding/json"
66 "errors"
77 "fmt"
8- "github.com/ncode/vault-audit-filter/pkg/forwarder"
9- "github.com/ncode/vault-audit-filter/pkg/messaging"
8+ "github.com/expr-lang/expr/vm"
109 "github.com/stretchr/testify/require"
1110 "io"
1211 "io/ioutil"
@@ -804,6 +803,10 @@ func TestAuditServer_React_WithForwarding(t *testing.T) {
804803 }
805804}
806805
806+ /* ----------------------------------------------------------------
807+ lightweight mocks
808+ -----------------------------------------------------------------*/
809+
807810type dummyMessenger struct {
808811 sendErr error
809812 calls int
@@ -829,22 +832,18 @@ func auditFrame() []byte {
829832 return []byte (`{"type":"request","time":"2000-01-01T00:00:00Z","auth":{},"request":{},"response":{}}` )
830833}
831834
832- // rule‑group factory: match=true → no rules (auto‑match); match=false → 1 rule that always fails.
833- func newRuleGroup (match bool , msgr messaging.Messenger , fwd forwarder.Forwarder ) RuleGroup {
834- var compiled []CompiledRule
835- if ! match {
836- compiled = []CompiledRule {{Program : nil }} // any non‑nil slice forces shouldLog=false
837- }
838- return RuleGroup {
839- Name : "grp" ,
840- CompiledRules : compiled ,
841- Messenger : msgr ,
842- Forwarder : fwd ,
843- Writer : new (bytes.Buffer ), // satisfies io.Writer, avoids disk I/O
844- }
835+ // returns a compiled rule that always evaluates to false
836+ func falseProgram (t * testing.T ) * vm.Program {
837+ t .Helper ()
838+ p , err := expr .Compile ("false" )
839+ require .NoError (t , err )
840+ return p
845841}
846842
847843func TestReact_Branches (t * testing.T ) {
844+ logger := slog .New (slog .NewTextHandler (io .Discard , & slog.HandlerOptions {Level : slog .LevelDebug }))
845+ frame := auditFrame ()
846+
848847 tests := []struct {
849848 name string
850849 group RuleGroup
@@ -853,43 +852,70 @@ func TestReact_Branches(t *testing.T) {
853852 wantFwdCalls int
854853 }{
855854 {
856- name : "match_no_side_effects_returns_None" ,
857- group : newRuleGroup (true , nil , nil ),
855+ name : "match_no_side_effects_returns_None" ,
856+ group : RuleGroup {
857+ Name : "matchOnly" ,
858+ // len==0 => always matches
859+ CompiledRules : nil ,
860+ Writer : new (bytes.Buffer ),
861+ },
858862 wantAction : gnet .None ,
859863 },
860864 {
861- name : "forwarder_ok_triggers_Close" ,
862- group : newRuleGroup (true , nil , & dummyForwarder {}),
865+ name : "forwarder_ok_triggers_Close" ,
866+ group : RuleGroup {
867+ Name : "forwardOK" ,
868+ CompiledRules : nil ,
869+ Writer : new (bytes.Buffer ),
870+ Forwarder : & dummyForwarder {},
871+ },
863872 wantAction : gnet .Close ,
864873 wantFwdCalls : 1 ,
865874 },
866875 {
867- name : "forwarder_error_triggers_Close" ,
868- group : newRuleGroup (true , nil , & dummyForwarder {forwardErr : errors .New ("x" )}),
876+ name : "forwarder_error_triggers_Close" ,
877+ group : RuleGroup {
878+ Name : "forwardErr" ,
879+ CompiledRules : nil ,
880+ Writer : new (bytes.Buffer ),
881+ Forwarder : & dummyForwarder {forwardErr : errors .New ("boom" )},
882+ },
869883 wantAction : gnet .Close ,
870884 wantFwdCalls : 1 ,
871885 },
872886 {
873- name : "messenger_error_triggers_Close" ,
874- group : newRuleGroup (true , & dummyMessenger {sendErr : errors .New ("x" )}, nil ),
887+ name : "messenger_error_triggers_Close" ,
888+ group : RuleGroup {
889+ Name : "msgErr" ,
890+ CompiledRules : nil ,
891+ Writer : new (bytes.Buffer ),
892+ Messenger : & dummyMessenger {sendErr : errors .New ("boom" )},
893+ },
875894 wantAction : gnet .Close ,
876895 wantMsgCalls : 1 ,
877896 },
878897 {
879- name : "no_match_triggers_Close" ,
880- group : newRuleGroup (false , nil , nil ),
898+ name : "no_match_triggers_Close" ,
899+ group : RuleGroup {
900+ Name : "noMatch" ,
901+ CompiledRules : []CompiledRule {{
902+ Program : falseProgram (t ),
903+ }},
904+ Writer : new (bytes.Buffer ),
905+ },
881906 wantAction : gnet .Close ,
882907 },
883908 }
884909
885- frame := auditFrame ()
886-
887910 for _ , tc := range tests {
888911 tc := tc // capture range variable
889912 t .Run (tc .name , func (t * testing.T ) {
890- srv := & AuditServer {ruleGroups : []RuleGroup {tc .group }}
891- _ , act := srv .React (frame , nil )
913+ srv := & AuditServer {
914+ logger : logger ,
915+ ruleGroups : []RuleGroup {tc .group },
916+ }
892917
918+ _ , act := srv .React (frame , nil )
893919 require .Equal (t , tc .wantAction , act )
894920
895921 if dm , ok := tc .group .Messenger .(* dummyMessenger ); ok {
0 commit comments