From 2cb0ea149a1ae478b7c9ebd5a380e78a4d720058 Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Wed, 13 Nov 2024 17:49:39 +0900 Subject: [PATCH 01/10] resource: add integer value for category to resources --- app/src/main/res/values/arrays.xml | 30 ++++++++++++++++++++++++++ app/src/main/res/values/integers.xml | 32 ++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/values/integers.xml diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 0000000..d188d0a --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,30 @@ + + + + @integer/category_restaurant + @integer/category_cafe + @integer/category_delivery + @integer/category_ingredients + + + + @integer/category_subscription + @integer/category_movie + @integer/category_book + @integer/category_performance + + + + @integer/category_transportation + @integer/category_communication + @integer/category_housing + @integer/category_hospital + @integer/category_medicine + @integer/category_apparel + @integer/category_education + + + + @integer/category_transfer + + \ No newline at end of file diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml new file mode 100644 index 0000000..2391065 --- /dev/null +++ b/app/src/main/res/values/integers.xml @@ -0,0 +1,32 @@ + + + 1 + 2 + 3 + 4 + + + 11 + 12 + 13 + 14 + + + 21 + 22 + 23 + 24 + + + 31 + 32 + 33 + 34 + 35 + 36 + 37 + + + 41 + + \ No newline at end of file From ad3cc9179b0f2eb853ad73cfb9f03e047aaeb708 Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Wed, 20 Nov 2024 17:55:04 +0900 Subject: [PATCH 02/10] build: add room dependency --- app/build.gradle.kts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5eeb58f..f5e927a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.ksp) } android { @@ -18,6 +19,9 @@ android { vectorDrawables { useSupportLibrary = true } + ksp { + arg("room.schemaLocation", "$projectDir/schemas") + } } buildTypes { @@ -30,11 +34,11 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_19 - targetCompatibility = JavaVersion.VERSION_19 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = "19" + jvmTarget = "17" } buildFeatures { compose = true @@ -50,7 +54,6 @@ android { } dependencies { - implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) @@ -59,6 +62,10 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) + + implementation(libs.androidx.room.ktx) + ksp(libs.androidx.room.compiler) + testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) From 66a85e6ebbdd18bfc9212aff30b9ee63efb7697a Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Wed, 20 Nov 2024 20:03:47 +0900 Subject: [PATCH 03/10] feat: add Spending Dao and Entity --- .../mybudget/data/local/dao/SpendingDao.kt | 37 +++++++++++++++++++ .../data/local/entity/SpendingEntity.kt | 17 +++++++++ app/src/main/res/values/integers.xml | 1 + 3 files changed, 55 insertions(+) create mode 100644 app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt create mode 100644 app/src/main/java/kr/ksw/mybudget/data/local/entity/SpendingEntity.kt diff --git a/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt b/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt new file mode 100644 index 0000000..d6e1b65 --- /dev/null +++ b/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt @@ -0,0 +1,37 @@ +package kr.ksw.mybudget.data.local.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Query +import androidx.room.Upsert +import kotlinx.coroutines.flow.Flow +import kr.ksw.mybudget.data.local.entity.SpendingEntity +import java.util.Date + +@Dao +interface SpendingDao { + @Upsert + suspend fun upsertSpendingEntity(spendingEntity: SpendingEntity) + + @Delete + suspend fun deleteSpendingEntity(spendingEntity: SpendingEntity) + + @Query("SELECT * FROM spending_table") + suspend fun getAllSpendingEntities(): Flow> + + @Query("SELECT * FROM spending_table WHERE majorCategory = :majorCategory") + suspend fun getSpendingEntitiesByMajorCategory( + majorCategory: Int + ): List + + @Query("SELECT * FROM spending_table WHERE subCategory = :subCategory") + suspend fun getSpendingEntitiesBySubCategory( + subCategory: Int + ): List + + @Query("SELECT * FROM spending_table WHERE date BETWEEN :from AND :to") + suspend fun getSpendingEntitiesBetween( + from: Date, + to: Date + ): List +} \ No newline at end of file diff --git a/app/src/main/java/kr/ksw/mybudget/data/local/entity/SpendingEntity.kt b/app/src/main/java/kr/ksw/mybudget/data/local/entity/SpendingEntity.kt new file mode 100644 index 0000000..aaf847d --- /dev/null +++ b/app/src/main/java/kr/ksw/mybudget/data/local/entity/SpendingEntity.kt @@ -0,0 +1,17 @@ +package kr.ksw.mybudget.data.local.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey +import java.util.Date + +@Entity("spending_table") +data class SpendingEntity( + @PrimaryKey(autoGenerate = true) + val id: Int? = null, + val title: String, + val date: Date, + val price: Int, + val majorCategory: Int, + val subCategory: Int, + val cardNum: String? = null, +) diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index 2391065..1b50182 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -1,5 +1,6 @@ + 1 2 3 From 223cc75ca12964009ff81cf09ff0198b30fc7047 Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Wed, 20 Nov 2024 20:16:26 +0900 Subject: [PATCH 04/10] feat: add SpendingDatabase, TypeConverter --- .../mybudget/data/local/converter/Converters.kt | 16 ++++++++++++++++ .../data/local/databases/SpendingDatabase.kt | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 app/src/main/java/kr/ksw/mybudget/data/local/converter/Converters.kt create mode 100644 app/src/main/java/kr/ksw/mybudget/data/local/databases/SpendingDatabase.kt diff --git a/app/src/main/java/kr/ksw/mybudget/data/local/converter/Converters.kt b/app/src/main/java/kr/ksw/mybudget/data/local/converter/Converters.kt new file mode 100644 index 0000000..620fb44 --- /dev/null +++ b/app/src/main/java/kr/ksw/mybudget/data/local/converter/Converters.kt @@ -0,0 +1,16 @@ +package kr.ksw.mybudget.data.local.converter + +import androidx.room.TypeConverter +import java.util.Date + +class Converters { + @TypeConverter + fun fromTimestamp(value: Long?): Date? { + return value?.let { Date(it) } + } + + @TypeConverter + fun dateToTimestamp(date: Date?): Long? { + return date?.time + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ksw/mybudget/data/local/databases/SpendingDatabase.kt b/app/src/main/java/kr/ksw/mybudget/data/local/databases/SpendingDatabase.kt new file mode 100644 index 0000000..4253047 --- /dev/null +++ b/app/src/main/java/kr/ksw/mybudget/data/local/databases/SpendingDatabase.kt @@ -0,0 +1,17 @@ +package kr.ksw.mybudget.data.local.databases + +import androidx.room.Database +import androidx.room.RoomDatabase +import androidx.room.TypeConverters +import kr.ksw.mybudget.data.local.converter.Converters +import kr.ksw.mybudget.data.local.dao.SpendingDao +import kr.ksw.mybudget.data.local.entity.SpendingEntity + +@Database( + entities = [SpendingEntity::class], + version = 1 +) +@TypeConverters(Converters::class) +abstract class SpendingDatabase: RoomDatabase() { + abstract val spendingDao: SpendingDao +} \ No newline at end of file From 286c82c175b5c5e5d6defb129e1558b039daf7f0 Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Wed, 20 Nov 2024 20:27:54 +0900 Subject: [PATCH 05/10] refactor: rename database (Spending -> MyBudget) --- .../databases/{SpendingDatabase.kt => MyBudgetDatabase.kt} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename app/src/main/java/kr/ksw/mybudget/data/local/databases/{SpendingDatabase.kt => MyBudgetDatabase.kt} (90%) diff --git a/app/src/main/java/kr/ksw/mybudget/data/local/databases/SpendingDatabase.kt b/app/src/main/java/kr/ksw/mybudget/data/local/databases/MyBudgetDatabase.kt similarity index 90% rename from app/src/main/java/kr/ksw/mybudget/data/local/databases/SpendingDatabase.kt rename to app/src/main/java/kr/ksw/mybudget/data/local/databases/MyBudgetDatabase.kt index 4253047..3384b46 100644 --- a/app/src/main/java/kr/ksw/mybudget/data/local/databases/SpendingDatabase.kt +++ b/app/src/main/java/kr/ksw/mybudget/data/local/databases/MyBudgetDatabase.kt @@ -12,6 +12,6 @@ import kr.ksw.mybudget.data.local.entity.SpendingEntity version = 1 ) @TypeConverters(Converters::class) -abstract class SpendingDatabase: RoomDatabase() { +abstract class MyBudgetDatabase: RoomDatabase() { abstract val spendingDao: SpendingDao } \ No newline at end of file From 2d6d384dbb0f6a60e11e159724e190e3bb7daf63 Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Thu, 21 Nov 2024 14:00:43 +0900 Subject: [PATCH 06/10] fix: delete suspend keyword to getAllSpendingEntities --- .../ksw/mybudget/ExampleInstrumentedTest.kt | 24 ------------------- .../mybudget/data/local/dao/SpendingDao.kt | 2 +- 2 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 app/src/androidTest/java/kr/ksw/mybudget/ExampleInstrumentedTest.kt diff --git a/app/src/androidTest/java/kr/ksw/mybudget/ExampleInstrumentedTest.kt b/app/src/androidTest/java/kr/ksw/mybudget/ExampleInstrumentedTest.kt deleted file mode 100644 index e1bf52e..0000000 --- a/app/src/androidTest/java/kr/ksw/mybudget/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package kr.ksw.mybudget - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("kr.ksw.mybudget", appContext.packageName) - } -} \ No newline at end of file diff --git a/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt b/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt index d6e1b65..4e46c34 100644 --- a/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt +++ b/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt @@ -17,7 +17,7 @@ interface SpendingDao { suspend fun deleteSpendingEntity(spendingEntity: SpendingEntity) @Query("SELECT * FROM spending_table") - suspend fun getAllSpendingEntities(): Flow> + fun getAllSpendingEntities(): Flow> @Query("SELECT * FROM spending_table WHERE majorCategory = :majorCategory") suspend fun getSpendingEntitiesByMajorCategory( From bd65ab2701cefb16a28d12e0ffe4f398125b2908 Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Thu, 21 Nov 2024 14:52:24 +0900 Subject: [PATCH 07/10] test: add SpendingDao test *test upsert, delete --- .../mybudget/data/local/SpendingDaoTest.kt | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 app/src/androidTest/java/kr/ksw/mybudget/data/local/SpendingDaoTest.kt diff --git a/app/src/androidTest/java/kr/ksw/mybudget/data/local/SpendingDaoTest.kt b/app/src/androidTest/java/kr/ksw/mybudget/data/local/SpendingDaoTest.kt new file mode 100644 index 0000000..859940d --- /dev/null +++ b/app/src/androidTest/java/kr/ksw/mybudget/data/local/SpendingDaoTest.kt @@ -0,0 +1,80 @@ +package kr.ksw.mybudget.data.local + +import android.content.Context +import androidx.room.Room +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.runTest +import kr.ksw.mybudget.R +import kr.ksw.mybudget.data.local.dao.SpendingDao +import kr.ksw.mybudget.data.local.databases.MyBudgetDatabase +import kr.ksw.mybudget.data.local.entity.SpendingEntity +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import java.io.IOException +import java.util.Date +import kotlin.jvm.Throws + +@RunWith(AndroidJUnit4::class) +class SpendingDaoTest { + private lateinit var db: MyBudgetDatabase + private lateinit var dao: SpendingDao + + @Before + fun createDB() { + val context = ApplicationProvider.getApplicationContext() + db = Room.inMemoryDatabaseBuilder( + context, + MyBudgetDatabase::class.java + ).build() + dao = db.spendingDao + } + + @After + @Throws(IOException::class) + fun closeDB() { + db.close() + } + + @Test + fun getAllSpendingEntitiesIsEmpty() = runTest { + val result = dao.getAllSpendingEntities().first() + assert(result.isEmpty()) + } + + @Test + fun upsertSpendingEntity() = runTest { + val context = ApplicationProvider.getApplicationContext() + dao.upsertSpendingEntity(SpendingEntity( + title = "스타벅스", + date = Date(), + majorCategory = context.resources.getInteger(R.integer.category_food), + subCategory = context.resources.getInteger(R.integer.category_cafe), + price = 5_000 + )) + val result = dao.getAllSpendingEntities().first() + assert(result.isNotEmpty()) + } + + @Test + fun deleteSpendingEntity() = runTest { + val context = ApplicationProvider.getApplicationContext() + val spending = SpendingEntity( + id = 1, + title = "스타벅스", + date = Date(), + majorCategory = context.resources.getInteger(R.integer.category_food), + subCategory = context.resources.getInteger(R.integer.category_cafe), + price = 5_000 + ) + dao.upsertSpendingEntity(spending) + assert(dao.getAllSpendingEntities().first().isNotEmpty()) + dao.deleteSpendingEntity(spending) + assert(dao.getAllSpendingEntities().first().isEmpty()) + } + + +} \ No newline at end of file From aeb9cea25e0a6624451a769984900773176648fa Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Thu, 21 Nov 2024 15:01:30 +0900 Subject: [PATCH 08/10] test: add spending mock data --- .../mybudget/data/local/mock/SpendingMock.kt | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 app/src/androidTest/java/kr/ksw/mybudget/data/local/mock/SpendingMock.kt diff --git a/app/src/androidTest/java/kr/ksw/mybudget/data/local/mock/SpendingMock.kt b/app/src/androidTest/java/kr/ksw/mybudget/data/local/mock/SpendingMock.kt new file mode 100644 index 0000000..8bea019 --- /dev/null +++ b/app/src/androidTest/java/kr/ksw/mybudget/data/local/mock/SpendingMock.kt @@ -0,0 +1,49 @@ +package kr.ksw.mybudget.data.local.mock + +import kr.ksw.mybudget.data.local.entity.SpendingEntity +import java.util.Date + +val spendingList = listOf( + SpendingEntity( + title = "스타벅스", + date = Date(), + majorCategory = 1, + subCategory = 12, + price = 6_000 + ), + SpendingEntity( + title = "할리스", + date = Date(), + majorCategory = 1, + subCategory = 12, + price = 5_000 + ), + SpendingEntity( + title = "영화", + date = Date(), + majorCategory = 2, + subCategory = 22, + price = 15_000 + ), + SpendingEntity( + title = "교통비", + date = Date(), + majorCategory = 3, + subCategory = 31, + price = 100_000 + ), + SpendingEntity( + title = "통신비", + date = Date(), + majorCategory = 3, + subCategory = 32, + price = 50_000 + ), + SpendingEntity( + title = "송금", + date = Date(), + majorCategory = 4, + subCategory = 41, + price = 200_000 + ), +) \ No newline at end of file From fd7b8aae4bdf5e63a27825277b89af9932985ca7 Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Thu, 21 Nov 2024 17:27:34 +0900 Subject: [PATCH 09/10] refactor: SpendingDao date type changed (Date -> LocalDate) *Converter changed --- .../kr/ksw/mybudget/data/local/converter/Converters.kt | 10 +++++----- .../java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt | 5 +++-- .../ksw/mybudget/data/local/entity/SpendingEntity.kt | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/kr/ksw/mybudget/data/local/converter/Converters.kt b/app/src/main/java/kr/ksw/mybudget/data/local/converter/Converters.kt index 620fb44..d6e4381 100644 --- a/app/src/main/java/kr/ksw/mybudget/data/local/converter/Converters.kt +++ b/app/src/main/java/kr/ksw/mybudget/data/local/converter/Converters.kt @@ -1,16 +1,16 @@ package kr.ksw.mybudget.data.local.converter import androidx.room.TypeConverter -import java.util.Date +import java.time.LocalDate class Converters { @TypeConverter - fun fromTimestamp(value: Long?): Date? { - return value?.let { Date(it) } + fun fromTimestamp(value: Int?): LocalDate? { + return value?.let { LocalDate.ofYearDay(LocalDate.now().year, value) } } @TypeConverter - fun dateToTimestamp(date: Date?): Long? { - return date?.time + fun dateToTimestamp(date: LocalDate?): Int? { + return date?.dayOfYear } } \ No newline at end of file diff --git a/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt b/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt index 4e46c34..f166882 100644 --- a/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt +++ b/app/src/main/java/kr/ksw/mybudget/data/local/dao/SpendingDao.kt @@ -6,6 +6,7 @@ import androidx.room.Query import androidx.room.Upsert import kotlinx.coroutines.flow.Flow import kr.ksw.mybudget.data.local.entity.SpendingEntity +import java.time.LocalDate import java.util.Date @Dao @@ -31,7 +32,7 @@ interface SpendingDao { @Query("SELECT * FROM spending_table WHERE date BETWEEN :from AND :to") suspend fun getSpendingEntitiesBetween( - from: Date, - to: Date + from: LocalDate, + to: LocalDate ): List } \ No newline at end of file diff --git a/app/src/main/java/kr/ksw/mybudget/data/local/entity/SpendingEntity.kt b/app/src/main/java/kr/ksw/mybudget/data/local/entity/SpendingEntity.kt index aaf847d..fe35639 100644 --- a/app/src/main/java/kr/ksw/mybudget/data/local/entity/SpendingEntity.kt +++ b/app/src/main/java/kr/ksw/mybudget/data/local/entity/SpendingEntity.kt @@ -2,14 +2,14 @@ package kr.ksw.mybudget.data.local.entity import androidx.room.Entity import androidx.room.PrimaryKey -import java.util.Date +import java.time.LocalDate @Entity("spending_table") data class SpendingEntity( @PrimaryKey(autoGenerate = true) val id: Int? = null, val title: String, - val date: Date, + val date: LocalDate, val price: Int, val majorCategory: Int, val subCategory: Int, From 57b95df8b4b2bde84dfd3a907dd98c7f6b1b727a Mon Sep 17 00:00:00 2001 From: ksw4015 Date: Thu, 21 Nov 2024 17:28:19 +0900 Subject: [PATCH 10/10] test: add getByCategory, getBetween to dao test --- .../mybudget/data/local/SpendingDaoTest.kt | 101 +++++++++++++++++- .../mybudget/data/local/mock/SpendingMock.kt | 55 +++++++--- 2 files changed, 139 insertions(+), 17 deletions(-) diff --git a/app/src/androidTest/java/kr/ksw/mybudget/data/local/SpendingDaoTest.kt b/app/src/androidTest/java/kr/ksw/mybudget/data/local/SpendingDaoTest.kt index 859940d..6d90a81 100644 --- a/app/src/androidTest/java/kr/ksw/mybudget/data/local/SpendingDaoTest.kt +++ b/app/src/androidTest/java/kr/ksw/mybudget/data/local/SpendingDaoTest.kt @@ -10,13 +10,16 @@ import kr.ksw.mybudget.R import kr.ksw.mybudget.data.local.dao.SpendingDao import kr.ksw.mybudget.data.local.databases.MyBudgetDatabase import kr.ksw.mybudget.data.local.entity.SpendingEntity +import kr.ksw.mybudget.data.local.mock.MAJOR_CATEGORY_FOOD +import kr.ksw.mybudget.data.local.mock.MAJOR_CATEGORY_LIFE_STYLE +import kr.ksw.mybudget.data.local.mock.spendingList +import kr.ksw.mybudget.data.local.mock.spendingListForBetween import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import java.io.IOException -import java.util.Date -import kotlin.jvm.Throws +import java.time.LocalDate @RunWith(AndroidJUnit4::class) class SpendingDaoTest { @@ -50,7 +53,7 @@ class SpendingDaoTest { val context = ApplicationProvider.getApplicationContext() dao.upsertSpendingEntity(SpendingEntity( title = "스타벅스", - date = Date(), + date = LocalDate.now(), majorCategory = context.resources.getInteger(R.integer.category_food), subCategory = context.resources.getInteger(R.integer.category_cafe), price = 5_000 @@ -65,7 +68,7 @@ class SpendingDaoTest { val spending = SpendingEntity( id = 1, title = "스타벅스", - date = Date(), + date = LocalDate.now(), majorCategory = context.resources.getInteger(R.integer.category_food), subCategory = context.resources.getInteger(R.integer.category_cafe), price = 5_000 @@ -76,5 +79,95 @@ class SpendingDaoTest { assert(dao.getAllSpendingEntities().first().isEmpty()) } + @Test + fun `getSpendingEntitiesByMajorCategory Test Food Result Count is 2`() = runTest { + spendingList.forEach { spending -> + dao.upsertSpendingEntity(spending) + } + assert(dao.getAllSpendingEntities().first().isNotEmpty()) + + val result = dao.getSpendingEntitiesByMajorCategory(MAJOR_CATEGORY_FOOD) + assert(result.isNotEmpty()) + assert(result.size == 2) + } + + @Test + fun `getSpendingEntitiesBySubCategory Test LifeStyle And Transportation Category`() = runTest { + spendingList.forEach { spending -> + dao.upsertSpendingEntity(spending) + } + assert(dao.getAllSpendingEntities().first().isNotEmpty()) + + val resultLifeStyle = dao.getSpendingEntitiesByMajorCategory(MAJOR_CATEGORY_LIFE_STYLE) + assert(resultLifeStyle.size == 2) + + val categoryTransportation = 31 + val resultTransportation = dao.getSpendingEntitiesBySubCategory(categoryTransportation) + assert(resultTransportation.size == 1) + } + + @Test + fun `getSpendingEntitiesBetween Today`() = runTest { + spendingList.forEach { spending -> + dao.upsertSpendingEntity(spending) + } + val from = LocalDate.now() + val to = LocalDate.now() + val result = dao.getSpendingEntitiesBetween(from, to) + assert(result.isNotEmpty()) + assert(result.size == spendingList.size) + } + @Test + fun `getSpendingEntitiesBetween Week`() = runTest { + val now = LocalDate.now() + val from = now.plusDays(-((now.dayOfWeek.value - 1).toLong())) + val to = now.plusDays((7 - now.dayOfWeek.value).toLong()) + spendingListForBetween.forEach { spending -> + dao.upsertSpendingEntity(spending) + } + val result = dao.getSpendingEntitiesBetween(from, to) + assert(result.isNotEmpty()) + assert(result.size == 1) + } + + @Test + fun `getSpendingEntitiesBetween Month`() = runTest { + val now = LocalDate.now() + val from = now.withDayOfMonth(1) + val to = now.withDayOfMonth(now.lengthOfMonth()) + spendingListForBetween.forEach { spending -> + dao.upsertSpendingEntity(spending) + } + val result = dao.getSpendingEntitiesBetween(from, to) + assert(result.isNotEmpty()) + assert(result.size == 2) + } + + @Test + fun `getSpendingEntitiesBetween One Month Before`() = runTest { + val month = LocalDate.now().plusMonths(-1L) + val from = month.withDayOfMonth(1) + val to = month.withDayOfMonth(month.lengthOfMonth()) + println("$from, $to") + spendingListForBetween.forEach { spending -> + dao.upsertSpendingEntity(spending) + } + val result = dao.getSpendingEntitiesBetween(from, to) + assert(result.isNotEmpty()) + assert(result.size == 1) + } + + @Test + fun `getSpendingEntitiesBetween Year`() = runTest { + val now = LocalDate.now() + val from = now.withDayOfYear(1) + println("$from, $now") + spendingListForBetween.forEach { spending -> + dao.upsertSpendingEntity(spending) + } + val result = dao.getSpendingEntitiesBetween(from, now) + assert(result.isNotEmpty()) + assert(result.size == spendingListForBetween.size) + } } \ No newline at end of file diff --git a/app/src/androidTest/java/kr/ksw/mybudget/data/local/mock/SpendingMock.kt b/app/src/androidTest/java/kr/ksw/mybudget/data/local/mock/SpendingMock.kt index 8bea019..f3aea29 100644 --- a/app/src/androidTest/java/kr/ksw/mybudget/data/local/mock/SpendingMock.kt +++ b/app/src/androidTest/java/kr/ksw/mybudget/data/local/mock/SpendingMock.kt @@ -1,48 +1,77 @@ package kr.ksw.mybudget.data.local.mock import kr.ksw.mybudget.data.local.entity.SpendingEntity -import java.util.Date +import java.time.LocalDate + +const val MAJOR_CATEGORY_FOOD = 1 +const val MAJOR_CATEGORY_CULTURE = 2 +const val MAJOR_CATEGORY_LIFE_STYLE = 3 +const val MAJOR_CATEGORY_CASH = 4 val spendingList = listOf( SpendingEntity( title = "스타벅스", - date = Date(), - majorCategory = 1, + date = LocalDate.now(), + majorCategory = MAJOR_CATEGORY_FOOD, subCategory = 12, price = 6_000 ), SpendingEntity( title = "할리스", - date = Date(), - majorCategory = 1, + date = LocalDate.now(), + majorCategory = MAJOR_CATEGORY_FOOD, subCategory = 12, price = 5_000 ), SpendingEntity( title = "영화", - date = Date(), - majorCategory = 2, + date = LocalDate.now(), + majorCategory = MAJOR_CATEGORY_CULTURE, subCategory = 22, price = 15_000 ), SpendingEntity( title = "교통비", - date = Date(), - majorCategory = 3, + date = LocalDate.now(), + majorCategory = MAJOR_CATEGORY_LIFE_STYLE, subCategory = 31, price = 100_000 ), SpendingEntity( title = "통신비", - date = Date(), - majorCategory = 3, + date = LocalDate.now(), + majorCategory = MAJOR_CATEGORY_LIFE_STYLE, subCategory = 32, price = 50_000 ), SpendingEntity( title = "송금", - date = Date(), - majorCategory = 4, + date = LocalDate.now(), + majorCategory = MAJOR_CATEGORY_CASH, + subCategory = 41, + price = 200_000 + ), +) + +val spendingListForBetween = listOf( + SpendingEntity( + title = "송금", + date = LocalDate.now().plusWeeks(-1L), + majorCategory = MAJOR_CATEGORY_CASH, + subCategory = 41, + price = 200_000 + ), + SpendingEntity( + title = "송금", + date = LocalDate.now().plusMonths(-1L), + majorCategory = MAJOR_CATEGORY_CASH, + subCategory = 41, + price = 200_000 + ), + SpendingEntity( + title = "송금", + date = LocalDate.now(), + majorCategory = MAJOR_CATEGORY_CASH, subCategory = 41, price = 200_000 ),