package rules import ( "testing" "time" "git.pengzhan.dev/haopengzhan/rsspipe/internal/models" ) func TestRuleEvaluator(t *testing.T) { eval := NewEvaluator() entry := models.FeedEntry{ ID: "entry-1", FeedID: "feed-hn", FeedTitle: "Hacker News", Title: "Announcing Go 1.24 Release", Author: "Go Team", Content: "

Go 1.24 brings new features...

", Variants: map[string]models.EntryVariant{ "keywords": { EntryID: "entry-1", VariantKey: "keywords", ContentType: "json", TextValue: `["go", "compiler", "release"]`, }, }, PublishedAt: time.Now(), } // Test 1: Title contains Go AND FeedID == feed-hn rule1 := models.Rule{ ID: "r1", Name: "Tech Feeds", MatchMode: "all", Conditions: []models.RuleCondition{ {Field: "feed_id", Operator: "eq", Value: "feed-hn"}, {Field: "title", Operator: "contains", Value: "Go 1.24"}, }, } if !eval.Evaluate(rule1, entry) { t.Error("expected rule1 to match entry") } // Test 2: Negative condition (author != Python Team) rule2 := models.Rule{ ID: "r2", Name: "Author check", MatchMode: "all", Conditions: []models.RuleCondition{ {Field: "author", Operator: "neq", Value: "Python Team"}, }, } if !eval.Evaluate(rule2, entry) { t.Error("expected rule2 to match entry") } // Test 3: Variant matching (variants.keywords contains compiler) rule3 := models.Rule{ ID: "r3", Name: "Keywords check", MatchMode: "all", Conditions: []models.RuleCondition{ {Field: "variants.keywords", Operator: "contains", Value: "compiler"}, }, } if !eval.Evaluate(rule3, entry) { t.Error("expected rule3 to match entry variant") } }