mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-11-10 00:10:36 +08:00
321 lines
9.5 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|