From 9f32134a51b978218cfd27487d5e1350e8b33217 Mon Sep 17 00:00:00 2001 From: Adeleye Olamide Date: Thu, 2 Sep 2021 16:30:25 +0100 Subject: [PATCH 1/7] Add test runner --- buildSrc/src/main/kotlin/AppConfig.kt | 4 +++- buildSrc/src/main/kotlin/extensions/AndroidAppExtension.kt | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/AppConfig.kt b/buildSrc/src/main/kotlin/AppConfig.kt index b34cc0d..c8bc9a3 100644 --- a/buildSrc/src/main/kotlin/AppConfig.kt +++ b/buildSrc/src/main/kotlin/AppConfig.kt @@ -10,4 +10,6 @@ object AppConfig { const val versionCode: Int = 1 const val versionName: String = "1.0" -} \ No newline at end of file + + const val testInstrumentationRunner: String = "androidx.test.runner.AndroidJUnitRunner" +} diff --git a/buildSrc/src/main/kotlin/extensions/AndroidAppExtension.kt b/buildSrc/src/main/kotlin/extensions/AndroidAppExtension.kt index 1c2bbcf..7b08290 100644 --- a/buildSrc/src/main/kotlin/extensions/AndroidAppExtension.kt +++ b/buildSrc/src/main/kotlin/extensions/AndroidAppExtension.kt @@ -22,6 +22,7 @@ private class AndroidAppExtension : ProjectExtension { minSdk = AppConfig.minSdkVersion versionCode(AppConfig.versionCode) versionName(AppConfig.versionName) + testInstrumentationRunner = AppConfig.testInstrumentationRunner } buildTypes { From a0caded0ba757044362a4cb44d1b26abc4cbdbdd Mon Sep 17 00:00:00 2001 From: Adeleye Olamide Date: Thu, 2 Sep 2021 16:40:42 +0100 Subject: [PATCH 2/7] Add cache contract test --- buildSrc/src/main/kotlin/Library.kt | 3 + buildSrc/src/main/kotlin/Version.kt | 3 + .../kotlin/plugin/AndroidLibraryPlugin.kt | 1 + .../expenselogger/cache/dao/ExpenseDao.kt | 10 +-- .../cache/repository/ExpenseRepository.kt | 10 +-- .../cache/repository/ExpenseRepositoryImpl.kt | 10 +-- .../expenselogger/cache/entity/DummyData.kt | 14 +++++ .../repository/ExpenseRepositoryImplTest.kt | 62 +++++++++++++++++++ 8 files changed, 98 insertions(+), 15 deletions(-) create mode 100644 cache/src/test/java/com/example/expenselogger/cache/entity/DummyData.kt create mode 100644 cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImplTest.kt diff --git a/buildSrc/src/main/kotlin/Library.kt b/buildSrc/src/main/kotlin/Library.kt index 888cf0c..c67da90 100644 --- a/buildSrc/src/main/kotlin/Library.kt +++ b/buildSrc/src/main/kotlin/Library.kt @@ -55,6 +55,9 @@ object Library { // Mockito const val mockito = "org.mockito.kotlin:mockito-kotlin:${Version.mockito}" + + // AndroidXTest + const val androidXTest: String = "androidx.test.ext:junit:${Version.testExt}" } object Project { diff --git a/buildSrc/src/main/kotlin/Version.kt b/buildSrc/src/main/kotlin/Version.kt index 810aa4e..8972d51 100644 --- a/buildSrc/src/main/kotlin/Version.kt +++ b/buildSrc/src/main/kotlin/Version.kt @@ -33,6 +33,9 @@ object Version { // Mockito const val mockito: String = "3.2.0" + // AndroidXTest + const val testExt: String = "1.1.3" + // ktlint const val ktlint: String = "0.42.1" } diff --git a/buildSrc/src/main/kotlin/plugin/AndroidLibraryPlugin.kt b/buildSrc/src/main/kotlin/plugin/AndroidLibraryPlugin.kt index 22f5ae9..971eea2 100644 --- a/buildSrc/src/main/kotlin/plugin/AndroidLibraryPlugin.kt +++ b/buildSrc/src/main/kotlin/plugin/AndroidLibraryPlugin.kt @@ -32,6 +32,7 @@ class AndroidLibraryPlugin : BasePlugin() { Library.junit, Library.truth, Library.mockito, + Library.androidXTest, Library.coroutinesTest ) kapt( diff --git a/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt b/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt index 1001633..e9e7f76 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt @@ -9,17 +9,17 @@ import com.example.expenselogger.cache.entity.ExpenseEntity @Dao internal interface ExpenseDao { @Insert - fun insertExpense(expense: ExpenseEntity) + suspend fun insertExpense(expense: ExpenseEntity) @Update - fun updateExpense(expense: ExpenseEntity) + suspend fun updateExpense(expense: ExpenseEntity) @Query("SELECT * FROM expense WHERE id = :id") - fun getExpense(id: Long): ExpenseEntity + suspend fun getExpense(id: Long): ExpenseEntity @Query("SELECT * FROM expense ORDER BY date ASC") - public fun getExpenses(): List + suspend fun getExpenses(): List @Query("DELETE FROM expense WHERE id = :id") - fun deleteExpense(id: Long) + suspend fun deleteExpense(id: Long) } diff --git a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt index 38bdb20..93e3e22 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt @@ -4,9 +4,9 @@ import com.example.expenselogger.cache.entity.ExpenseEntity public interface ExpenseRepository { - public fun insertExpense(expenseEntity: ExpenseEntity) - public fun updateExpense(expenseEntity: ExpenseEntity) - public fun getExpense(id: Long): ExpenseEntity? - public fun getExpenses(): List - public fun deleteExpense(id: Long) + public suspend fun insertExpense(expenseEntity: ExpenseEntity) + public suspend fun updateExpense(expenseEntity: ExpenseEntity) + public suspend fun getExpense(id: Long): ExpenseEntity? + public suspend fun getExpenses(): List + public suspend fun deleteExpense(id: Long) } diff --git a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt index 3f376ea..335ab37 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt @@ -8,23 +8,23 @@ internal class ExpenseRepositoryImpl @Inject constructor( private val expenseDao: ExpenseDao ) : ExpenseRepository { - override fun insertExpense(expenseEntity: ExpenseEntity) { + override suspend fun insertExpense(expenseEntity: ExpenseEntity) { expenseDao.insertExpense(expenseEntity) } - override fun updateExpense(expenseEntity: ExpenseEntity) { + override suspend fun updateExpense(expenseEntity: ExpenseEntity) { expenseDao.updateExpense(expenseEntity) } - override fun getExpense(id: Long): ExpenseEntity? { + override suspend fun getExpense(id: Long): ExpenseEntity? { return expenseDao.getExpense(id) } - override fun getExpenses(): List { + override suspend fun getExpenses(): List { return expenseDao.getExpenses() } - override fun deleteExpense(id: Long) { + override suspend fun deleteExpense(id: Long) { expenseDao.deleteExpense(id) } } diff --git a/cache/src/test/java/com/example/expenselogger/cache/entity/DummyData.kt b/cache/src/test/java/com/example/expenselogger/cache/entity/DummyData.kt new file mode 100644 index 0000000..e5486de --- /dev/null +++ b/cache/src/test/java/com/example/expenselogger/cache/entity/DummyData.kt @@ -0,0 +1,14 @@ +package com.example.expenselogger.cache.entity + +import java.util.Date + +public object DummyData { + + public val expenseEntity: ExpenseEntity = ExpenseEntity( + id = 0, + name = "Valentine outing", + amount = 13_500.00, + date = Date(1613311218000).time, // February 14th 2021 + info = "Valentine outing with bae" + ) +} diff --git a/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImplTest.kt b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImplTest.kt new file mode 100644 index 0000000..1fab8a1 --- /dev/null +++ b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImplTest.kt @@ -0,0 +1,62 @@ +package com.example.expenselogger.cache.repository + +import androidx.room.Room +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.example.expenselogger.cache.ExpenseDatabase +import com.example.expenselogger.cache.entity.DummyData +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.runBlockingTest +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +public class ExpenseRepositoryImplTest { + + private lateinit var expenseRepository: ExpenseRepository + private lateinit var expenseDatabase: ExpenseDatabase + + @Before + public fun setup() { + expenseDatabase = Room.inMemoryDatabaseBuilder( + ApplicationProvider.getApplicationContext(), + ExpenseDatabase::class.java + ).allowMainThreadQueries().build() + + expenseRepository = ExpenseRepositoryImpl( + expenseDatabase.expenseDao + ) + } + + @Test + public fun `verify that insertExpense inserts Expense into database`(): Unit = + runBlockingTest { + val expenseEntity = DummyData.expenseEntity + expenseRepository.insertExpense(expenseEntity) + val expectedExpenseEntity = expenseRepository.getExpense(0) + assertThat(expectedExpenseEntity).isEqualTo(expenseEntity) + } + + @Test + public fun `verify that getExpenses gets list of expenses`(): Unit = runBlockingTest { + val expense = DummyData.expenseEntity + expenseRepository.insertExpense(expense) + val expectedExpenses = expenseRepository.getExpenses().first() + assertThat(expense).isEqualTo(expectedExpenses) + } + + @Test + public fun `verify that getExpense gets an expense`(): Unit = runBlockingTest { + val expenseEntity = DummyData.expenseEntity + expenseRepository.insertExpense(expenseEntity) + val expectedExpenseEntity = expenseRepository.getExpense(0) + assertThat(expectedExpenseEntity).isEqualTo(expenseEntity) + } + + @After + public fun `tearDown()`() { + expenseDatabase.close() + } +} From e7fdbcca120370d3fa85c77ca7986576a108a7ac Mon Sep 17 00:00:00 2001 From: tezike Date: Fri, 3 Sep 2021 13:08:33 +0200 Subject: [PATCH 3/7] fix failing build and test --- buildSrc/src/main/kotlin/Library.kt | 2 + buildSrc/src/main/kotlin/Version.kt | 2 + .../kotlin/plugin/AndroidLibraryPlugin.kt | 9 +---- cache/build.gradle.kts | 12 ++++++ .../expenselogger/cache/dao/ExpenseDao.kt | 7 ++-- .../cache/entity/ExpenseEntity.kt | 9 +++-- .../cache/repository/ExpenseRepository.kt | 2 +- .../cache/repository/ExpenseRepositoryImpl.kt | 16 ++++---- .../expenselogger/cache/entity/DummyData.kt | 5 +-- ...ryImplTest.kt => ExpenseRepositoryTest.kt} | 40 +++++++++---------- 10 files changed, 57 insertions(+), 47 deletions(-) rename cache/src/test/java/com/example/expenselogger/cache/repository/{ExpenseRepositoryImplTest.kt => ExpenseRepositoryTest.kt} (56%) diff --git a/buildSrc/src/main/kotlin/Library.kt b/buildSrc/src/main/kotlin/Library.kt index c67da90..98088fb 100644 --- a/buildSrc/src/main/kotlin/Library.kt +++ b/buildSrc/src/main/kotlin/Library.kt @@ -58,6 +58,8 @@ object Library { // AndroidXTest const val androidXTest: String = "androidx.test.ext:junit:${Version.testExt}" + const val runner: String = "androidx.test:runner:${Version.runner}" + const val robolectric: String = "org.robolectric:robolectric:${Version.robolectric}" } object Project { diff --git a/buildSrc/src/main/kotlin/Version.kt b/buildSrc/src/main/kotlin/Version.kt index 8972d51..eb98786 100644 --- a/buildSrc/src/main/kotlin/Version.kt +++ b/buildSrc/src/main/kotlin/Version.kt @@ -35,6 +35,8 @@ object Version { // AndroidXTest const val testExt: String = "1.1.3" + const val robolectric: String = "4.5.1" + const val runner: String = "1.2.0" // ktlint const val ktlint: String = "0.42.1" diff --git a/buildSrc/src/main/kotlin/plugin/AndroidLibraryPlugin.kt b/buildSrc/src/main/kotlin/plugin/AndroidLibraryPlugin.kt index 971eea2..7540a89 100644 --- a/buildSrc/src/main/kotlin/plugin/AndroidLibraryPlugin.kt +++ b/buildSrc/src/main/kotlin/plugin/AndroidLibraryPlugin.kt @@ -25,20 +25,15 @@ class AndroidLibraryPlugin : BasePlugin() { get() = { implementation( Library.daggerHiltAndroid, - Library.coroutines, - Library.room + Library.coroutines ) testImplementation( Library.junit, Library.truth, Library.mockito, - Library.androidXTest, Library.coroutinesTest ) - kapt( - Library.daggerHiltCompiler, - Library.roomCompiler - ) + kapt(Library.daggerHiltCompiler) } override val extensions: Array diff --git a/cache/build.gradle.kts b/cache/build.gradle.kts index d61e778..746cb05 100644 --- a/cache/build.gradle.kts +++ b/cache/build.gradle.kts @@ -1,3 +1,15 @@ plugins { androidLib } + +dependencies { + implementation(Library.room) + kapt(Library.roomCompiler) + + testImplementation( + Library.androidXTest, + Library.runner, + Library.androidXTest, + Library.robolectric + ) +} diff --git a/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt b/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt index e9e7f76..ee81902 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt @@ -2,20 +2,21 @@ package com.example.expenselogger.cache.dao import androidx.room.Dao import androidx.room.Insert +import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update import com.example.expenselogger.cache.entity.ExpenseEntity @Dao internal interface ExpenseDao { - @Insert - suspend fun insertExpense(expense: ExpenseEntity) + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertExpense(expense: ExpenseEntity): Long @Update suspend fun updateExpense(expense: ExpenseEntity) @Query("SELECT * FROM expense WHERE id = :id") - suspend fun getExpense(id: Long): ExpenseEntity + suspend fun getExpense(id: Long): ExpenseEntity? @Query("SELECT * FROM expense ORDER BY date ASC") suspend fun getExpenses(): List diff --git a/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt b/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt index c7f905d..3c22afb 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt @@ -6,9 +6,6 @@ import androidx.room.PrimaryKey @Entity(tableName = "expense") public data class ExpenseEntity( - @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = "id") - val id: Long, @ColumnInfo(name = "name") val name: String, @ColumnInfo(name = "amount") @@ -17,4 +14,8 @@ public data class ExpenseEntity( val date: Long, @ColumnInfo(name = "info") val info: String -) +) { + @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = "id") + var id: Long = 0L +} diff --git a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt index 93e3e22..e15f51b 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt @@ -4,7 +4,7 @@ import com.example.expenselogger.cache.entity.ExpenseEntity public interface ExpenseRepository { - public suspend fun insertExpense(expenseEntity: ExpenseEntity) + public suspend fun insertExpense(expenseEntity: ExpenseEntity): Long public suspend fun updateExpense(expenseEntity: ExpenseEntity) public suspend fun getExpense(id: Long): ExpenseEntity? public suspend fun getExpenses(): List diff --git a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt index 335ab37..68ba2ac 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt @@ -8,21 +8,19 @@ internal class ExpenseRepositoryImpl @Inject constructor( private val expenseDao: ExpenseDao ) : ExpenseRepository { - override suspend fun insertExpense(expenseEntity: ExpenseEntity) { - expenseDao.insertExpense(expenseEntity) - } + override suspend fun insertExpense( + expenseEntity: ExpenseEntity + ): Long = expenseDao.insertExpense(expenseEntity) override suspend fun updateExpense(expenseEntity: ExpenseEntity) { expenseDao.updateExpense(expenseEntity) } - override suspend fun getExpense(id: Long): ExpenseEntity? { - return expenseDao.getExpense(id) - } + override suspend fun getExpense( + id: Long + ): ExpenseEntity? = expenseDao.getExpense(id) - override suspend fun getExpenses(): List { - return expenseDao.getExpenses() - } + override suspend fun getExpenses(): List = expenseDao.getExpenses() override suspend fun deleteExpense(id: Long) { expenseDao.deleteExpense(id) diff --git a/cache/src/test/java/com/example/expenselogger/cache/entity/DummyData.kt b/cache/src/test/java/com/example/expenselogger/cache/entity/DummyData.kt index e5486de..4248683 100644 --- a/cache/src/test/java/com/example/expenselogger/cache/entity/DummyData.kt +++ b/cache/src/test/java/com/example/expenselogger/cache/entity/DummyData.kt @@ -2,10 +2,9 @@ package com.example.expenselogger.cache.entity import java.util.Date -public object DummyData { +internal object DummyData { - public val expenseEntity: ExpenseEntity = ExpenseEntity( - id = 0, + val expenseEntity: ExpenseEntity = ExpenseEntity( name = "Valentine outing", amount = 13_500.00, date = Date(1613311218000).time, // February 14th 2021 diff --git a/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImplTest.kt b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt similarity index 56% rename from cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImplTest.kt rename to cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt index 1fab8a1..3088e84 100644 --- a/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImplTest.kt +++ b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt @@ -6,20 +6,20 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.example.expenselogger.cache.ExpenseDatabase import com.example.expenselogger.cache.entity.DummyData import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.test.runBlockingTest +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -public class ExpenseRepositoryImplTest { +internal class ExpenseRepositoryTest { private lateinit var expenseRepository: ExpenseRepository private lateinit var expenseDatabase: ExpenseDatabase @Before - public fun setup() { + fun setup() { expenseDatabase = Room.inMemoryDatabaseBuilder( ApplicationProvider.getApplicationContext(), ExpenseDatabase::class.java @@ -30,33 +30,33 @@ public class ExpenseRepositoryImplTest { ) } + @After + fun `tearDown()`() { + expenseDatabase.close() + } + @Test - public fun `verify that insertExpense inserts Expense into database`(): Unit = - runBlockingTest { + fun `verify that insertExpense inserts Expense into database`(): Unit = + runBlocking { val expenseEntity = DummyData.expenseEntity - expenseRepository.insertExpense(expenseEntity) - val expectedExpenseEntity = expenseRepository.getExpense(0) - assertThat(expectedExpenseEntity).isEqualTo(expenseEntity) + val id = expenseRepository.insertExpense(expenseEntity) + val actual = expenseRepository.getExpense(id) + assertThat(actual).isEqualTo(expenseEntity) } @Test - public fun `verify that getExpenses gets list of expenses`(): Unit = runBlockingTest { + fun `verify that getExpenses gets list of expenses`(): Unit = runBlocking { val expense = DummyData.expenseEntity expenseRepository.insertExpense(expense) - val expectedExpenses = expenseRepository.getExpenses().first() - assertThat(expense).isEqualTo(expectedExpenses) + val actual = expenseRepository.getExpenses() + assertThat(actual).isEqualTo(listOf(expense)) } @Test - public fun `verify that getExpense gets an expense`(): Unit = runBlockingTest { + fun `verify that getExpense gets an expense`(): Unit = runBlocking { val expenseEntity = DummyData.expenseEntity - expenseRepository.insertExpense(expenseEntity) - val expectedExpenseEntity = expenseRepository.getExpense(0) - assertThat(expectedExpenseEntity).isEqualTo(expenseEntity) - } - - @After - public fun `tearDown()`() { - expenseDatabase.close() + val id = expenseRepository.insertExpense(expenseEntity) + val actual = expenseRepository.getExpense(id) + assertThat(actual).isEqualTo(expenseEntity) } } From d73fde13d406589a177d44b2b52026369f68792b Mon Sep 17 00:00:00 2001 From: tezike Date: Fri, 3 Sep 2021 13:20:20 +0200 Subject: [PATCH 4/7] fix failing build and test --- buildSrc/src/main/kotlin/Library.kt | 1 - buildSrc/src/main/kotlin/Version.kt | 1 - cache/build.gradle.kts | 2 -- 3 files changed, 4 deletions(-) diff --git a/buildSrc/src/main/kotlin/Library.kt b/buildSrc/src/main/kotlin/Library.kt index 98088fb..e464857 100644 --- a/buildSrc/src/main/kotlin/Library.kt +++ b/buildSrc/src/main/kotlin/Library.kt @@ -58,7 +58,6 @@ object Library { // AndroidXTest const val androidXTest: String = "androidx.test.ext:junit:${Version.testExt}" - const val runner: String = "androidx.test:runner:${Version.runner}" const val robolectric: String = "org.robolectric:robolectric:${Version.robolectric}" } diff --git a/buildSrc/src/main/kotlin/Version.kt b/buildSrc/src/main/kotlin/Version.kt index eb98786..ff789eb 100644 --- a/buildSrc/src/main/kotlin/Version.kt +++ b/buildSrc/src/main/kotlin/Version.kt @@ -36,7 +36,6 @@ object Version { // AndroidXTest const val testExt: String = "1.1.3" const val robolectric: String = "4.5.1" - const val runner: String = "1.2.0" // ktlint const val ktlint: String = "0.42.1" diff --git a/cache/build.gradle.kts b/cache/build.gradle.kts index 746cb05..ec607c1 100644 --- a/cache/build.gradle.kts +++ b/cache/build.gradle.kts @@ -7,8 +7,6 @@ dependencies { kapt(Library.roomCompiler) testImplementation( - Library.androidXTest, - Library.runner, Library.androidXTest, Library.robolectric ) From 408286d11802668a1faff81d42d0e710fbe5b99a Mon Sep 17 00:00:00 2001 From: Adeleye Olamide Date: Sat, 4 Sep 2021 21:11:03 +0100 Subject: [PATCH 5/7] Fix updateExpense test --- .../example/expenselogger/cache/entity/ExpenseEntity.kt | 2 +- .../cache/repository/ExpenseRepositoryTest.kt | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt b/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt index e34e94b..3c22afb 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt @@ -13,7 +13,7 @@ public data class ExpenseEntity( @ColumnInfo(name = "date") val date: Long, @ColumnInfo(name = "info") - var info: String + val info: String ) { @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") diff --git a/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt index b1ea317..320b903 100644 --- a/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt +++ b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt @@ -66,8 +66,11 @@ internal class ExpenseRepositoryTest { val id = expenseRepository.insertExpense(expenseEntity) val newExpenseEntity = expenseRepository.getExpense(id) val newInfo = "Valentine outing with now ex bae" - newExpenseEntity?.info = newInfo - expenseRepository.updateExpense(newExpenseEntity!!) + val newExpenseEntityCopy = newExpenseEntity?.copy(info = newInfo) + newExpenseEntityCopy?.let { + it.id = id + expenseRepository.updateExpense(it) + } val actual = expenseRepository.getExpense(id) assertThat(actual?.info).isEqualTo(newInfo) } From f0e3ac03b8421747e3ea9e4a60f91b35564d5104 Mon Sep 17 00:00:00 2001 From: tezike Date: Wed, 8 Sep 2021 21:36:56 +0200 Subject: [PATCH 6/7] remove updateExpense function and move id to constructor --- .../expenselogger/cache/dao/ExpenseDao.kt | 4 --- .../cache/entity/ExpenseEntity.kt | 7 ++--- .../cache/repository/ExpenseRepository.kt | 2 -- .../cache/repository/ExpenseRepositoryImpl.kt | 4 --- .../cache/repository/ExpenseRepositoryTest.kt | 28 ++++++------------- 5 files changed, 12 insertions(+), 33 deletions(-) diff --git a/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt b/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt index ee81902..e90a9de 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt @@ -4,7 +4,6 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import androidx.room.Update import com.example.expenselogger.cache.entity.ExpenseEntity @Dao @@ -12,9 +11,6 @@ internal interface ExpenseDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertExpense(expense: ExpenseEntity): Long - @Update - suspend fun updateExpense(expense: ExpenseEntity) - @Query("SELECT * FROM expense WHERE id = :id") suspend fun getExpense(id: Long): ExpenseEntity? diff --git a/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt b/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt index 3c22afb..4e24152 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/entity/ExpenseEntity.kt @@ -13,9 +13,8 @@ public data class ExpenseEntity( @ColumnInfo(name = "date") val date: Long, @ColumnInfo(name = "info") - val info: String -) { + val info: String, @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") - var id: Long = 0L -} + val id: Long = 0L +) diff --git a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt index e15f51b..de0d2c6 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt @@ -3,9 +3,7 @@ package com.example.expenselogger.cache.repository import com.example.expenselogger.cache.entity.ExpenseEntity public interface ExpenseRepository { - public suspend fun insertExpense(expenseEntity: ExpenseEntity): Long - public suspend fun updateExpense(expenseEntity: ExpenseEntity) public suspend fun getExpense(id: Long): ExpenseEntity? public suspend fun getExpenses(): List public suspend fun deleteExpense(id: Long) diff --git a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt index 68ba2ac..73e79bd 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt @@ -12,10 +12,6 @@ internal class ExpenseRepositoryImpl @Inject constructor( expenseEntity: ExpenseEntity ): Long = expenseDao.insertExpense(expenseEntity) - override suspend fun updateExpense(expenseEntity: ExpenseEntity) { - expenseDao.updateExpense(expenseEntity) - } - override suspend fun getExpense( id: Long ): ExpenseEntity? = expenseDao.getExpense(id) diff --git a/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt index 320b903..70d2d49 100644 --- a/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt +++ b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt @@ -41,15 +41,20 @@ internal class ExpenseRepositoryTest { val expenseEntity = DummyData.expenseEntity val id = expenseRepository.insertExpense(expenseEntity) val actual = expenseRepository.getExpense(id) - assertThat(actual).isEqualTo(expenseEntity) + assertThat(actual).isEqualTo(expenseEntity.copy(id = id)) } @Test fun `verify that getExpenses gets list of expenses`(): Unit = runBlocking { val expense = DummyData.expenseEntity - expenseRepository.insertExpense(expense) + val id = expenseRepository.insertExpense(expense) + val id2 = expenseRepository.insertExpense(expense) val actual = expenseRepository.getExpenses() - assertThat(actual).isEqualTo(listOf(expense)) + val expected = listOf( + expense.copy(id = id), + expense.copy(id = id2) + ) + assertThat(actual).isEqualTo(expected) } @Test @@ -57,22 +62,7 @@ internal class ExpenseRepositoryTest { val expenseEntity = DummyData.expenseEntity val id = expenseRepository.insertExpense(expenseEntity) val actual = expenseRepository.getExpense(id) - assertThat(actual).isEqualTo(expenseEntity) - } - - @Test - fun `verify that updateExpense updates an expense`(): Unit = runBlocking { - val expenseEntity = DummyData.expenseEntity - val id = expenseRepository.insertExpense(expenseEntity) - val newExpenseEntity = expenseRepository.getExpense(id) - val newInfo = "Valentine outing with now ex bae" - val newExpenseEntityCopy = newExpenseEntity?.copy(info = newInfo) - newExpenseEntityCopy?.let { - it.id = id - expenseRepository.updateExpense(it) - } - val actual = expenseRepository.getExpense(id) - assertThat(actual?.info).isEqualTo(newInfo) + assertThat(actual).isEqualTo(expenseEntity.copy(id = id)) } @Test From f1b9e2588f1a828d5ea692b0e1e94d22e027328a Mon Sep 17 00:00:00 2001 From: Adeleye Olamide Date: Thu, 9 Sep 2021 16:04:22 +0100 Subject: [PATCH 7/7] Add updateExpense to cache contract --- .../example/expenselogger/cache/dao/ExpenseDao.kt | 4 ++++ .../cache/repository/ExpenseRepository.kt | 1 + .../cache/repository/ExpenseRepositoryImpl.kt | 4 ++++ .../cache/repository/ExpenseRepositoryTest.kt | 12 ++++++++++++ 4 files changed, 21 insertions(+) diff --git a/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt b/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt index e90a9de..ee81902 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/dao/ExpenseDao.kt @@ -4,6 +4,7 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.Update import com.example.expenselogger.cache.entity.ExpenseEntity @Dao @@ -11,6 +12,9 @@ internal interface ExpenseDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertExpense(expense: ExpenseEntity): Long + @Update + suspend fun updateExpense(expense: ExpenseEntity) + @Query("SELECT * FROM expense WHERE id = :id") suspend fun getExpense(id: Long): ExpenseEntity? diff --git a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt index de0d2c6..beab0b5 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepository.kt @@ -4,6 +4,7 @@ import com.example.expenselogger.cache.entity.ExpenseEntity public interface ExpenseRepository { public suspend fun insertExpense(expenseEntity: ExpenseEntity): Long + public suspend fun updateExpense(expenseEntity: ExpenseEntity) public suspend fun getExpense(id: Long): ExpenseEntity? public suspend fun getExpenses(): List public suspend fun deleteExpense(id: Long) diff --git a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt index 73e79bd..0fa7c26 100644 --- a/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt +++ b/cache/src/main/java/com/example/expenselogger/cache/repository/ExpenseRepositoryImpl.kt @@ -12,6 +12,10 @@ internal class ExpenseRepositoryImpl @Inject constructor( expenseEntity: ExpenseEntity ): Long = expenseDao.insertExpense(expenseEntity) + override suspend fun updateExpense( + expenseEntity: ExpenseEntity + ) = expenseDao.updateExpense(expenseEntity) + override suspend fun getExpense( id: Long ): ExpenseEntity? = expenseDao.getExpense(id) diff --git a/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt index 70d2d49..7ed24fa 100644 --- a/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt +++ b/cache/src/test/java/com/example/expenselogger/cache/repository/ExpenseRepositoryTest.kt @@ -44,6 +44,18 @@ internal class ExpenseRepositoryTest { assertThat(actual).isEqualTo(expenseEntity.copy(id = id)) } + @Test + fun `verify that updateExpense updates an Expense in the database`(): Unit = + runBlocking { + val expenseEntity = DummyData.expenseEntity + val id = expenseRepository.insertExpense(expenseEntity) + val newInfo = "Valentine outing with now ex bae" + val expenseEntityUpdate = expenseEntity.copy(id = id, info = newInfo) + expenseRepository.updateExpense(expenseEntityUpdate) + val actual = expenseRepository.getExpense(id) + assertThat(actual).isEqualTo(expenseEntityUpdate) + } + @Test fun `verify that getExpenses gets list of expenses`(): Unit = runBlocking { val expense = DummyData.expenseEntity