import Testing import Foundation #if os(iOS) import UIKit #else import AppKit #endif @testable import bitchat private func makeTemporaryFileURL(_ name: String) -> URL { FileManager.default.temporaryDirectory.appendingPathComponent(name) } private func makeTemporaryDirectoryURL(_ name: String) -> URL { FileManager.default.temporaryDirectory.appendingPathComponent(name, isDirectory: true) } #if os(iOS) private func makePlatformImage(size: CGSize) -> UIImage { UIGraphicsImageRenderer(size: size).image { context in UIColor.systemTeal.setFill() context.fill(CGRect(origin: .zero, size: size)) } } #else private func makePlatformImage(size: CGSize) -> NSImage { let image = NSImage(size: size) image.lockFocus() NSColor.systemTeal.setFill() NSBezierPath(rect: CGRect(origin: .zero, size: size)).fill() image.unlockFocus() return image } #endif struct ImageUtilsTests { @Test func processImage_rejectsOversizedSourceFile() throws { let url = makeTemporaryFileURL("image-too-large.bin") try Data(repeating: 0xFF, count: 10 * 1024 * 1024 + 1).write(to: url, options: .atomic) defer { try? FileManager.default.removeItem(at: url) } #expect(throws: ImageUtilsError.self) { try ImageUtils.processImage(at: url) } } @Test func processImage_rejectsInvalidImageData() throws { let url = makeTemporaryFileURL("image-invalid.bin") try Data("not-an-image".utf8).write(to: url, options: .atomic) defer { try? FileManager.default.removeItem(at: url) } #expect(throws: ImageUtilsError.self) { try ImageUtils.processImage(at: url) } } @Test func processImage_writesCompressedJpeg() throws { let image = makePlatformImage(size: CGSize(width: 1024, height: 768)) let outputDirectory = makeTemporaryDirectoryURL("image-output-\(UUID().uuidString)") defer { try? FileManager.default.removeItem(at: outputDirectory) } let outputURL = try ImageUtils.processImage(image, maxDimension: 256, outputDirectory: outputDirectory) let data = try Data(contentsOf: outputURL) #expect(outputURL.deletingLastPathComponent() == outputDirectory) #expect(outputURL.pathExtension.lowercased() == "jpg") #expect(data.starts(with: Data([0xFF, 0xD8]))) #expect(data.count > 0) } @Test func processImage_usesUniqueOutputURLs() throws { let image = makePlatformImage(size: CGSize(width: 64, height: 64)) let outputDirectory = makeTemporaryDirectoryURL("image-output-\(UUID().uuidString)") defer { try? FileManager.default.removeItem(at: outputDirectory) } let firstURL = try ImageUtils.processImage(image, maxDimension: 64, outputDirectory: outputDirectory) let secondURL = try ImageUtils.processImage(image, maxDimension: 64, outputDirectory: outputDirectory) #expect(firstURL != secondURL) #expect(FileManager.default.fileExists(atPath: firstURL.path)) #expect(FileManager.default.fileExists(atPath: secondURL.path)) } }