github.com/webonyx/up@v0.7.4-0.20180808230834-91b94e551323/config/dns_test.go (about)

     1  package config
     2  
     3  import (
     4  	"encoding/json"
     5  	"log"
     6  	"os"
     7  	"sort"
     8  	"testing"
     9  
    10  	"github.com/tj/assert"
    11  )
    12  
    13  func ExampleDNS() {
    14  	s := `{
    15  		"something.sh": [
    16  			{
    17  				"name": "something.com",
    18  				"type": "A",
    19  				"ttl": 60,
    20  				"value": ["35.161.83.243"]
    21  			},
    22  			{
    23  				"name": "blog.something.com",
    24  				"type": "CNAME",
    25  				"ttl": 60,
    26  				"value": ["34.209.172.67"]
    27  			},
    28  			{
    29  				"name": "api.something.com",
    30  				"type": "A",
    31  				"value": ["54.187.185.18"]
    32  			}
    33  		]
    34  	}`
    35  
    36  	var c DNS
    37  
    38  	if err := json.Unmarshal([]byte(s), &c); err != nil {
    39  		log.Fatalf("error unmarshaling: %s", err)
    40  	}
    41  
    42  	sort.Slice(c.Zones[0].Records, func(i int, j int) bool {
    43  		a := c.Zones[0].Records[i]
    44  		b := c.Zones[0].Records[j]
    45  		return a.Name > b.Name
    46  	})
    47  
    48  	if err := c.Validate(); err != nil {
    49  		log.Fatalf("error validating: %s", err)
    50  	}
    51  
    52  	if err := c.Default(); err != nil {
    53  		log.Fatalf("error defaulting: %s", err)
    54  	}
    55  
    56  	enc := json.NewEncoder(os.Stdout)
    57  	enc.SetIndent("", "  ")
    58  	enc.Encode(c)
    59  	// Output:
    60  	// 	{
    61  	//   "zones": [
    62  	//     {
    63  	//       "name": "something.sh",
    64  	//       "records": [
    65  	//         {
    66  	//           "name": "something.com",
    67  	//           "type": "A",
    68  	//           "ttl": 60,
    69  	//           "value": [
    70  	//             "35.161.83.243"
    71  	//           ]
    72  	//         },
    73  	//         {
    74  	//           "name": "blog.something.com",
    75  	//           "type": "CNAME",
    76  	//           "ttl": 60,
    77  	//           "value": [
    78  	//             "34.209.172.67"
    79  	//           ]
    80  	//         },
    81  	//         {
    82  	//           "name": "api.something.com",
    83  	//           "type": "A",
    84  	//           "ttl": 300,
    85  	//           "value": [
    86  	//             "54.187.185.18"
    87  	//           ]
    88  	//         }
    89  	//       ]
    90  	//     }
    91  	//   ]
    92  	// }
    93  }
    94  
    95  func TestDNS_Validate(t *testing.T) {
    96  	t.Run("invalid", func(t *testing.T) {
    97  		c := &DNS{
    98  			Zones: []*Zone{
    99  				{
   100  					Name: "apex.sh",
   101  					Records: []*Record{
   102  						{
   103  							Name: "blog.apex.sh",
   104  							Type: "CNAME",
   105  						},
   106  					},
   107  				},
   108  			},
   109  		}
   110  
   111  		assert.EqualError(t, c.Validate(), `zone apex.sh: record 0: .value: must have at least 1 value`)
   112  	})
   113  }
   114  
   115  func TestRecord_Type(t *testing.T) {
   116  	t.Run("valid", func(t *testing.T) {
   117  		c := &Record{
   118  			Name:  "blog.apex.sh",
   119  			Type:  "A",
   120  			Value: []string{"1.1.1.1"},
   121  		}
   122  
   123  		assert.NoError(t, c.Validate(), "validate")
   124  	})
   125  
   126  	t.Run("invalid", func(t *testing.T) {
   127  		c := &Record{
   128  			Name: "blog.apex.sh",
   129  			Type: "AAA",
   130  		}
   131  
   132  		assert.EqualError(t, c.Validate(), `.type: "AAA" is invalid, must be one of:
   133  
   134    • ALIAS
   135    • A
   136    • AAAA
   137    • CNAME
   138    • MX
   139    • NAPTR
   140    • NS
   141    • PTR
   142    • SOA
   143    • SPF
   144    • SRV
   145    • TXT`)
   146  	})
   147  }
   148  
   149  func TestRecord_TTL(t *testing.T) {
   150  	c := &Record{Type: "A"}
   151  	assert.NoError(t, c.Default(), "default")
   152  	assert.Equal(t, 300, c.TTL)
   153  }
   154  
   155  func TestRecord_Value(t *testing.T) {
   156  	t.Run("empty", func(t *testing.T) {
   157  		c := &Record{
   158  			Name: "blog.apex.sh",
   159  			Type: "A",
   160  		}
   161  
   162  		assert.EqualError(t, c.Validate(), `.value: must have at least 1 value`)
   163  	})
   164  
   165  	t.Run("invalid", func(t *testing.T) {
   166  		c := &Record{
   167  			Name:  "blog.apex.sh",
   168  			Type:  "A",
   169  			Value: []string{"1.1.1.1", ""},
   170  		}
   171  
   172  		assert.EqualError(t, c.Validate(), `.value: at index 1: is required`)
   173  	})
   174  }