sigs.k8s.io/external-dns@v0.14.1/provider/vinyldns/vinyldns_test.go (about) 1 /* 2 Copyright 2017 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package vinyldns 18 19 import ( 20 "context" 21 "fmt" 22 "os" 23 "testing" 24 25 "github.com/stretchr/testify/assert" 26 "github.com/stretchr/testify/mock" 27 "github.com/vinyldns/go-vinyldns/vinyldns" 28 29 "sigs.k8s.io/external-dns/endpoint" 30 "sigs.k8s.io/external-dns/plan" 31 "sigs.k8s.io/external-dns/provider" 32 ) 33 34 type mockVinyldnsZoneInterface struct { 35 mock.Mock 36 } 37 38 var mockVinylDNSProvider vinyldnsProvider 39 40 var ( 41 vinylDNSZones []vinyldns.Zone 42 vinylDNSRecords []vinyldns.RecordSet 43 vinylDNSRecordSetUpdateResponse *vinyldns.RecordSetUpdateResponse 44 ) 45 46 func TestVinylDNSServices(t *testing.T) { 47 firstZone := vinyldns.Zone{ 48 ID: "0", 49 Name: "example.com.", 50 } 51 secondZone := vinyldns.Zone{ 52 ID: "1", 53 Name: "example-beta.com.", 54 } 55 vinylDNSZones = []vinyldns.Zone{firstZone, secondZone} 56 57 firstRecord := vinyldns.RecordSet{ 58 ZoneID: "0", 59 Name: "example.com.", 60 TTL: 300, 61 Type: "CNAME", 62 Records: []vinyldns.Record{ 63 { 64 CName: "vinyldns.com", 65 }, 66 }, 67 } 68 vinylDNSRecords = []vinyldns.RecordSet{firstRecord} 69 70 vinylDNSRecordSetUpdateResponse = &vinyldns.RecordSetUpdateResponse{ 71 Zone: firstZone, 72 RecordSet: firstRecord, 73 ChangeID: "123", 74 Status: "Active", 75 } 76 77 mockVinylDNS := &mockVinyldnsZoneInterface{} 78 mockVinylDNS.On("Zones").Return(vinylDNSZones, nil) 79 mockVinylDNS.On("RecordSets", "0").Return(vinylDNSRecords, nil) 80 mockVinylDNS.On("RecordSets", "1").Return(nil, nil) 81 mockVinylDNS.On("RecordSets", "2").Return(nil, fmt.Errorf("Record not found")) 82 mockVinylDNS.On("RecordSetCreate", &firstRecord).Return(vinylDNSRecordSetUpdateResponse, nil) 83 mockVinylDNS.On("RecordSetUpdate", &firstRecord).Return(vinylDNSRecordSetUpdateResponse, nil) 84 mockVinylDNS.On("RecordSetDelete", "0", "").Return(nil, nil) 85 86 mockVinylDNSProvider = vinyldnsProvider{client: mockVinylDNS} 87 88 // Run tests on mock services 89 t.Run("Records", testVinylDNSProviderRecords) 90 t.Run("ApplyChanges", testVinylDNSProviderApplyChanges) 91 t.Run("SuitableZone", testVinylDNSSuitableZone) 92 t.Run("GetRecordID", testVinylDNSFindRecordSetID) 93 } 94 95 func testVinylDNSProviderRecords(t *testing.T) { 96 ctx := context.Background() 97 98 mockVinylDNSProvider.domainFilter = endpoint.NewDomainFilter([]string{"example.com"}) 99 result, err := mockVinylDNSProvider.Records(ctx) 100 assert.Nil(t, err) 101 assert.Equal(t, len(vinylDNSRecords), len(result)) 102 103 mockVinylDNSProvider.zoneFilter = provider.NewZoneIDFilter([]string{"0"}) 104 result, err = mockVinylDNSProvider.Records(ctx) 105 assert.Nil(t, err) 106 assert.Equal(t, len(vinylDNSRecords), len(result)) 107 108 mockVinylDNSProvider.zoneFilter = provider.NewZoneIDFilter([]string{"1"}) 109 result, err = mockVinylDNSProvider.Records(ctx) 110 assert.Nil(t, err) 111 assert.Equal(t, 0, len(result)) 112 } 113 114 func testVinylDNSProviderApplyChanges(t *testing.T) { 115 changes := &plan.Changes{} 116 changes.Create = []*endpoint.Endpoint{ 117 {DNSName: "example.com", Targets: endpoint.Targets{"vinyldns.com"}, RecordType: endpoint.RecordTypeCNAME}, 118 } 119 changes.UpdateNew = []*endpoint.Endpoint{ 120 {DNSName: "example.com", Targets: endpoint.Targets{"vinyldns.com"}, RecordType: endpoint.RecordTypeCNAME}, 121 } 122 changes.Delete = []*endpoint.Endpoint{{DNSName: "example.com", Targets: endpoint.Targets{"vinyldns.com"}, RecordType: endpoint.RecordTypeCNAME}} 123 124 mockVinylDNSProvider.zoneFilter = provider.NewZoneIDFilter([]string{"1"}) 125 err := mockVinylDNSProvider.ApplyChanges(context.Background(), changes) 126 if err != nil { 127 t.Errorf("Failed to apply changes: %v", err) 128 } 129 } 130 131 func testVinylDNSSuitableZone(t *testing.T) { 132 mockVinylDNSProvider.zoneFilter = provider.NewZoneIDFilter([]string{"0"}) 133 134 zone := vinyldnsSuitableZone("example.com", vinylDNSZones) 135 assert.Equal(t, zone.Name, "example.com.") 136 } 137 138 func TestNewVinylDNSProvider(t *testing.T) { 139 os.Setenv("VINYLDNS_ACCESS_KEY", "xxxxxxxxxxxxxxxxxxxxxxxxxx") 140 _, err := NewVinylDNSProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.NewZoneIDFilter([]string{"0"}), true) 141 assert.Nil(t, err) 142 143 os.Unsetenv("VINYLDNS_ACCESS_KEY") 144 _, err = NewVinylDNSProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.NewZoneIDFilter([]string{"0"}), true) 145 assert.NotNil(t, err) 146 if err == nil { 147 t.Errorf("Expected to fail new provider on empty token") 148 } 149 } 150 151 func testVinylDNSFindRecordSetID(t *testing.T) { 152 mockVinylDNSProvider.zoneFilter = provider.NewZoneIDFilter([]string{"0"}) 153 result, err := mockVinylDNSProvider.findRecordSetID("0", "example.com.") 154 assert.Nil(t, err) 155 assert.Equal(t, "", result) 156 157 _, err = mockVinylDNSProvider.findRecordSetID("2", "example-beta") 158 assert.NotNil(t, err) 159 } 160 161 func (m *mockVinyldnsZoneInterface) Zones() ([]vinyldns.Zone, error) { 162 args := m.Called() 163 var r0 []vinyldns.Zone 164 165 if args.Get(0) != nil { 166 r0 = args.Get(0).([]vinyldns.Zone) 167 } 168 169 return r0, args.Error(1) 170 } 171 172 func (m *mockVinyldnsZoneInterface) RecordSet(zoneID, recordSet string) (vinyldns.RecordSet, error) { 173 args := m.Called(zoneID, recordSet) 174 var r0 vinyldns.RecordSet 175 176 if args.Get(0) != nil { 177 r0 = args.Get(0).(vinyldns.RecordSet) 178 } 179 180 return r0, args.Error(1) 181 } 182 183 func (m *mockVinyldnsZoneInterface) RecordSets(id string) ([]vinyldns.RecordSet, error) { 184 args := m.Called(id) 185 var r0 []vinyldns.RecordSet 186 187 if args.Get(0) != nil { 188 r0 = args.Get(0).([]vinyldns.RecordSet) 189 } 190 191 return r0, args.Error(1) 192 } 193 194 func (m *mockVinyldnsZoneInterface) RecordSetCreate(rs *vinyldns.RecordSet) (*vinyldns.RecordSetUpdateResponse, error) { 195 args := m.Called(rs) 196 var r0 *vinyldns.RecordSetUpdateResponse 197 198 if args.Get(0) != nil { 199 r0 = args.Get(0).(*vinyldns.RecordSetUpdateResponse) 200 } 201 202 return r0, args.Error(1) 203 } 204 205 func (m *mockVinyldnsZoneInterface) RecordSetUpdate(rs *vinyldns.RecordSet) (*vinyldns.RecordSetUpdateResponse, error) { 206 args := m.Called(rs) 207 var r0 *vinyldns.RecordSetUpdateResponse 208 209 if args.Get(0) != nil { 210 r0 = args.Get(0).(*vinyldns.RecordSetUpdateResponse) 211 } 212 213 return r0, args.Error(1) 214 } 215 216 func (m *mockVinyldnsZoneInterface) RecordSetDelete(zoneID, recordSetID string) (*vinyldns.RecordSetUpdateResponse, error) { 217 args := m.Called(zoneID, recordSetID) 218 var r0 *vinyldns.RecordSetUpdateResponse 219 220 if args.Get(0) != nil { 221 r0 = args.Get(0).(*vinyldns.RecordSetUpdateResponse) 222 } 223 224 return r0, args.Error(1) 225 }