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  }