@testable import Trio import XCTest final class SettingsExportTests: XCTestCase { func testCSVEscaping() { // Test CSV escaping functionality let testValue = "Test,Value\"With\nSpecial Characters" let escaped = csvEscape(testValue) let expected = "\"Test,Value\"\"With\nSpecial Characters\"" XCTAssertEqual(escaped, expected, "CSV escaping should handle commas, quotes, and newlines") } func testCSVEscapingSimple() { // Test simple values don't get escaped let testValue = "SimpleValue" let escaped = csvEscape(testValue) XCTAssertEqual(escaped, testValue, "Simple values should not be escaped") } func testExportCSVStructure() { // Test that the CSV has the expected header structure let expectedHeader = "Setting Category,Subcategory,Setting Name,Value,Unit" // This test would require mocking the settings manager and file storage // For now, we verify the header format is correct XCTAssertEqual(expectedHeader.components(separatedBy: ",").count, 5, "CSV header should have 5 columns") } func testExportErrorTypes() { // Test that our export error types are properly defined let documentError = Settings.StateModel.ExportError.documentsDirectoryNotFound XCTAssertNotNil(documentError.errorDescription, "Document error should have description") let writeError = Settings.StateModel.ExportError.fileWriteError(TestError.testError) XCTAssertNotNil(writeError.errorDescription, "Write error should have description") let unknownError = Settings.StateModel.ExportError.unknown("Test message") XCTAssertNotNil(unknownError.errorDescription, "Unknown error should have description") } func testExportFileNaming() { // Test that export files have the correct naming pattern let formatter = DateFormatter() formatter.dateFormat = "yyyyMMdd_HHmmss" let timestamp = formatter.string(from: Date()) let fileName = "TrioSettings_\(timestamp).csv" XCTAssertTrue(fileName.hasPrefix("TrioSettings_"), "File name should start with TrioSettings_") XCTAssertTrue(fileName.hasSuffix(".csv"), "File name should end with .csv") XCTAssertEqual(fileName.components(separatedBy: "_").count, 2, "File name should have one underscore") } // Helper function to test CSV escaping (extracted from Settings.StateModel) private func csvEscape(_ value: String) -> String { if value.contains(",") || value.contains("\"") || value.contains("\n") { return "\"\(value.replacingOccurrences(of: "\"", with: "\"\""))\"" } return value } }