mirror of https://github.com/velour/catbase.git
stats: Add tests and clean a few things up
* Make statFromDB return 0 if no stats are in the DB instead of error * Convert tests to use the assert library * Add tests for actual messages
This commit is contained in:
parent
95616e0fb8
commit
e1e58591ec
|
@ -107,6 +107,10 @@ func statFromDB(path, bucket, key string) (stat, error) {
|
|||
return stat{}, err
|
||||
}
|
||||
|
||||
if v == nil {
|
||||
return stat{bucket, key, 0}, nil
|
||||
}
|
||||
|
||||
return mkStat(buk, k, v)
|
||||
}
|
||||
|
||||
|
|
|
@ -2,18 +2,22 @@ package stats
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/velour/catbase/bot"
|
||||
"github.com/velour/catbase/bot/msg"
|
||||
"github.com/velour/catbase/bot/user"
|
||||
)
|
||||
|
||||
var dbPath = "test.db"
|
||||
|
||||
func TestJSON(t *testing.T) {
|
||||
expected := 5
|
||||
b, err := json.Marshal(expected)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
assert.Nil(t, err)
|
||||
t.Logf("%+v", expected)
|
||||
t.Log(string(b))
|
||||
}
|
||||
|
@ -22,25 +26,17 @@ func TestValueConversion(t *testing.T) {
|
|||
expected := value(5)
|
||||
|
||||
b, err := expected.Bytes()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
assert.Nil(t, err)
|
||||
|
||||
t.Log(string(b))
|
||||
|
||||
actual, err := valueFromBytes(b)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
assert.Nil(t, err)
|
||||
|
||||
assert.Equal(t, actual, expected)
|
||||
}
|
||||
|
||||
if fmt.Sprintf("%+v", actual) != fmt.Sprintf("%+v", expected) {
|
||||
t.Errorf("Did not get equivalent objects: %+v != %+v", actual, expected)
|
||||
}
|
||||
}
|
||||
|
||||
func rmDB(t *testing.T, dbPath string) {
|
||||
func rmDB(t *testing.T) {
|
||||
err := os.Remove(dbPath)
|
||||
if err != nil && !strings.Contains(err.Error(), "no such file or directory") {
|
||||
t.Fatal(err)
|
||||
|
@ -48,8 +44,7 @@ func rmDB(t *testing.T, dbPath string) {
|
|||
}
|
||||
|
||||
func TestWithDB(t *testing.T) {
|
||||
dbPath := "test.db"
|
||||
rmDB(t, dbPath)
|
||||
rmDB(t)
|
||||
|
||||
t.Run("TestDBReadWrite", func(t *testing.T) {
|
||||
bucket := "testBucket"
|
||||
|
@ -62,36 +57,22 @@ func TestWithDB(t *testing.T) {
|
|||
}}
|
||||
|
||||
err := expected.toDB(dbPath)
|
||||
if err != nil {
|
||||
t.Fatalf("Error writing to DB: %s", err)
|
||||
}
|
||||
assert.Nil(t, err)
|
||||
|
||||
actual, err := statFromDB(dbPath, bucket, key)
|
||||
if err != nil {
|
||||
t.Fatalf("Error reading DB: %s", err)
|
||||
}
|
||||
assert.Nil(t, err)
|
||||
|
||||
if actual != expected[0] {
|
||||
t.Fatalf("%+v != %+v", actual, expected)
|
||||
}
|
||||
assert.Equal(t, actual, expected[0])
|
||||
|
||||
})
|
||||
|
||||
rmDB(t, dbPath)
|
||||
rmDB(t)
|
||||
|
||||
t.Run("TestDBAddStatInLoop", func(t *testing.T) {
|
||||
bucket := "testBucket"
|
||||
key := "testKey"
|
||||
expected := value(25)
|
||||
|
||||
os.Remove(dbPath)
|
||||
defer func() {
|
||||
err := os.Remove(dbPath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}()
|
||||
|
||||
statPack := stats{stat{
|
||||
bucket,
|
||||
key,
|
||||
|
@ -100,36 +81,22 @@ func TestWithDB(t *testing.T) {
|
|||
|
||||
for i := 0; i < 5; i++ {
|
||||
err := statPack.toDB(dbPath)
|
||||
if err != nil {
|
||||
t.Fatalf("Error writing to DB: %s", err)
|
||||
}
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
actual, err := statFromDB(dbPath, bucket, key)
|
||||
if err != nil {
|
||||
t.Fatalf("Error reading DB: %s", err)
|
||||
}
|
||||
assert.Nil(t, err)
|
||||
|
||||
if actual.val != expected {
|
||||
t.Fatalf("%+v != %+v", actual.val, expected)
|
||||
}
|
||||
assert.Equal(t, actual.val, expected)
|
||||
})
|
||||
|
||||
rmDB(t, dbPath)
|
||||
rmDB(t)
|
||||
|
||||
t.Run("TestDBAddStats", func(t *testing.T) {
|
||||
bucket := "testBucket"
|
||||
key := "testKey"
|
||||
expected := value(5)
|
||||
|
||||
os.Remove(dbPath)
|
||||
defer func() {
|
||||
err := os.Remove(dbPath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}()
|
||||
|
||||
statPack := stats{
|
||||
stat{
|
||||
bucket,
|
||||
|
@ -159,19 +126,172 @@ func TestWithDB(t *testing.T) {
|
|||
}
|
||||
|
||||
err := statPack.toDB(dbPath)
|
||||
if err != nil {
|
||||
t.Fatalf("Error writing to DB: %s", err)
|
||||
}
|
||||
assert.Nil(t, err)
|
||||
|
||||
actual, err := statFromDB(dbPath, bucket, key)
|
||||
if err != nil {
|
||||
t.Fatalf("Error reading DB: %s", err)
|
||||
}
|
||||
assert.Nil(t, err)
|
||||
|
||||
if actual.val != expected {
|
||||
t.Fatalf("%+v != %+v", actual.val, expected)
|
||||
}
|
||||
assert.Equal(t, actual.val, expected)
|
||||
})
|
||||
|
||||
rmDB(t, dbPath)
|
||||
rmDB(t)
|
||||
}
|
||||
|
||||
func makeMessage(payload string) msg.Message {
|
||||
isCmd := strings.HasPrefix(payload, "!")
|
||||
if isCmd {
|
||||
payload = payload[1:]
|
||||
}
|
||||
return msg.Message{
|
||||
User: &user.User{Name: "tester"},
|
||||
Channel: "test",
|
||||
Body: payload,
|
||||
Command: isCmd,
|
||||
}
|
||||
}
|
||||
|
||||
func testUserCounter(t *testing.T, count int) {
|
||||
expected := value(count)
|
||||
mb := bot.NewMockBot()
|
||||
mb.Cfg.Stats.DBPath = dbPath
|
||||
s := New(mb)
|
||||
assert.NotNil(t, s)
|
||||
|
||||
for i := 0; i < count; i++ {
|
||||
s.Message(makeMessage("test"))
|
||||
}
|
||||
|
||||
_, err := os.Stat(dbPath)
|
||||
assert.Nil(t, err)
|
||||
|
||||
stat, err := statFromDB(mb.Config().Stats.DBPath, "user", "tester")
|
||||
assert.Nil(t, err)
|
||||
actual := stat.val
|
||||
assert.Equal(t, actual, expected)
|
||||
}
|
||||
|
||||
func TestMessages(t *testing.T) {
|
||||
_, err := os.Stat(dbPath)
|
||||
assert.NotNil(t, err)
|
||||
|
||||
t.Run("TestOneUserCounter", func(t *testing.T) {
|
||||
count := 5
|
||||
expected := value(count)
|
||||
mb := bot.NewMockBot()
|
||||
mb.Cfg.Stats.DBPath = dbPath
|
||||
s := New(mb)
|
||||
assert.NotNil(t, s)
|
||||
|
||||
for i := 0; i < count; i++ {
|
||||
s.Message(makeMessage("test"))
|
||||
}
|
||||
|
||||
_, err := os.Stat(dbPath)
|
||||
assert.Nil(t, err)
|
||||
|
||||
stat, err := statFromDB(mb.Config().Stats.DBPath, "user", "tester")
|
||||
assert.Nil(t, err)
|
||||
actual := stat.val
|
||||
assert.Equal(t, actual, expected)
|
||||
})
|
||||
|
||||
rmDB(t)
|
||||
|
||||
t.Run("TestTenUserCounter", func(t *testing.T) {
|
||||
count := 5
|
||||
expected := value(count)
|
||||
mb := bot.NewMockBot()
|
||||
mb.Cfg.Stats.DBPath = dbPath
|
||||
s := New(mb)
|
||||
assert.NotNil(t, s)
|
||||
|
||||
for i := 0; i < count; i++ {
|
||||
s.Message(makeMessage("test"))
|
||||
}
|
||||
|
||||
_, err := os.Stat(dbPath)
|
||||
assert.Nil(t, err)
|
||||
|
||||
stat, err := statFromDB(mb.Config().Stats.DBPath, "user", "tester")
|
||||
assert.Nil(t, err)
|
||||
actual := stat.val
|
||||
assert.Equal(t, actual, expected)
|
||||
})
|
||||
|
||||
rmDB(t)
|
||||
|
||||
t.Run("TestChannelCounter", func(t *testing.T) {
|
||||
count := 5
|
||||
expected := value(count)
|
||||
mb := bot.NewMockBot()
|
||||
mb.Cfg.Stats.DBPath = dbPath
|
||||
s := New(mb)
|
||||
assert.NotNil(t, s)
|
||||
|
||||
for i := 0; i < count; i++ {
|
||||
s.Message(makeMessage("test"))
|
||||
}
|
||||
|
||||
_, err := os.Stat(dbPath)
|
||||
assert.Nil(t, err)
|
||||
|
||||
stat, err := statFromDB(mb.Config().Stats.DBPath, "channel", "test")
|
||||
assert.Nil(t, err)
|
||||
actual := stat.val
|
||||
assert.Equal(t, actual, expected)
|
||||
})
|
||||
|
||||
rmDB(t)
|
||||
|
||||
t.Run("TestSightingCounter", func(t *testing.T) {
|
||||
count := 5
|
||||
expected := value(count)
|
||||
mb := bot.NewMockBot()
|
||||
|
||||
mb.Cfg.Stats.DBPath = dbPath
|
||||
mb.Cfg.Stats.Sightings = []string{"user", "nobody"}
|
||||
|
||||
s := New(mb)
|
||||
assert.NotNil(t, s)
|
||||
|
||||
for i := 0; i < count; i++ {
|
||||
s.Message(makeMessage("user sighting"))
|
||||
}
|
||||
|
||||
_, err := os.Stat(dbPath)
|
||||
assert.Nil(t, err)
|
||||
|
||||
stat, err := statFromDB(mb.Config().Stats.DBPath, "sighting", "user")
|
||||
assert.Nil(t, err)
|
||||
actual := stat.val
|
||||
assert.Equal(t, actual, expected)
|
||||
})
|
||||
|
||||
rmDB(t)
|
||||
|
||||
t.Run("TestSightingCounterNoResults", func(t *testing.T) {
|
||||
count := 5
|
||||
expected := value(0)
|
||||
mb := bot.NewMockBot()
|
||||
|
||||
mb.Cfg.Stats.DBPath = dbPath
|
||||
mb.Cfg.Stats.Sightings = []string{}
|
||||
|
||||
s := New(mb)
|
||||
assert.NotNil(t, s)
|
||||
|
||||
for i := 0; i < count; i++ {
|
||||
s.Message(makeMessage("user sighting"))
|
||||
}
|
||||
|
||||
_, err := os.Stat(dbPath)
|
||||
assert.Nil(t, err)
|
||||
|
||||
stat, err := statFromDB(mb.Config().Stats.DBPath, "sighting", "user")
|
||||
assert.Nil(t, err)
|
||||
actual := stat.val
|
||||
assert.Equal(t, actual, expected)
|
||||
})
|
||||
|
||||
rmDB(t)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue