github.com/pmoroney/dnscontrol@v0.2.4-0.20171024134423-fad98f73f44a/providers/namedotcom/nameservers_test.go (about)

     1  package namedotcom
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/StackExchange/dnscontrol/models"
    11  )
    12  
    13  var (
    14  	mux    *http.ServeMux
    15  	client *nameDotCom
    16  	server *httptest.Server
    17  )
    18  
    19  func setup() {
    20  	mux = http.NewServeMux()
    21  	server = httptest.NewServer(mux)
    22  
    23  	client = &nameDotCom{
    24  		APIUser: "bob",
    25  		APIKey:  "123",
    26  		APIUrl:  server.URL,
    27  	}
    28  }
    29  
    30  func teardown() {
    31  	server.Close()
    32  }
    33  
    34  func TestGetNameserversRaw(t *testing.T) {
    35  	for i, test := range []struct {
    36  		givenNs, expected string
    37  	}{
    38  		{"", ""},
    39  		{`"foo.ns.tld","bar.ns.tld"`, "bar.ns.tld,foo.ns.tld"},
    40  		{"ERR", "ERR"},
    41  		{"MSGERR", "ERR"},
    42  	} {
    43  		setup()
    44  		defer teardown()
    45  
    46  		mux.HandleFunc("/domain/get/example.tld", func(w http.ResponseWriter, r *http.Request) {
    47  			if test.givenNs == "ERR" {
    48  				http.Error(w, "UH OH", 500)
    49  				return
    50  			}
    51  			if test.givenNs == "MSGERR" {
    52  				w.Write(nameComError)
    53  				return
    54  			}
    55  			w.Write(domainResponse(test.givenNs))
    56  		})
    57  
    58  		found, err := client.getNameserversRaw("example.tld")
    59  		if err != nil {
    60  			if test.expected == "ERR" {
    61  				continue
    62  			}
    63  			t.Errorf("Error on test %d: %s", i, err)
    64  			continue
    65  		}
    66  		if test.expected == "ERR" {
    67  			t.Errorf("Expected error on test %d, but was none", i)
    68  			continue
    69  		}
    70  		if strings.Join(found, ",") != test.expected {
    71  			t.Errorf("Test %d: Expected '%s', but found '%s'", i, test.expected, found)
    72  		}
    73  	}
    74  }
    75  
    76  func TestGetCorrections(t *testing.T) {
    77  	for i, test := range []struct {
    78  		givenNs  string
    79  		expected int
    80  	}{
    81  		{"", 1},
    82  		{`"foo.ns.tld","bar.ns.tld"`, 0},
    83  		{`"bar.ns.tld","foo.ns.tld"`, 0},
    84  		{`"foo.ns.tld"`, 1},
    85  		{`"1.ns.aaa","2.ns.www"`, 1},
    86  		{"ERR", -1}, //-1 means we expect an error
    87  		{"MSGERR", -1},
    88  	} {
    89  		setup()
    90  		defer teardown()
    91  
    92  		mux.HandleFunc("/domain/get/example.tld", func(w http.ResponseWriter, r *http.Request) {
    93  			if test.givenNs == "ERR" {
    94  				http.Error(w, "UH OH", 500)
    95  				return
    96  			}
    97  			if test.givenNs == "MSGERR" {
    98  				w.Write(nameComError)
    99  				return
   100  			}
   101  			w.Write(domainResponse(test.givenNs))
   102  		})
   103  		dc := &models.DomainConfig{
   104  			Name: "example.tld",
   105  			Nameservers: []*models.Nameserver{
   106  				{Name: "foo.ns.tld"},
   107  				{Name: "bar.ns.tld"},
   108  			},
   109  		}
   110  		corrections, err := client.GetRegistrarCorrections(dc)
   111  		if err != nil {
   112  			if test.expected == -1 {
   113  				continue
   114  			}
   115  			t.Errorf("Error on test %d: %s", i, err)
   116  			continue
   117  		}
   118  		if test.expected == -1 {
   119  			t.Errorf("Expected error on test %d, but was none", i)
   120  			continue
   121  		}
   122  		if len(corrections) != test.expected {
   123  			t.Errorf("Test %d: Expected '%d', but found '%d'", i, test.expected, len(corrections))
   124  		}
   125  	}
   126  }
   127  
   128  func domainResponse(ns string) []byte {
   129  	return []byte(fmt.Sprintf(`{
   130    "result": {
   131      "code": 100,
   132      "message": "Command Successful"
   133    },
   134    "domain_name": "example.tld",
   135    "create_date": "2015-12-28 18:08:05",
   136    "expire_date": "2016-12-28 23:59:59",
   137    "locked": true,
   138    "nameservers": [%s],
   139    "contacts": [],
   140    "addons": {
   141      "whois_privacy": {
   142        "price": "3.99"
   143      },
   144      "domain\/renew": {
   145        "price": "10.99"
   146      }
   147    }
   148  }`, ns))
   149  }
   150  
   151  var nameComError = []byte(`{"result":{"code":251,"message":"Authentication Error - Invalid Username Or Api Token"}}`)
   152  
   153  func TestGetNameservers(t *testing.T) {
   154  	const d = "ns1.name.com,ns2.name.com,ns3.name.com,ns4.name.com"
   155  	for i, test := range []struct {
   156  		givenNs, expected string
   157  	}{
   158  		//empty or external dsp, use ns1-4.name.com
   159  		{"", d},
   160  		{`"foo.ns.tld","bar.ns.tld"`, d},
   161  		//if already on name.com, use the existing nameservers
   162  		{`"ns1aaa.name.com","ns2bbb.name.com","ns3ccc.name.com","ns4ddd.name.com"`, "ns1aaa.name.com,ns2bbb.name.com,ns3ccc.name.com,ns4ddd.name.com"},
   163  		//also handle half and half
   164  		{`"ns1aaa.name.com","ns2bbb.name.com","ns3ccc.aws.net","ns4ddd.awsdns.org"`, "ns1aaa.name.com,ns2bbb.name.com,ns3.name.com,ns4.name.com"},
   165  		{`"nsa.azuredns.com","ns2b.gandhi.net","ns3ccc.name.com","ns4ddd.name.com"`, "ns1.name.com,ns2.name.com,ns3ccc.name.com,ns4ddd.name.com"},
   166  	} {
   167  		setup()
   168  		defer teardown()
   169  
   170  		mux.HandleFunc("/domain/get/example.tld", func(w http.ResponseWriter, r *http.Request) {
   171  			w.Write(domainResponse(test.givenNs))
   172  		})
   173  		found, err := client.GetNameservers("example.tld")
   174  		if err != nil {
   175  			t.Errorf("Test %d: %s", i, err)
   176  			continue
   177  		}
   178  		fStrs := []string{}
   179  		for _, n := range found {
   180  			fStrs = append(fStrs, n.Name)
   181  		}
   182  		if strings.Join(fStrs, ",") != test.expected {
   183  			t.Errorf("Test %d: Expected '%s', but found '%s'", i, test.expected, found)
   184  		}
   185  	}
   186  }