From c7ef0b112137bb48d6c04ce6ea270c690745c698 Mon Sep 17 00:00:00 2001 From: Amir Raminfar Date: Sat, 23 May 2026 13:56:45 -0700 Subject: [PATCH] test(level-guesser): guard colon-prefix against false positives Require a word char before the colon so the tagged form only fires on ": " (z2m) and not on bare ":level" in URLs. Add negative tests covering level words embedded in prose and URLs. Co-Authored-By: Claude Opus 4.7 (1M context) --- internal/container/level_guesser.go | 4 ++-- internal/container/level_guesser_test.go | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/internal/container/level_guesser.go b/internal/container/level_guesser.go index 2dcdc9ed..e65e1c0a 100644 --- a/internal/container/level_guesser.go +++ b/internal/container/level_guesser.go @@ -29,7 +29,7 @@ var aliasToCanonical = map[string]string{} // (?i:^[^a-z] // plain prefix: "error: ..." // |\[ ? ?\] // bracketed: "[ERROR]" / "[ error ]" // | [/|:-] // separator: " error|", " info:" (z2m) -// |:\s) // colon prefix: "Tag:info " (z2m) +// |\w:\s) // tagged: "Zigbee2MQTT:info " (z2m) // |"" // quoted: "\"ERROR\"" // |\s\s // spaced: " ERROR " // @@ -62,7 +62,7 @@ func init() { `(?i:^` + alt + `[^a-z]` + `|\[ ?` + alt + ` ?\]` + `| ` + alt + `[/|:-]` + - `|:` + alt + `\s)` + + `|\w:` + alt + `\s)` + `|"` + upper + `"` + `|\s` + upper + `\s`, ) diff --git a/internal/container/level_guesser_test.go b/internal/container/level_guesser_test.go index b0b406f2..93376e32 100644 --- a/internal/container/level_guesser_test.go +++ b/internal/container/level_guesser_test.go @@ -94,6 +94,10 @@ func TestGuessLogLevel(t *testing.T) { {"Zigbee2MQTT:info 2025-12-22 12:00:00: started", "info"}, {"Zigbee2MQTT:warn 2025-12-22 12:00:00: queue full", "warn"}, {"Zigbee2MQTT:error 2025-12-22 12:00:00: failure", "error"}, + // False-positive guards: level words embedded in prose or URLs must not match. + {"there was an error in the connection info report", "unknown"}, + {"user information saved successfully", "unknown"}, + {"GET https://example.com/info returned 200", "unknown"}, // Pipe-delimited {"2024-01-01 12:00:00 | ERROR | something went wrong", "error"}, {"2024-01-01 12:00:00 | INFO | starting up", "info"},