215 lines
4.4 KiB
Go
215 lines
4.4 KiB
Go
|
package loopia
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/go-acme/lego/v4/platform/tester"
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
const envDomain = envNamespace + "DOMAIN"
|
||
|
|
||
|
var envTest = tester.NewEnvTest(
|
||
|
EnvAPIUser,
|
||
|
EnvAPIPassword,
|
||
|
EnvTTL,
|
||
|
EnvPollingInterval,
|
||
|
EnvPropagationTimeout,
|
||
|
EnvHTTPTimeout).
|
||
|
WithDomain(envDomain)
|
||
|
|
||
|
func TestSplitDomain(t *testing.T) {
|
||
|
provider := &DNSProvider{
|
||
|
findZoneByFqdn: func(fqdn string) (string, error) {
|
||
|
return "example.com.", nil
|
||
|
},
|
||
|
}
|
||
|
|
||
|
testCases := []struct {
|
||
|
desc string
|
||
|
fqdn string
|
||
|
subdomain string
|
||
|
domain string
|
||
|
}{
|
||
|
{
|
||
|
desc: "single subdomain",
|
||
|
fqdn: "subdomain.example.com",
|
||
|
subdomain: "subdomain",
|
||
|
domain: "example.com",
|
||
|
},
|
||
|
{
|
||
|
desc: "double subdomain",
|
||
|
fqdn: "sub.domain.example.com",
|
||
|
subdomain: "sub.domain",
|
||
|
domain: "example.com",
|
||
|
},
|
||
|
{
|
||
|
desc: "asterisk subdomain",
|
||
|
fqdn: "*.example.com",
|
||
|
subdomain: "*",
|
||
|
domain: "example.com",
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, test := range testCases {
|
||
|
t.Run(test.desc, func(t *testing.T) {
|
||
|
subdomain, domain := provider.splitDomain(test.fqdn)
|
||
|
|
||
|
assert.Equal(t, test.subdomain, subdomain)
|
||
|
assert.Equal(t, test.domain, domain)
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestNewDNSProvider(t *testing.T) {
|
||
|
testCases := []struct {
|
||
|
desc string
|
||
|
envVars map[string]string
|
||
|
expectedError string
|
||
|
}{
|
||
|
{
|
||
|
desc: "success",
|
||
|
envVars: map[string]string{
|
||
|
EnvAPIUser: "user",
|
||
|
EnvAPIPassword: "secret",
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
desc: "missing API user",
|
||
|
envVars: map[string]string{
|
||
|
EnvAPIUser: "",
|
||
|
EnvAPIPassword: "secret",
|
||
|
},
|
||
|
expectedError: "loopia: some credentials information are missing: LOOPIA_API_USER",
|
||
|
},
|
||
|
{
|
||
|
desc: "missing API password",
|
||
|
envVars: map[string]string{
|
||
|
EnvAPIUser: "user",
|
||
|
EnvAPIPassword: "",
|
||
|
},
|
||
|
expectedError: "loopia: some credentials information are missing: LOOPIA_API_PASSWORD",
|
||
|
},
|
||
|
{
|
||
|
desc: "missing credentials",
|
||
|
envVars: map[string]string{},
|
||
|
expectedError: "loopia: some credentials information are missing: LOOPIA_API_USER,LOOPIA_API_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 len(test.expectedError) == 0 {
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, p)
|
||
|
} else {
|
||
|
require.Error(t, err)
|
||
|
require.EqualError(t, err, test.expectedError)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestNewDNSProviderConfig(t *testing.T) {
|
||
|
testCases := []struct {
|
||
|
desc string
|
||
|
config *Config
|
||
|
expectedTTL int
|
||
|
expectedError string
|
||
|
}{
|
||
|
{
|
||
|
desc: "success",
|
||
|
config: &Config{
|
||
|
APIUser: "user",
|
||
|
APIPassword: "secret",
|
||
|
TTL: 3600,
|
||
|
},
|
||
|
expectedTTL: 3600,
|
||
|
},
|
||
|
{
|
||
|
desc: "nil config user",
|
||
|
expectedError: "loopia: the configuration of the DNS provider is nil",
|
||
|
},
|
||
|
{
|
||
|
desc: "empty user",
|
||
|
config: &Config{
|
||
|
APIUser: "",
|
||
|
APIPassword: "secret",
|
||
|
TTL: 3600,
|
||
|
},
|
||
|
expectedError: "loopia: credentials missing",
|
||
|
},
|
||
|
{
|
||
|
desc: "empty password",
|
||
|
config: &Config{
|
||
|
APIUser: "user",
|
||
|
APIPassword: "",
|
||
|
TTL: 3600,
|
||
|
},
|
||
|
expectedTTL: 3600,
|
||
|
expectedError: "loopia: credentials missing",
|
||
|
},
|
||
|
{
|
||
|
desc: "too low TTL",
|
||
|
config: &Config{
|
||
|
APIUser: "user",
|
||
|
APIPassword: "secret",
|
||
|
TTL: 299,
|
||
|
},
|
||
|
expectedTTL: 300,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, test := range testCases {
|
||
|
t.Run(test.desc, func(t *testing.T) {
|
||
|
p, err := NewDNSProviderConfig(test.config)
|
||
|
|
||
|
if len(test.expectedError) == 0 {
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, p)
|
||
|
assert.Equal(t, test.expectedTTL, p.config.TTL)
|
||
|
} else {
|
||
|
require.Error(t, err)
|
||
|
assert.EqualError(t, err, test.expectedError)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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)
|
||
|
}
|