summaryrefslogtreecommitdiff
path: root/internal/store/search_test.go
blob: be21b3e757f6974d87858c20285d17772df65854 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package store_test

import (
	"testing"
	"time"

	"github.com/shiv/internal/store"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func logTxWithBodies(t *testing.T, st *store.Store, method, host, url string, status int, reqBody, respBody string) {
	t.Helper()
	tx := store.Transaction{
		Timestamp:  time.Now().UTC(),
		Host:       host,
		Method:     method,
		URL:        url,
		ReqBody:    []byte(reqBody),
		RespBody:   []byte(respBody),
		StatusCode: status,
		InScope:    true,
	}
	require.NoError(t, st.Log(tx))
}

func TestSearchTransactions_FindsInRespBody(t *testing.T) {
	st := newTestStore(t)
	logTxWithBodies(t, st, "GET", "a.com", "https://a.com/", 200, "", "secret_token_here")
	logTxWithBodies(t, st, "GET", "b.com", "https://b.com/", 200, "", "nothing special")

	results, err := st.SearchTransactions("secret_token", false, true, false)
	require.NoError(t, err)
	require.Len(t, results, 1)
	assert.Equal(t, "a.com", results[0].Host)
}

func TestSearchTransactions_FindsInReqBody(t *testing.T) {
	st := newTestStore(t)
	logTxWithBodies(t, st, "POST", "a.com", "https://a.com/login", 200, "password=hunter2", "ok")
	logTxWithBodies(t, st, "GET", "b.com", "https://b.com/", 200, "", "ok")

	results, err := st.SearchTransactions("hunter2", true, false, false)
	require.NoError(t, err)
	require.Len(t, results, 1)
	assert.Equal(t, "a.com", results[0].Host)
}

func TestSearchTransactions_EmptyTerm_ReturnsNil(t *testing.T) {
	st := newTestStore(t)
	logTxWithBodies(t, st, "GET", "a.com", "https://a.com/", 200, "", "data")

	results, err := st.SearchTransactions("", true, true, false)
	require.NoError(t, err)
	assert.Nil(t, results)
}

func TestSearchTransactions_NoFieldsSelected_ReturnsNil(t *testing.T) {
	st := newTestStore(t)
	logTxWithBodies(t, st, "GET", "a.com", "https://a.com/", 200, "", "data")

	results, err := st.SearchTransactions("data", false, false, false)
	require.NoError(t, err)
	assert.Nil(t, results)
}

func TestSearchTransactions_NoMatch_ReturnsEmpty(t *testing.T) {
	st := newTestStore(t)
	logTxWithBodies(t, st, "GET", "a.com", "https://a.com/", 200, "", "nothing here")

	results, err := st.SearchTransactions("xyzzy_not_found", false, true, false)
	require.NoError(t, err)
	assert.Empty(t, results)
}

func TestTransactionsPage_MethodFilter(t *testing.T) {
	st := newTestStore(t)
	require.NoError(t, st.Log(makeTx("GET", "a.com", "https://a.com/", 200)))
	require.NoError(t, st.Log(makeTx("POST", "a.com", "https://a.com/login", 200)))
	require.NoError(t, st.Log(makeTx("PUT", "a.com", "https://a.com/item", 200)))

	results, err := st.TransactionsPage(0, store.TransactionFilter{
		ShowOutScope: true,
		Methods:      []string{"POST"},
	})
	require.NoError(t, err)
	require.Len(t, results, 1)
	assert.Equal(t, "POST", results[0].Method)
}

func TestTransactionsPage_StatusRangeFilter(t *testing.T) {
	st := newTestStore(t)
	require.NoError(t, st.Log(makeTx("GET", "a.com", "https://a.com/ok", 200)))
	require.NoError(t, st.Log(makeTx("GET", "a.com", "https://a.com/redir", 302)))
	require.NoError(t, st.Log(makeTx("GET", "a.com", "https://a.com/err", 404)))

	results, err := st.TransactionsPage(0, store.TransactionFilter{
		ShowOutScope: true,
		StatusMin:    400,
		StatusMax:    499,
	})
	require.NoError(t, err)
	require.Len(t, results, 1)
	assert.Equal(t, 404, results[0].StatusCode)
}