All checks were successful
check / check (push) Successful in 3s
Updates golangci-lint to v2.12.2 and sets `.golangci.yml` to the org-standard v2-schema config already deployed across the org's repos. The config change is owner-authorized (see #96 (comment) and #96 (comment)); the same file is being landed as canonical via prompts PR #24 (sneak/prompts#24). ## Changes - **Commit-pinned installs**: golangci-lint pinned to commit `c0d3ddc9cf3faa61a4e378e879ece580256d76e5` (v2.12.2, released 2026-05-06) in `Dockerfile` and `script/bootstrap`. - **`.golangci.yml` set to the org-standard v2 config** (sha256 `021cc83f4e6fc7c31b95b34b846723dfcf20b66b7baeea1dc40406e643346bcb`), byte-identical to the file used across the org's other repos. Settings live under `linters.settings`, so the `lll`/`funlen`/`cyclop`/`dupl` thresholds are actually applied (under the old hybrid file, v2 silently ignored the top-level `linters-settings` block). - **Lint fixes** required by the now-active thresholds: - `goconst`: shared constants for repeated status/priority/DNS-fixture strings in `internal/watcher/watcher.go` and the notify, state, and watcher tests - `dupl`: consolidated duplicated ntfy/slack HTTP-error tests and SendNotification endpoint-error tests behind shared helpers in `internal/notify/delivery_test.go` - `lll`: wrapped long test table entries and comments in `internal/config/classify_test.go`, `internal/notify/history_test.go`, `internal/state/state_test.go`, `internal/watcher/watcher_test.go`; shortened one inline nolint justification in `internal/notify/retry.go` - **`TODO.md`**: Completed Steps entry updated in the same commit. - Rebased onto current `main` (`f79cd98`); the branch is one clean commit. ## Notes - v2.12 deprecates the `gomodguard` linter in favor of `gomodguard_v2`. The org-standard config does not disable the deprecated linter, so golangci-lint may emit an informational deprecation warning; this is accepted by the owner and does not affect the exit status (this exact config+code combination was CI-green at `dea7e44`). ## Verification - `make check` exits 0 (fmt-check, tests, lint) - `make lint`: 0 issues; no deprecation warning surfaced in the runs performed - sha256 of `.golangci.yml` at HEAD verified equal to `021cc83f4e6fc7c31b95b34b846723dfcf20b66b7baeea1dc40406e643346bcb` Co-authored-by: sneak <sneak@sneak.berlin> Reviewed-on: #96 Co-authored-by: clawbot <clawbot@noreply.example.org> Co-committed-by: clawbot <clawbot@noreply.example.org>
104 lines
2.2 KiB
Go
104 lines
2.2 KiB
Go
package config_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"sneak.berlin/go/dnswatcher/internal/config"
|
|
)
|
|
|
|
func TestClassifyDNSName(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
want config.DNSNameType
|
|
wantErr bool
|
|
}{
|
|
{name: "apex domain simple", input: "example.com", want: config.DNSNameTypeDomain},
|
|
{name: "hostname simple", input: "www.example.com", want: config.DNSNameTypeHostname},
|
|
{
|
|
name: "apex domain multi-part TLD",
|
|
input: "example.co.uk",
|
|
want: config.DNSNameTypeDomain,
|
|
},
|
|
{
|
|
name: "hostname multi-part TLD",
|
|
input: "api.example.co.uk",
|
|
want: config.DNSNameTypeHostname,
|
|
},
|
|
{name: "public suffix itself", input: "co.uk", wantErr: true},
|
|
{name: "empty string", input: "", wantErr: true},
|
|
{
|
|
name: "deeply nested hostname",
|
|
input: "a.b.c.example.com",
|
|
want: config.DNSNameTypeHostname,
|
|
},
|
|
{
|
|
name: "trailing dot stripped",
|
|
input: "example.com.",
|
|
want: config.DNSNameTypeDomain,
|
|
},
|
|
{
|
|
name: "uppercase normalized",
|
|
input: "WWW.Example.COM",
|
|
want: config.DNSNameTypeHostname,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
got, err := config.ClassifyDNSName(tt.input)
|
|
|
|
if tt.wantErr {
|
|
if err == nil {
|
|
t.Errorf("ClassifyDNSName(%q) expected error, got %v", tt.input, got)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
if err != nil {
|
|
t.Fatalf("ClassifyDNSName(%q) unexpected error: %v", tt.input, err)
|
|
}
|
|
|
|
if got != tt.want {
|
|
t.Errorf("ClassifyDNSName(%q) = %v, want %v", tt.input, got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestClassifyTargets(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
domains, hostnames, err := config.ClassifyTargets([]string{
|
|
"example.com",
|
|
"www.example.com",
|
|
"example.co.uk",
|
|
"api.example.co.uk",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
|
|
if len(domains) != 2 {
|
|
t.Errorf("expected 2 domains, got %d: %v", len(domains), domains)
|
|
}
|
|
|
|
if len(hostnames) != 2 {
|
|
t.Errorf("expected 2 hostnames, got %d: %v", len(hostnames), hostnames)
|
|
}
|
|
}
|
|
|
|
func TestClassifyTargetsRejectsPublicSuffix(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
_, _, err := config.ClassifyTargets([]string{"co.uk"})
|
|
if err == nil {
|
|
t.Error("expected error for public suffix, got nil")
|
|
}
|
|
}
|