fix: initialize dns provider just once at startup

This commit is contained in:
2025-04-25 21:30:28 +02:00
parent 4819f92569
commit a77e96be6e
2 changed files with 55 additions and 42 deletions

View File

@@ -2,15 +2,27 @@ package server_test
import (
"bytes"
"context" // Added for mock provider
"encoding/json"
"errors"
"net/http"
"net/http/httptest"
"testing"
"git.cloonar.com/cloonar/updns/internal/config"
"git.cloonar.com/cloonar/updns/internal/config" // Added for mock provider
"git.cloonar.com/cloonar/updns/internal/server"
"go.uber.org/zap" // Added for logger
)
// mockProvider is a simple mock for testing router logic without real provider interaction.
type mockProvider struct {
updateErr error // Allows simulating update errors
}
func (m *mockProvider) UpdateRecord(ctx context.Context, host, ip string) error {
return m.updateErr
}
func newTestConfig(provider string) *config.Config {
return &config.Config{
Server: config.ServerConfig{
@@ -32,7 +44,9 @@ func newTestConfig(provider string) *config.Config {
}
func TestMetricsEndpoint(t *testing.T) {
r := server.NewRouter(newTestConfig("unknown"))
logger := zap.NewNop()
mockProv := &mockProvider{}
r := server.NewRouter(newTestConfig("unknown"), logger, mockProv)
req := httptest.NewRequest("GET", "/metrics", nil)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
@@ -42,7 +56,9 @@ func TestMetricsEndpoint(t *testing.T) {
}
func TestUpdateInvalidJSON(t *testing.T) {
r := server.NewRouter(newTestConfig("unknown"))
logger := zap.NewNop()
mockProv := &mockProvider{}
r := server.NewRouter(newTestConfig("unknown"), logger, mockProv)
req := httptest.NewRequest("POST", "/update", bytes.NewBufferString("{invalid"))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
@@ -53,7 +69,9 @@ func TestUpdateInvalidJSON(t *testing.T) {
}
func TestUpdateUnauthorizedKey(t *testing.T) {
r := server.NewRouter(newTestConfig("unknown"))
logger := zap.NewNop()
mockProv := &mockProvider{}
r := server.NewRouter(newTestConfig("unknown"), logger, mockProv)
body := map[string]string{"key": "bad", "secret": "x", "host": "a.example.com"}
data, _ := json.Marshal(body)
req := httptest.NewRequest("POST", "/update", bytes.NewBuffer(data))
@@ -66,7 +84,9 @@ func TestUpdateUnauthorizedKey(t *testing.T) {
}
func TestUpdateHostForbidden(t *testing.T) {
r := server.NewRouter(newTestConfig("unknown"))
logger := zap.NewNop()
mockProv := &mockProvider{}
r := server.NewRouter(newTestConfig("unknown"), logger, mockProv)
body := map[string]string{"key": "client1", "secret": "s3cr3t", "host": "bad.example.com"}
data, _ := json.Marshal(body)
req := httptest.NewRequest("POST", "/update", bytes.NewBuffer(data))
@@ -78,8 +98,16 @@ func TestUpdateHostForbidden(t *testing.T) {
}
}
func TestUpdateProviderNotConfigured(t *testing.T) {
r := server.NewRouter(newTestConfig("unknown"))
// Note: This test case name is slightly misleading now. The router itself doesn't care
// about the provider name from config anymore, as the provider is passed in.
// The provider initialization logic is tested separately or in StartServer tests.
// We keep the test to ensure the update path works correctly when auth passes.
// If the *mock* provider returned an error, we'd get 500.
func TestUpdateProviderInteraction(t *testing.T) {
logger := zap.NewNop()
// Simulate a provider error
mockProv := &mockProvider{updateErr: errors.New("simulated provider update error")}
r := server.NewRouter(newTestConfig("hetzner"), logger, mockProv) // Config provider name doesn't matter here
body := map[string]string{"key": "client1", "secret": "s3cr3t", "host": "a.example.com"}
data, _ := json.Marshal(body)
req := httptest.NewRequest("POST", "/update", bytes.NewBuffer(data))
@@ -92,7 +120,9 @@ func TestUpdateProviderNotConfigured(t *testing.T) {
}
func TestUpdateSuccess(t *testing.T) {
r := server.NewRouter(newTestConfig("hetzner"))
logger := zap.NewNop()
mockProv := &mockProvider{} // No error for success case
r := server.NewRouter(newTestConfig("hetzner"), logger, mockProv)
body := map[string]string{"key": "client1", "secret": "s3cr3t", "host": "a.example.com", "ip": "1.2.3.4"}
data, _ := json.Marshal(body)
req := httptest.NewRequest("POST", "/update", bytes.NewBuffer(data))