bitbucket.org/Aishee/synsec@v0.0.0-20210414005726-236fc01a153d/pkg/apiclient/decisions_service_test.go (about) 1 package apiclient 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "net/url" 8 "reflect" 9 "testing" 10 11 "bitbucket.org/Aishee/synsec/pkg/cwversion" 12 "bitbucket.org/Aishee/synsec/pkg/models" 13 log "github.com/sirupsen/logrus" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestDecisionsList(t *testing.T) { 19 log.SetLevel(log.DebugLevel) 20 21 mux, urlx, teardown := setup() 22 defer teardown() 23 24 mux.HandleFunc("/decisions", func(w http.ResponseWriter, r *http.Request) { 25 testMethod(t, r, "GET") 26 if r.URL.RawQuery == "ip=1.2.3.4" { 27 assert.Equal(t, r.URL.RawQuery, "ip=1.2.3.4") 28 assert.Equal(t, r.Header.Get("X-Api-Key"), "ixu") 29 w.WriteHeader(http.StatusOK) 30 w.Write([]byte(`[{"duration":"3h59m55.756182786s","id":4,"origin":"ccscli","scenario":"manual 'ban' from '82929df7ee394b73b81252fe3b4e50203yaT2u6nXiaN7Ix9'","scope":"Ip","type":"ban","value":"1.2.3.4"}]`)) 31 } else { 32 w.WriteHeader(http.StatusOK) 33 w.Write([]byte(`null`)) 34 //no results 35 } 36 }) 37 apiURL, err := url.Parse(urlx + "/") 38 if err != nil { 39 log.Fatalf("parsing api url: %s", apiURL) 40 } 41 42 //ok answer 43 auth := &APIKeyTransport{ 44 APIKey: "ixu", 45 } 46 47 newcli, err := NewDefaultClient(apiURL, "v1", "toto", auth.Client()) 48 if err != nil { 49 log.Fatalf("new api client: %s", err.Error()) 50 } 51 52 tduration := "3h59m55.756182786s" 53 torigin := "ccscli" 54 tscenario := "manual 'ban' from '82929df7ee394b73b81252fe3b4e50203yaT2u6nXiaN7Ix9'" 55 tscope := "Ip" 56 ttype := "ban" 57 tvalue := "1.2.3.4" 58 expected := &models.GetDecisionsResponse{ 59 &models.Decision{ 60 Duration: &tduration, 61 ID: 4, 62 Origin: &torigin, 63 Scenario: &tscenario, 64 Scope: &tscope, 65 Type: &ttype, 66 Value: &tvalue, 67 }, 68 } 69 70 //OK decisions 71 decisionsFilter := DecisionsListOpts{IPEquals: new(string)} 72 *decisionsFilter.IPEquals = "1.2.3.4" 73 decisions, resp, err := newcli.Decisions.List(context.Background(), decisionsFilter) 74 75 if resp.Response.StatusCode != http.StatusOK { 76 t.Errorf("Alerts.List returned status: %d, want %d", resp.Response.StatusCode, http.StatusOK) 77 } 78 79 if err != nil { 80 log.Fatalf("new api client: %s", err.Error()) 81 } 82 if !reflect.DeepEqual(*decisions, *expected) { 83 t.Fatalf("returned %+v, want %+v", resp, expected) 84 } 85 86 //Empty return 87 decisionsFilter = DecisionsListOpts{IPEquals: new(string)} 88 *decisionsFilter.IPEquals = "1.2.3.5" 89 decisions, resp, err = newcli.Decisions.List(context.Background(), decisionsFilter) 90 require.NoError(t, err) 91 92 if resp.Response.StatusCode != http.StatusOK { 93 t.Errorf("Alerts.List returned status: %d, want %d", resp.Response.StatusCode, http.StatusOK) 94 } 95 assert.Equal(t, len(*decisions), 0) 96 97 } 98 99 func TestDecisionsStream(t *testing.T) { 100 log.SetLevel(log.DebugLevel) 101 102 mux, urlx, teardown := setup() 103 defer teardown() 104 105 mux.HandleFunc("/decisions/stream", func(w http.ResponseWriter, r *http.Request) { 106 107 assert.Equal(t, r.Header.Get("X-Api-Key"), "ixu") 108 testMethod(t, r, "GET") 109 if r.Method == "GET" { 110 111 if r.URL.RawQuery == "startup=true" { 112 w.WriteHeader(http.StatusOK) 113 w.Write([]byte(`{"deleted":null,"new":[{"duration":"3h59m55.756182786s","id":4,"origin":"ccscli","scenario":"manual 'ban' from '82929df7ee394b73b81252fe3b4e50203yaT2u6nXiaN7Ix9'","scope":"Ip","type":"ban","value":"1.2.3.4"}]}`)) 114 } else { 115 w.WriteHeader(http.StatusOK) 116 w.Write([]byte(`{"deleted":null,"new":null}`)) 117 } 118 } 119 }) 120 mux.HandleFunc("/decisions", func(w http.ResponseWriter, r *http.Request) { 121 assert.Equal(t, r.Header.Get("X-Api-Key"), "ixu") 122 testMethod(t, r, "DELETE") 123 if r.Method == "DELETE" { 124 w.WriteHeader(http.StatusOK) 125 } 126 }) 127 128 apiURL, err := url.Parse(urlx + "/") 129 if err != nil { 130 log.Fatalf("parsing api url: %s", apiURL) 131 } 132 133 //ok answer 134 auth := &APIKeyTransport{ 135 APIKey: "ixu", 136 } 137 138 newcli, err := NewDefaultClient(apiURL, "v1", "toto", auth.Client()) 139 if err != nil { 140 log.Fatalf("new api client: %s", err.Error()) 141 } 142 143 tduration := "3h59m55.756182786s" 144 torigin := "ccscli" 145 tscenario := "manual 'ban' from '82929df7ee394b73b81252fe3b4e50203yaT2u6nXiaN7Ix9'" 146 tscope := "Ip" 147 ttype := "ban" 148 tvalue := "1.2.3.4" 149 expected := &models.DecisionsStreamResponse{ 150 New: models.GetDecisionsResponse{ 151 &models.Decision{ 152 Duration: &tduration, 153 ID: 4, 154 Origin: &torigin, 155 Scenario: &tscenario, 156 Scope: &tscope, 157 Type: &ttype, 158 Value: &tvalue, 159 }, 160 }, 161 } 162 163 decisions, resp, err := newcli.Decisions.GetStream(context.Background(), true) 164 require.NoError(t, err) 165 166 if resp.Response.StatusCode != http.StatusOK { 167 t.Errorf("Alerts.List returned status: %d, want %d", resp.Response.StatusCode, http.StatusOK) 168 } 169 170 if err != nil { 171 log.Fatalf("new api client: %s", err.Error()) 172 } 173 if !reflect.DeepEqual(*decisions, *expected) { 174 t.Fatalf("returned %+v, want %+v", resp, expected) 175 } 176 177 //and second call, we get empty lists 178 decisions, resp, err = newcli.Decisions.GetStream(context.Background(), false) 179 require.NoError(t, err) 180 181 if resp.Response.StatusCode != http.StatusOK { 182 t.Errorf("Alerts.List returned status: %d, want %d", resp.Response.StatusCode, http.StatusOK) 183 } 184 assert.Equal(t, 0, len(decisions.New)) 185 assert.Equal(t, 0, len(decisions.Deleted)) 186 187 //delete stream 188 resp, err = newcli.Decisions.StopStream(context.Background()) 189 require.NoError(t, err) 190 191 if resp.Response.StatusCode != http.StatusOK { 192 t.Errorf("Alerts.List returned status: %d, want %d", resp.Response.StatusCode, http.StatusOK) 193 } 194 } 195 196 func TestDeleteDecisions(t *testing.T) { 197 mux, urlx, teardown := setup() 198 mux.HandleFunc("/watchers/login", func(w http.ResponseWriter, r *http.Request) { 199 w.WriteHeader(http.StatusOK) 200 w.Write([]byte(`{"code": 200, "expire": "2030-01-02T15:04:05Z", "token": "oklol"}`)) 201 }) 202 mux.HandleFunc("/decisions", func(w http.ResponseWriter, r *http.Request) { 203 testMethod(t, r, "DELETE") 204 assert.Equal(t, r.URL.RawQuery, "ip=1.2.3.4") 205 w.WriteHeader(http.StatusOK) 206 w.Write([]byte(`{"nbDeleted":"1"}`)) 207 //w.Write([]byte(`{"message":"0 deleted alerts"}`)) 208 }) 209 log.Printf("URL is %s", urlx) 210 apiURL, err := url.Parse(urlx + "/") 211 if err != nil { 212 log.Fatalf("parsing api url: %s", apiURL) 213 } 214 client, err := NewClient(&Config{ 215 MachineID: "test_login", 216 Password: "test_password", 217 UserAgent: fmt.Sprintf("synsec/%s", cwversion.VersionStr()), 218 URL: apiURL, 219 VersionPrefix: "v1", 220 }) 221 222 if err != nil { 223 log.Fatalf("new api client: %s", err.Error()) 224 } 225 226 filters := DecisionsDeleteOpts{IPEquals: new(string)} 227 *filters.IPEquals = "1.2.3.4" 228 deleted, _, err := client.Decisions.Delete(context.Background(), filters) 229 if err != nil { 230 t.Fatalf("unexpected err : %s", err) 231 } 232 assert.Equal(t, "1", deleted.NbDeleted) 233 234 defer teardown() 235 } 236 237 // func TestDeleteOneDecision(t *testing.T) { 238 // mux, urlx, teardown := setup() 239 // mux.HandleFunc("/watchers/login", func(w http.ResponseWriter, r *http.Request) { 240 // w.WriteHeader(http.StatusOK) 241 // w.Write([]byte(`{"code": 200, "expire": "2030-01-02T15:04:05Z", "token": "oklol"}`)) 242 // }) 243 // mux.HandleFunc("/decisions/1", func(w http.ResponseWriter, r *http.Request) { 244 // testMethod(t, r, "DELETE") 245 // w.WriteHeader(http.StatusOK) 246 // w.Write([]byte(`{"nbDeleted":"1"}`)) 247 // }) 248 // log.Printf("URL is %s", urlx) 249 // apiURL, err := url.Parse(urlx + "/") 250 // if err != nil { 251 // log.Fatalf("parsing api url: %s", apiURL) 252 // } 253 // client, err := NewClient(&Config{ 254 // MachineID: "test_login", 255 // Password: "test_password", 256 // UserAgent: fmt.Sprintf("synsec/%s", cwversion.VersionStr()), 257 // URL: apiURL, 258 // VersionPrefix: "v1", 259 // }) 260 261 // if err != nil { 262 // log.Fatalf("new api client: %s", err.Error()) 263 // } 264 265 // filters := DecisionsDeleteOpts{IPEquals: new(string)} 266 // *filters.IPEquals = "1.2.3.4" 267 // deleted, _, err := client.Decisions.Delete(context.Background(), filters) 268 // if err != nil { 269 // t.Fatalf("unexpected err : %s", err) 270 // } 271 // assert.Equal(t, "1", deleted.NbDeleted) 272 273 // defer teardown() 274 // }