63 lines
3.3 KiB
Swift
63 lines
3.3 KiB
Swift
import Foundation
|
|
|
|
@main
|
|
struct ExpensePreviewTests {
|
|
static func rejects(_ action: () throws -> Void) {
|
|
do {
|
|
try action()
|
|
preconditionFailure("Unexpected success")
|
|
} catch {
|
|
precondition(!error.localizedDescription.isEmpty)
|
|
}
|
|
}
|
|
|
|
static func main() throws {
|
|
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
|
|
try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true)
|
|
defer { try? FileManager.default.removeItem(at: root) }
|
|
let source = root.appendingPathComponent("组 模板.XLSX")
|
|
let data = Data("test worksheet bytes".utf8)
|
|
try data.write(to: source)
|
|
let accepted = try ExpenseTemplateImportSource.validate([source])
|
|
precondition(accepted == source)
|
|
rejects { _ = try ExpenseTemplateImportSource.validate([]) }
|
|
rejects { _ = try ExpenseTemplateImportSource.validate([source, source]) }
|
|
rejects { _ = try ExpenseTemplateImportSource.validate([root]) }
|
|
rejects { _ = try ExpenseTemplateImportSource.validate([URL(string: "https://example.invalid/template.xlsx")!]) }
|
|
rejects { _ = try ExpenseTemplateImportSource.validate([root.appendingPathComponent("missing.xlsx")]) }
|
|
let empty = root.appendingPathComponent("empty.xlsx")
|
|
try Data().write(to: empty)
|
|
rejects { _ = try ExpenseTemplateImportSource.validate([empty]) }
|
|
let oldFormat = root.appendingPathComponent("old.xls")
|
|
try data.write(to: oldFormat)
|
|
rejects { _ = try ExpenseTemplateImportSource.validate([oldFormat]) }
|
|
let oversized = root.appendingPathComponent("large.xlsx")
|
|
try Data(count: 20 * 1024 * 1024 + 1).write(to: oversized)
|
|
rejects { _ = try ExpenseTemplateImportSource.validate([oversized]) }
|
|
let request: [String: Any] = ["purpose": "交通", "amount": "100.30", "payee": ["recipient": "测试"]]
|
|
let preview = PreparedExpensePreview(file: source, requestDigest: try PreparedExpensePreview.digest(request),
|
|
fileDigest: ExpenseTemplateStorage.fingerprint(data), templateName: "测试",
|
|
uncalculatedCells: [])
|
|
let verified = try preview.verifiedData(request: request)
|
|
precondition(verified == data)
|
|
var changed = request
|
|
changed["destination"] = "/different/output.xlsx"
|
|
let relocated = try preview.verifiedData(request: changed)
|
|
precondition(relocated == data)
|
|
changed["payee"] = ["recipient": "新收款人"]
|
|
rejects { _ = try preview.verifiedData(request: changed) }
|
|
changed = request
|
|
changed["amount"] = "444.00"
|
|
rejects { _ = try preview.verifiedData(request: changed) }
|
|
changed = request
|
|
changed["templateMapping"] = ["purpose": "D"]
|
|
rejects { _ = try preview.verifiedData(request: changed) }
|
|
try Data("changed file".utf8).write(to: source)
|
|
rejects { _ = try preview.verifiedData(request: request) }
|
|
preview.remove()
|
|
precondition(!FileManager.default.fileExists(atPath: source.path))
|
|
rejects { _ = try preview.verifiedData(request: request) }
|
|
print("Template drop validation, preview identity, stale input and temporary cleanup tests passed")
|
|
}
|
|
}
|