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