45 lines
1.3 KiB
Go
45 lines
1.3 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// The readiness probe is unauthenticated. MongoDB's driver errors embed the
|
|
// topology — host, port, and, when the connection string carries them,
|
|
// credentials — so the raw error must never reach the response body.
|
|
func TestReadinessDoesNotEchoDependencyErrorText(t *testing.T) {
|
|
secret := "mongodb://relata:sup3rs3cr3t@db.internal:27017/relata?authSource=admin"
|
|
h := &HealthChecker{
|
|
Mongo: func(context.Context) error {
|
|
return fmt.Errorf("server selection error: current topology: { Servers: [{ Addr: %s }] }", secret)
|
|
},
|
|
Version: "test",
|
|
Started: time.Now(),
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
h.Ready(w, httptest.NewRequest(http.MethodGet, "/health/ready", nil))
|
|
body := w.Body.String()
|
|
|
|
for _, leak := range []string{"sup3rs3cr3t", "db.internal", "27017", "authSource", "topology"} {
|
|
if strings.Contains(body, leak) {
|
|
t.Fatalf("readiness response leaks %q from the driver error:\n%s", leak, body)
|
|
}
|
|
}
|
|
|
|
// It must still report the failure clearly.
|
|
if w.Code != http.StatusServiceUnavailable {
|
|
t.Fatalf("status = %d, want %d when a required dependency is down",
|
|
w.Code, http.StatusServiceUnavailable)
|
|
}
|
|
if !strings.Contains(body, "unavailable") {
|
|
t.Fatalf("readiness hid the failure entirely:\n%s", body)
|
|
}
|
|
}
|