11import XCTest
22@testable import WooCommerce
3+ @testable import Yosemite
34
45class ReviewReplyViewModelTests : XCTestCase {
56
7+ private let sampleSiteID : Int64 = 12345
8+
9+ private let sampleReviewID : Int64 = 7
10+
611 func test_send_button_is_disabled_when_reply_content_is_empty( ) {
712 // Given
8- let viewModel = ReviewReplyViewModel ( )
13+ let viewModel = ReviewReplyViewModel ( siteID : sampleSiteID , reviewID : sampleReviewID )
914
1015 // When
1116 let navigationItem = viewModel. navigationTrailingItem
@@ -16,12 +21,110 @@ class ReviewReplyViewModelTests: XCTestCase {
1621
1722 func test_send_button_is_enabled_when_reply_is_entered( ) {
1823 // Given
19- let viewModel = ReviewReplyViewModel ( )
24+ let viewModel = ReviewReplyViewModel ( siteID : sampleSiteID , reviewID : sampleReviewID )
2025
2126 // When
2227 viewModel. newReply = " New reply "
2328
2429 // Then
2530 assertEqual ( viewModel. navigationTrailingItem, . send( enabled: true ) )
2631 }
32+
33+ func test_loading_indicator_enabled_during_network_request( ) {
34+ // Given
35+ let stores = MockStoresManager ( sessionManager: . testingInstance)
36+ let viewModel = ReviewReplyViewModel ( siteID: sampleSiteID, reviewID: sampleReviewID, stores: stores)
37+ viewModel. newReply = " New reply "
38+
39+ // When
40+ let navigationItem : ReviewReplyNavigationItem = waitFor { promise in
41+ stores. whenReceivingAction ( ofType: CommentAction . self) { action in
42+ switch action {
43+ case . replyToComment:
44+ promise ( viewModel. navigationTrailingItem)
45+ default :
46+ XCTFail ( " Received unsupported action: \( action) " )
47+ }
48+ }
49+ viewModel. sendReply { _ in }
50+ }
51+
52+ // Then
53+ XCTAssertEqual ( navigationItem, . loading)
54+ }
55+
56+ func test_send_button_renabled_after_network_request_completes( ) {
57+ // Given
58+ let stores = MockStoresManager ( sessionManager: . testingInstance)
59+ let viewModel = ReviewReplyViewModel ( siteID: sampleSiteID, reviewID: sampleReviewID, stores: stores)
60+ stores. whenReceivingAction ( ofType: CommentAction . self) { action in
61+ switch action {
62+ case let . replyToComment( _, _, _, onCompletion) :
63+ onCompletion ( . failure( NSError ( domain: " " , code: 0 ) ) )
64+ default :
65+ XCTFail ( " Received unsupported action: \( action) " )
66+ }
67+ }
68+
69+ // When
70+ viewModel. newReply = " New reply "
71+ let navigationItem : ReviewReplyNavigationItem = waitFor { promise in
72+ viewModel. sendReply { _ in
73+ promise ( viewModel. navigationTrailingItem)
74+ }
75+ }
76+
77+ // Then
78+ XCTAssertEqual ( navigationItem, . send( enabled: true ) )
79+ }
80+
81+ func test_sendReply_completion_block_returns_true_after_successful_network_request( ) {
82+ // Given
83+ let stores = MockStoresManager ( sessionManager: . testingInstance)
84+ let viewModel = ReviewReplyViewModel ( siteID: sampleSiteID, reviewID: sampleReviewID, stores: stores)
85+ stores. whenReceivingAction ( ofType: CommentAction . self) { action in
86+ switch action {
87+ case let . replyToComment( _, _, _, onCompletion) :
88+ onCompletion ( . success( . approved) )
89+ default :
90+ XCTFail ( " Received unsupported action: \( action) " )
91+ }
92+ }
93+
94+ // When
95+ viewModel. newReply = " New reply "
96+ let successResponse : Bool = waitFor { promise in
97+ viewModel. sendReply { successResponse in
98+ promise ( successResponse)
99+ }
100+ }
101+
102+ // Then
103+ XCTAssertTrue ( successResponse)
104+ }
105+
106+ func test_sendReply_completion_block_returns_false_after_failed_network_request( ) {
107+ // Given
108+ let stores = MockStoresManager ( sessionManager: . testingInstance)
109+ let viewModel = ReviewReplyViewModel ( siteID: sampleSiteID, reviewID: sampleReviewID, stores: stores)
110+ stores. whenReceivingAction ( ofType: CommentAction . self) { action in
111+ switch action {
112+ case let . replyToComment( _, _, _, onCompletion) :
113+ onCompletion ( . failure( NSError ( domain: " " , code: 0 ) ) )
114+ default :
115+ XCTFail ( " Received unsupported action: \( action) " )
116+ }
117+ }
118+
119+ // When
120+ viewModel. newReply = " New reply "
121+ let successResponse : Bool = waitFor { promise in
122+ viewModel. sendReply { successResponse in
123+ promise ( successResponse)
124+ }
125+ }
126+
127+ // Then
128+ XCTAssertFalse ( successResponse)
129+ }
27130}
0 commit comments