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)