@@ -2,19 +2,41 @@ package com.woocommerce.android.ui.bookings.details
22
33import androidx.lifecycle.SavedStateHandle
44import 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
58import com.woocommerce.android.ui.bookings.compose.BookingAttendanceStatus
9+ import com.woocommerce.android.util.CurrencyFormatter
610import com.woocommerce.android.util.getOrAwaitValue
711import com.woocommerce.android.viewmodel.BaseUnitTest
812import com.woocommerce.android.viewmodel.ResourceProvider
913import kotlinx.coroutines.ExperimentalCoroutinesApi
14+ import kotlinx.coroutines.flow.MutableSharedFlow
1015import org.assertj.core.api.Assertions.assertThat
16+ import org.junit.Before
1117import org.junit.Test
18+ import org.mockito.kotlin.any
1219import org.mockito.kotlin.doReturn
1320import 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 )
1628class 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