From 126afc3bcfbe6b9932eba4821aceb097e42454af Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 6 Oct 2023 20:22:15 +0700 Subject: [PATCH 01/10] Setup test and write sample test --- app/build.gradle | 2 + .../impl/GetProfileUseCaseImplTest.kt | 76 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProfileUseCaseImplTest.kt diff --git a/app/build.gradle b/app/build.gradle index 2d08d0fd..611125d3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -117,6 +117,7 @@ dependencies { implementation("androidx.hilt:hilt-navigation-compose:1.0.0") implementation "com.github.bumptech.glide:compose:1.0.0-alpha.1" implementation "androidx.compose.material3:material3:1.1.1" + testImplementation("org.mockito:mockito-core:2.1.0") debugImplementation "androidx.compose.ui:ui-tooling:1.4.2" implementation "androidx.compose.ui:ui-tooling-preview:1.4.2" @@ -125,6 +126,7 @@ dependencies { implementation "androidx.compose.material:material-icons-extended:1.0.0" implementation libs.caruilib + testImplementation "org.mockito.kotlin:mockito-kotlin:5.1.0" testImplementation libs.junit androidTestImplementation libs.androidx.test.runner diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProfileUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProfileUseCaseImplTest.kt new file mode 100644 index 00000000..e9f8cb97 --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProfileUseCaseImplTest.kt @@ -0,0 +1,76 @@ +package com.hieuwu.groceriesstore.domain.usecases.impl + +import com.hieuwu.groceriesstore.data.repository.UserRepository +import com.hieuwu.groceriesstore.domain.models.UserModel +import com.hieuwu.groceriesstore.domain.usecases.GetProfileUseCase +import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertNotNull +import junit.framework.TestCase.assertNull +import junit.framework.TestCase.assertTrue +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.whenever + +@RunWith(MockitoJUnitRunner::class) + +class GetProfileUseCaseImplTest { + + @Mock + lateinit var mockedUserRepository: UserRepository + + private lateinit var testee: GetProfileUseCase + + @Before + fun setUp() { + testee = GetProfileUseCaseImpl( + userRepository = mockedUserRepository + ) + } + + @Test + fun givenUserAvailable_whenExecute_thenReturnCorrectValue() { + whenever(mockedUserRepository.getCurrentUser()).thenReturn(flow { + UserModel( + id = "", + name = "", + email = "", + phone = "", + address = "", + isOrderCreatedNotiEnabled = true, + isPromotionNotiEnabled = true, + isDataRefreshedNotiEnabled = true + ) + }) + runBlocking { + val result = testee.execute(GetProfileUseCase.Input()) + + result.result.collect { + assertEquals("", it?.id) + assertTrue(it!!.isDataRefreshedNotiEnabled) + assertTrue(it.isOrderCreatedNotiEnabled) + assertTrue(it.isPromotionNotiEnabled) + } + } + } + + + @Test + fun givenUserUnavailable_whenExecute_thenReturnCorrectValue() { + whenever(mockedUserRepository.getCurrentUser()).thenReturn(flow { + null + }) + + runBlocking { + val result = testee.execute(GetProfileUseCase.Input()) + result.result.collect { + assertNull(it) + } + } + } + +} \ No newline at end of file From 7c1376b554b1e3f0eaab8a5586044a0f024fa9d0 Mon Sep 17 00:00:00 2001 From: patthhar Date: Fri, 6 Oct 2023 23:50:52 +0530 Subject: [PATCH 02/10] Unit test for GetCategoriesListUseCase done --- .../impl/GetCategoriesListUseCaseImplTest.kt | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCategoriesListUseCaseImplTest.kt diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCategoriesListUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCategoriesListUseCaseImplTest.kt new file mode 100644 index 00000000..c8de395a --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCategoriesListUseCaseImplTest.kt @@ -0,0 +1,69 @@ +package com.hieuwu.groceriesstore.domain.usecases.impl + +import com.hieuwu.groceriesstore.data.repository.CategoryRepository +import com.hieuwu.groceriesstore.domain.models.CategoryModel +import com.hieuwu.groceriesstore.domain.usecases.GetCategoriesListUseCase +import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertNull +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.whenever + +@RunWith(MockitoJUnitRunner::class) + +class GetCategoriesListUseCaseImplTest { + + @Mock + lateinit var mockedCategoryRepository: CategoryRepository + + private lateinit var testee: GetCategoriesListUseCaseImpl + + @Before + fun setUp() { + testee = GetCategoriesListUseCaseImpl( + categoryRepository = mockedCategoryRepository + ) + } + + @Test + fun givenCategoriesAvailable_whenExecute_thenReturnCorrectValue() { + val mockCategories = listOf( + CategoryModel(id = "1", name = "Category 1", image = "image1.jpg"), + CategoryModel(id = "2", name = "Category 2", image = "image2.jpg"), + CategoryModel(id = "3", name = "Category 3", image = "image3.jpg"), + CategoryModel(id = "4", name = "Category 4", image = "image4.jpg") + ) + whenever(mockedCategoryRepository.getFromLocal()).thenReturn(flow { + emit(mockCategories) + }) + runBlocking { + val result = testee.execute(GetCategoriesListUseCase.Input()) + + result.result.collect { categories -> + assertEquals(mockCategories[0], categories[0]) + assertEquals(mockCategories[1], categories[1]) + assertEquals(mockCategories[2], categories[2]) + assertEquals(mockCategories[1].name, "Category 2") + assertEquals(mockCategories[3].image, "image4.jpg") + } + } + } + + @Test + fun givenCategoriesUnavailable_whenExecute_thenReturnCorrectValue() { + whenever(mockedCategoryRepository.getFromLocal()).thenReturn(flow { + null + }) + runBlocking { + val result = testee.execute(GetCategoriesListUseCase.Input()) + result.result.collect { + assertNull(it) + } + } + } +} \ No newline at end of file From 810a21897da8a9e5b9afed63d40345b42af39755 Mon Sep 17 00:00:00 2001 From: patthhar Date: Fri, 6 Oct 2023 23:55:38 +0530 Subject: [PATCH 03/10] Updated test for when categories aren't available --- .idea/gradle.xml | 1 + .../domain/usecases/impl/GetCategoriesListUseCaseImplTest.kt | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index dd415e7e..cd342bb1 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,6 +13,7 @@ + diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCategoriesListUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCategoriesListUseCaseImplTest.kt index c8de395a..7e844fdf 100644 --- a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCategoriesListUseCaseImplTest.kt +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCategoriesListUseCaseImplTest.kt @@ -4,7 +4,6 @@ import com.hieuwu.groceriesstore.data.repository.CategoryRepository import com.hieuwu.groceriesstore.domain.models.CategoryModel import com.hieuwu.groceriesstore.domain.usecases.GetCategoriesListUseCase import junit.framework.TestCase.assertEquals -import junit.framework.TestCase.assertNull import kotlinx.coroutines.flow.flow import kotlinx.coroutines.runBlocking import org.junit.Before @@ -57,12 +56,12 @@ class GetCategoriesListUseCaseImplTest { @Test fun givenCategoriesUnavailable_whenExecute_thenReturnCorrectValue() { whenever(mockedCategoryRepository.getFromLocal()).thenReturn(flow { - null + emit(listOf()) }) runBlocking { val result = testee.execute(GetCategoriesListUseCase.Input()) result.result.collect { - assertNull(it) + assertEquals(it.isEmpty(), true) } } } From b0d9ed34b2b043aa77eeef8ce1de316377bb3522 Mon Sep 17 00:00:00 2001 From: patthhar Date: Sat, 7 Oct 2023 10:00:19 +0530 Subject: [PATCH 04/10] Unit test for GetCurrentCartUseCase done --- .../impl/GetCurrentCartUseCaseImplTest.kt | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCurrentCartUseCaseImplTest.kt diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCurrentCartUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCurrentCartUseCaseImplTest.kt new file mode 100644 index 00000000..2eda357e --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetCurrentCartUseCaseImplTest.kt @@ -0,0 +1,71 @@ +package com.hieuwu.groceriesstore.domain.usecases.impl + +import com.hieuwu.groceriesstore.data.repository.OrderRepository +import com.hieuwu.groceriesstore.domain.models.OrderModel +import com.hieuwu.groceriesstore.domain.usecases.GetCurrentCartUseCase +import com.hieuwu.groceriesstore.utilities.OrderStatus +import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertNull +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.whenever + +@RunWith(MockitoJUnitRunner::class) + +class GetCurrentCartUseCaseImplTest { + + @Mock + lateinit var mockedOrderRepository: OrderRepository + + private lateinit var testee: GetCurrentCartUseCaseImpl + + @Before + fun setUp() { + testee = GetCurrentCartUseCaseImpl( + orderRepository = mockedOrderRepository + ) + } + + @Test + fun givenCartNotEmpty_whenExecute_thenReturnOrdersInCart() { + val mockOrder = OrderModel( + id = "", + status = OrderStatus.IN_CART.value, + address = null, + lineItemList = mutableListOf(), + createdAt = "" + ) + whenever(mockedOrderRepository.getOneOrderByStatus(OrderStatus.IN_CART)).thenReturn(flow { + emit(mockOrder) + }) + runBlocking { + val result = testee.execute(GetCurrentCartUseCase.Input()) + + result.result.collect { order -> + assertEquals(order?.id, "") + assertEquals(order?.status, "cart") + assertEquals(order?.address, null) + assertEquals(order?.lineItemList!!.isEmpty(), true) + assertEquals(order.createdAt, "") + } + } + } + + @Test + fun givenCartEmpty_whenExecute_thenReturnNull() { + whenever(mockedOrderRepository.getOneOrderByStatus(OrderStatus.IN_CART)).thenReturn(flow { + null + }) + runBlocking { + val result = testee.execute(GetCurrentCartUseCase.Input()) + result.result.collect { + assertNull(it) + } + } + } +} \ No newline at end of file From 58003a49fb0e89ccecfc529c7d0eb8cd7afe9bba Mon Sep 17 00:00:00 2001 From: Yashraj254 Date: Sun, 8 Oct 2023 01:56:36 +0530 Subject: [PATCH 05/10] test case added for GetProductsListUseCase --- .../impl/GetProductsListUseCaseImplTest.kt | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsListUseCaseImplTest.kt diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsListUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsListUseCaseImplTest.kt new file mode 100644 index 00000000..90c5843a --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsListUseCaseImplTest.kt @@ -0,0 +1,68 @@ +package com.hieuwu.groceriesstore.domain.usecases.impl + +import com.hieuwu.groceriesstore.data.repository.ProductRepository +import com.hieuwu.groceriesstore.domain.models.ProductModel +import com.hieuwu.groceriesstore.domain.usecases.GetProductsListUseCase +import junit.framework.TestCase.assertEquals +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.whenever + +@RunWith(MockitoJUnitRunner::class) + +class GetProductsListUseCaseImplTest { + + @Mock + lateinit var mockedProductsRepository: ProductRepository + + private lateinit var testee: GetProductsListUseCase + + @Before + fun setUp() { + testee = GetProductsListUseCaseImpl( + productRepository = mockedProductsRepository + ) + } + + @Test + fun givenUserAvailable_whenExecute_thenReturnCorrectValue() { + val mockedProducts = listOf( + ProductModel(id = "1", name = "Apple", price = 1.0, image = "image1.jpg", description = "Fruit", nutrition = "Healthy"), + ProductModel(id = "2", name = "Fries", price = 5.0, image = "image2.jpg", description = "Junk food", nutrition = "Unhealthy"), + ProductModel(id = "3", name = "Potato", price = 10.0, image = "image3.jpg", description = "Vegetable", nutrition = "Healthy"), + ) + whenever(mockedProductsRepository.products).thenReturn(flow { + emit(mockedProducts) + }) + runBlocking { + val result = testee.execute(GetProductsListUseCase.Input()) + + result.result.collect { products -> + assertEquals(mockedProducts[0], products[0]) + assertEquals(mockedProducts[1], products[1]) + assertEquals(mockedProducts[2], products[2]) + assertEquals(mockedProducts[1].name, "Fries") + } + } + } + + @Test + fun givenProductsUnavailable_whenExecute_thenReturnCorrectValue() { + whenever(mockedProductsRepository.products).thenReturn(flow { + emit(listOf()) + }) + + runBlocking { + val result = testee.execute(GetProductsListUseCase.Input()) + result.result.collect { + assertEquals(it.isEmpty(), true) + } + } + } + +} \ No newline at end of file From 7fd5a26f52f6f67ac218090a9010a55161cc768a Mon Sep 17 00:00:00 2001 From: Yashraj254 Date: Sun, 8 Oct 2023 02:01:28 +0530 Subject: [PATCH 06/10] renamed test method name --- .../domain/usecases/impl/GetProductsListUseCaseImplTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsListUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsListUseCaseImplTest.kt index 90c5843a..307f70d0 100644 --- a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsListUseCaseImplTest.kt +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsListUseCaseImplTest.kt @@ -30,7 +30,7 @@ class GetProductsListUseCaseImplTest { } @Test - fun givenUserAvailable_whenExecute_thenReturnCorrectValue() { + fun givenProductsAvailable_whenExecute_thenReturnCorrectValue() { val mockedProducts = listOf( ProductModel(id = "1", name = "Apple", price = 1.0, image = "image1.jpg", description = "Fruit", nutrition = "Healthy"), ProductModel(id = "2", name = "Fries", price = 5.0, image = "image2.jpg", description = "Junk food", nutrition = "Unhealthy"), From cd97df6efa7f93d17e857fd361b3f6a8eb8e56c5 Mon Sep 17 00:00:00 2001 From: Raghunandan Bansal Date: Tue, 10 Oct 2023 05:34:52 +0530 Subject: [PATCH 07/10] upgrade the gradle version --- .idea/gradle.xml | 3 ++- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 3 +-- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 5 +++-- local.properties | 6 +++--- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index cd342bb1..03b83c4d 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,8 +4,9 @@