dnscontrol/pkg/cloudflare-go/devices_policy_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

423 lines
11 KiB
Go

package cloudflare
import (
"context"
"fmt"
"net/http"
"testing"
"github.com/stretchr/testify/assert"
)
var (
deviceSettingsPolicyID = "a842fa8a-a583-482e-9cd9-eb43362949fd"
deviceSettingsPolicyMatch = "identity.email == \"test@example.com\""
deviceSettingsPolicyPrecedence = 10
defaultDeviceSettingsPolicy = DeviceSettingsPolicy{
ServiceModeV2: &ServiceModeV2{
Mode: "warp",
},
DisableAutoFallback: BoolPtr(false),
FallbackDomains: &[]FallbackDomain{
{Suffix: "invalid"},
{Suffix: "test"},
},
Exclude: &[]SplitTunnel{
{Address: "10.0.0.0/8"},
{Address: "100.64.0.0/10"},
},
GatewayUniqueID: StringPtr("t1235"),
SupportURL: StringPtr(""),
CaptivePortal: IntPtr(180),
AllowModeSwitch: BoolPtr(false),
SwitchLocked: BoolPtr(false),
AllowUpdates: BoolPtr(false),
AutoConnect: IntPtr(0),
AllowedToLeave: BoolPtr(true),
Enabled: BoolPtr(true),
PolicyID: nil,
Name: nil,
Match: nil,
Precedence: nil,
Default: true,
ExcludeOfficeIps: BoolPtr(false),
Description: nil,
LANAllowMinutes: nil,
LANAllowSubnetSize: nil,
}
nonDefaultDeviceSettingsPolicy = DeviceSettingsPolicy{
ServiceModeV2: &ServiceModeV2{
Mode: "warp",
},
DisableAutoFallback: BoolPtr(false),
FallbackDomains: &[]FallbackDomain{
{Suffix: "invalid"},
{Suffix: "test"},
},
Exclude: &[]SplitTunnel{
{Address: "10.0.0.0/8"},
{Address: "100.64.0.0/10"},
},
GatewayUniqueID: StringPtr("t1235"),
SupportURL: StringPtr(""),
CaptivePortal: IntPtr(180),
AllowModeSwitch: BoolPtr(false),
SwitchLocked: BoolPtr(false),
AllowUpdates: BoolPtr(false),
AutoConnect: IntPtr(0),
AllowedToLeave: BoolPtr(true),
PolicyID: &deviceSettingsPolicyID,
Enabled: BoolPtr(true),
Name: StringPtr("test"),
Match: &deviceSettingsPolicyMatch,
Precedence: &deviceSettingsPolicyPrecedence,
Default: false,
ExcludeOfficeIps: BoolPtr(true),
Description: StringPtr("Test Description"),
LANAllowMinutes: UintPtr(120),
LANAllowSubnetSize: UintPtr(31),
}
defaultDeviceSettingsPolicyJson = `{
"service_mode_v2": {
"mode": "warp"
},
"disable_auto_fallback": false,
"fallback_domains": [
{
"suffix": "invalid"
},
{
"suffix": "test"
}
],
"exclude": [
{
"address": "10.0.0.0/8"
},
{
"address": "100.64.0.0/10"
}
],
"gateway_unique_id": "t1235",
"support_url": "",
"captive_portal": 180,
"allow_mode_switch": false,
"switch_locked": false,
"allow_updates": false,
"auto_connect": 0,
"allowed_to_leave": true,
"enabled": true,
"default": true,
"exclude_office_ips":false
}`
nonDefaultDeviceSettingsPolicyJson = fmt.Sprintf(`{
"service_mode_v2": {
"mode": "warp"
},
"disable_auto_fallback": false,
"fallback_domains": [
{
"suffix": "invalid"
},
{
"suffix": "test"
}
],
"exclude": [
{
"address": "10.0.0.0/8"
},
{
"address": "100.64.0.0/10"
}
],
"gateway_unique_id": "t1235",
"support_url": "",
"captive_portal": 180,
"allow_mode_switch": false,
"switch_locked": false,
"allow_updates": false,
"auto_connect": 0,
"allowed_to_leave": true,
"policy_id": "%s",
"enabled": true,
"name": "test",
"match": %#v,
"precedence": 10,
"default": false,
"exclude_office_ips":true,
"description":"Test Description",
"lan_allow_minutes": 120,
"lan_allow_subnet_size": 31
}`, deviceSettingsPolicyID, deviceSettingsPolicyMatch)
)
func TestUpdateDeviceClientCertificates(t *testing.T) {
setup()
defer teardown()
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": null,
"messages": null,
"result": {"enabled": true}
}`)
}
want := DeviceClientCertificates{
Response: Response{
Success: true,
Errors: nil,
Messages: nil,
},
Result: Enabled{true},
}
mux.HandleFunc("/zones/"+testZoneID+"/devices/policy/certificates", handler)
actual, err := client.UpdateDeviceClientCertificates(context.Background(), ZoneIdentifier(testZoneID), UpdateDeviceClientCertificatesParams{Enabled: BoolPtr(true)})
if assert.NoError(t, err) {
assert.Equal(t, want, actual)
}
}
func TestGetDeviceClientCertificates(t *testing.T) {
setup()
defer teardown()
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": null,
"messages": null,
"result": {"enabled": false}
}`)
}
want := DeviceClientCertificates{
Response: Response{
Success: true,
Errors: nil,
Messages: nil,
},
Result: Enabled{false},
}
mux.HandleFunc("/zones/"+testZoneID+"/devices/policy/certificates", handler)
actual, err := client.GetDeviceClientCertificates(context.Background(), ZoneIdentifier(testZoneID), GetDeviceClientCertificatesParams{})
if assert.NoError(t, err) {
assert.Equal(t, want, actual)
}
}
func TestCreateDeviceSettingsPolicy(t *testing.T) {
setup()
defer teardown()
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": null,
"messages": null,
"result": %s
}`, nonDefaultDeviceSettingsPolicyJson)
}
mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy", handler)
actual, err := client.CreateDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), CreateDeviceSettingsPolicyParams{
Precedence: IntPtr(10),
Match: &deviceSettingsPolicyMatch,
Name: StringPtr("test"),
Description: StringPtr("Test Description"),
LANAllowMinutes: UintPtr(120),
LANAllowSubnetSize: UintPtr(31),
})
if assert.NoError(t, err) {
assert.Equal(t, nonDefaultDeviceSettingsPolicy, actual)
}
}
func TestUpdateDefaultDeviceSettingsPolicy(t *testing.T) {
setup()
defer teardown()
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": null,
"messages": null,
"result": %s
}`, defaultDeviceSettingsPolicyJson)
}
mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy", handler)
actual, err := client.UpdateDefaultDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), UpdateDefaultDeviceSettingsPolicyParams{})
if assert.NoError(t, err) {
assert.Equal(t, defaultDeviceSettingsPolicy, actual)
}
}
func TestUpdateDeviceSettingsPolicy(t *testing.T) {
setup()
defer teardown()
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": null,
"messages": null,
"result": %s
}`, nonDefaultDeviceSettingsPolicyJson)
}
precedence := 10
mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy/"+deviceSettingsPolicyID, handler)
actual, err := client.UpdateDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), UpdateDeviceSettingsPolicyParams{
PolicyID: &deviceSettingsPolicyID,
Precedence: &precedence,
})
if assert.NoError(t, err) {
assert.Equal(t, nonDefaultDeviceSettingsPolicy, actual)
}
}
func TestDeleteDeviceSettingsPolicy(t *testing.T) {
setup()
defer teardown()
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodDelete, r.Method, "Expected method 'DELETE', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": null,
"messages": null,
"result": [ %s ]
}`, defaultDeviceSettingsPolicyJson)
}
mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy/"+deviceSettingsPolicyID, handler)
actual, err := client.DeleteDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), deviceSettingsPolicyID)
if assert.NoError(t, err) {
assert.Equal(t, []DeviceSettingsPolicy{defaultDeviceSettingsPolicy}, actual)
}
}
func TestGetDefaultDeviceSettings(t *testing.T) {
setup()
defer teardown()
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": null,
"messages": null,
"result": %s
}`, defaultDeviceSettingsPolicyJson)
}
mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy", handler)
actual, err := client.GetDefaultDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), GetDefaultDeviceSettingsPolicyParams{})
if assert.NoError(t, err) {
assert.Equal(t, defaultDeviceSettingsPolicy, actual)
}
}
func TestGetDeviceSettings(t *testing.T) {
setup()
defer teardown()
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": null,
"messages": null,
"result": %s
}`, nonDefaultDeviceSettingsPolicyJson)
}
mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy/"+deviceSettingsPolicyID, handler)
actual, err := client.GetDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), GetDeviceSettingsPolicyParams{PolicyID: &deviceSettingsPolicyID})
if assert.NoError(t, err) {
assert.Equal(t, nonDefaultDeviceSettingsPolicy, actual)
}
}
func TestListDeviceSettingsPolicies(t *testing.T) {
setup()
defer teardown()
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": null,
"messages": null,
"result": [%s],
"result_info": {
"count": 1,
"page": 1,
"per_page": 20,
"total_count": 1
}
}`, nonDefaultDeviceSettingsPolicyJson)
}
want := []DeviceSettingsPolicy{nonDefaultDeviceSettingsPolicy}
mux.HandleFunc("/accounts/"+testAccountID+"/devices/policies", handler)
actual, resultInfo, err := client.ListDeviceSettingsPolicies(context.Background(), AccountIdentifier(testAccountID), ListDeviceSettingsPoliciesParams{
ResultInfo: ResultInfo{
Page: 1,
PerPage: 20,
},
})
if assert.NoError(t, err) {
assert.Equal(t, want, actual)
assert.Equal(t, &ResultInfo{
Count: 1,
Page: 1,
PerPage: 20,
Total: 1,
}, resultInfo)
assert.Len(t, actual, 1)
}
}