1+ import Fakes
12import XCTest
23@testable import Yosemite
34@testable import Networking
@@ -7,7 +8,7 @@ import XCTest
78
89/// AccountStore Unit Tests
910///
10- class AccountStoreTests : XCTestCase {
11+ final class AccountStoreTests : XCTestCase {
1112
1213 /// Mock Dispatcher!
1314 ///
@@ -216,7 +217,7 @@ class AccountStoreTests: XCTestCase {
216217
217218 // When
218219 let result : Result < Void , Error > = waitFor { promise in
219- let action = AccountAction . synchronizeSites { result in
220+ let action = AccountAction . synchronizeSites ( selectedSiteID : nil ) { result in
220221 promise ( result)
221222 }
222223 store. onAction ( action)
@@ -236,7 +237,7 @@ class AccountStoreTests: XCTestCase {
236237
237238 // When
238239 let result : Result < Void , Error > = waitFor { promise in
239- let action = AccountAction . synchronizeSites { result in
240+ let action = AccountAction . synchronizeSites ( selectedSiteID : nil ) { result in
240241 promise ( result)
241242 }
242243 store. onAction ( action)
@@ -247,6 +248,58 @@ class AccountStoreTests: XCTestCase {
247248 XCTAssertEqual ( self . viewStorage. countObjects ( ofType: Storage . Site. self) , 2 )
248249 }
249250
251+ /// Verifies that `synchronizeSites` deletes storage sites that do not exist remotely anymore.
252+ ///
253+ func test_synchronizeSites_deletes_sites_that_do_not_exist_remotely( ) {
254+ // Given
255+ let store = AccountStore ( dispatcher: dispatcher, storageManager: storageManager, network: network)
256+ let siteIDInStorageOnly = Int64 ( 127 )
257+ storageManager. insertSampleSite ( readOnlySite: Site . fake ( ) . copy ( siteID: siteIDInStorageOnly) )
258+ network. simulateResponse ( requestUrlSuffix: " me/sites " , filename: " sites " )
259+ XCTAssertEqual ( viewStorage. countObjects ( ofType: Storage . Site. self) , 1 )
260+ XCTAssertNotNil ( viewStorage. loadSite ( siteID: siteIDInStorageOnly) )
261+
262+ // When
263+ let result : Result < Void , Error > = waitFor { promise in
264+ let action = AccountAction . synchronizeSites ( selectedSiteID: nil ) { result in
265+ promise ( result)
266+ }
267+ store. onAction ( action)
268+ }
269+
270+ // Then
271+ XCTAssertTrue ( result. isSuccess)
272+ // `sites.json` contains 2 sites that do not match `siteIDInStorageOnly`.
273+ XCTAssertEqual ( self . viewStorage. countObjects ( ofType: Storage . Site. self) , 2 )
274+ XCTAssertNil ( viewStorage. loadSite ( siteID: siteIDInStorageOnly) )
275+ }
276+
277+ /// Verifies that `synchronizeSites` does not delete selected site after syncing and the selected site does not exist remotely anymore.
278+ ///
279+ func test_synchronizeSites_does_not_delete_selected_site_that_does_not_exist_remotely( ) {
280+ // Given
281+ let store = AccountStore ( dispatcher: dispatcher, storageManager: storageManager, network: network)
282+ let selectedSiteID = Int64 ( 127 )
283+ storageManager. insertSampleSite ( readOnlySite: Site . fake ( ) . copy ( siteID: selectedSiteID) )
284+ network. simulateResponse ( requestUrlSuffix: " me/sites " , filename: " sites " )
285+ XCTAssertEqual ( viewStorage. countObjects ( ofType: Storage . Site. self) , 1 )
286+ XCTAssertNotNil ( viewStorage. loadSite ( siteID: selectedSiteID) )
287+
288+ // When
289+ let result : Result < Void , Error > = waitFor { promise in
290+ let action = AccountAction . synchronizeSites ( selectedSiteID: selectedSiteID) { result in
291+ promise ( result)
292+ }
293+ store. onAction ( action)
294+ }
295+
296+ // Then
297+ XCTAssertTrue ( result. isSuccess)
298+ // `sites.json` contains 2 sites that do not match `siteIDInStorageOnly`.
299+ XCTAssertEqual ( self . viewStorage. countObjects ( ofType: Storage . Site. self) , 3 )
300+ XCTAssertNotNil ( viewStorage. loadSite ( siteID: selectedSiteID) )
301+ }
302+
250303 // MARK: - AccountAction.loadAccount
251304
252305 func test_loadAccount_returns_expected_account( ) {
0 commit comments