@@ -202,10 +202,7 @@ class ItemEnumerationTaskTests: CloudTaskExecutorTestCase {
202202
203203 // MARK: Folder
204204
205- // swiftlint:disable:next function_body_length
206- func testFolderEnumeration( ) throws {
207- let expectation = XCTestExpectation ( description: " Folder Enumeration " )
208-
205+ func testFolderEnumeration( ) async throws {
209206 let rootItemMetadata = ItemMetadata ( id: NSFileProviderItemIdentifier . rootContainerDatabaseValue, name: " Home " , type: . folder, size: nil , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " / " ) , isPlaceholderItem: false )
210207 try metadataManagerMock. cacheMetadata ( rootItemMetadata)
211208
@@ -218,110 +215,92 @@ class ItemEnumerationTaskTests: CloudTaskExecutorTestCase {
218215 ItemMetadata ( id: 5 , name: " File 3 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 3 " ) , isPlaceholderItem: false ) ,
219216 ItemMetadata ( id: 6 , name: " File 4 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 4 " ) , isPlaceholderItem: false ) ]
220217
221- let expectedRootFolderFileProviderItems = expectedItemMetadataInsideRootFolder. map { FileProviderItem ( metadata: $0, domainIdentifier: . test) }
222218 let expectedItemMetadataInsideSubFolder = [ ItemMetadata ( id: 7 , name: " Directory 2 " , type: . folder, size: 0 , parentID: 2 , lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /Directory 1/Directory 2 " ) , isPlaceholderItem: false ) ,
223219 ItemMetadata ( id: 8 , name: " File 5 " , type: . file, size: 14 , parentID: 2 , lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /Directory 1/File 5 " ) , isPlaceholderItem: false ) ]
224- let expectedSubFolderFileProviderItems = expectedItemMetadataInsideSubFolder. map { FileProviderItem ( metadata: $0, domainIdentifier: . test) }
225220
226221 let taskExecutor = ItemEnumerationTaskExecutor ( domainIdentifier: . test, provider: cloudProviderMock, itemMetadataManager: metadataManagerMock, cachedFileManager: cachedFileManagerMock, uploadTaskManager: uploadTaskManagerMock, reparentTaskManager: reparentTaskManagerMock, deletionTaskManager: deletionTaskManagerMock, itemEnumerationTaskManager: itemEnumerationTaskManagerMock, deleteItemHelper: deleteItemHelper)
227222 let permissionProviderMock = PermissionProviderMock ( )
228- withDependencies {
223+ try await withDependencies ( {
229224 $0. permissionProvider = permissionProviderMock
230- } operation: {
225+ } , operation: {
231226 permissionProviderMock. getPermissionsForAtReturnValue = . allowsReading
232-
233- taskExecutor. execute ( task: enumerationTask) . then { fileProviderItemList -> FileProviderItem in
234- XCTAssertEqual ( 5 , fileProviderItemList. items. count)
235- XCTAssertEqual ( expectedRootFolderFileProviderItems. map ( \. filename) , fileProviderItemList. items. map ( \. filename) )
236- XCTAssertEqual ( expectedRootFolderFileProviderItems. map ( \. parentItemIdentifier) , fileProviderItemList. items. map ( \. parentItemIdentifier) )
237- XCTAssertEqual ( 6 , self . metadataManagerMock. cachedMetadata. count)
238-
239- let expectedItemMetadata = [ rootItemMetadata] + expectedItemMetadataInsideRootFolder
240- XCTAssert ( expectedItemMetadata. allSatisfy { expectedMetadata in
241- self . metadataManagerMock. cachedMetadata. contains ( where: { key, value in
242- key == expectedMetadata. id && value. name == expectedMetadata. name && value. type == expectedMetadata. type && value. size == expectedMetadata. size && value. parentID == expectedMetadata. parentID && value. statusCode == expectedMetadata. statusCode && value. cloudPath == expectedMetadata. cloudPath && value. isPlaceholderItem == expectedMetadata. isPlaceholderItem
243- } )
227+ let expectedRootFolderFileProviderItems = expectedItemMetadataInsideRootFolder. map { FileProviderItem ( metadata: $0, domainIdentifier: . test) }
228+ let expectedSubFolderFileProviderItems = expectedItemMetadataInsideSubFolder. map { FileProviderItem ( metadata: $0, domainIdentifier: . test) }
229+
230+ let rootFolderItemList = try await taskExecutor. execute ( task: enumerationTask) . getValue ( )
231+ XCTAssertEqual ( 5 , rootFolderItemList. items. count)
232+ XCTAssertEqual ( expectedRootFolderFileProviderItems, rootFolderItemList. items)
233+ XCTAssertEqual ( 6 , self . metadataManagerMock. cachedMetadata. count)
234+
235+ // Check cached metadata equals expected metadata, except the last modified date
236+ let expectedItemMetadata = [ rootItemMetadata] + expectedItemMetadataInsideRootFolder
237+ XCTAssert ( expectedItemMetadata. allSatisfy { expectedMetadata in
238+ self . metadataManagerMock. cachedMetadata. contains ( where: { key, value in
239+ key == expectedMetadata. id && value. name == expectedMetadata. name && value. type == expectedMetadata. type && value. size == expectedMetadata. size && value. parentID == expectedMetadata. parentID && value. statusCode == expectedMetadata. statusCode && value. cloudPath == expectedMetadata. cloudPath && value. isPlaceholderItem == expectedMetadata. isPlaceholderItem
244240 } )
245- XCTAssertEqual ( 1 , self . itemEnumerationTaskManagerMock. removedTaskRecords. count)
246- XCTAssert ( self . itemEnumerationTaskManagerMock. removedTaskRecords. contains ( where: { $0 == enumerationTaskRecord } ) )
247- return fileProviderItemList. items [ 0 ]
248- } . then { folderFileProviderItem -> Promise < FileProviderItemList > in
249- let enumerationTaskRecord = ItemEnumerationTaskRecord ( correspondingItem: rootItemMetadata. id!, pageToken: nil )
250- let enumerationTask = ItemEnumerationTask ( taskRecord: enumerationTaskRecord, itemMetadata: folderFileProviderItem. metadata)
251- return taskExecutor. execute ( task: enumerationTask)
252- } . then { fileProviderItemList in
253- XCTAssertEqual ( 2 , self . itemEnumerationTaskManagerMock. removedTaskRecords. count)
254-
255- XCTAssertEqual ( 2 , fileProviderItemList. items. count)
256- XCTAssertEqual ( expectedSubFolderFileProviderItems. map ( \. filename) , fileProviderItemList. items. map ( \. filename) )
257- XCTAssertEqual ( expectedSubFolderFileProviderItems. map ( \. parentItemIdentifier) , fileProviderItemList. items. map ( \. parentItemIdentifier) )
258- XCTAssertEqual ( 8 , self . metadataManagerMock. cachedMetadata. count)
259-
260- XCTAssert ( expectedItemMetadataInsideSubFolder. allSatisfy { expectedMetadata in
261- self . metadataManagerMock. cachedMetadata. contains ( where: { key, value in
262- key == expectedMetadata. id && value. name == expectedMetadata. name && value. type == expectedMetadata. type && value. size == expectedMetadata. size && value. parentID == expectedMetadata. parentID && value. statusCode == expectedMetadata. statusCode && value. cloudPath == expectedMetadata. cloudPath && value. isPlaceholderItem == expectedMetadata. isPlaceholderItem
263- } )
241+ } )
242+ XCTAssertEqual ( 1 , self . itemEnumerationTaskManagerMock. removedTaskRecords. count)
243+ XCTAssert ( self . itemEnumerationTaskManagerMock. removedTaskRecords. contains ( where: { $0 == enumerationTaskRecord } ) )
244+
245+ let subfolderEnumerationTaskRecord = ItemEnumerationTaskRecord ( correspondingItem: rootItemMetadata. id!, pageToken: nil )
246+ let subfolderEnumerationTask = ItemEnumerationTask ( taskRecord: subfolderEnumerationTaskRecord, itemMetadata: rootFolderItemList. items [ 0 ] . metadata)
247+ let subfolderItemList = try await taskExecutor. execute ( task: subfolderEnumerationTask) . getValue ( )
248+
249+ XCTAssertEqual ( 2 , self . itemEnumerationTaskManagerMock. removedTaskRecords. count)
250+ XCTAssertEqual ( 2 , subfolderItemList. items. count)
251+ XCTAssertEqual ( expectedSubFolderFileProviderItems, subfolderItemList. items)
252+ XCTAssertEqual ( 8 , self . metadataManagerMock. cachedMetadata. count)
253+
254+ // Check cached metadata equals expected metadata, except the last modified date
255+ XCTAssert ( expectedItemMetadataInsideSubFolder. allSatisfy { expectedMetadata in
256+ self . metadataManagerMock. cachedMetadata. contains ( where: { key, value in
257+ key == expectedMetadata. id && value. name == expectedMetadata. name && value. type == expectedMetadata. type && value. size == expectedMetadata. size && value. parentID == expectedMetadata. parentID && value. statusCode == expectedMetadata. statusCode && value. cloudPath == expectedMetadata. cloudPath && value. isPlaceholderItem == expectedMetadata. isPlaceholderItem
264258 } )
265- } . catch { error in
266- XCTFail ( " Error in promise: \( error) " )
267- } . always {
268- expectation. fulfill ( )
269- }
270- }
271- wait ( for: [ expectation] , timeout: 5.0 )
259+ } )
260+ } )
272261 }
273262
274- func testFolderEnumerationSameFolderTwice( ) throws {
275- let expectation = XCTestExpectation ( description: " Folder Enumeration " )
276-
263+ func testFolderEnumerationSameFolderTwice( ) async throws {
277264 let rootItemMetadata = ItemMetadata ( id: NSFileProviderItemIdentifier . rootContainerDatabaseValue, name: " Home " , type: . folder, size: nil , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " / " ) , isPlaceholderItem: false )
278265 try metadataManagerMock. cacheMetadata ( rootItemMetadata)
279266
280267 let enumerationTaskRecord = try ItemEnumerationTaskRecord ( correspondingItem: XCTUnwrap ( rootItemMetadata. id) , pageToken: nil )
281268 let enumerationTask = ItemEnumerationTask ( taskRecord: enumerationTaskRecord, itemMetadata: rootItemMetadata)
282269
283- let expectedRootFolderFileProviderItems = [ FileProviderItem ( metadata: ItemMetadata ( id: 2 , name: " Directory 1 " , type: . folder, size: 0 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /Directory 1/ " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
284- FileProviderItem ( metadata: ItemMetadata ( id: 3 , name: " File 1 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 1 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
285- FileProviderItem ( metadata: ItemMetadata ( id: 4 , name: " File 2 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 3 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
286- FileProviderItem ( metadata: ItemMetadata ( id: 5 , name: " File 3 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 3 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
287- FileProviderItem ( metadata: ItemMetadata ( id: 6 , name: " File 4 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 4 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ]
288- let expectedChangedRootFolderFileProviderItems = [ FileProviderItem ( metadata: ItemMetadata ( id: 2 , name: " Directory 1 " , type: . folder, size: 0 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /Directory 1/ " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
289- FileProviderItem ( metadata: ItemMetadata ( id: 4 , name: " File 2 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 3 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
290- FileProviderItem ( metadata: ItemMetadata ( id: 5 , name: " File 3 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 3 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
291- FileProviderItem ( metadata: ItemMetadata ( id: 6 , name: " File 4 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 4 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
292- FileProviderItem ( metadata: ItemMetadata ( id: 7 , name: " NewFileFromCloud " , type: . file, size: 24 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /NewFileFromCloud " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ]
293-
294270 let permissionProviderMock = PermissionProviderMock ( )
295271 let taskExecutor = ItemEnumerationTaskExecutor ( domainIdentifier: . test, provider: cloudProviderMock, itemMetadataManager: metadataManagerMock, cachedFileManager: cachedFileManagerMock, uploadTaskManager: uploadTaskManagerMock, reparentTaskManager: reparentTaskManagerMock, deletionTaskManager: deletionTaskManagerMock, itemEnumerationTaskManager: itemEnumerationTaskManagerMock, deleteItemHelper: deleteItemHelper)
296272
297- withDependencies {
273+ try await withDependencies ( {
298274 $0. permissionProvider = permissionProviderMock
299- } operation: {
275+ } , operation: {
300276 permissionProviderMock. getPermissionsForAtReturnValue = . allowsReading
277+ let expectedRootFolderFileProviderItems = [ FileProviderItem ( metadata: ItemMetadata ( id: 2 , name: " Directory 1 " , type: . folder, size: 0 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /Directory 1/ " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
278+ FileProviderItem ( metadata: ItemMetadata ( id: 3 , name: " File 1 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 1 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
279+ FileProviderItem ( metadata: ItemMetadata ( id: 4 , name: " File 2 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 3 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
280+ FileProviderItem ( metadata: ItemMetadata ( id: 5 , name: " File 3 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 3 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
281+ FileProviderItem ( metadata: ItemMetadata ( id: 6 , name: " File 4 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 4 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ]
282+ let expectedChangedRootFolderFileProviderItems = [ FileProviderItem ( metadata: ItemMetadata ( id: 2 , name: " Directory 1 " , type: . folder, size: 0 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /Directory 1/ " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
283+ FileProviderItem ( metadata: ItemMetadata ( id: 4 , name: " File 2 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 3 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
284+ FileProviderItem ( metadata: ItemMetadata ( id: 5 , name: " File 3 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 3 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
285+ FileProviderItem ( metadata: ItemMetadata ( id: 6 , name: " File 4 " , type: . file, size: 14 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /File 4 " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ,
286+ FileProviderItem ( metadata: ItemMetadata ( id: 7 , name: " NewFileFromCloud " , type: . file, size: 24 , parentID: NSFileProviderItemIdentifier . rootContainerDatabaseValue, lastModifiedDate: nil , statusCode: . isUploaded, cloudPath: CloudPath ( " /NewFileFromCloud " ) , isPlaceholderItem: false ) , domainIdentifier: . test) ]
287+
288+ let firstEnumerationItemList = try await taskExecutor. execute ( task: enumerationTask) . getValue ( )
289+ XCTAssertEqual ( 5 , firstEnumerationItemList. items. count)
290+ XCTAssertEqual ( expectedRootFolderFileProviderItems, firstEnumerationItemList. items)
291+ XCTAssertEqual ( 1 , self . itemEnumerationTaskManagerMock. removedTaskRecords. count)
292+ XCTAssert ( self . itemEnumerationTaskManagerMock. removedTaskRecords. contains ( where: { $0 == enumerationTaskRecord } ) )
301293
302- taskExecutor. execute ( task: enumerationTask) . then { fileProviderItemList -> Promise < FileProviderItemList > in
303- XCTAssertEqual ( 5 , fileProviderItemList. items. count)
304- XCTAssertEqual ( expectedRootFolderFileProviderItems. map ( \. filename) , fileProviderItemList. items. map ( \. filename) )
305- XCTAssertEqual ( expectedRootFolderFileProviderItems. map ( \. parentItemIdentifier) , fileProviderItemList. items. map ( \. parentItemIdentifier) )
306- XCTAssertEqual ( 1 , self . itemEnumerationTaskManagerMock. removedTaskRecords. count)
307- XCTAssert ( self . itemEnumerationTaskManagerMock. removedTaskRecords. contains ( where: { $0 == enumerationTaskRecord } ) )
308- self . cloudProviderMock. files [ " /File 1 " ] = nil
309- self . cloudProviderMock. files [ " /NewFileFromCloud " ] = Data ( " NewFileFromCloud content " . utf8)
310- let enumerationTaskRecord = ItemEnumerationTaskRecord ( correspondingItem: rootItemMetadata. id!, pageToken: nil )
311- let secondEnumerationTask = ItemEnumerationTask ( taskRecord: enumerationTaskRecord, itemMetadata: rootItemMetadata)
312- return taskExecutor. execute ( task: secondEnumerationTask)
313- } . then { fileProviderItemList in
314- XCTAssertEqual ( 2 , self . itemEnumerationTaskManagerMock. removedTaskRecords. count)
315- XCTAssertEqual ( 5 , fileProviderItemList. items. count)
316- XCTAssertEqual ( expectedChangedRootFolderFileProviderItems. map ( \. filename) , fileProviderItemList. items. map ( \. filename) )
317- XCTAssertEqual ( expectedChangedRootFolderFileProviderItems. map ( \. parentItemIdentifier) , fileProviderItemList. items. map ( \. parentItemIdentifier) )
318- } . catch { error in
319- XCTFail ( " Error in promise: \( error) " )
320- } . always {
321- expectation. fulfill ( )
322- }
323- }
324- wait ( for: [ expectation] , timeout: 5.0 )
294+ self . cloudProviderMock. files [ " /File 1 " ] = nil
295+ self . cloudProviderMock. files [ " /NewFileFromCloud " ] = Data ( " NewFileFromCloud content " . utf8)
296+ let secondEnumerationTaskRecord = ItemEnumerationTaskRecord ( correspondingItem: rootItemMetadata. id!, pageToken: nil )
297+ let secondEnumerationTask = ItemEnumerationTask ( taskRecord: secondEnumerationTaskRecord, itemMetadata: rootItemMetadata)
298+ let secondEnumerationItemList = try await taskExecutor. execute ( task: secondEnumerationTask) . getValue ( )
299+
300+ XCTAssertEqual ( 2 , self . itemEnumerationTaskManagerMock. removedTaskRecords. count)
301+ XCTAssertEqual ( 5 , secondEnumerationItemList. items. count)
302+ XCTAssertEqual ( expectedChangedRootFolderFileProviderItems, secondEnumerationItemList. items)
303+ } )
325304 }
326305
327306 func testFolderEnumerationPreservesUploadError( ) throws {
0 commit comments