@@ -24,49 +24,61 @@ final class DomainSelectorViewModelTests: XCTestCase {
2424 func test_DomainAction_is_not_dispatched_when_searchTerm_is_empty( ) {
2525 // Given
2626 stores. whenReceivingAction ( ofType: DomainAction . self) { action in
27+ // Then
2728 XCTFail ( " Unexpected action: \( action) " )
2829 }
2930
3031 // When
3132 viewModel. searchTerm = " "
3233 viewModel. searchTerm = " "
33-
34- // Then
35- XCTAssertEqual ( viewModel. domains, [ ] )
36- XCTAssertTrue ( stores. receivedActions. isEmpty)
3734 }
3835
39- func test_domain_suggestions_success_returns_domain_rows_for_free_domains( ) {
40- // Given
41- mockDomainSuggestionsSuccess ( suggestions: [
42- . init( name: " free.com " , isFree: true ) ,
43- . init( name: " paid.com " , isFree: false )
44- ] )
36+ // MARK: - `isLoadingDomainSuggestions`
37+
38+ func test_isLoadingDomainSuggestions_is_toggled_when_loading_suggestions( ) {
39+ var loadingValues : [ Bool ] = [ ]
40+ viewModel. $isLoadingDomainSuggestions. sink { value in
41+ loadingValues. append ( value)
42+ } . store ( in: & subscriptions)
43+
44+ mockDomainSuggestionsFailure ( error: SampleError . first)
4545
4646 // When
47- viewModel. searchTerm = " woo "
47+ viewModel. searchTerm = " Woo "
4848
4949 // Then
5050 waitUntil {
51- self . viewModel . domains . isNotEmpty
51+ loadingValues == [ false , true , false ]
5252 }
53- XCTAssertEqual ( viewModel. domains, [ " free.com " ] )
5453 }
5554
56- func test_domain_suggestions_failure_does_not_update_domain_rows( ) {
55+ // MARK: - `state`
56+
57+ func test_state_is_placeholder_when_searchTerm_is_empty( ) {
58+ // When
59+ viewModel. searchTerm = " "
60+
61+ // Then
62+ XCTAssertEqual ( viewModel. state, . placeholder)
63+ }
64+
65+ func test_state_is_results_with_free_domain_only_on_domain_suggestions_success( ) {
5766 // Given
58- mockDomainSuggestionsFailure ( error: SampleError . first)
67+ mockDomainSuggestionsSuccess ( suggestions: [
68+ . init( name: " free.com " , isFree: true ) ,
69+ . init( name: " paid.com " , isFree: false )
70+ ] )
5971
6072 // When
6173 viewModel. searchTerm = " woo "
6274
6375 // Then
64- XCTAssertEqual ( viewModel. domains, [ ] )
76+ waitUntil {
77+ self . viewModel. state == . results( domains: [ " free.com " ] )
78+ }
6579 }
6680
67- // MARK: - `errorMessage`
68-
69- func test_domain_suggestions_failure_with_non_DotcomError_sets_default_error_message( ) {
81+ func test_state_is_errorMessage_with_default_error_message_when_failure_is_not_DotcomError( ) {
7082 // Given
7183 mockDomainSuggestionsFailure ( error: SampleError . first)
7284
@@ -75,12 +87,11 @@ final class DomainSelectorViewModelTests: XCTestCase {
7587
7688 // Then
7789 waitUntil {
78- self . viewModel. errorMessage ? . isNotEmpty == true
90+ self . viewModel. state == . error ( message : DomainSelectorViewModel . Localization . defaultErrorMessage )
7991 }
80- XCTAssertEqual ( viewModel. errorMessage, DomainSelectorViewModel . Localization. defaultErrorMessage)
8192 }
8293
83- func test_domain_suggestions_failure_with_DotcomError_unknown_error_sets_error_message ( ) {
94+ func test_state_is_errorMessage_with_DotcomError_message_when_failure_is_DotcomError ( ) {
8495 // Given
8596 mockDomainSuggestionsFailure ( error: DotcomError . unknown ( code: " " , message: " error message " ) )
8697
@@ -89,46 +100,26 @@ final class DomainSelectorViewModelTests: XCTestCase {
89100
90101 // Then
91102 waitUntil {
92- self . viewModel. errorMessage ? . isNotEmpty == true
103+ self . viewModel. state == . error ( message : " error message " )
93104 }
94- XCTAssertEqual ( viewModel. errorMessage, " error message " )
95105 }
96106
97- func test_domain_suggestions_error_message_is_reset_when_loading_domain_suggestions ( ) {
107+ func test_state_is_updated_from_errorMessage_to_results_when_changing_search_term_after_failure ( ) {
98108 // Given
99109 mockDomainSuggestionsFailure ( error: SampleError . first)
100110
101111 // When
102112 viewModel. searchTerm = " woo "
103113 waitUntil {
104- self . viewModel. errorMessage ? . isNotEmpty == true
114+ self . viewModel. state == . error ( message : DomainSelectorViewModel . Localization . defaultErrorMessage )
105115 }
106116
107117 mockDomainSuggestionsSuccess ( suggestions: [ ] )
108118 viewModel. searchTerm = " wooo "
109119
110120 // Then
111121 waitUntil {
112- self . viewModel. errorMessage == nil
113- }
114- }
115-
116- // MARK: `isLoadingDomainSuggestions`
117-
118- func test_isLoadingDomainSuggestions_is_toggled_when_loading_suggestions( ) {
119- var loadingValues : [ Bool ] = [ ]
120- viewModel. $isLoadingDomainSuggestions. sink { value in
121- loadingValues. append ( value)
122- } . store ( in: & subscriptions)
123-
124- mockDomainSuggestionsFailure ( error: SampleError . first)
125-
126- // When
127- viewModel. searchTerm = " Woo "
128-
129- // Then
130- waitUntil {
131- loadingValues == [ false , true , false ]
122+ self . viewModel. state == . results( domains: [ ] )
132123 }
133124 }
134125}
0 commit comments