diff --git a/Server/api/totp_handler_test.go b/Server/api/totp_handler_test.go index 1987eacc..2723c8b2 100644 --- a/Server/api/totp_handler_test.go +++ b/Server/api/totp_handler_test.go @@ -5,6 +5,7 @@ import ( "encoding/json" "net/http" "net/http/httptest" + "net/url" "testing" "time" @@ -418,25 +419,13 @@ func deleteWithToken(t *testing.T, router http.Handler, path, token string, body // extractSecretFromURI parses a TOTP otpauth:// URI and returns the secret parameter. func extractSecretFromURI(t *testing.T, uri string) string { t.Helper() - // URI format: otpauth://totp/OwnCord:username?secret=XXX&issuer=OwnCord - // Simple parse — find "secret=" and extract until next '&' or end. - const marker = "secret=" - idx := 0 - for i := 0; i+len(marker) <= len(uri); i++ { - if uri[i:i+len(marker)] == marker { - idx = i + len(marker) - break - } + u, err := url.Parse(uri) + if err != nil { + t.Fatalf("parse otpauth URI: %v", err) } - if idx == 0 { - t.Fatalf("no secret= found in URI: %s", uri) + s := u.Query().Get("secret") + if s == "" { + t.Fatalf("no secret param in URI: %s", uri) } - end := len(uri) - for i := idx; i < len(uri); i++ { - if uri[i] == '&' { - end = i - break - } - } - return uri[idx:end] + return s } diff --git a/Server/db/models_test.go b/Server/db/models_test.go index f7f67bd1..b0ad3c93 100644 --- a/Server/db/models_test.go +++ b/Server/db/models_test.go @@ -72,7 +72,9 @@ func TestRole_NilColor(t *testing.T) { data, _ := json.Marshal(role) var raw map[string]interface{} - json.Unmarshal(data, &raw) //nolint:errcheck + if err := json.Unmarshal(data, &raw); err != nil { + t.Fatalf("Unmarshal: %v", err) + } if raw["color"] != nil { t.Errorf("nil Color should serialize as null, got %v", raw["color"]) @@ -126,7 +128,9 @@ func TestChannel_OmitEmptyFields(t *testing.T) { data, _ := json.Marshal(ch) var raw map[string]json.RawMessage - json.Unmarshal(data, &raw) //nolint:errcheck + if err := json.Unmarshal(data, &raw); err != nil { + t.Fatalf("Unmarshal: %v", err) + } // voice_quality and mixing_threshold have omitempty — should be absent when nil. if _, ok := raw["voice_quality"]; ok { @@ -149,7 +153,9 @@ func TestVoiceState_JoinedAtOmittedFromJSON(t *testing.T) { data, _ := json.Marshal(vs) var raw map[string]json.RawMessage - json.Unmarshal(data, &raw) //nolint:errcheck + if err := json.Unmarshal(data, &raw); err != nil { + t.Fatalf("Unmarshal: %v", err) + } if _, ok := raw["JoinedAt"]; ok { t.Error("JoinedAt has json:\"-\" tag and should not appear in JSON output") @@ -164,7 +170,9 @@ func TestVoiceState_BoolDefaults(t *testing.T) { data, _ := json.Marshal(vs) var decoded db.VoiceState - json.Unmarshal(data, &decoded) //nolint:errcheck + if err := json.Unmarshal(data, &decoded); err != nil { + t.Fatalf("Unmarshal: %v", err) + } if decoded.Muted || decoded.Deafened || decoded.Speaking || decoded.Camera || decoded.Screenshare { t.Error("zero-value VoiceState bools should all be false") @@ -186,7 +194,9 @@ func TestMessageAPIResponse_JSONKeys(t *testing.T) { data, _ := json.Marshal(resp) var raw map[string]json.RawMessage - json.Unmarshal(data, &raw) //nolint:errcheck + if err := json.Unmarshal(data, &raw); err != nil { + t.Fatalf("Unmarshal: %v", err) + } required := []string{"id", "channel_id", "user", "content", "reply_to", "attachments", "reactions", "pinned", "edited_at", "deleted", "timestamp"} @@ -206,7 +216,9 @@ func TestAttachmentInfo_OmitsNilDimensions(t *testing.T) { data, _ := json.Marshal(att) var raw map[string]json.RawMessage - json.Unmarshal(data, &raw) //nolint:errcheck + if err := json.Unmarshal(data, &raw); err != nil { + t.Fatalf("Unmarshal: %v", err) + } if _, ok := raw["width"]; ok { t.Error("nil Width should be omitted") @@ -225,7 +237,9 @@ func TestAttachmentInfo_IncludesDimensions(t *testing.T) { data, _ := json.Marshal(att) var raw map[string]json.RawMessage - json.Unmarshal(data, &raw) //nolint:errcheck + if err := json.Unmarshal(data, &raw); err != nil { + t.Fatalf("Unmarshal: %v", err) + } if _, ok := raw["width"]; !ok { t.Error("non-nil Width should be present") @@ -242,7 +256,9 @@ func TestUserPublic_OmitsNilAvatar(t *testing.T) { data, _ := json.Marshal(u) var raw map[string]json.RawMessage - json.Unmarshal(data, &raw) //nolint:errcheck + if err := json.Unmarshal(data, &raw); err != nil { + t.Fatalf("Unmarshal: %v", err) + } if _, ok := raw["avatar"]; ok { t.Error("nil Avatar should be omitted") @@ -255,7 +271,9 @@ func TestUserPublic_IncludesAvatar(t *testing.T) { data, _ := json.Marshal(u) var raw map[string]json.RawMessage - json.Unmarshal(data, &raw) //nolint:errcheck + if err := json.Unmarshal(data, &raw); err != nil { + t.Fatalf("Unmarshal: %v", err) + } if _, ok := raw["avatar"]; !ok { t.Error("non-nil Avatar should be present") @@ -299,7 +317,9 @@ func TestAuditEntry_JSONKeys(t *testing.T) { data, _ := json.Marshal(entry) var raw map[string]json.RawMessage - json.Unmarshal(data, &raw) //nolint:errcheck + if err := json.Unmarshal(data, &raw); err != nil { + t.Fatalf("Unmarshal: %v", err) + } required := []string{"id", "actor_id", "actor_name", "action", "target_type", "target_id", "detail", "created_at"} for _, k := range required {