diff options
Diffstat (limited to 'app/src/test')
| -rw-r--r-- | app/src/test/java/org/terst/feedreader/data/FilterRuleEngineTest.kt | 83 |
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)) + } +} |
