lego/providers/dns/liquidweb/liquidweb_test.go
2023-10-31 14:08:50 +01:00

290 lines
6.2 KiB
Go

package liquidweb
import (
"testing"
"time"
"github.com/go-acme/lego/v4/platform/tester"
"github.com/liquidweb/liquidweb-go/network"
"github.com/stretchr/testify/require"
)
const envDomain = envNamespace + "DOMAIN"
var envTest = tester.NewEnvTest(
EnvURL,
EnvUsername,
EnvPassword,
EnvZone).
WithDomain(envDomain)
func setupTest(t *testing.T, initRecs ...network.DNSRecord) *DNSProvider {
t.Helper()
serverURL := mockAPIServer(t, initRecs)
config := NewDefaultConfig()
config.Username = "blars"
config.Password = "tacoman"
config.BaseURL = serverURL
provider, err := NewDNSProviderConfig(config)
require.NoError(t, err)
return provider
}
func TestNewDNSProvider(t *testing.T) {
testCases := []struct {
desc string
envVars map[string]string
expected string
}{
{
desc: "minimum-success",
envVars: map[string]string{
EnvUsername: "blars",
EnvPassword: "tacoman",
},
},
{
desc: "set-everything",
envVars: map[string]string{
EnvURL: "https://storm.com",
EnvUsername: "blars",
EnvPassword: "tacoman",
EnvZone: "blars.com",
},
},
{
desc: "missing credentials",
envVars: map[string]string{},
expected: "liquidweb: some credentials information are missing: LIQUID_WEB_USERNAME,LIQUID_WEB_PASSWORD",
},
{
desc: "missing username",
envVars: map[string]string{
EnvPassword: "tacoman",
EnvZone: "blars.com",
},
expected: "liquidweb: some credentials information are missing: LIQUID_WEB_USERNAME",
},
{
desc: "missing password",
envVars: map[string]string{
EnvUsername: "blars",
EnvZone: "blars.com",
},
expected: "liquidweb: some credentials information are missing: LIQUID_WEB_PASSWORD",
},
}
for _, test := range testCases {
t.Run(test.desc, func(t *testing.T) {
defer envTest.RestoreEnv()
envTest.ClearEnv()
envTest.Apply(test.envVars)
p, err := NewDNSProvider()
if test.expected == "" {
require.NoError(t, err)
require.NotNil(t, p)
require.NotNil(t, p.config)
require.NotNil(t, p.client)
require.NotNil(t, p.recordIDs)
} else {
require.EqualError(t, err, test.expected)
}
})
}
}
func TestNewDNSProviderConfig(t *testing.T) {
testCases := []struct {
desc string
username string
password string
zone string
expected string
}{
{
desc: "success",
username: "acme",
password: "secret",
zone: "example.com",
},
{
desc: "missing credentials",
username: "",
password: "",
zone: "",
expected: "liquidweb: could not create Liquid Web API client: provided username is empty",
},
{
desc: "missing username",
username: "",
password: "secret",
zone: "example.com",
expected: "liquidweb: could not create Liquid Web API client: provided username is empty",
},
{
desc: "missing password",
username: "acme",
password: "",
zone: "example.com",
expected: "liquidweb: could not create Liquid Web API client: provided password is empty",
},
}
for _, test := range testCases {
t.Run(test.desc, func(t *testing.T) {
config := NewDefaultConfig()
config.Username = test.username
config.Password = test.password
config.Zone = test.zone
p, err := NewDNSProviderConfig(config)
if test.expected == "" {
require.NoError(t, err)
require.NotNil(t, p)
require.NotNil(t, p.config)
require.NotNil(t, p.client)
require.NotNil(t, p.recordIDs)
} else {
require.EqualError(t, err, test.expected)
}
})
}
}
func TestDNSProvider_Present(t *testing.T) {
provider := setupTest(t)
err := provider.Present("tacoman.com", "", "")
require.NoError(t, err)
}
func TestDNSProvider_CleanUp(t *testing.T) {
provider := setupTest(t, network.DNSRecord{
Name: "_acme-challenge.tacoman.com",
RData: "123d==",
Type: "TXT",
TTL: 300,
ID: 1234567,
ZoneID: 42,
})
provider.recordIDs["123d=="] = 1234567
err := provider.CleanUp("tacoman.com.", "123d==", "")
require.NoError(t, err)
}
func TestDNSProvider(t *testing.T) {
testCases := []struct {
desc string
initRecs []network.DNSRecord
domain string
token string
keyAuth string
present bool
expPresentErr string
cleanup bool
}{
{
desc: "expected successful",
domain: "tacoman.com",
token: "123",
keyAuth: "456",
present: true,
cleanup: true,
},
{
desc: "other successful",
domain: "banana.com",
token: "123",
keyAuth: "456",
present: true,
cleanup: true,
},
{
desc: "zone not on account",
domain: "huckleberry.com",
token: "123",
keyAuth: "456",
present: true,
expPresentErr: "no valid zone in account for certificate '_acme-challenge.huckleberry.com'",
cleanup: false,
},
{
desc: "ssl for domain",
domain: "sundae.cherry.com",
token: "5847953",
keyAuth: "34872934",
present: true,
cleanup: true,
},
{
desc: "complicated domain",
domain: "always.money.stand.banana.com",
token: "5847953",
keyAuth: "there is always money in the banana stand",
present: true,
cleanup: true,
},
}
for _, test := range testCases {
test := test
t.Run(test.desc, func(t *testing.T) {
provider := setupTest(t, test.initRecs...)
if test.present {
err := provider.Present(test.domain, test.token, test.keyAuth)
if test.expPresentErr == "" {
require.NoError(t, err)
} else {
require.ErrorContains(t, err, test.expPresentErr)
}
}
if test.cleanup {
err := provider.CleanUp(test.domain, test.token, test.keyAuth)
require.NoError(t, err)
}
})
}
}
func TestLivePresent(t *testing.T) {
if !envTest.IsLiveTest() {
t.Skip("skipping live test")
}
envTest.RestoreEnv()
provider, err := NewDNSProvider()
require.NoError(t, err)
err = provider.Present(envTest.GetDomain(), "", "123d==")
require.NoError(t, err)
}
func TestLiveCleanUp(t *testing.T) {
if !envTest.IsLiveTest() {
t.Skip("skipping live test")
}
envTest.RestoreEnv()
provider, err := NewDNSProvider()
require.NoError(t, err)
time.Sleep(2 * time.Second)
err = provider.CleanUp(envTest.GetDomain(), "", "123d==")
require.NoError(t, err)
}