RadrootsCaptureIntakeTestingTests.swift (4537B)
1 import Foundation 2 import Testing 3 import RadrootsKit 4 import RadrootsKitTesting 5 6 @Test func fakeMediaPickerReturnsConfiguredSupportAndResults() async throws { 7 let asset = try testMediaAsset() 8 let importResult = try RadrootsMediaImportResult(items: [asset]) 9 let captureResult = RadrootsMediaCaptureResult(item: asset) 10 let picker = RadrootsFakeMediaPicker( 11 support: try RadrootsMediaPickerSupport( 12 importAvailable: true, 13 cameraCaptureAvailable: true, 14 supportedImportKinds: [.image], 15 supportedCaptureKinds: [.image], 16 multipleSelectionSupported: true 17 ), 18 importOutcome: .success(importResult), 19 captureOutcome: .success(captureResult) 20 ) 21 let importRequest = try RadrootsMediaImportRequest(selectionLimit: 1) 22 let captureRequest = try RadrootsMediaCaptureRequest() 23 24 #expect(try await picker.currentSupport().supportedImportKinds == [.image]) 25 #expect(try await picker.importMedia(importRequest) == importResult) 26 #expect(try await picker.captureMedia(captureRequest) == captureResult) 27 #expect(await picker.supportRequestCount == 1) 28 #expect(await picker.importRequestCount == 1) 29 #expect(await picker.captureRequestCount == 1) 30 #expect(await picker.lastImportRequest == importRequest) 31 #expect(await picker.lastCaptureRequest == captureRequest) 32 } 33 34 @Test func fakeMediaPickerReturnsTypedFailures() async throws { 35 let asset = try testMediaAsset() 36 let picker = RadrootsFakeMediaPicker( 37 support: try RadrootsMediaPickerSupport( 38 importAvailable: true, 39 cameraCaptureAvailable: true, 40 supportedImportKinds: [.image], 41 supportedCaptureKinds: [.image], 42 multipleSelectionSupported: false 43 ), 44 importOutcome: .failure(.userCancelled("media import was cancelled")), 45 captureOutcome: .success(RadrootsMediaCaptureResult(item: asset)) 46 ) 47 48 await #expect(throws: RadrootsCaptureIntakeError.userCancelled("media import was cancelled")) { 49 _ = try await picker.importMedia(try RadrootsMediaImportRequest()) 50 } 51 52 await picker.setCaptureOutcome(.failure(.permissionDenied("camera access is denied"))) 53 54 await #expect(throws: RadrootsCaptureIntakeError.permissionDenied("camera access is denied")) { 55 _ = try await picker.captureMedia(try RadrootsMediaCaptureRequest()) 56 } 57 } 58 59 @Test func fakeDocumentScannerReturnsConfiguredSupportAndResults() async throws { 60 let document = try testScannedDocument() 61 let scanner = RadrootsFakeDocumentScanner( 62 support: try RadrootsDocumentScannerSupport( 63 interactiveScanAvailable: true, 64 multiPageSupported: true, 65 supportedOutputKinds: [.pdf] 66 ), 67 scanOutcome: .success(document) 68 ) 69 let request = RadrootsDocumentScanRequest() 70 71 #expect(try await scanner.currentSupport().supportedOutputKinds == [.pdf]) 72 #expect(try await scanner.scanDocument(request) == document) 73 #expect(await scanner.supportRequestCount == 1) 74 #expect(await scanner.scanRequestCount == 1) 75 #expect(await scanner.lastScanRequest == request) 76 } 77 78 @Test func fakeDocumentScannerReturnsTypedFailures() async throws { 79 let scanner = RadrootsFakeDocumentScanner( 80 support: try RadrootsDocumentScannerSupport( 81 interactiveScanAvailable: false, 82 multiPageSupported: false, 83 supportedOutputKinds: [] 84 ), 85 scanOutcome: .failure(.unavailable("document scanner unavailable")) 86 ) 87 88 await #expect(throws: RadrootsCaptureIntakeError.unavailable("document scanner unavailable")) { 89 _ = try await scanner.scanDocument(RadrootsDocumentScanRequest()) 90 } 91 } 92 93 private func testMediaAsset() throws -> RadrootsMediaAsset { 94 try RadrootsMediaAsset( 95 source: .libraryImport, 96 kind: .image, 97 file: RadrootsFileReference(scope: .temporary, relativePath: "capture/photo.jpg"), 98 mediaType: "image/jpeg", 99 suggestedFilename: "photo.jpg", 100 sizeBytes: 12, 101 capturedAt: Date(timeIntervalSince1970: 10) 102 ) 103 } 104 105 private func testScannedDocument() throws -> RadrootsScannedDocument { 106 try RadrootsScannedDocument( 107 file: RadrootsFileReference(scope: .temporary, relativePath: "capture/scan.pdf"), 108 outputKind: .pdf, 109 suggestedFilename: "scan.pdf", 110 mediaType: "application/pdf", 111 pageCount: 2, 112 sizeBytes: 2048, 113 capturedAt: Date(timeIntervalSince1970: 11) 114 ) 115 }