github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/threat_intel_test.go (about) 1 package appsec 2 3 import ( 4 "context" 5 "encoding/json" 6 "errors" 7 "net/http" 8 "net/http/httptest" 9 "testing" 10 11 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v2/pkg/session" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestAppSec_GetThreatIntel(t *testing.T) { 17 18 result := GetThreatIntelResponse{} 19 20 respData := compactJSON(loadFixtureBytes("testdata/TestThreatIntel/ThreatIntel.json")) 21 json.Unmarshal([]byte(respData), &result) 22 23 tests := map[string]struct { 24 params GetThreatIntelRequest 25 responseStatus int 26 responseBody string 27 expectedPath string 28 expectedResponse *GetThreatIntelResponse 29 withError error 30 }{ 31 "200 OK": { 32 params: GetThreatIntelRequest{ 33 ConfigID: 43253, 34 Version: 15, 35 PolicyID: "AAAA_81230", 36 }, 37 responseStatus: http.StatusOK, 38 responseBody: respData, 39 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/threat-intel", 40 expectedResponse: &result, 41 }, 42 "500 internal server error": { 43 params: GetThreatIntelRequest{ 44 ConfigID: 43253, 45 Version: 15, 46 PolicyID: "AAAA_81230", 47 }, 48 responseStatus: http.StatusInternalServerError, 49 responseBody: (` 50 { 51 "type": "internal_error", 52 "title": "Internal Server Error", 53 "detail": "Error fetching match target" 54 }`), 55 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/threat-intel", 56 withError: &Error{ 57 Type: "internal_error", 58 Title: "Internal Server Error", 59 Detail: "Error fetching match target", 60 StatusCode: http.StatusInternalServerError, 61 }, 62 }, 63 } 64 65 for name, test := range tests { 66 t.Run(name, func(t *testing.T) { 67 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 68 assert.Equal(t, test.expectedPath, r.URL.String()) 69 assert.Equal(t, http.MethodGet, r.Method) 70 w.WriteHeader(test.responseStatus) 71 _, err := w.Write([]byte(test.responseBody)) 72 assert.NoError(t, err) 73 })) 74 client := mockAPIClient(t, mockServer) 75 result, err := client.GetThreatIntel(context.Background(), test.params) 76 if test.withError != nil { 77 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 78 return 79 } 80 require.NoError(t, err) 81 assert.Equal(t, test.expectedResponse, result) 82 }) 83 } 84 } 85 86 func TestAppSec_UpdateThreatIntel(t *testing.T) { 87 result := UpdateThreatIntelResponse{} 88 89 respData := compactJSON(loadFixtureBytes("testdata/TestThreatIntel/ThreatIntel.json")) 90 json.Unmarshal([]byte(respData), &result) 91 92 req := UpdateThreatIntelRequest{} 93 94 reqData := compactJSON(loadFixtureBytes("testdata/TestThreatIntel/ThreatIntel.json")) 95 json.Unmarshal([]byte(reqData), &req) 96 97 tests := map[string]struct { 98 params UpdateThreatIntelRequest 99 responseStatus int 100 responseBody string 101 expectedPath string 102 expectedResponse *UpdateThreatIntelResponse 103 withError error 104 headers http.Header 105 }{ 106 "200 Success": { 107 params: UpdateThreatIntelRequest{ 108 ConfigID: 43253, 109 Version: 15, 110 PolicyID: "AAAA_81230", 111 }, 112 headers: http.Header{ 113 "Content-Type": []string{"application/json;charset=UTF-8"}, 114 }, 115 responseStatus: http.StatusCreated, 116 responseBody: respData, 117 expectedResponse: &result, 118 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/threat-intel", 119 }, 120 "500 internal server error": { 121 params: UpdateThreatIntelRequest{ 122 ConfigID: 43253, 123 Version: 15, 124 PolicyID: "AAAA_81230", 125 }, 126 responseStatus: http.StatusInternalServerError, 127 responseBody: (` 128 { 129 "type": "internal_error", 130 "title": "Internal Server Error", 131 "detail": "Error creating zone" 132 }`), 133 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/threat-intel", 134 withError: &Error{ 135 Type: "internal_error", 136 Title: "Internal Server Error", 137 Detail: "Error creating zone", 138 StatusCode: http.StatusInternalServerError, 139 }, 140 }, 141 } 142 143 for name, test := range tests { 144 t.Run(name, func(t *testing.T) { 145 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 146 assert.Equal(t, http.MethodPut, r.Method) 147 w.WriteHeader(test.responseStatus) 148 if len(test.responseBody) > 0 { 149 _, err := w.Write([]byte(test.responseBody)) 150 assert.NoError(t, err) 151 } 152 })) 153 client := mockAPIClient(t, mockServer) 154 result, err := client.UpdateThreatIntel( 155 session.ContextWithOptions( 156 context.Background(), 157 session.WithContextHeaders(test.headers)), test.params) 158 if test.withError != nil { 159 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 160 return 161 } 162 require.NoError(t, err) 163 assert.Equal(t, test.expectedResponse, result) 164 }) 165 } 166 }