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