@@ -82,4 +82,145 @@ final class LogTableHelperTests: XCTestCase {
8282 XCTAssertEqual(levelColor(for: "unknown"), .primary)
8383 XCTAssertEqual(levelColor(for: ""), .primary)
8484 }
85+
86+ // MARK: - parseSeverity
87+
88+ func testParseSeverityFatal() {
89+ XCTAssertEqual(parseSeverity(from: "fatal"), .fatal)
90+ XCTAssertEqual(parseSeverity(from: "CRITICAL"), .fatal)
91+ XCTAssertEqual(parseSeverity(from: "panic"), .fatal)
92+ XCTAssertEqual(parseSeverity(from: "emerg"), .fatal)
93+ XCTAssertEqual(parseSeverity(from: "EMERGENCY"), .fatal)
94+ XCTAssertEqual(parseSeverity(from: "alert"), .fatal)
95+ XCTAssertEqual(parseSeverity(from: "crit"), .fatal)
96+ }
97+
98+ func testParseSeverityError() {
99+ XCTAssertEqual(parseSeverity(from: "error"), .error)
100+ XCTAssertEqual(parseSeverity(from: "ERROR"), .error)
101+ XCTAssertEqual(parseSeverity(from: "err"), .error)
102+ XCTAssertEqual(parseSeverity(from: "failure"), .error)
103+ XCTAssertEqual(parseSeverity(from: "FAIL"), .error)
104+ XCTAssertEqual(parseSeverity(from: "severe"), .error)
105+ }
106+
107+ func testParseSeverityWarning() {
108+ XCTAssertEqual(parseSeverity(from: "warn"), .warning)
109+ XCTAssertEqual(parseSeverity(from: "WARNING"), .warning)
110+ XCTAssertEqual(parseSeverity(from: "caution"), .warning)
111+ }
112+
113+ func testParseSeverityInfo() {
114+ XCTAssertEqual(parseSeverity(from: "info"), .info)
115+ XCTAssertEqual(parseSeverity(from: "INFO"), .info)
116+ XCTAssertEqual(parseSeverity(from: "information"), .info)
117+ XCTAssertEqual(parseSeverity(from: "informational"), .info)
118+ XCTAssertEqual(parseSeverity(from: "notice"), .info)
119+ }
120+
121+ func testParseSeverityDebug() {
122+ XCTAssertEqual(parseSeverity(from: "debug"), .debug)
123+ XCTAssertEqual(parseSeverity(from: "DEBUG"), .debug)
124+ XCTAssertEqual(parseSeverity(from: "dbg"), .debug)
125+ XCTAssertEqual(parseSeverity(from: "verbose"), .debug)
126+ }
127+
128+ func testParseSeverityTrace() {
129+ XCTAssertEqual(parseSeverity(from: "trace"), .trace)
130+ XCTAssertEqual(parseSeverity(from: "TRACE"), .trace)
131+ XCTAssertEqual(parseSeverity(from: "finest"), .trace)
132+ XCTAssertEqual(parseSeverity(from: "finer"), .trace)
133+ XCTAssertEqual(parseSeverity(from: "fine"), .trace)
134+ XCTAssertEqual(parseSeverity(from: "all"), .trace)
135+ }
136+
137+ func testParseSeverityNumericSyslog() {
138+ // RFC 5424 severity codes
139+ XCTAssertEqual(parseSeverity(from: "0"), .fatal) // Emergency
140+ XCTAssertEqual(parseSeverity(from: "1"), .fatal) // Alert
141+ XCTAssertEqual(parseSeverity(from: "2"), .fatal) // Critical
142+ XCTAssertEqual(parseSeverity(from: "3"), .error) // Error
143+ XCTAssertEqual(parseSeverity(from: "4"), .warning) // Warning
144+ XCTAssertEqual(parseSeverity(from: "5"), .info) // Notice
145+ XCTAssertEqual(parseSeverity(from: "6"), .info) // Informational
146+ XCTAssertEqual(parseSeverity(from: "7"), .debug) // Debug
147+ }
148+
149+ func testParseSeverityUnknown() {
150+ XCTAssertEqual(parseSeverity(from: ""), .unknown)
151+ XCTAssertEqual(parseSeverity(from: "something"), .unknown)
152+ XCTAssertEqual(parseSeverity(from: "99"), .unknown)
153+ }
154+
155+ func testParseSeverityWhitespace() {
156+ XCTAssertEqual(parseSeverity(from: " error "), .error)
157+ XCTAssertEqual(parseSeverity(from: " WARN "), .warning)
158+ }
159+
160+ // MARK: - extractSeverity
161+
162+ func testExtractSeverityFromLevelColumn() {
163+ let record: LogRecord = ["level": .string("error"), "message": .string("boom")]
164+ XCTAssertEqual(extractSeverity(from: record), .error)
165+ }
166+
167+ func testExtractSeverityFromSeverityColumn() {
168+ let record: LogRecord = ["severity": .string("warning"), "msg": .string("watch out")]
169+ XCTAssertEqual(extractSeverity(from: record), .warning)
170+ }
171+
172+ func testExtractSeverityFromSeverityTextColumn() {
173+ let record: LogRecord = ["severity_text": .string("FATAL")]
174+ XCTAssertEqual(extractSeverity(from: record), .fatal)
175+ }
176+
177+ func testExtractSeverityFromLogLevelColumn() {
178+ let record: LogRecord = ["log_level": .string("info")]
179+ XCTAssertEqual(extractSeverity(from: record), .info)
180+ }
181+
182+ func testExtractSeverityFromNumericValue() {
183+ let record: LogRecord = ["priority": .int(3)]
184+ XCTAssertEqual(extractSeverity(from: record), .error)
185+ }
186+
187+ func testExtractSeverityNoSeverityColumn() {
188+ let record: LogRecord = ["message": .string("hello"), "timestamp": .string("now")]
189+ XCTAssertEqual(extractSeverity(from: record), .unknown)
190+ }
191+
192+ func testExtractSeverityUnrecognizedValue() {
193+ let record: LogRecord = ["level": .string("custom_level")]
194+ XCTAssertEqual(extractSeverity(from: record), .unknown)
195+ }
196+
197+ // MARK: - severityRowTint
198+
199+ func testSeverityRowTintFatalReturnsColor() {
200+ XCTAssertNotNil(severityRowTint(for: .fatal))
201+ }
202+
203+ func testSeverityRowTintErrorReturnsColor() {
204+ XCTAssertNotNil(severityRowTint(for: .error))
205+ }
206+
207+ func testSeverityRowTintWarningReturnsColor() {
208+ XCTAssertNotNil(severityRowTint(for: .warning))
209+ }
210+
211+ func testSeverityRowTintInfoReturnsNil() {
212+ XCTAssertNil(severityRowTint(for: .info))
213+ }
214+
215+ func testSeverityRowTintDebugReturnsNil() {
216+ XCTAssertNil(severityRowTint(for: .debug))
217+ }
218+
219+ func testSeverityRowTintTraceReturnsNil() {
220+ XCTAssertNil(severityRowTint(for: .trace))
221+ }
222+
223+ func testSeverityRowTintUnknownReturnsNil() {
224+ XCTAssertNil(severityRowTint(for: .unknown))
225+ }
85226}