/
Stalnodg
/
RandomCoffee
Обзор
Документация
Войти
/
Stalnodg
/
RandomCoffee
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
app/src/test/java/com/topit/randomcoffee/presentation/viewmodel/CartViewModelTest.kt
150 строк
5 KB
Max
presentation: pagination moved from data to presentation, bug with broken reload fixed, ViewModel for shopping cart created
05 май 2026, 18:21
05 май 2026, 18:21
1c6961d
Код
Авторство
О чём код?
package com.topit.randomcoffee.presentation.viewmodel import com.topit.randomcoffee.domain.models.Cart import com.topit.randomcoffee.domain.models.CartProduct import com.topit.randomcoffee.domain.models.CreateOrderResponse import com.topit.randomcoffee.domain.models.OperationResult import com.topit.randomcoffee.domain.models.Order import com.topit.randomcoffee.domain.models.OrderStatus import com.topit.randomcoffee.domain.models.Product import com.topit.randomcoffee.domain.repository.CoffeeRepository import com.topit.randomcoffee.domain.usecase.AddProductUseCase import com.topit.randomcoffee.domain.usecase.ClearCartUseCase import com.topit.randomcoffee.domain.usecase.GetCartUseCase import com.topit.randomcoffee.domain.usecase.PlaceOrderUseCase import com.topit.randomcoffee.domain.usecase.RemoveCartItemQuantityUseCase import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Before import org.junit.Test @OptIn(ExperimentalCoroutinesApi::class) class CartViewModelTest { private val testDispatcher = StandardTestDispatcher() private lateinit var coffeeRepository: CoffeeRepository @Before fun setUp() { Dispatchers.setMain(testDispatcher) coffeeRepository = mockk(relaxed = true) } @After fun tearDown() { Dispatchers.resetMain() } @Test fun addToCart_sets_limit_error() = runTest { val fullCart = cartWithSingleProduct(quantity = 10) coEvery { coffeeRepository.getCart() } returns OperationResult.Success(fullCart) val viewModel = createViewModel() advanceUntilIdle() viewModel.addToCart(productId = 1) advanceUntilIdle() assertEquals("Лимит корзины: максимум 10 позиций.", viewModel.uiState.value.cartError) coVerify(exactly = 0) { coffeeRepository.addToCart(any(), any()) } } @Test fun addToCart_refreshes_cart() = runTest { val initialCart = cartWithSingleProduct(quantity = 1) val updatedCart = cartWithSingleProduct(quantity = 2) coEvery { coffeeRepository.getCart() } returnsMany listOf( OperationResult.Success(initialCart), OperationResult.Success(updatedCart) ) coEvery { coffeeRepository.addToCart(productId = 1, quantity = 1) } returns OperationResult.Success(updatedCart) val viewModel = createViewModel() advanceUntilIdle() viewModel.addToCart(productId = 1) advanceUntilIdle() assertEquals(updatedCart, viewModel.uiState.value.cart) assertNull(viewModel.uiState.value.cartError) coVerify(exactly = 1) { coffeeRepository.addToCart(productId = 1, quantity = 1) } } @Test fun placeOrder_updates_order() = runTest { val initialCart = cartWithSingleProduct(quantity = 2) val cartAfterOrder = Cart(items = emptyList(), total = 0) val response = CreateOrderResponse( success = true, order = Order( id = 10, items = emptyList(), total = 0, status = OrderStatus.pending ), message = "Заказ успешно создан" ) coEvery { coffeeRepository.getCart() } returnsMany listOf( OperationResult.Success(initialCart), OperationResult.Success(cartAfterOrder) ) coEvery { coffeeRepository.placeOrder() } returns OperationResult.Success(response) val viewModel = createViewModel() advanceUntilIdle() viewModel.placeOrder() advanceUntilIdle() assertEquals("Заказ успешно создан", viewModel.uiState.value.orderMessage) assertEquals(cartAfterOrder, viewModel.uiState.value.cart) assertNull(viewModel.uiState.value.cartError) coVerify(exactly = 1) { coffeeRepository.placeOrder() } } private fun createViewModel(): CartViewModel { return CartViewModel( addProductUseCase = AddProductUseCase(coffeeRepository), removeCartItemQuantityUseCase = RemoveCartItemQuantityUseCase(coffeeRepository), getCartUseCase = GetCartUseCase(coffeeRepository), clearCartUseCase = ClearCartUseCase(coffeeRepository), placeOrderUseCase = PlaceOrderUseCase(coffeeRepository) ) } private fun cartWithSingleProduct(quantity: Int): Cart { val product = Product( id = 1, name = "Latte", description = "Milk coffee", price = 250, image_url = "", category_id = 1 ) return Cart( items = listOf( CartProduct( product = product, quantity = quantity, total_price = product.price * quantity ) ), total = product.price * quantity ) } }