dnscontrol/pkg/cloudflare-go/tiered_cache_test.go
Tom Limoncelli 7fd6a74e0c
CLOUDFLAREAPI: CF_REDIRECT/CF_TEMP_REDIRECT should dtrt using Single Redirects (#3002)
Co-authored-by: Josh Zhang <jzhang1@stackoverflow.com>
2024-06-18 17:38:50 -04:00

321 lines
9.5 KiB
Go

package cloudflare
import (
"context"
"fmt"
"net/http"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func createSmartTieredCacheHandler(val string, lastModified string) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": [],
"messages": [],
"result": {
"editable": true,
"id": "tiered_cache_smart_topology_enable",
"modified_on": "%s",
"value": "%s"
}
}`, lastModified, val)
}
}
func nonexistentSmartTieredCacheHandler() func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("content-type", "application/json")
w.WriteHeader(404)
fmt.Fprintf(w, `{
"result": null,
"success": false,
"errors": [
{
"code": 1142,
"message": "Unable to retrieve tiered_cache_smart_topology_enable setting value. The zone setting does not exist."
}
],
"messages": []
}`)
}
}
func createGenericTieredCacheHandler(val string, lastModified string) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": [],
"messages": [],
"result": {
"id": "tiered_caching",
"value": "%s",
"modified_on": "%s",
"editable": false
}
}`, val, lastModified)
}
}
func TestGetTieredCache(t *testing.T) {
t.Run("can identify when Smart Tiered Cache", func(t *testing.T) {
t.Run("is disabled", func(t *testing.T) {
setup()
defer teardown()
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("on", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", createSmartTieredCacheHandler("off", lastModified))
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheGeneric,
LastModified: wanted,
}
got, err := client.GetTieredCache(context.Background(), ZoneIdentifier(testZoneID))
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
t.Run("is enabled", func(t *testing.T) {
setup()
defer teardown()
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("on", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", createSmartTieredCacheHandler("on", lastModified))
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheSmart,
LastModified: wanted,
}
got, err := client.GetTieredCache(context.Background(), ZoneIdentifier(testZoneID))
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
t.Run("zone setting does not exist", func(t *testing.T) {
setup()
defer teardown()
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("on", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", nonexistentSmartTieredCacheHandler())
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheGeneric,
LastModified: wanted,
}
got, err := client.GetTieredCache(context.Background(), ZoneIdentifier(testZoneID))
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
})
t.Run("can identify when generic tiered cache", func(t *testing.T) {
t.Run("is disabled", func(t *testing.T) {
setup()
defer teardown()
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("off", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", createSmartTieredCacheHandler("on", lastModified))
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheOff,
LastModified: wanted,
}
got, err := client.GetTieredCache(context.Background(), ZoneIdentifier(testZoneID))
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
t.Run("is enabled", func(t *testing.T) {
setup()
defer teardown()
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("on", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", nonexistentSmartTieredCacheHandler())
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheGeneric,
LastModified: wanted,
}
got, err := client.GetTieredCache(context.Background(), ZoneIdentifier(testZoneID))
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
})
t.Run("determines the latest last modified when", func(t *testing.T) {
t.Run("smart tiered cache zone setting does not exist", func(t *testing.T) {
setup()
defer teardown()
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("on", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", nonexistentSmartTieredCacheHandler())
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheGeneric,
LastModified: wanted,
}
got, err := client.GetTieredCache(context.Background(), ZoneIdentifier(testZoneID))
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
t.Run("generic tiered cache was modified more recently", func(t *testing.T) {
setup()
defer teardown()
earlier := time.Now().Add(time.Minute * -5).Format(time.RFC3339)
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("on", earlier))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", createSmartTieredCacheHandler("on", lastModified))
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheSmart,
LastModified: wanted,
}
got, err := client.GetTieredCache(context.Background(), ZoneIdentifier(testZoneID))
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
t.Run("smart tiered cache was modified more recently", func(t *testing.T) {
setup()
defer teardown()
earlier := time.Now().Add(time.Minute * -5).Format(time.RFC3339)
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("on", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", createSmartTieredCacheHandler("on", earlier))
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheSmart,
LastModified: wanted,
}
got, err := client.GetTieredCache(context.Background(), ZoneIdentifier(testZoneID))
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
})
}
func TestSetTieredCache(t *testing.T) {
t.Run("can enable tiered caching", func(t *testing.T) {
t.Run("using smart caching", func(t *testing.T) {
setup()
defer teardown()
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("on", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", createSmartTieredCacheHandler("on", lastModified))
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheSmart,
LastModified: wanted,
}
got, err := client.SetTieredCache(context.Background(), ZoneIdentifier(testZoneID), TieredCacheSmart)
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
t.Run("use generic caching", func(t *testing.T) {
setup()
defer teardown()
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("on", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", nonexistentSmartTieredCacheHandler())
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheGeneric,
LastModified: wanted,
}
got, err := client.SetTieredCache(context.Background(), ZoneIdentifier(testZoneID), TieredCacheGeneric)
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
})
}
func TestDeleteTieredCache(t *testing.T) {
t.Run("can disable tiered caching", func(t *testing.T) {
setup()
defer teardown()
lastModified := time.Now().Format(time.RFC3339)
mux.HandleFunc("/zones/"+testZoneID+"/argo/tiered_caching", createGenericTieredCacheHandler("off", lastModified))
mux.HandleFunc("/zones/"+testZoneID+"/cache/tiered_cache_smart_topology_enable", nonexistentSmartTieredCacheHandler())
wanted, _ := time.Parse(time.RFC3339, lastModified)
want := TieredCache{
Type: TieredCacheOff,
LastModified: wanted,
}
got, err := client.GetTieredCache(context.Background(), ZoneIdentifier(testZoneID))
if assert.NoError(t, err) {
assert.Equal(t, want, got)
}
})
}