blob: f0ddbb3b303d2b70c67da0062b4b1b27426a0100 [file]
package ignore
import (
"net/url"
"testing"
"time"
assert "github.com/stretchr/testify/require"
)
func TestTestMemIgnoreStore(t *testing.T) {
memStore := NewMemIgnoreStore()
testIgnoreStore(t, memStore)
}
func testIgnoreStore(t *testing.T, store IgnoreStore) {
// Add a few instances.
r1 := NewIgnoreRule("jon@example.com", time.Now().Add(time.Hour), "config=gpu", "reason")
r2 := NewIgnoreRule("jim@example.com", time.Now().Add(time.Minute*10), "config=8888", "No good reason.")
r3 := NewIgnoreRule("jon@example.com", time.Now().Add(time.Minute*50), "extra=123&extra=abc", "Ignore multiple.")
r4 := NewIgnoreRule("jon@example.com", time.Now().Add(time.Minute*100), "extra=123&extra=abc&config=8888", "Ignore multiple.")
assert.Equal(t, int64(0), store.Revision())
assert.Nil(t, store.Create(r1))
assert.Nil(t, store.Create(r2))
assert.Nil(t, store.Create(r3))
assert.Nil(t, store.Create(r4))
assert.Equal(t, int64(4), store.Revision())
allRules, err := store.List()
assert.Nil(t, err)
assert.Equal(t, 4, len(allRules))
assert.Equal(t, int64(4), store.Revision())
// Test the rule matcher
matcher, err := store.BuildRuleMatcher()
assert.Nil(t, err)
found, ok := matcher(map[string]string{"config": "565"})
assert.False(t, ok)
assert.Equal(t, []*IgnoreRule{}, found)
found, ok = matcher(map[string]string{"config": "8888"})
assert.True(t, ok)
assert.Equal(t, 1, len(found))
found, ok = matcher(map[string]string{"extra": "123"})
assert.True(t, ok)
assert.Equal(t, 1, len(found))
found, ok = matcher(map[string]string{"extra": "abc"})
assert.True(t, ok)
assert.Equal(t, 1, len(found))
found, ok = matcher(map[string]string{"extra": "abc", "config": "8888"})
assert.True(t, ok)
assert.Equal(t, 3, len(found))
found, ok = matcher(map[string]string{"extra": "abc", "config": "gpu"})
assert.True(t, ok)
assert.Equal(t, 2, len(found))
assert.Equal(t, int64(4), store.Revision())
// Remove the third and fourth rule
delCount, err := store.Delete(r3.ID, "jon@example.com")
assert.Nil(t, err)
assert.Equal(t, 1, delCount)
delCount, err = store.Delete(r4.ID, "jon@example.com")
assert.Nil(t, err)
assert.Equal(t, 1, delCount)
allRules, err = store.List()
assert.Nil(t, err)
assert.Equal(t, 2, len(allRules))
assert.Equal(t, int64(6), store.Revision())
for _, oneRule := range allRules {
assert.True(t, (oneRule.ID == r1.ID) || (oneRule.ID == r2.ID))
}
delCount, err = store.Delete(r1.ID, "jane@example.com")
assert.Nil(t, err)
allRules, err = store.List()
assert.Equal(t, 1, len(allRules))
assert.Equal(t, r2.ID, allRules[0].ID)
assert.Equal(t, int64(7), store.Revision())
// Update a rule.
updatedRule := *allRules[0]
updatedRule.Note = "an updated rule"
err = store.Update(updatedRule.ID, &updatedRule)
assert.NoError(t, err, "Update should succeed.")
allRules, err = store.List()
assert.Equal(t, 1, len(allRules))
assert.Equal(t, r2.ID, allRules[0].ID)
assert.Equal(t, "an updated rule", allRules[0].Note)
assert.Equal(t, int64(8), store.Revision())
// Try to update a non-existent rule.
updatedRule = *allRules[0]
err = store.Update(100001, &updatedRule)
assert.Error(t, err, "Update should fail for a bad id.")
assert.Equal(t, int64(8), store.Revision())
delCount, err = store.Delete(r2.ID, "jon@example.com")
assert.Nil(t, err)
allRules, err = store.List()
assert.Nil(t, err)
assert.Equal(t, 0, len(allRules))
assert.Equal(t, int64(9), store.Revision())
delCount, err = store.Delete(1000000, "someuser@example.com")
assert.Nil(t, err)
assert.Equal(t, delCount, 0)
allRules, err = store.List()
assert.Nil(t, err)
assert.Equal(t, 0, len(allRules))
assert.Equal(t, int64(9), store.Revision())
}
func TestToQuery(t *testing.T) {
queries, err := ToQuery([]*IgnoreRule{})
assert.Nil(t, err)
assert.Len(t, queries, 0)
r1 := NewIgnoreRule("jon@example.com", time.Now().Add(time.Hour), "config=gpu", "reason")
queries, err = ToQuery([]*IgnoreRule{r1})
assert.Nil(t, err)
assert.Equal(t, queries[0], url.Values{"config": []string{"gpu"}})
r1 = NewIgnoreRule("jon@example.com", time.Now().Add(time.Hour), "bad=%", "reason")
queries, err = ToQuery([]*IgnoreRule{r1})
assert.NotNil(t, err)
}