package roots import ( "encoding/json" "github.com/stretchr/testify/assert" "os" "testing" ) var testEvents []Event func init() { data, err := os.ReadFile("testdata/test_events.json") if err != nil { panic(err) } if err := json.Unmarshal(data, &testEvents); err != nil { panic(err) } } var ( nayru_sk = "1784be782585dfa97712afe12585d13ee608b624cf564116fa143c31a124d31e" nayru_pk = "d877e187934bd942a71221b50ff2b426bd0777991b41b6c749119805dc40bcbe" farore_sk = "03d0611c41048a9108a75bf5d023180b5cf2d2d24e2e6b83def29de977315bb3" farore_pk = "9e4b726ab0f25af580bdd2fd504fb245cf604f1fbc2482b89cf74beb4fb3aca9" din_sk = "7547dd630c04fde72bff3b99c481c683479966cb758f0b367b08fc971ead18f0" din_pk = "e719e8f83b77a9efacb29fd19118b030cbf7cfbca1f8d3694235707ee213abc7" ) type FilterTestCase struct { name string filter Filter expectedIDs []string } var filterTestCases = []FilterTestCase{ { name: "empty filter", filter: Filter{}, expectedIDs: []string{ "e751d41f", "562bc378", "e67fa7b8", "5e4c64f1", "7a5d83d4", "3a122100", "4a15d963", "4b03b69a", "d39e6f3f", }, }, { name: "empty id", filter: Filter{IDs: []string{}}, expectedIDs: []string{ "e751d41f", "562bc378", "e67fa7b8", "5e4c64f1", "7a5d83d4", "3a122100", "4a15d963", "4b03b69a", "d39e6f3f", }, }, { name: "single id prefix", filter: Filter{IDs: []string{"e751d41f"}}, expectedIDs: []string{"e751d41f"}, }, { name: "single full id", filter: Filter{IDs: []string{"e67fa7b84df6b0bb4c57f8719149de77f58955d7849da1be10b2267c72daad8b"}}, expectedIDs: []string{"e67fa7b8"}, }, { name: "multiple id prefixes", filter: Filter{IDs: []string{"562bc378", "5e4c64f1"}}, expectedIDs: []string{"562bc378", "5e4c64f1"}, }, { name: "no id match", filter: Filter{IDs: []string{"ffff"}}, expectedIDs: []string{}, }, { name: "empty author", filter: Filter{Authors: []string{}}, expectedIDs: []string{ "e751d41f", "562bc378", "e67fa7b8", "5e4c64f1", "7a5d83d4", "3a122100", "4a15d963", "4b03b69a", "d39e6f3f", }, }, { name: "single author prefix", filter: Filter{Authors: []string{"d877e187"}}, expectedIDs: []string{"e751d41f", "562bc378", "e67fa7b8"}, }, { name: "multiple author prefixex", filter: Filter{Authors: []string{"d877e187", "9e4b726a"}}, expectedIDs: []string{ "e751d41f", "562bc378", "e67fa7b8", "5e4c64f1", "7a5d83d4", "3a122100", }, }, { name: "single author full", filter: Filter{Authors: []string{"d877e187934bd942a71221b50ff2b426bd0777991b41b6c749119805dc40bcbe"}}, expectedIDs: []string{"e751d41f", "562bc378", "e67fa7b8"}, }, { name: "no author match", filter: Filter{Authors: []string{"ffff"}}, expectedIDs: []string{}, }, { name: "empty kind", filter: Filter{Kinds: []int{}}, expectedIDs: []string{ "e751d41f", "562bc378", "e67fa7b8", "5e4c64f1", "7a5d83d4", "3a122100", "4a15d963", "4b03b69a", "d39e6f3f", }, }, { name: "single kind", filter: Filter{Kinds: []int{1}}, expectedIDs: []string{"562bc378", "7a5d83d4", "4b03b69a"}, }, { name: "multiple kinds", filter: Filter{Kinds: []int{0, 2}}, expectedIDs: []string{ "e751d41f", "e67fa7b8", "5e4c64f1", "3a122100", "4a15d963", "d39e6f3f", }, }, { name: "no kind match", filter: Filter{Kinds: []int{99}}, expectedIDs: []string{}, }, { name: "since only", filter: Filter{Since: intPtr(5000)}, expectedIDs: []string{ "7a5d83d4", "3a122100", "4a15d963", "4b03b69a", "d39e6f3f", }, }, { name: "until only", filter: Filter{Until: intPtr(3000)}, expectedIDs: []string{ "e751d41f", "562bc378", "e67fa7b8", }, }, { name: "time range", filter: Filter{ Since: intPtr(4000), Until: intPtr(6000), }, expectedIDs: []string{ "5e4c64f1", "7a5d83d4", "3a122100", }, }, { name: "outside time range", filter: Filter{ Since: intPtr(10000), }, expectedIDs: []string{}, }, { name: "empty tag filter", filter: Filter{ Tags: map[string][]string{ "e": {}, }, }, expectedIDs: []string{ "e751d41f", "562bc378", "e67fa7b8", "5e4c64f1", "7a5d83d4", "3a122100", "4a15d963", "4b03b69a", "d39e6f3f", }, }, { name: "single letter tag filter: e", filter: Filter{ Tags: map[string][]string{ "e": {"5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"}, }, }, expectedIDs: []string{"562bc378"}, }, { name: "multiple tag matches", filter: Filter{ Tags: map[string][]string{ "e": { "5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36", "ae3f2a91b6c3d8f7e9a1c5b4d8f2e7a9b6c3d8f7e9a1c5b4d8f2e7a9b6c3d8f7", }, }, }, expectedIDs: []string{"562bc378", "3a122100"}, }, { name: "multiple tag matches - single event match", filter: Filter{ Tags: map[string][]string{ "e": { "5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36", "cb7787c460a79187d6a13e75a0f19240e05fafca8ea42288f5765773ea69cf2f", }, }, }, expectedIDs: []string{"562bc378"}, }, { name: "single letter tag filter: p", filter: Filter{ Tags: map[string][]string{ "p": {"91cf9b32f3735070f46c0a86a820a47efa08a5be6c9f4f8cf68e5b5b75c92d60"}, }, }, expectedIDs: []string{"e67fa7b8"}, }, { name: "multi letter tag filter", filter: Filter{ Tags: map[string][]string{ "emoji": {"🌊"}, }, }, expectedIDs: []string{"e67fa7b8"}, }, { name: "multiple tag filters", filter: Filter{ Tags: map[string][]string{ "e": {"ae3f2a91b6c3d8f7e9a1c5b4d8f2e7a9b6c3d8f7e9a1c5b4d8f2e7a9b6c3d8f7"}, "p": {"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"}, }, }, expectedIDs: []string{"3a122100"}, }, { name: "prefix tag filter", filter: Filter{ Tags: map[string][]string{ "p": {"ae3f2a91"}, }, }, expectedIDs: []string{}, }, { name: "unknown tag filter", filter: Filter{ Tags: map[string][]string{ "z": {"anything"}, }, }, expectedIDs: []string{}, }, { name: "combined author+kind tag filter", filter: Filter{ Authors: []string{"d877e187"}, Kinds: []int{1, 2}, }, expectedIDs: []string{ "562bc378", "e67fa7b8", }, }, { name: "combined kind+time range tag filter", filter: Filter{ Kinds: []int{0}, Since: intPtr(2000), Until: intPtr(7000), }, expectedIDs: []string{ "5e4c64f1", "4a15d963", }, }, { name: "combined author+tag tag filter", filter: Filter{ Authors: []string{"e719e8f8"}, Tags: map[string][]string{ "power": {"fire"}, }, }, expectedIDs: []string{ "4a15d963", }, }, { name: "combined tag filter", filter: Filter{ Authors: []string{"e719e8f8"}, Kinds: []int{0}, Since: intPtr(5000), Until: intPtr(10000), Tags: map[string][]string{ "power": {"fire"}, }, }, expectedIDs: []string{ "4a15d963", }, }, } func TestEventFilterMatching(t *testing.T) { for _, tc := range filterTestCases { t.Run(tc.name, func(t *testing.T) { actualIDs := []string{} for _, event := range testEvents { if tc.filter.Matches(&event) { actualIDs = append(actualIDs, event.ID[:8]) } } assert.Equal(t, tc.expectedIDs, actualIDs) }) } }