Skip to content

Commit c33ad87

Browse files
Add tests for the BookingDetailsViewModel
1 parent b43c1fd commit c33ad87

File tree

1 file changed

+79
-1
lines changed

1 file changed

+79
-1
lines changed

WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsViewModelTest.kt

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,41 @@ package com.woocommerce.android.ui.bookings.details
22

33
import androidx.lifecycle.SavedStateHandle
44
import com.woocommerce.android.R
5+
import com.woocommerce.android.ui.bookings.Booking
6+
import com.woocommerce.android.ui.bookings.BookingMapper
7+
import com.woocommerce.android.ui.bookings.BookingsRepository
58
import com.woocommerce.android.ui.bookings.compose.BookingAttendanceStatus
9+
import com.woocommerce.android.util.CurrencyFormatter
610
import com.woocommerce.android.util.getOrAwaitValue
711
import com.woocommerce.android.viewmodel.BaseUnitTest
812
import com.woocommerce.android.viewmodel.ResourceProvider
913
import kotlinx.coroutines.ExperimentalCoroutinesApi
14+
import kotlinx.coroutines.flow.MutableSharedFlow
1015
import org.assertj.core.api.Assertions.assertThat
16+
import org.junit.Before
1117
import org.junit.Test
18+
import org.mockito.kotlin.any
1219
import org.mockito.kotlin.doReturn
1320
import org.mockito.kotlin.mock
21+
import org.mockito.kotlin.whenever
22+
import org.wordpress.android.fluxc.model.LocalOrRemoteId
23+
import org.wordpress.android.fluxc.persistence.entity.BookingEntity
24+
import java.time.Duration
25+
import java.time.Instant
1426

1527
@OptIn(ExperimentalCoroutinesApi::class)
1628
class BookingDetailsViewModelTest : BaseUnitTest() {
1729

30+
private val currencyFormatter = mock<CurrencyFormatter>()
31+
private val bookingMapper = BookingMapper(currencyFormatter)
32+
33+
private val bookingFlow = MutableSharedFlow<Booking>()
34+
35+
@Before
36+
fun setup() {
37+
whenever(currencyFormatter.formatCurrency(any<String>(), any<String>(), any())).thenReturn("$0.00")
38+
}
39+
1840
@Test
1941
fun `given bookingId in SavedStateHandle, when ViewModel created, then toolbar title formatted`() {
2042
// Given
@@ -42,6 +64,9 @@ class BookingDetailsViewModelTest : BaseUnitTest() {
4264
}
4365
val viewModel = createViewModel(savedState, resourceProvider)
4466

67+
val booking = getSampleBooking(1)
68+
testBlocking { bookingFlow.emit(booking) }
69+
4570
// When
4671
val state = viewModel.state.getOrAwaitValue()
4772
state.onAttendanceStatusSelected(BookingAttendanceStatus.CANCELLED)
@@ -51,12 +76,65 @@ class BookingDetailsViewModelTest : BaseUnitTest() {
5176
assertThat(updated).isEqualTo(BookingAttendanceStatus.CANCELLED)
5277
}
5378

79+
@Test
80+
fun `given booking emitted, when observed by ViewModel, then state contains mapped objects`() = testBlocking {
81+
// Given
82+
val bookingId = 789L
83+
val savedState = SavedStateHandle(mapOf("bookingId" to bookingId))
84+
val resourceProvider = mock<ResourceProvider> {
85+
on { getString(R.string.booking_details_title, bookingId) } doReturn "Booking #$bookingId"
86+
}
87+
val viewModel = createViewModel(savedState, resourceProvider)
88+
89+
// When
90+
val booking = getSampleBooking(2)
91+
bookingFlow.emit(booking)
92+
93+
// Then
94+
val state = viewModel.state.getOrAwaitValue()
95+
assertThat(state.bookingSummary).isNotNull
96+
assertThat(state.bookingsAppointmentDetails).isNotNull
97+
assertThat(state.bookingCustomerDetails).isNotNull
98+
}
99+
54100
private fun createViewModel(
55101
savedState: SavedStateHandle,
56102
resourceProvider: ResourceProvider
57103
): BookingDetailsViewModel {
58-
return BookingDetailsViewModel(savedState, resourceProvider).apply {
104+
val bookingsRepository = mock<BookingsRepository> {
105+
on { observeBooking(any()) } doReturn bookingFlow
106+
}
107+
return BookingDetailsViewModel(
108+
savedState = savedState,
109+
resourceProvider = resourceProvider,
110+
bookingsRepository = bookingsRepository,
111+
bookingMapper = bookingMapper
112+
).apply {
59113
state.observeForever { }
60114
}
61115
}
116+
117+
private fun getSampleBooking(id: Int): Booking {
118+
return BookingEntity(
119+
id = LocalOrRemoteId.RemoteId(id.toLong()),
120+
localSiteId = LocalOrRemoteId.LocalId(1),
121+
start = Instant.now(),
122+
end = Instant.now() + Duration.ofDays(1),
123+
allDay = false,
124+
status = BookingEntity.Status.Confirmed,
125+
cost = "100.00",
126+
currency = "USD",
127+
customerId = 1L,
128+
productId = 1L,
129+
resourceId = 1L,
130+
dateCreated = Instant.now(),
131+
dateModified = Instant.now(),
132+
googleCalendarEventId = "",
133+
orderId = 1L,
134+
orderItemId = 1L,
135+
parentId = 0L,
136+
personCounts = listOf(1L),
137+
localTimezone = ""
138+
)
139+
}
62140
}

0 commit comments

Comments
 (0)