71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
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: "<p>Go 1.24 brings new features...</p>",
|
|
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")
|
|
}
|
|
}
|