@@ -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