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 }