keel/bot/slack/slack_test.go

337 lines
7.2 KiB
Go
Raw Normal View History

package slack
2017-08-21 22:43:46 +00:00
import (
"fmt"
"os"
"time"
"github.com/nlopes/slack"
2018-01-04 10:15:55 +00:00
"github.com/keel-hq/keel/extension/approval"
"github.com/keel-hq/keel/provider/kubernetes"
2017-11-01 18:25:28 +00:00
"github.com/keel-hq/keel/approvals"
2017-12-20 10:54:15 +00:00
b "github.com/keel-hq/keel/bot"
2017-11-01 18:25:28 +00:00
"github.com/keel-hq/keel/cache/memory"
"github.com/keel-hq/keel/constants"
"github.com/keel-hq/keel/types"
2017-08-21 22:43:46 +00:00
"testing"
2017-11-01 18:25:28 +00:00
testutil "github.com/keel-hq/keel/util/testing"
2017-08-21 22:43:46 +00:00
)
2017-12-27 13:46:38 +00:00
var botMessagesChannel chan *b.BotMessage
var approvalsRespCh chan *b.ApprovalResponse
func New(name, token, channel string,
k8sImplementer kubernetes.Implementer,
approvalsManager approvals.Manager, fi SlackImplementer) *Bot {
approvalsRespCh = make(chan *b.ApprovalResponse)
botMessagesChannel = make(chan *b.BotMessage)
slack := &Bot{}
b.RegisterBot(name, slack)
b.Run(k8sImplementer, approvalsManager)
slack.slackHTTPClient = fi
return slack
}
2017-08-21 22:43:46 +00:00
type fakeProvider struct {
submitted []types.Event
images []*types.TrackedImage
}
func (p *fakeProvider) Submit(event types.Event) error {
p.submitted = append(p.submitted, event)
return nil
}
func (p *fakeProvider) TrackedImages() ([]*types.TrackedImage, error) {
return p.images, nil
}
2017-08-21 22:43:46 +00:00
func (p *fakeProvider) List() []string {
return []string{"fakeprovider"}
}
func (p *fakeProvider) Stop() {
return
}
func (p *fakeProvider) GetName() string {
return "fp"
}
type postedMessage struct {
channel string
text string
params slack.PostMessageParameters
}
type fakeSlackImplementer struct {
postedMessages []postedMessage
}
func (i *fakeSlackImplementer) PostMessage(channel, text string, params slack.PostMessageParameters) (string, string, error) {
i.postedMessages = append(i.postedMessages, postedMessage{
channel: channel,
text: text,
params: params,
})
return "", "", nil
}
func TestBotRequest(t *testing.T) {
f8s := &testutil.FakeK8sImplementer{}
fi := &fakeSlackImplementer{}
2018-10-07 13:17:22 +00:00
mem := memory.NewMemoryCache()
2017-08-21 22:43:46 +00:00
token := os.Getenv(constants.EnvSlackToken)
if token == "" {
t.Skip()
}
2018-10-07 13:17:22 +00:00
am := approvals.New(mem)
2017-08-21 22:43:46 +00:00
2017-12-27 13:46:38 +00:00
New("keel", token, "approvals", f8s, am, fi)
defer b.Stop()
2017-08-21 22:43:46 +00:00
2017-09-24 12:06:02 +00:00
time.Sleep(1 * time.Second)
2017-08-21 22:43:46 +00:00
2017-12-27 13:46:38 +00:00
err := am.Create(&types.Approval{
2017-08-21 22:43:46 +00:00
Identifier: "k8s/project/repo:1.2.3",
VotesRequired: 1,
CurrentVersion: "2.3.4",
NewVersion: "3.4.5",
Event: &types.Event{
Repository: types.Repository{
Name: "project/repo",
Tag: "2.3.4",
},
},
})
if err != nil {
t.Fatalf("unexpected error while creating : %s", err)
}
2017-09-24 12:06:02 +00:00
time.Sleep(1 * time.Second)
2017-08-21 22:43:46 +00:00
if len(fi.postedMessages) != 1 {
2017-09-24 12:06:02 +00:00
t.Errorf("expected to find one message, but got: %d", len(fi.postedMessages))
2017-08-21 22:43:46 +00:00
}
}
func TestProcessApprovedResponse(t *testing.T) {
f8s := &testutil.FakeK8sImplementer{}
fi := &fakeSlackImplementer{}
2018-10-07 13:17:22 +00:00
mem := memory.NewMemoryCache()
2017-08-21 22:43:46 +00:00
token := os.Getenv(constants.EnvSlackToken)
if token == "" {
t.Skip()
}
2018-10-07 13:17:22 +00:00
am := approvals.New(mem)
2017-08-21 22:43:46 +00:00
2017-12-27 13:46:38 +00:00
New("keel", token, "approvals", f8s, am, fi)
defer b.Stop()
2017-08-21 22:43:46 +00:00
2017-09-24 12:06:02 +00:00
time.Sleep(1 * time.Second)
2017-08-21 22:43:46 +00:00
2017-12-27 13:46:38 +00:00
err := am.Create(&types.Approval{
2017-08-21 22:43:46 +00:00
Identifier: "k8s/project/repo:1.2.3",
VotesRequired: 1,
CurrentVersion: "2.3.4",
NewVersion: "3.4.5",
Event: &types.Event{
Repository: types.Repository{
Name: "project/repo",
Tag: "2.3.4",
},
},
})
if err != nil {
t.Fatalf("unexpected error while creating : %s", err)
}
2017-09-24 12:06:02 +00:00
time.Sleep(1 * time.Second)
2017-08-21 22:43:46 +00:00
if len(fi.postedMessages) != 1 {
t.Errorf("expected to find one message")
}
}
func TestProcessApprovalReply(t *testing.T) {
f8s := &testutil.FakeK8sImplementer{}
fi := &fakeSlackImplementer{}
2018-10-07 13:17:22 +00:00
mem := memory.NewMemoryCache()
2017-08-21 22:43:46 +00:00
token := os.Getenv(constants.EnvSlackToken)
if token == "" {
t.Skip()
}
2018-10-07 13:17:22 +00:00
am := approvals.New(mem)
2017-08-21 22:43:46 +00:00
identifier := "k8s/project/repo:1.2.3"
// creating initial approve request
err := am.Create(&types.Approval{
Identifier: identifier,
VotesRequired: 2,
CurrentVersion: "2.3.4",
NewVersion: "3.4.5",
Event: &types.Event{
Repository: types.Repository{
Name: "project/repo",
Tag: "2.3.4",
},
},
})
if err != nil {
t.Fatalf("unexpected error while creating : %s", err)
}
2017-12-27 13:46:38 +00:00
bot := New("keel", token, "approvals", f8s, am, fi)
defer b.Stop()
2017-08-21 22:43:46 +00:00
time.Sleep(1 * time.Second)
// approval resp
2017-12-20 10:54:15 +00:00
bot.approvalsRespCh <- &b.ApprovalResponse{
2017-08-21 22:43:46 +00:00
User: "123",
Status: types.ApprovalStatusApproved,
2017-12-21 10:31:55 +00:00
Text: fmt.Sprintf("%s %s", b.ApprovalResponseKeyword, identifier),
2017-08-21 22:43:46 +00:00
}
time.Sleep(1 * time.Second)
updated, err := am.Get(identifier)
if err != nil {
t.Fatalf("failed to get approval, error: %s", err)
}
if updated.VotesReceived != 1 {
t.Errorf("expected to find 1 received vote, found %d", updated.VotesReceived)
}
if updated.Status() != types.ApprovalStatusPending {
t.Errorf("expected approval to be in status pending but got: %s", updated.Status())
}
if len(fi.postedMessages) != 1 {
t.Errorf("expected to find one message")
}
}
func TestProcessRejectedReply(t *testing.T) {
f8s := &testutil.FakeK8sImplementer{}
fi := &fakeSlackImplementer{}
2018-10-07 13:17:22 +00:00
mem := memory.NewMemoryCache()
2017-08-21 22:43:46 +00:00
2018-01-04 10:15:55 +00:00
token := os.Getenv(constants.EnvSlackToken)
if token == "" {
t.Skip()
}
2017-08-21 22:43:46 +00:00
identifier := "k8s/project/repo:1.2.3"
2018-10-07 13:17:22 +00:00
am := approvals.New(mem)
2017-08-21 22:43:46 +00:00
// creating initial approve request
err := am.Create(&types.Approval{
Identifier: identifier,
VotesRequired: 2,
CurrentVersion: "2.3.4",
NewVersion: "3.4.5",
Event: &types.Event{
Repository: types.Repository{
Name: "project/repo",
Tag: "2.3.4",
},
},
})
if err != nil {
t.Fatalf("unexpected error while creating : %s", err)
}
2017-12-27 13:46:38 +00:00
bot := New("keel", "random", "approvals", f8s, am, fi)
defer b.Stop()
2017-08-21 22:43:46 +00:00
collector := approval.New()
collector.Configure(am)
time.Sleep(1 * time.Second)
// approval resp
2017-12-20 10:54:15 +00:00
bot.approvalsRespCh <- &b.ApprovalResponse{
2017-08-21 22:43:46 +00:00
User: "123",
Status: types.ApprovalStatusRejected,
2017-12-21 10:31:55 +00:00
Text: fmt.Sprintf("%s %s", b.RejectResponseKeyword, identifier),
2017-08-21 22:43:46 +00:00
}
time.Sleep(1 * time.Second)
updated, err := am.Get(identifier)
if err != nil {
t.Fatalf("failed to get approval, error: %s", err)
}
if updated.VotesReceived != 0 {
t.Errorf("expected to find 0 received vote, found %d", updated.VotesReceived)
}
if updated.Status() != types.ApprovalStatusRejected {
t.Errorf("expected approval to be in status rejected but got: %s", updated.Status())
}
fmt.Println(updated.Status())
if len(fi.postedMessages) != 1 {
t.Errorf("expected to find one message")
}
}
2017-12-11 08:37:26 +00:00
func TestIsApproval(t *testing.T) {
2017-12-27 13:46:38 +00:00
// f8s := &testutil.FakeK8sImplementer{}
// mem := memory.NewMemoryCache(100*time.Hour, 100*time.Hour, 100*time.Hour)
//
// identifier := "k8s/project/repo:1.2.3"
//
2018-10-07 13:17:22 +00:00
// am := approvals.New(mem)
2017-12-27 13:46:38 +00:00
// // creating initial approve request
// err := am.Create(&types.Approval{
// Identifier: identifier,
// VotesRequired: 2,
// CurrentVersion: "2.3.4",
// NewVersion: "3.4.5",
// Event: &types.Event{
// Repository: types.Repository{
// Name: "project/repo",
// Tag: "2.3.4",
// },
// },
// })
//
// if err != nil {
// t.Fatalf("unexpected error while creating : %s", err)
// }
// bot := New("keel", "random", "approvals", f8s, am, fi)
event := &slack.MessageEvent{
2017-12-11 08:37:26 +00:00
Msg: slack.Msg{
Channel: "approvals",
User: "user-x",
},
2017-12-27 13:46:38 +00:00
}
_, isApproval := b.IsApproval(event.User, "approve k8s/project/repo:1.2.3")
2017-12-11 08:37:26 +00:00
if !isApproval {
t.Errorf("event expected to be an approval")
}
}