diff --git a/app/build.gradle b/app/build.gradle
index 526e9a14..33cfc1a7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -61,6 +61,7 @@ dependencies {
implementation "androidx.work:work-runtime-ktx:2.3.0"
testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
diff --git a/app/src/androidTest/java/com/readrops/app/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/readrops/app/ExampleInstrumentedTest.java
deleted file mode 100644
index 22adf061..00000000
--- a/app/src/androidTest/java/com/readrops/app/ExampleInstrumentedTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.readrops.app;
-
-import android.content.Context;
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.*;
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * @see Testing documentation
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
- @Test
- public void useAppContext() {
- // Context of the app under test.
- Context appContext = InstrumentationRegistry.getTargetContext();
-
- assertEquals("com.readrops.app", appContext.getPackageName());
- }
-}
diff --git a/app/src/androidTest/java/com/readrops/app/SyncResultAnalyserTest.kt b/app/src/androidTest/java/com/readrops/app/SyncResultAnalyserTest.kt
new file mode 100644
index 00000000..b1314d7e
--- /dev/null
+++ b/app/src/androidTest/java/com/readrops/app/SyncResultAnalyserTest.kt
@@ -0,0 +1,149 @@
+package com.readrops.app
+
+import android.content.Context
+import androidx.room.Room
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import com.readrops.app.utils.SyncResultAnalyser
+import com.readrops.readropsdb.Database
+import com.readrops.readropsdb.entities.Feed
+import com.readrops.readropsdb.entities.Item
+import com.readrops.readropsdb.entities.account.Account
+import com.readrops.readropsdb.entities.account.AccountType
+import com.readrops.readropslibrary.services.SyncResult
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class SyncResultAnalyserTest {
+
+ private lateinit var database: Database
+
+ private val context: Context = InstrumentationRegistry.getInstrumentation().targetContext
+ private val account1 = Account().apply {
+ accountName = "test account 1"
+ accountType = AccountType.FRESHRSS
+ }
+
+ private val account2 = Account().apply {
+ accountName = "test account 2"
+ accountType = AccountType.NEXTCLOUD_NEWS
+ }
+
+ @Before
+ fun setupDb() {
+ database = Room.inMemoryDatabaseBuilder(context, Database::class.java)
+ .build()
+
+ var account1Id = 0
+ database.accountDao().insert(account1).subscribe { id -> account1Id = id.toInt() }
+
+ var account2Id = 0
+ database.accountDao().insert(account2).subscribe { id -> account2Id = id.toInt() }
+
+ for (i in 0..3) {
+ val feed = Feed().apply {
+ name = "feed ${i + 1}"
+ iconUrl = "https://i0.wp.com/mrmondialisation.org/wp-content/uploads/2017/05/ico_final.gif"
+ this.accountId = if (i %2 == 0) account1Id else account2Id
+ }
+
+ database.feedDao().insert(feed).subscribe()
+ }
+ }
+
+ @After
+ fun closeDb() {
+ database.close()
+ }
+
+ @Test
+ fun caseOneElementEveryWhere() {
+ val item = Item().apply {
+ title = "caseOneElementEveryWhere"
+ feedId = 1
+ }
+
+ val syncResult = SyncResult().apply {
+ items = mutableListOf(item)
+ }
+
+ val notifContent = SyncResultAnalyser(context, mapOf(Pair(account1, syncResult)), database).getSyncNotifContent()
+
+ assertEquals("caseOneElementEveryWhere", notifContent.content)
+ assertEquals("feed 1", notifContent.title)
+ assertTrue(notifContent.largeIcon != null)
+ }
+
+ @Test
+ fun caseTwoItemsOneFeed() {
+ val item = Item().apply {
+ title = "caseOneElementEveryWhere"
+ feedId = 1
+ }
+
+ val syncResult = SyncResult().apply {
+ items = mutableListOf(item, item, item)
+ }
+
+ val notifContent = SyncResultAnalyser(context, mapOf(Pair(account1, syncResult)), database).getSyncNotifContent()
+
+ assertEquals("3 new articles", notifContent.content)
+ assertEquals("feed 1", notifContent.title)
+ assertTrue(notifContent.largeIcon != null)
+ }
+
+ @Test
+ fun caseMultipleFeeds() {
+ val item = Item().apply {
+ feedId = 1
+ }
+
+ val item2 = Item().apply {
+ feedId = 2
+ }
+
+ val syncResult = SyncResult().apply {
+ items = mutableListOf(item, item2)
+ }
+
+ val notifContent = SyncResultAnalyser(context, mapOf(Pair(account1, syncResult)), database).getSyncNotifContent()
+
+ assertEquals("2 new articles", notifContent.content)
+ assertEquals(account1.accountName, notifContent.title)
+ //assertTrue(notifContent.largeIcon != null) doesn't work currently
+ }
+
+ @Test
+ fun multipleAccounts() {
+ val item = Item().apply {
+ feedId = 1
+ }
+
+ val item2 = Item().apply {
+ feedId = 2
+ }
+
+ val syncResult = SyncResult().apply {
+ items = mutableListOf(item, item2)
+ }
+
+ val syncResult2 = SyncResult().apply {
+ items = mutableListOf(item, item2)
+ }
+
+ val syncResults = mutableMapOf().apply {
+ put(account1, syncResult)
+ put(account2, syncResult2)
+ }
+
+ val notifContent = SyncResultAnalyser(context, syncResults, database).getSyncNotifContent()
+
+ assertEquals("Notifications", notifContent.title)
+ assertEquals("4 new articles", notifContent.content)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/readrops/app/utils/SyncResultAnalyser.kt b/app/src/main/java/com/readrops/app/utils/SyncResultAnalyser.kt
index 41754428..3ded4dbe 100644
--- a/app/src/main/java/com/readrops/app/utils/SyncResultAnalyser.kt
+++ b/app/src/main/java/com/readrops/app/utils/SyncResultAnalyser.kt
@@ -12,7 +12,7 @@ import com.readrops.readropslibrary.services.SyncResult
/**
* Simple class to get synchro notification content (title, content and largeIcon) according to some rules
*/
-class SyncResultAnalyser(val context: Context, private val syncResults: Map) {
+class SyncResultAnalyser(val context: Context, private val syncResults: Map, val database: Database) {
fun getSyncNotifContent(): SyncResultNotifContent {
var title: String? = null
@@ -40,7 +40,7 @@ class SyncResultAnalyser(val context: Context, private val syncResults: Map) {
- val notifContent = SyncResultAnalyser(applicationContext, syncResults).getSyncNotifContent()
+ val notifContent = SyncResultAnalyser(applicationContext, syncResults, database).getSyncNotifContent()
if (notifContent.title != null && notifContent.content != null) {
val intent = Intent(applicationContext, MainActivity::class.java)