Skip to content

Commit 208e15e

Browse files
committed
Fix ItemEnumerationTaskTests
1 parent 35dc653 commit 208e15e

1 file changed

Lines changed: 64 additions & 85 deletions

File tree

CryptomatorFileProviderTests/Middleware/TaskExecutor/ItemEnumerationTaskTests.swift

Lines changed: 64 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)