Skip to content

Commit 6f65181

Browse files
committed
add tests & fixes for dataLocalizationRegionalHostnamesChanges()
1 parent c3f0cd6 commit 6f65181

File tree

2 files changed

+251
-4
lines changed

2 files changed

+251
-4
lines changed

provider/cloudflare/cloudflare.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@ func (p *CloudFlareProvider) submitDataLocalizationRegionalHostnameChanges(ctx c
575575

576576
// dataLocalizationRegionalHostnamesChanges processes a slice of cloudFlare changes and consolidates them
577577
// into a list of data localization regional hostname changes.
578+
// returns nil if no changes are needed
578579
func dataLocalizationRegionalHostnamesChanges(changes []*cloudFlareChange) ([]DataLocalizationRegionalHostnameChange, error) {
579580
regionalHostnameChanges := make(map[string]DataLocalizationRegionalHostnameChange)
580581
for _, change := range changes {
@@ -597,10 +598,12 @@ func dataLocalizationRegionalHostnamesChanges(changes []*cloudFlareChange) ([]Da
597598
if regionalHostname.RegionKey != change.RegionalHostname.RegionKey {
598599
return nil, fmt.Errorf("conflicting region keys for regional hostname %q: %q and %q", change.RegionalHostname.Hostname, regionalHostname.RegionKey, change.RegionalHostname.RegionKey)
599600
}
600-
if change.Action == cloudFlareUpdate {
601-
regionalHostname.Action = cloudFlareUpdate
602-
} else if regionalHostname.Action == cloudFlareDelete {
603-
regionalHostname.Action = cloudFlareUpdate
601+
if (change.Action == cloudFlareUpdate && regionalHostname.Action != cloudFlareUpdate) ||
602+
regionalHostname.Action == cloudFlareDelete {
603+
regionalHostnameChanges[change.RegionalHostname.Hostname] = DataLocalizationRegionalHostnameChange{
604+
Action: cloudFlareUpdate,
605+
RegionalHostname: change.RegionalHostname,
606+
}
604607
}
605608
case cloudFlareDelete:
606609
if !ok {

provider/cloudflare/cloudflare_test.go

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"errors"
2222
"fmt"
2323
"os"
24+
"reflect"
2425
"slices"
2526
"sort"
2627
"strings"
@@ -2879,3 +2880,246 @@ func Test_getRegionKey(t *testing.T) {
28792880
})
28802881
}
28812882
}
2883+
2884+
func Test_dataLocalizationRegionalHostnamesChanges(t *testing.T) {
2885+
cmpDataLocalizationRegionalHostnameChange := func(i, j DataLocalizationRegionalHostnameChange) int {
2886+
if i.Action == j.Action {
2887+
return 0
2888+
}
2889+
if i.Hostname < j.Hostname {
2890+
return -1
2891+
}
2892+
return 1
2893+
}
2894+
type args struct {
2895+
changes []*cloudFlareChange
2896+
}
2897+
tests := []struct {
2898+
name string
2899+
args args
2900+
want []DataLocalizationRegionalHostnameChange
2901+
wantErr bool
2902+
}{
2903+
{
2904+
name: "empty input",
2905+
args: args{
2906+
changes: []*cloudFlareChange{},
2907+
},
2908+
want: nil,
2909+
wantErr: false,
2910+
},
2911+
{
2912+
name: "changes without RegionalHostname",
2913+
args: args{
2914+
changes: []*cloudFlareChange{
2915+
{
2916+
Action: cloudFlareCreate,
2917+
ResourceRecord: cloudflare.DNSRecord{
2918+
Name: "example.com",
2919+
},
2920+
RegionalHostname: cloudflare.RegionalHostname{}, // Empty
2921+
},
2922+
},
2923+
},
2924+
want: nil,
2925+
wantErr: false,
2926+
},
2927+
{
2928+
name: "change with empty RegionKey",
2929+
args: args{
2930+
changes: []*cloudFlareChange{
2931+
{
2932+
Action: cloudFlareCreate,
2933+
ResourceRecord: cloudflare.DNSRecord{
2934+
Name: "example.com",
2935+
},
2936+
RegionalHostname: cloudflare.RegionalHostname{
2937+
Hostname: "example.com",
2938+
RegionKey: "", // Empty region key
2939+
},
2940+
},
2941+
},
2942+
},
2943+
wantErr: true,
2944+
},
2945+
{
2946+
name: "conflicting region keys",
2947+
args: args{
2948+
changes: []*cloudFlareChange{
2949+
{
2950+
Action: cloudFlareCreate,
2951+
RegionalHostname: cloudflare.RegionalHostname{
2952+
Hostname: "example.com",
2953+
RegionKey: "eu",
2954+
},
2955+
},
2956+
{
2957+
Action: cloudFlareCreate,
2958+
RegionalHostname: cloudflare.RegionalHostname{
2959+
Hostname: "example.com",
2960+
RegionKey: "us", // Different region key for same hostname
2961+
},
2962+
},
2963+
},
2964+
},
2965+
wantErr: true,
2966+
},
2967+
{
2968+
name: "update takes precedence over create & delete",
2969+
args: args{
2970+
changes: []*cloudFlareChange{
2971+
{
2972+
Action: cloudFlareCreate,
2973+
RegionalHostname: cloudflare.RegionalHostname{
2974+
Hostname: "example.com",
2975+
RegionKey: "eu",
2976+
},
2977+
},
2978+
{
2979+
Action: cloudFlareUpdate,
2980+
RegionalHostname: cloudflare.RegionalHostname{
2981+
Hostname: "example.com",
2982+
RegionKey: "eu",
2983+
},
2984+
},
2985+
{
2986+
Action: cloudFlareDelete,
2987+
RegionalHostname: cloudflare.RegionalHostname{
2988+
Hostname: "example.com",
2989+
RegionKey: "eu",
2990+
},
2991+
},
2992+
},
2993+
},
2994+
want: []DataLocalizationRegionalHostnameChange{
2995+
{
2996+
Action: cloudFlareUpdate,
2997+
RegionalHostname: cloudflare.RegionalHostname{
2998+
Hostname: "example.com",
2999+
RegionKey: "eu",
3000+
},
3001+
},
3002+
},
3003+
wantErr: false,
3004+
},
3005+
{
3006+
name: "create after delete becomes update",
3007+
args: args{
3008+
changes: []*cloudFlareChange{
3009+
{
3010+
Action: cloudFlareDelete,
3011+
RegionalHostname: cloudflare.RegionalHostname{
3012+
Hostname: "example.com",
3013+
RegionKey: "eu",
3014+
},
3015+
},
3016+
{
3017+
Action: cloudFlareCreate,
3018+
RegionalHostname: cloudflare.RegionalHostname{
3019+
Hostname: "example.com",
3020+
RegionKey: "eu",
3021+
},
3022+
},
3023+
},
3024+
},
3025+
want: []DataLocalizationRegionalHostnameChange{
3026+
{
3027+
Action: cloudFlareUpdate,
3028+
RegionalHostname: cloudflare.RegionalHostname{
3029+
Hostname: "example.com",
3030+
RegionKey: "eu",
3031+
},
3032+
},
3033+
},
3034+
wantErr: false,
3035+
},
3036+
{
3037+
name: "consolidate mixed actions for different hostnames",
3038+
args: args{
3039+
changes: []*cloudFlareChange{
3040+
{
3041+
Action: cloudFlareCreate,
3042+
RegionalHostname: cloudflare.RegionalHostname{
3043+
Hostname: "example1.com",
3044+
RegionKey: "eu",
3045+
},
3046+
},
3047+
{
3048+
Action: cloudFlareUpdate,
3049+
RegionalHostname: cloudflare.RegionalHostname{
3050+
Hostname: "example2.com",
3051+
RegionKey: "us",
3052+
},
3053+
},
3054+
{
3055+
Action: cloudFlareDelete,
3056+
RegionalHostname: cloudflare.RegionalHostname{
3057+
Hostname: "example3.com",
3058+
RegionKey: "ap",
3059+
},
3060+
},
3061+
// duplicated actions
3062+
{
3063+
Action: cloudFlareCreate,
3064+
RegionalHostname: cloudflare.RegionalHostname{
3065+
Hostname: "example1.com",
3066+
RegionKey: "eu",
3067+
},
3068+
},
3069+
{
3070+
Action: cloudFlareUpdate,
3071+
RegionalHostname: cloudflare.RegionalHostname{
3072+
Hostname: "example2.com",
3073+
RegionKey: "us",
3074+
},
3075+
},
3076+
{
3077+
Action: cloudFlareDelete,
3078+
RegionalHostname: cloudflare.RegionalHostname{
3079+
Hostname: "example3.com",
3080+
RegionKey: "ap",
3081+
},
3082+
},
3083+
},
3084+
},
3085+
want: []DataLocalizationRegionalHostnameChange{
3086+
{
3087+
Action: cloudFlareCreate,
3088+
RegionalHostname: cloudflare.RegionalHostname{
3089+
Hostname: "example1.com",
3090+
RegionKey: "eu",
3091+
},
3092+
},
3093+
{
3094+
Action: cloudFlareUpdate,
3095+
RegionalHostname: cloudflare.RegionalHostname{
3096+
Hostname: "example2.com",
3097+
RegionKey: "us",
3098+
},
3099+
},
3100+
{
3101+
Action: cloudFlareDelete,
3102+
RegionalHostname: cloudflare.RegionalHostname{
3103+
Hostname: "example3.com",
3104+
RegionKey: "ap",
3105+
},
3106+
},
3107+
},
3108+
wantErr: false,
3109+
},
3110+
}
3111+
for _, tt := range tests {
3112+
t.Run(tt.name, func(t *testing.T) {
3113+
got, err := dataLocalizationRegionalHostnamesChanges(tt.args.changes)
3114+
if (err != nil) != tt.wantErr {
3115+
t.Errorf("dataLocalizationRegionalHostnamesChanges() error = %v, wantErr %v", err, tt.wantErr)
3116+
return
3117+
}
3118+
slices.SortFunc(got, cmpDataLocalizationRegionalHostnameChange)
3119+
slices.SortFunc(tt.want, cmpDataLocalizationRegionalHostnameChange)
3120+
if !reflect.DeepEqual(got, tt.want) {
3121+
t.Errorf("dataLocalizationRegionalHostnamesChanges() = %v, want %v", got, tt.want)
3122+
}
3123+
})
3124+
}
3125+
}

0 commit comments

Comments
 (0)