summaryrefslogtreecommitdiff
path: root/app/src/test/java/org/terst/feedreader/data
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/test/java/org/terst/feedreader/data')
-rw-r--r--app/src/test/java/org/terst/feedreader/data/FilterRuleEngineTest.kt83
1 files changed, 83 insertions, 0 deletions
diff --git a/app/src/test/java/org/terst/feedreader/data/FilterRuleEngineTest.kt b/app/src/test/java/org/terst/feedreader/data/FilterRuleEngineTest.kt
new file mode 100644
index 0000000..2f9dbd3
--- /dev/null
+++ b/app/src/test/java/org/terst/feedreader/data/FilterRuleEngineTest.kt
@@ -0,0 +1,83 @@
+package org.terst.feedreader.data
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+private data class FakeArticle(override val title: String, override val feedId: String?) : Titled
+
+class FilterRuleEngineTest {
+
+ private fun rule(pattern: String, action: FilterAction, feedId: String? = null) =
+ FilterRuleEntity(pattern = pattern, action = action, feedId = feedId, createdAt = 0L)
+
+ @Test
+ fun `global rule matches an article from any feed`() {
+ val rules = FilterRuleEngine.compile(listOf(rule("politics", FilterAction.MUTE)))
+
+ assertEquals(FilterResult.MUTED, FilterRuleEngine.evaluate(FakeArticle("Politics today", "feed-a"), rules))
+ assertEquals(FilterResult.MUTED, FilterRuleEngine.evaluate(FakeArticle("Politics today", "feed-b"), rules))
+ assertEquals(FilterResult.MUTED, FilterRuleEngine.evaluate(FakeArticle("Politics today", null), rules))
+ }
+
+ @Test
+ fun `feed-scoped rule only matches an article from that feed`() {
+ val rules = FilterRuleEngine.compile(listOf(rule("politics", FilterAction.MUTE, feedId = "feed-a")))
+
+ assertEquals(FilterResult.MUTED, FilterRuleEngine.evaluate(FakeArticle("Politics today", "feed-a"), rules))
+ }
+
+ @Test
+ fun `feed-scoped rule does not match an article from a different feed`() {
+ val rules = FilterRuleEngine.compile(listOf(rule("politics", FilterAction.MUTE, feedId = "feed-a")))
+
+ assertEquals(FilterResult.NORMAL, FilterRuleEngine.evaluate(FakeArticle("Politics today", "feed-b"), rules))
+ assertEquals(FilterResult.NORMAL, FilterRuleEngine.evaluate(FakeArticle("Politics today", null), rules))
+ }
+
+ @Test
+ fun `mute wins over highlight when both match`() {
+ val rules = FilterRuleEngine.compile(
+ listOf(
+ rule("politics", FilterAction.HIGHLIGHT),
+ rule("politics", FilterAction.MUTE)
+ )
+ )
+
+ assertEquals(FilterResult.MUTED, FilterRuleEngine.evaluate(FakeArticle("Politics today", "feed-a"), rules))
+ }
+
+ @Test
+ fun `highlight applies when no mute rule matches`() {
+ val rules = FilterRuleEngine.compile(listOf(rule("politics", FilterAction.HIGHLIGHT)))
+
+ assertEquals(FilterResult.HIGHLIGHTED, FilterRuleEngine.evaluate(FakeArticle("Politics today", "feed-a"), rules))
+ }
+
+ @Test
+ fun `matching is case-insensitive`() {
+ val rules = FilterRuleEngine.compile(listOf(rule("POLITICS", FilterAction.MUTE)))
+
+ assertEquals(FilterResult.MUTED, FilterRuleEngine.evaluate(FakeArticle("politics today", "feed-a"), rules))
+ }
+
+ @Test
+ fun `no match returns normal`() {
+ val rules = FilterRuleEngine.compile(listOf(rule("politics", FilterAction.MUTE)))
+
+ assertEquals(FilterResult.NORMAL, FilterRuleEngine.evaluate(FakeArticle("Sports today", "feed-a"), rules))
+ }
+
+ @Test
+ fun `a feed-scoped rule for one feed and a global rule both apply independently`() {
+ val rules = FilterRuleEngine.compile(
+ listOf(
+ rule("politics", FilterAction.MUTE, feedId = "feed-a"),
+ rule("sports", FilterAction.HIGHLIGHT)
+ )
+ )
+
+ assertEquals(FilterResult.MUTED, FilterRuleEngine.evaluate(FakeArticle("Politics today", "feed-a"), rules))
+ assertEquals(FilterResult.NORMAL, FilterRuleEngine.evaluate(FakeArticle("Politics today", "feed-b"), rules))
+ assertEquals(FilterResult.HIGHLIGHTED, FilterRuleEngine.evaluate(FakeArticle("Sports today", "feed-b"), rules))
+ }
+}