twonly-app-dependencies/camera_avfoundation/darwin/Tests/SavePhotoDelegateTests.swift
2026-10-07 22:18:23 +02:00

99 lines
3.6 KiB
Swift

// Copyright 2013 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import AVFoundation
import XCTest
@testable import camera_avfoundation
final class SavePhotoDelegateTests: XCTestCase {
func testHandlePhotoCaptureResult_mustCompleteWithErrorIfFailedToCapture() {
let completionExpectation = expectation(
description: "Must complete with error if failed to capture photo.")
let captureError = NSError(domain: "test", code: 0, userInfo: nil)
let ioQueue = DispatchQueue(label: "test")
let delegate = SavePhotoDelegate(path: "test", ioQueue: ioQueue) { path, error in
XCTAssertEqual(captureError, error as NSError?)
XCTAssertNil(path)
completionExpectation.fulfill()
}
delegate.handlePhotoCaptureResult(error: captureError) { nil }
waitForExpectations(timeout: 30, handler: nil)
}
func testHandlePhotoCaptureResult_mustCompleteWithErrorIfFailedToWrite() {
let completionExpectation = expectation(
description: "Must complete with error if failed to write file.")
let ioQueue = DispatchQueue(label: "test")
let ioError = NSError(
domain: "IOError", code: 0, userInfo: [NSLocalizedDescriptionKey: "Localized IO Error"])
let delegate = SavePhotoDelegate(path: "test", ioQueue: ioQueue) { path, error in
XCTAssertEqual(ioError, error as NSError?)
XCTAssertNil(path)
completionExpectation.fulfill()
}
let mockWritableData = MockWritableData()
mockWritableData.writeToFileStub = { path, options in
throw ioError
}
delegate.handlePhotoCaptureResult(error: nil) { mockWritableData }
waitForExpectations(timeout: 30, handler: nil)
}
func testHandlePhotoCaptureResult_mustCompleteWithFilePathIfSuccessToWrite() {
let completionExpectation = expectation(
description: "Must complete with file path if succeeds to write file.")
let ioQueue = DispatchQueue(label: "test")
let filePath = "test"
let delegate = SavePhotoDelegate(path: filePath, ioQueue: ioQueue) { path, error in
XCTAssertNil(error)
XCTAssertEqual(filePath, path)
completionExpectation.fulfill()
}
let mockWritableData = MockWritableData()
mockWritableData.writeToFileStub = { path, options in }
delegate.handlePhotoCaptureResult(error: nil) { mockWritableData }
waitForExpectations(timeout: 30, handler: nil)
}
func testHandlePhotoCaptureResult_bothProvideDataAndSaveFileMustRunOnIOQueue() {
let dataProviderQueueExpectation = expectation(
description: "Data provider must run on io queue.")
let writeFileQueueExpectation = expectation(description: "File writing must run on io queue.")
let completionExpectation = expectation(
description: "Must complete with file path if success to write file.")
let ioQueue = DispatchQueue(label: "test")
let ioQueueSpecific = DispatchSpecificKey<Void>()
ioQueue.setSpecific(key: ioQueueSpecific, value: ())
let mockWritableData = MockWritableData()
mockWritableData.writeToFileStub = { path, options in
if DispatchQueue.getSpecific(key: ioQueueSpecific) != nil {
writeFileQueueExpectation.fulfill()
}
}
let filePath = "test"
let delegate = SavePhotoDelegate(path: filePath, ioQueue: ioQueue) { path, error in
completionExpectation.fulfill()
}
delegate.handlePhotoCaptureResult(error: nil) {
if DispatchQueue.getSpecific(key: ioQueueSpecific) != nil {
dataProviderQueueExpectation.fulfill()
}
return mockWritableData
}
waitForExpectations(timeout: 30, handler: nil)
}
}