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