catbase/plugins/beers/beers_test.go

142 lines
3.5 KiB
Go

// © 2013 the CatBase Authors under the WTFPL. See AUTHORS for the list of authors.
package beers
import (
"regexp"
"strings"
"testing"
"github.com/velour/catbase/plugins/cli"
"github.com/stretchr/testify/assert"
"github.com/velour/catbase/bot"
"github.com/velour/catbase/bot/msg"
"github.com/velour/catbase/bot/user"
"github.com/velour/catbase/plugins/counter"
)
func makeMessage(payload string, r *regexp.Regexp) bot.Request {
isCmd := strings.HasPrefix(payload, "!")
if isCmd {
payload = payload[1:]
}
c := &cli.CliPlugin{}
values := bot.ParseValues(r, payload)
return bot.Request{
Conn: c,
Kind: bot.Message,
Values: values,
Msg: msg.Message{
User: &user.User{Name: "tester", ID: "id"},
Channel: "test",
Body: payload,
Command: isCmd,
},
}
}
func testMessage(p *BeersPlugin, msg string) bool {
for _, h := range p.handlers {
if h.Regex.MatchString(msg) {
req := makeMessage(msg, h.Regex)
if h.Handler(req) {
return true
}
}
}
return false
}
func makeBeersPlugin(t *testing.T) (*BeersPlugin, *bot.MockBot) {
mb := bot.NewMockBot()
counter.New(mb)
mb.DB().MustExec(`delete from counter; delete from counter_alias;`)
b := New(mb)
counter.MkAlias(mb.DB(), "beer", ":beer:")
counter.MkAlias(mb.DB(), "beers", ":beer:")
return b, mb
}
func TestCounter(t *testing.T) {
_, mb := makeBeersPlugin(t)
i, err := counter.GetUserItem(mb.DB(), "tester", "id", "test")
if !assert.Nil(t, err) {
t.Log(err)
t.Fatal()
}
err = i.Update(5)
assert.Nil(t, err)
}
func TestImbibe(t *testing.T) {
b, mb := makeBeersPlugin(t)
testMessage(b, "imbibe")
assert.Len(t, mb.Messages, 1)
testMessage(b, "imbibe")
assert.Len(t, mb.Messages, 2)
it, err := counter.GetUserItem(mb.DB(), "tester", "id", itemName)
assert.Nil(t, err)
assert.Equal(t, 2, it.Count)
}
func TestEq(t *testing.T) {
b, mb := makeBeersPlugin(t)
testMessage(b, "beers = 3")
assert.Len(t, mb.Messages, 1)
it, err := counter.GetUserItem(mb.DB(), "tester", "id", itemName)
assert.Nil(t, err)
assert.Equal(t, 3, it.Count)
}
func TestEqZero(t *testing.T) {
b, mb := makeBeersPlugin(t)
testMessage(b, "beers += 5")
testMessage(b, "beers = 0")
assert.Len(t, mb.Messages, 2)
assert.Contains(t, mb.Messages[1], "reversal of fortune")
it, err := counter.GetUserItem(mb.DB(), "tester", "id", itemName)
assert.Nil(t, err)
assert.Equal(t, 0, it.Count)
}
func TestBeersPlusEq(t *testing.T) {
b, mb := makeBeersPlugin(t)
testMessage(b, "beers += 5")
assert.Len(t, mb.Messages, 1)
testMessage(b, "beers += 5")
assert.Len(t, mb.Messages, 2)
it, err := counter.GetUserItem(mb.DB(), "tester", "id", itemName)
assert.Nil(t, err)
assert.Equal(t, 10, it.Count)
}
func TestPuke(t *testing.T) {
b, mb := makeBeersPlugin(t)
testMessage(b, "beers += 5")
it, err := counter.GetUserItem(mb.DB(), "tester", "id", itemName)
assert.Nil(t, err)
assert.Equal(t, 5, it.Count)
testMessage(b, "puke")
it, err = counter.GetUserItem(mb.DB(), "tester", "id", itemName)
assert.Nil(t, err)
assert.Equal(t, 0, it.Count)
}
func TestBeersReport(t *testing.T) {
b, mb := makeBeersPlugin(t)
testMessage(b, "beers += 5")
it, err := counter.GetUserItem(mb.DB(), "tester", "id", itemName)
assert.Nil(t, err)
assert.Equal(t, 5, it.Count)
testMessage(b, "beers")
if assert.Len(t, mb.Messages, 2) {
assert.Contains(t, mb.Messages[1], "5 beers")
}
}
func TestHelp(t *testing.T) {
b, mb := makeBeersPlugin(t)
b.help(&cli.CliPlugin{}, bot.Help, msg.Message{Channel: "channel"}, []string{})
assert.Len(t, mb.Messages, 1)
}