From 5d5784f535e36aac9d89d76bf02e3025be5c7ba6 Mon Sep 17 00:00:00 2001 From: Yvan <8574526@qq,com> Date: Fri, 21 Aug 2026 22:54:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/integration/connectivity_test.go | 78 +++++++++++++++++++ internal/integration/websocket/server_test.go | 61 +++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 internal/integration/connectivity_test.go create mode 100644 internal/integration/websocket/server_test.go diff --git a/internal/integration/connectivity_test.go b/internal/integration/connectivity_test.go new file mode 100644 index 0000000..0528226 --- /dev/null +++ b/internal/integration/connectivity_test.go @@ -0,0 +1,78 @@ +package integration + +import ( + "encoding/json" + "strings" + "testing" + + "kra/internal/integration/runtimeconfig" +) + +func TestConnectivityTesterRestoreMaskedSecrets(t *testing.T) { + store := runtimeconfig.NewStore() + store.Set(runtimeconfig.Config{ + Kind: "mq", + Provider: "rabbitmq", + Enabled: true, + Values: json.RawMessage(`{"username":"stored-user","password":"stored-secret"}`), + }) + tester := NewConnectivityTester(store) + + t.Run("restores masked secret from active config", func(t *testing.T) { + values := map[string]any{ + "username": "candidate-user", + "password": "******", + } + + if err := tester.restoreMaskedSecrets(" MQ ", " RabbitMQ ", values); err != nil { + t.Fatalf("restoreMaskedSecrets() error = %v", err) + } + if got := values["password"]; got != "stored-secret" { + t.Fatalf("password = %q, want stored secret", got) + } + if got := values["username"]; got != "candidate-user" { + t.Fatalf("username = %q, want candidate value", got) + } + }) + + t.Run("keeps newly entered secret", func(t *testing.T) { + values := map[string]any{"password": "new-secret"} + + if err := tester.restoreMaskedSecrets("mq", "rabbitmq", values); err != nil { + t.Fatalf("restoreMaskedSecrets() error = %v", err) + } + if got := values["password"]; got != "new-secret" { + t.Fatalf("password = %q, want newly entered secret", got) + } + }) + + t.Run("does not treat non-secret fields as masked secrets", func(t *testing.T) { + values := map[string]any{ + "username": "******", + "password": "new-secret", + } + + if err := tester.restoreMaskedSecrets("mq", "rabbitmq", values); err != nil { + t.Fatalf("restoreMaskedSecrets() error = %v", err) + } + if got := values["username"]; got != "******" { + t.Fatalf("username = %q, want unchanged masked-looking value", got) + } + }) +} + +func TestConnectivityTesterRestoreMaskedSecretsRequiresStoredSecret(t *testing.T) { + tester := NewConnectivityTester(runtimeconfig.NewStore()) + values := map[string]any{"password": "******"} + + err := tester.restoreMaskedSecrets("mq", "rabbitmq", values) + if err == nil { + t.Fatal("restoreMaskedSecrets() error = nil, want missing secret error") + } + if !strings.Contains(err.Error(), "password") || !strings.Contains(err.Error(), "重新填写") { + t.Fatalf("restoreMaskedSecrets() error = %q, want actionable password message", err) + } + if got := values["password"]; got != "******" { + t.Fatalf("password = %q, want masked value left unchanged after error", got) + } +} diff --git a/internal/integration/websocket/server_test.go b/internal/integration/websocket/server_test.go new file mode 100644 index 0000000..40a5f6f --- /dev/null +++ b/internal/integration/websocket/server_test.go @@ -0,0 +1,61 @@ +package websocket + +import ( + "context" + "encoding/json" + "testing" + "time" +) + +func TestConfigCompletesLocalTemporaryHandshake(t *testing.T) { + tests := []struct { + name string + values map[string]any + }{ + { + name: "default origin policy", + values: map[string]any{ + "path": "/connection-test", + "write_wait": "1s", + "pong_wait": "2s", + "ping_period": "1s", + "max_message_size": 1024, + }, + }, + { + name: "configured origin", + values: map[string]any{ + "path": "/origin-test", + "allow_origins": []string{"https://admin.example.test"}, + "write_wait": "1s", + "pong_wait": "2s", + "ping_period": "1s", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + raw, err := json.Marshal(tt.values) + if err != nil { + t.Fatalf("json.Marshal() error = %v", err) + } + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + if err = TestConfig(ctx, raw); err != nil { + t.Fatalf("TestConfig() error = %v", err) + } + }) + } +} + +func TestConfigHonorsCanceledContextWithoutExternalAccess(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + err := TestConfig(ctx, json.RawMessage(`{"path":"/connection-test"}`)) + if err != context.Canceled { + t.Fatalf("TestConfig() error = %v, want context.Canceled", err) + } +}