2019-03-11 16:56:48 +00:00
package vegadns
2018-06-30 23:45:24 +00:00
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
"time"
2019-07-30 19:19:32 +00:00
"github.com/go-acme/lego/v3/platform/tester"
2018-06-30 23:45:24 +00:00
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
2018-09-24 19:07:20 +00:00
const testDomain = "example.com"
2018-10-16 15:52:57 +00:00
var envTest = tester . NewEnvTest ( "SECRET_VEGADNS_KEY" , "SECRET_VEGADNS_SECRET" , "VEGADNS_URL" )
2018-10-12 17:29:18 +00:00
func TestNewDNSProvider_Fail ( t * testing . T ) {
2018-10-16 15:52:57 +00:00
defer envTest . RestoreEnv ( )
envTest . ClearEnv ( )
2018-06-30 23:45:24 +00:00
_ , err := NewDNSProvider ( )
assert . Error ( t , err , "VEGADNS_URL env missing" )
}
2018-10-12 17:29:18 +00:00
func TestDNSProvider_TimeoutSuccess ( t * testing . T ) {
2018-10-16 15:52:57 +00:00
defer envTest . RestoreEnv ( )
envTest . ClearEnv ( )
2019-06-24 16:34:04 +00:00
tearDown := startTestServer ( muxSuccess ( ) )
defer tearDown ( )
2018-06-30 23:45:24 +00:00
provider , err := NewDNSProvider ( )
require . NoError ( t , err )
timeout , interval := provider . Timeout ( )
2019-06-24 16:34:04 +00:00
assert . Equal ( t , timeout , 12 * time . Minute )
assert . Equal ( t , interval , 1 * time . Minute )
2018-06-30 23:45:24 +00:00
}
2018-09-24 19:07:20 +00:00
func TestDNSProvider_Present ( t * testing . T ) {
testCases := [ ] struct {
desc string
2019-06-24 16:34:04 +00:00
handler http . Handler
2018-09-24 19:07:20 +00:00
expectedError string
} {
{
2019-06-24 16:34:04 +00:00
desc : "Success" ,
handler : muxSuccess ( ) ,
2018-09-24 19:07:20 +00:00
} ,
{
desc : "FailToFindZone" ,
2019-06-24 16:34:04 +00:00
handler : muxFailToFindZone ( ) ,
2018-09-24 19:07:20 +00:00
expectedError : "vegadns: can't find Authoritative Zone for _acme-challenge.example.com. in Present: Unable to find auth zone for fqdn _acme-challenge.example.com" ,
} ,
{
desc : "FailToCreateTXT" ,
2019-06-24 16:34:04 +00:00
handler : muxFailToCreateTXT ( ) ,
2018-09-24 19:07:20 +00:00
expectedError : "vegadns: Got bad answer from VegaDNS on CreateTXT. Code: 400. Message: " ,
} ,
}
2018-06-30 23:45:24 +00:00
2018-09-24 19:07:20 +00:00
for _ , test := range testCases {
t . Run ( test . desc , func ( t * testing . T ) {
2018-10-16 15:52:57 +00:00
defer envTest . RestoreEnv ( )
envTest . ClearEnv ( )
2019-06-24 16:34:04 +00:00
tearDown := startTestServer ( test . handler )
defer tearDown ( )
2018-06-30 23:45:24 +00:00
2018-09-24 19:07:20 +00:00
provider , err := NewDNSProvider ( )
require . NoError ( t , err )
2018-06-30 23:45:24 +00:00
2018-09-24 19:07:20 +00:00
err = provider . Present ( testDomain , "token" , "keyAuth" )
if len ( test . expectedError ) == 0 {
assert . NoError ( t , err )
} else {
assert . EqualError ( t , err , test . expectedError )
}
} )
}
2018-06-30 23:45:24 +00:00
}
2018-09-24 19:07:20 +00:00
func TestDNSProvider_CleanUp ( t * testing . T ) {
testCases := [ ] struct {
desc string
2019-06-24 16:34:04 +00:00
handler http . Handler
2018-09-24 19:07:20 +00:00
expectedError string
} {
{
2019-06-24 16:34:04 +00:00
desc : "Success" ,
handler : muxSuccess ( ) ,
2018-09-24 19:07:20 +00:00
} ,
{
desc : "FailToFindZone" ,
2019-06-24 16:34:04 +00:00
handler : muxFailToFindZone ( ) ,
2018-09-24 19:07:20 +00:00
expectedError : "vegadns: can't find Authoritative Zone for _acme-challenge.example.com. in CleanUp: Unable to find auth zone for fqdn _acme-challenge.example.com" ,
} ,
{
desc : "FailToGetRecordID" ,
2019-06-24 16:34:04 +00:00
handler : muxFailToGetRecordID ( ) ,
2018-09-24 19:07:20 +00:00
expectedError : "vegadns: couldn't get Record ID in CleanUp: Got bad answer from VegaDNS on GetRecordID. Code: 404. Message: " ,
} ,
}
2018-06-30 23:45:24 +00:00
2018-09-24 19:07:20 +00:00
for _ , test := range testCases {
t . Run ( test . desc , func ( t * testing . T ) {
2018-10-16 15:52:57 +00:00
defer envTest . RestoreEnv ( )
envTest . ClearEnv ( )
2019-06-24 16:34:04 +00:00
tearDown := startTestServer ( test . handler )
defer tearDown ( )
2018-06-30 23:45:24 +00:00
2018-09-24 19:07:20 +00:00
provider , err := NewDNSProvider ( )
require . NoError ( t , err )
2018-06-30 23:45:24 +00:00
2018-09-24 19:07:20 +00:00
err = provider . CleanUp ( testDomain , "token" , "keyAuth" )
if len ( test . expectedError ) == 0 {
assert . NoError ( t , err )
} else {
assert . EqualError ( t , err , test . expectedError )
}
} )
}
2018-06-30 23:45:24 +00:00
}
2018-10-12 17:29:18 +00:00
func muxSuccess ( ) * http . ServeMux {
2018-06-30 23:45:24 +00:00
mux := http . NewServeMux ( )
mux . HandleFunc ( "/1.0/token" , func ( w http . ResponseWriter , r * http . Request ) {
2018-12-06 21:50:17 +00:00
if r . Method == http . MethodPost {
2018-06-30 23:45:24 +00:00
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , tokenResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusBadRequest )
} )
mux . HandleFunc ( "/1.0/domains" , func ( w http . ResponseWriter , r * http . Request ) {
if r . URL . Query ( ) . Get ( "search" ) == "example.com" {
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , domainsResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusNotFound )
} )
mux . HandleFunc ( "/1.0/records" , func ( w http . ResponseWriter , r * http . Request ) {
switch r . Method {
case http . MethodGet :
if r . URL . Query ( ) . Get ( "domain_id" ) == "1" {
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , recordsResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusNotFound )
return
case http . MethodPost :
w . WriteHeader ( http . StatusCreated )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , recordCreatedResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusBadRequest )
} )
mux . HandleFunc ( "/1.0/records/3" , func ( w http . ResponseWriter , r * http . Request ) {
2018-12-06 21:50:17 +00:00
if r . Method == http . MethodDelete {
2018-06-30 23:45:24 +00:00
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , recordDeletedResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusBadRequest )
} )
mux . HandleFunc ( "/" , func ( w http . ResponseWriter , r * http . Request ) {
w . WriteHeader ( http . StatusNotFound )
fmt . Printf ( "Not Found for Request: (%+v)\n\n" , r )
} )
return mux
}
2018-10-12 17:29:18 +00:00
func muxFailToFindZone ( ) * http . ServeMux {
2018-06-30 23:45:24 +00:00
mux := http . NewServeMux ( )
mux . HandleFunc ( "/1.0/token" , func ( w http . ResponseWriter , r * http . Request ) {
2018-12-06 21:50:17 +00:00
if r . Method == http . MethodPost {
2018-06-30 23:45:24 +00:00
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , tokenResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusBadRequest )
} )
2019-02-06 17:15:53 +00:00
mux . HandleFunc ( "/1.0/domains" , func ( w http . ResponseWriter , _ * http . Request ) {
2018-06-30 23:45:24 +00:00
w . WriteHeader ( http . StatusNotFound )
} )
return mux
}
2018-10-12 17:29:18 +00:00
func muxFailToCreateTXT ( ) * http . ServeMux {
2018-06-30 23:45:24 +00:00
mux := http . NewServeMux ( )
mux . HandleFunc ( "/1.0/token" , func ( w http . ResponseWriter , r * http . Request ) {
2018-12-06 21:50:17 +00:00
if r . Method == http . MethodPost {
2018-06-30 23:45:24 +00:00
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , tokenResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusBadRequest )
} )
mux . HandleFunc ( "/1.0/domains" , func ( w http . ResponseWriter , r * http . Request ) {
2018-09-24 19:07:20 +00:00
if r . URL . Query ( ) . Get ( "search" ) == testDomain {
2018-06-30 23:45:24 +00:00
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , domainsResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusNotFound )
} )
mux . HandleFunc ( "/1.0/records" , func ( w http . ResponseWriter , r * http . Request ) {
switch r . Method {
case http . MethodGet :
if r . URL . Query ( ) . Get ( "domain_id" ) == "1" {
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , recordsResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusNotFound )
return
case http . MethodPost :
w . WriteHeader ( http . StatusBadRequest )
return
}
w . WriteHeader ( http . StatusBadRequest )
} )
return mux
}
2018-10-12 17:29:18 +00:00
func muxFailToGetRecordID ( ) * http . ServeMux {
2018-06-30 23:45:24 +00:00
mux := http . NewServeMux ( )
mux . HandleFunc ( "/1.0/token" , func ( w http . ResponseWriter , r * http . Request ) {
2018-12-06 21:50:17 +00:00
if r . Method == http . MethodPost {
2018-06-30 23:45:24 +00:00
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , tokenResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusBadRequest )
} )
mux . HandleFunc ( "/1.0/domains" , func ( w http . ResponseWriter , r * http . Request ) {
2018-09-24 19:07:20 +00:00
if r . URL . Query ( ) . Get ( "search" ) == testDomain {
2018-06-30 23:45:24 +00:00
w . WriteHeader ( http . StatusOK )
2019-02-06 17:15:53 +00:00
fmt . Fprint ( w , domainsResponseMock )
2018-06-30 23:45:24 +00:00
return
}
w . WriteHeader ( http . StatusNotFound )
} )
mux . HandleFunc ( "/1.0/records" , func ( w http . ResponseWriter , r * http . Request ) {
2018-12-06 21:50:17 +00:00
if r . Method == http . MethodGet {
2018-06-30 23:45:24 +00:00
w . WriteHeader ( http . StatusNotFound )
return
}
w . WriteHeader ( http . StatusBadRequest )
} )
return mux
}
2019-06-24 16:34:04 +00:00
func startTestServer ( handler http . Handler ) func ( ) {
ts := httptest . NewServer ( handler )
2018-06-30 23:45:24 +00:00
2019-06-24 16:34:04 +00:00
envTest . Apply ( map [ string ] string {
"SECRET_VEGADNS_KEY" : "key" ,
"SECRET_VEGADNS_SECRET" : "secret" ,
"VEGADNS_URL" : ts . URL ,
} )
2018-06-30 23:45:24 +00:00
2019-06-24 16:34:04 +00:00
return func ( ) {
ts . Close ( )
2018-06-30 23:45:24 +00:00
}
}