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

406 lines
12 KiB
Go

package cloudflare
import (
"context"
"fmt"
"net/http"
"testing"
"time"
"github.com/goccy/go-json"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestListAccessRules(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.Fprint(w, `{
"success": true,
"errors": [],
"messages": [],
"result": [
{
"id": "92f17202ed8bd63d69a66b86a49a8f6b",
"notes": "This rule is on because of an event that occurred on date X",
"allowed_modes": [
"whitelist",
"block",
"challenge",
"js_challenge"
],
"mode": "challenge",
"configuration": {
"target": "ip",
"value": "198.51.100.4"
},
"created_on": "2014-01-01T05:20:00Z",
"modified_on": "2014-01-01T05:20:00Z",
"scope": {
"id": "7c5dae5552338874e5053f2534d2767a",
"email": "user@example.com",
"type": "user"
}
}
],
"result_info": {
"page": 1,
"per_page": 20,
"count": 1,
"total_count": 200
}
}`)
}
createdOn, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00Z")
modifiedOn, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00Z")
want := &AccessRuleListResponse{
Result: []AccessRule{{
ID: "92f17202ed8bd63d69a66b86a49a8f6b",
Notes: "This rule is on because of an event that occurred on date X",
AllowedModes: []string{"whitelist", "block", "challenge", "js_challenge"},
Mode: "challenge",
Configuration: AccessRuleConfiguration{
Target: "ip",
Value: "198.51.100.4",
},
CreatedOn: createdOn,
ModifiedOn: modifiedOn,
Scope: AccessRuleScope{
ID: "7c5dae5552338874e5053f2534d2767a",
Email: "user@example.com",
Type: "user",
},
}},
ResultInfo: ResultInfo{
Page: 1,
PerPage: 20,
Count: 1,
Total: 200,
},
Response: Response{Success: true, Errors: []ResponseInfo{}, Messages: []ResponseInfo{}},
}
accessRule := AccessRule{
Notes: "my note",
Mode: "challenge",
Configuration: AccessRuleConfiguration{
Target: "ip",
Value: "198.51.100.4",
},
}
mux.HandleFunc("/user/firewall/access_rules/rules", handler)
actual, err := client.ListUserAccessRules(context.Background(), accessRule, 1)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/zones/"+testZoneID+"/firewall/access_rules/rules", handler)
actual, err = client.ListZoneAccessRules(context.Background(), testZoneID, accessRule, 1)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/accounts/"+testAccountID+"/firewall/access_rules/rules", handler)
actual, err = client.ListAccountAccessRules(context.Background(), testAccountID, accessRule, 1)
require.NoError(t, err)
assert.Equal(t, want, actual)
}
func TestCreateAccessRule(t *testing.T) {
setup()
defer teardown()
input := AccessRule{
Mode: "challenge",
Configuration: AccessRuleConfiguration{
Target: "ip",
Value: "198.51.100.4",
},
Notes: "This rule is on because of an event that occurred on date X",
}
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
var v AccessRule
err := json.NewDecoder(r.Body).Decode(&v)
require.NoError(t, err)
assert.Equal(t, input, v)
w.Header().Set("content-type", "application/json")
fmt.Fprint(w, `{
"success": true,
"errors": [],
"messages": [],
"result": {
"id": "92f17202ed8bd63d69a66b86a49a8f6b",
"notes": "This rule is on because of an event that occurred on date X",
"allowed_modes": [
"whitelist",
"block",
"challenge",
"js_challenge"
],
"mode": "challenge",
"configuration": {
"target": "ip",
"value": "198.51.100.4"
},
"created_on": "2014-01-01T05:20:00Z",
"modified_on": "2014-01-01T05:20:00Z",
"scope": {
"id": "7c5dae5552338874e5053f2534d2767a",
"email": "user@example.com",
"type": "user"
}
}
}`)
}
createdOn, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00Z")
modifiedOn, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00Z")
want := &AccessRuleResponse{
Result: AccessRule{
ID: "92f17202ed8bd63d69a66b86a49a8f6b",
Notes: input.Notes,
AllowedModes: []string{"whitelist", "block", "challenge", "js_challenge"},
Mode: input.Mode,
Configuration: input.Configuration,
CreatedOn: createdOn,
ModifiedOn: modifiedOn,
Scope: AccessRuleScope{
ID: "7c5dae5552338874e5053f2534d2767a",
Email: "user@example.com",
Type: "user",
},
},
Response: Response{Success: true, Errors: []ResponseInfo{}, Messages: []ResponseInfo{}},
}
mux.HandleFunc("/user/firewall/access_rules/rules", handler)
actual, err := client.CreateUserAccessRule(context.Background(), input)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/zones/"+testZoneID+"/firewall/access_rules/rules", handler)
actual, err = client.CreateZoneAccessRule(context.Background(), testZoneID, input)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/accounts/"+testAccountID+"/firewall/access_rules/rules", handler)
actual, err = client.CreateAccountAccessRule(context.Background(), testAccountID, input)
require.NoError(t, err)
assert.Equal(t, want, actual)
}
func TestAccessRule(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.Fprint(w, `{
"success": true,
"errors": [],
"messages": [],
"result": {
"id": "92f17202ed8bd63d69a66b86a49a8f6b",
"notes": "This rule is on because of an event that occurred on date X",
"allowed_modes": [
"whitelist",
"block",
"challenge",
"js_challenge"
],
"mode": "challenge",
"configuration": {
"target": "ip",
"value": "198.51.100.4"
},
"created_on": "2014-01-01T05:20:00Z",
"modified_on": "2014-01-01T05:20:00Z",
"scope": {
"id": "7c5dae5552338874e5053f2534d2767a",
"email": "user@example.com",
"type": "user"
}
}
}`)
}
createdOn, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00Z")
modifiedOn, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00Z")
want := &AccessRuleResponse{
Result: AccessRule{
ID: "92f17202ed8bd63d69a66b86a49a8f6b",
Notes: "This rule is on because of an event that occurred on date X",
AllowedModes: []string{"whitelist", "block", "challenge", "js_challenge"},
Mode: "challenge",
Configuration: AccessRuleConfiguration{
Target: "ip",
Value: "198.51.100.4",
},
CreatedOn: createdOn,
ModifiedOn: modifiedOn,
Scope: AccessRuleScope{
ID: "7c5dae5552338874e5053f2534d2767a",
Email: "user@example.com",
Type: "user",
},
},
Response: Response{Success: true, Errors: []ResponseInfo{}, Messages: []ResponseInfo{}},
}
accessRuleID := "92f17202ed8bd63d69a66b86a49a8f6b"
mux.HandleFunc("/user/firewall/access_rules/rules/"+accessRuleID, handler)
actual, err := client.UserAccessRule(context.Background(), accessRuleID)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/zones/"+testZoneID+"/firewall/access_rules/rules/"+accessRuleID, handler)
actual, err = client.ZoneAccessRule(context.Background(), testZoneID, accessRuleID)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/accounts/"+testAccountID+"/firewall/access_rules/rules/"+accessRuleID, handler)
actual, err = client.AccountAccessRule(context.Background(), testAccountID, accessRuleID)
require.NoError(t, err)
assert.Equal(t, want, actual)
}
func TestUpdateAccessRule(t *testing.T) {
setup()
defer teardown()
input := AccessRule{
Mode: "challenge",
Notes: "This rule is on because of an event that occurred on date X",
}
handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
var v AccessRule
err := json.NewDecoder(r.Body).Decode(&v)
require.NoError(t, err)
assert.Equal(t, input, v)
w.Header().Set("content-type", "application/json")
fmt.Fprint(w, `{
"success": true,
"errors": [],
"messages": [],
"result": {
"id": "92f17202ed8bd63d69a66b86a49a8f6b",
"notes": "This rule is on because of an event that occurred on date X",
"allowed_modes": [
"whitelist",
"block",
"challenge",
"js_challenge"
],
"mode": "challenge",
"configuration": {
"target": "ip",
"value": "198.51.100.4"
},
"created_on": "2014-01-01T05:20:00Z",
"modified_on": "2014-01-01T05:20:00Z",
"scope": {
"id": "7c5dae5552338874e5053f2534d2767a",
"email": "user@example.com",
"type": "user"
}
}
}`)
}
createdOn, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00Z")
modifiedOn, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00Z")
want := &AccessRuleResponse{
Result: AccessRule{
ID: "92f17202ed8bd63d69a66b86a49a8f6b",
Notes: "This rule is on because of an event that occurred on date X",
AllowedModes: []string{"whitelist", "block", "challenge", "js_challenge"},
Mode: "challenge",
Configuration: AccessRuleConfiguration{
Target: "ip",
Value: "198.51.100.4",
},
CreatedOn: createdOn,
ModifiedOn: modifiedOn,
Scope: AccessRuleScope{
ID: "7c5dae5552338874e5053f2534d2767a",
Email: "user@example.com",
Type: "user",
},
},
Response: Response{Success: true, Errors: []ResponseInfo{}, Messages: []ResponseInfo{}},
}
accessRuleID := "92f17202ed8bd63d69a66b86a49a8f6b"
mux.HandleFunc("/user/firewall/access_rules/rules/"+accessRuleID, handler)
actual, err := client.UpdateUserAccessRule(context.Background(), accessRuleID, input)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/zones/"+testZoneID+"/firewall/access_rules/rules/"+accessRuleID, handler)
actual, err = client.UpdateZoneAccessRule(context.Background(), testZoneID, accessRuleID, input)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/accounts/"+testAccountID+"/firewall/access_rules/rules/"+accessRuleID, handler)
actual, err = client.UpdateAccountAccessRule(context.Background(), testAccountID, accessRuleID, input)
require.NoError(t, err)
assert.Equal(t, want, actual)
}
func TestDeleteAccessRule(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.Fprint(w, `{
"success": true,
"errors": [],
"messages": [],
"result": {
"id": "92f17202ed8bd63d69a66b86a49a8f6b"
}
}`)
}
want := &AccessRuleResponse{
Result: AccessRule{
ID: "92f17202ed8bd63d69a66b86a49a8f6b",
},
Response: Response{Success: true, Errors: []ResponseInfo{}, Messages: []ResponseInfo{}},
}
accessRuleID := "92f17202ed8bd63d69a66b86a49a8f6b"
mux.HandleFunc("/user/firewall/access_rules/rules/"+accessRuleID, handler)
actual, err := client.DeleteUserAccessRule(context.Background(), accessRuleID)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/zones/"+testZoneID+"/firewall/access_rules/rules/"+accessRuleID, handler)
actual, err = client.DeleteZoneAccessRule(context.Background(), testZoneID, accessRuleID)
require.NoError(t, err)
assert.Equal(t, want, actual)
mux.HandleFunc("/accounts/"+testAccountID+"/firewall/access_rules/rules/"+accessRuleID, handler)
actual, err = client.DeleteAccountAccessRule(context.Background(), testAccountID, accessRuleID)
require.NoError(t, err)
assert.Equal(t, want, actual)
}