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  // }