diff --git a/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/impl/UpdateCartItemUseCaseImpl.kt b/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/impl/UpdateCartItemUseCaseImpl.kt index f2c91b10..b9a6ec82 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/impl/UpdateCartItemUseCaseImpl.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/impl/UpdateCartItemUseCaseImpl.kt @@ -19,16 +19,20 @@ class UpdateCartItemUseCaseImpl @Inject constructor( ) : UpdateCartItemUseCase { override suspend fun updateLineItem(lineItemModel: LineItemModel) { withContext(ioDispatcher) { - productRepository.updateLineItemQuantityById( - lineItemModel.quantity!!, - lineItemModel.id!! - ) + if (lineItemModel.quantity != null && lineItemModel.id != null) { + productRepository.updateLineItemQuantityById( + lineItemModel.quantity!!, + lineItemModel.id!! + ) + } } } override suspend fun removeLineItem(lineItemModel: LineItemModel) { withContext(ioDispatcher) { - productRepository.removeLineItemById(lineItemModel.id!!) + if (lineItemModel.id != null) { + productRepository.removeLineItemById(lineItemModel.id!!) + } } } diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductDetailUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductDetailUseCaseImplTest.kt new file mode 100644 index 00000000..da90c3bc --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductDetailUseCaseImplTest.kt @@ -0,0 +1,45 @@ +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.GetProductDetailUseCase +import junit.framework.TestCase +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 GetProductDetailUseCaseImplTest { + + @Mock + lateinit var mockedProductRepository: ProductRepository + + private lateinit var testee: GetProductDetailUseCase + + @Before + fun setup() { + testee = GetProductDetailUseCaseImpl(productRepository = mockedProductRepository) + } + + @Test + fun productDetailsAvailable_whenExecuted_thenReturnCorrectValue() { + val input = "1" + val mockProduct = ProductModel("1") + + whenever(mockedProductRepository.getProductById(input)).thenReturn(flow { + emit(mockProduct) + }) + + runBlocking { + val result = testee.getProductDetail(input) + result.collect { + TestCase.assertEquals(mockProduct, it) + } + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsByCategoryUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsByCategoryUseCaseImplTest.kt new file mode 100644 index 00000000..dad923db --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/GetProductsByCategoryUseCaseImplTest.kt @@ -0,0 +1,64 @@ +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.GetProductsByCategoryUseCase +import junit.framework.TestCase +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 GetProductsByCategoryUseCaseImplTest { + + @Mock + lateinit var mockedProductRepository: ProductRepository + + private lateinit var testee: GetProductsByCategoryUseCaseImpl + + @Before + fun setup() { + testee = GetProductsByCategoryUseCaseImpl(productRepository = mockedProductRepository) + } + + @Test + fun productsAvailable_whenExecute_thenReturnCorrectValue() { + val input = GetProductsByCategoryUseCase.Input("20") + val mockedProducts = listOf(ProductModel("1"), ProductModel("2")) + + whenever(mockedProductRepository.getAllProductsByCategory(input.categoryId)).thenReturn(flow { + emit(mockedProducts) + }) + + runBlocking { + val result = testee.execute(input) + result.result.collect { + TestCase.assertTrue(it.isNotEmpty()) + TestCase.assertEquals(mockedProducts[0], it[0]) + TestCase.assertEquals(mockedProducts[0].id, it[0].id) + } + } + } + + @Test + fun productsNotAvailable_whenExecute_thenReturnCorrectValue() { + val input = GetProductsByCategoryUseCase.Input("20") + val mockedProducts = listOf() + + whenever(mockedProductRepository.getAllProductsByCategory(input.categoryId)).thenReturn(flow { + emit(mockedProducts) + }) + + runBlocking { + val result = testee.execute(input) + result.result.collect { + TestCase.assertTrue(it.isEmpty()) + } + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/RefreshAppDataUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/RefreshAppDataUseCaseImplTest.kt new file mode 100644 index 00000000..436e7cad --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/RefreshAppDataUseCaseImplTest.kt @@ -0,0 +1,50 @@ +package com.hieuwu.groceriesstore.domain.usecases.impl + +import com.hieuwu.groceriesstore.data.repository.CategoryRepository +import com.hieuwu.groceriesstore.data.repository.ProductRepository +import com.hieuwu.groceriesstore.data.repository.RecipeRepository +import com.hieuwu.groceriesstore.domain.usecases.RefreshAppDataUseCase +import kotlinx.coroutines.Dispatchers +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.verify + +@RunWith(MockitoJUnitRunner::class) +class RefreshAppDataUseCaseImplTest { + + @Mock + lateinit var mockedProductRepository: ProductRepository + + @Mock + lateinit var mockedCategoryRepository: CategoryRepository + + @Mock + lateinit var mockedRecipeRepository: RecipeRepository + + private lateinit var testee: RefreshAppDataUseCase + + @Before + fun setup() { + testee = RefreshAppDataUseCaseImpl( + productRepository = mockedProductRepository, + categoryRepository = mockedCategoryRepository, + recipeRepository = mockedRecipeRepository, + ioDispatcher = Dispatchers.IO + ) + } + + @Test + fun whenExecute_thenCallRepositories() { + runBlocking { + testee.execute(Unit) + + verify(mockedProductRepository).refreshDatabase() + verify(mockedCategoryRepository).refreshDatabase() + verify(mockedRecipeRepository).refreshDatabase() + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SearchProductUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SearchProductUseCaseImplTest.kt new file mode 100644 index 00000000..1f0a2fe8 --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SearchProductUseCaseImplTest.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.SearchProductUseCase +import junit.framework.TestCase +import kotlinx.coroutines.Dispatchers +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 SearchProductUseCaseImplTest { + + @Mock + lateinit var mockedProductRepository: ProductRepository + + private lateinit var testee: SearchProductUseCase + + @Before + fun setup() { + testee = SearchProductUseCaseImpl( + productRepository = mockedProductRepository, + ioDispatcher = Dispatchers.IO + ) + } + + @Test + fun productsAvailable_whenExecute_thenReturnCorrectValue() { + val input = SearchProductUseCase.Input("abc") + val mockProducts = listOf(ProductModel("1"), ProductModel("2")) + + whenever(mockedProductRepository.searchProductsListByName(input.name)).thenReturn(flow { + emit(mockProducts) + }) + + runBlocking { + val result = testee.execute(input) + result.result.collect { + TestCase.assertTrue(it.isNotEmpty()) + TestCase.assertEquals(mockProducts[0], it[0]) + TestCase.assertEquals(mockProducts[1].id, it[1].id) + } + } + } + + @Test + fun productsNotAvailable_whenExecute_thenReturnCorrectValue() { + val input = SearchProductUseCase.Input("abc") + val mockProducts = listOf() + + whenever(mockedProductRepository.searchProductsListByName(input.name)).thenReturn(flow { + emit(mockProducts) + }) + + runBlocking { + val result = testee.execute(input) + result.result.collect { + TestCase.assertTrue(it.isEmpty()) + } + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SignInUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SignInUseCaseImplTest.kt index 62533983..b3b4327c 100644 --- a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SignInUseCaseImplTest.kt +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SignInUseCaseImplTest.kt @@ -8,6 +8,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import junit.framework.TestCase.assertEquals +import kotlinx.coroutines.Dispatchers import org.mockito.Mock import org.mockito.junit.MockitoJUnitRunner import org.mockito.kotlin.whenever @@ -23,7 +24,8 @@ class SignInUseCaseImplTest { @Before fun setUp() { testee = SignInUseCaseImpl( - userRepository = mockedUserRepository + userRepository = mockedUserRepository, + ioDispatcher = Dispatchers.IO ) } diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SignOutUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SignOutUseCaseImplTest.kt new file mode 100644 index 00000000..d2beeeda --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SignOutUseCaseImplTest.kt @@ -0,0 +1,39 @@ +package com.hieuwu.groceriesstore.domain.usecases.impl + +import com.hieuwu.groceriesstore.data.repository.UserRepository +import com.hieuwu.groceriesstore.domain.usecases.SignOutUseCase +import kotlinx.coroutines.Dispatchers +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.verify + +@RunWith(MockitoJUnitRunner::class) +class SignOutUseCaseImplTest { + + @Mock + lateinit var mockedUserRepository: UserRepository + private lateinit var testee: SignOutUseCase + + @Before + fun setup() { + testee = SignOutUseCaseImpl( + userRepository = mockedUserRepository, + ioDispatcher = Dispatchers.IO + ) + } + + @Test + fun whenExecute_thenCallUserRepository() { + val input = SignOutUseCase.Input() + + runBlocking { + testee.execute(input) + + verify(mockedUserRepository).clearUser() + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SubmitOrderUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SubmitOrderUseCaseImplTest.kt index 9686e288..c60f93ad 100644 --- a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SubmitOrderUseCaseImplTest.kt +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/SubmitOrderUseCaseImplTest.kt @@ -3,6 +3,7 @@ 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.SubmitOrderUseCase +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import org.junit.Before import org.junit.Test @@ -18,13 +19,13 @@ class SubmitOrderUseCaseImplTest { @Mock lateinit var mockedOrderRepository: OrderRepository - private lateinit var testee: SubmitOrderUseCase @Before fun setUp() { testee = SubmitOrderUseCaseImpl( - orderRepository = mockedOrderRepository + orderRepository = mockedOrderRepository, + ioDispatcher = Dispatchers.IO ) } diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/UpdateCartItemUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/UpdateCartItemUseCaseImplTest.kt new file mode 100644 index 00000000..e23282c6 --- /dev/null +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/UpdateCartItemUseCaseImplTest.kt @@ -0,0 +1,129 @@ +package com.hieuwu.groceriesstore.domain.usecases.impl + +import com.hieuwu.groceriesstore.data.repository.OrderRepository +import com.hieuwu.groceriesstore.data.repository.ProductRepository +import com.hieuwu.groceriesstore.domain.models.LineItemModel +import com.hieuwu.groceriesstore.domain.models.OrderModel +import com.hieuwu.groceriesstore.domain.usecases.UpdateCartItemUseCase +import com.hieuwu.groceriesstore.utilities.OrderStatus +import junit.framework.TestCase +import kotlinx.coroutines.Dispatchers +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.Mockito +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +@RunWith(MockitoJUnitRunner::class) +class UpdateCartItemUseCaseImplTest { + + @Mock + lateinit var mockedProductRepository: ProductRepository + + @Mock + lateinit var mockedOrderRepository: OrderRepository + + private lateinit var testee: UpdateCartItemUseCase + + @Before + fun setup() { + testee = UpdateCartItemUseCaseImpl( + productRepository = mockedProductRepository, + orderRepository = mockedOrderRepository, + ioDispatcher = Dispatchers.IO + ) + } + + @Test + fun updateLineItem_correctValue_whenExecute_thenCallProductRepository() { + runBlocking { + val input = LineItemModel(1L, null, null, null, null, 1) + testee.updateLineItem(input) + + verify(mockedProductRepository).updateLineItemQuantityById(input.quantity!!, input.id!!) + } + } + + @Test + fun updateLineItem_quantityNull_whenExecute_thenCallProductRepository() { + runBlocking { + val input = LineItemModel(1L, null, null, null, null, null) + testee.updateLineItem(input) + + Mockito.verifyNoInteractions(mockedOrderRepository) + } + } + + @Test + fun updateLineItem_idNull_whenExecute_thenCallProductRepository() { + runBlocking { + val input = LineItemModel(null, null, null, null, null, 1) + testee.updateLineItem(input) + + Mockito.verifyNoInteractions(mockedOrderRepository) + } + } + + @Test + fun removeLineItem_correctValue_whenExecute_thenCallProductRepository() { + runBlocking { + val input = LineItemModel(1L, null, null, null, null, null) + testee.removeLineItem(input) + + verify(mockedProductRepository).removeLineItemById(input.id!!) + } + } + + @Test + fun removeLineItem_null_whenExecute_thenCallProductRepository() { + runBlocking { + val input = LineItemModel(null, null, null, null, null, null) + testee.removeLineItem(input) + + Mockito.verifyNoInteractions(mockedOrderRepository) + } + } + + @Test + fun getCurrentCartNotEmpty_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.getCurrentCart() + + result.collect { order -> + TestCase.assertEquals(order?.id, "") + TestCase.assertEquals(order?.status, "cart") + TestCase.assertEquals(order?.address, null) + TestCase.assertEquals(order?.lineItemList!!.isEmpty(), true) + TestCase.assertEquals(order.createdAt, "") + } + } + } + + @Test + fun getCurrentCartEmpty_whenExecute_thenReturnNull() { + whenever(mockedOrderRepository.getOneOrderByStatus(OrderStatus.IN_CART)).thenReturn(flow { + emit(null) + }) + runBlocking { + val result = testee.getCurrentCart() + result.collect { + TestCase.assertNull(it) + } + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/UserSettingsUseCaseImplTest.kt b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/UserSettingsUseCaseImplTest.kt index e9a14006..84f7083a 100644 --- a/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/UserSettingsUseCaseImplTest.kt +++ b/app/src/test/java/com/hieuwu/groceriesstore/domain/usecases/impl/UserSettingsUseCaseImplTest.kt @@ -3,6 +3,7 @@ package com.hieuwu.groceriesstore.domain.usecases.impl import com.hieuwu.groceriesstore.data.repository.UserRepository import com.hieuwu.groceriesstore.domain.usecases.UserSettingsUseCase import java.util.* +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import org.junit.Before import org.junit.Test @@ -21,7 +22,10 @@ class UserSettingsUseCaseImplTest { @Before fun setUp() { - testee = UserSettingsUseCaseImpl(userRepository = mockedUserRepository) + testee = UserSettingsUseCaseImpl( + userRepository = mockedUserRepository, + ioDispatcher = Dispatchers.IO + ) } @Test