Skip to content

Commit

Permalink
Test notification output
Browse files Browse the repository at this point in the history
  • Loading branch information
bittersweet committed Oct 11, 2015
1 parent 7424aca commit 8cdbae3
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 34 deletions.
24 changes: 6 additions & 18 deletions email.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import (
"text/template"
)

type emailNotifier struct {
}

const emailTemplate = `From: {{.From}}
To: {{.To}}
Subject: {{.Subject}}
Expand All @@ -26,7 +29,7 @@ type EmailData struct {
Body string
}

func sendEmail(class string, data []byte) {
func (e *emailNotifier) sendMessage(class string, data []byte) NotifierResponse {
var err error
var doc bytes.Buffer

Expand Down Expand Up @@ -55,22 +58,7 @@ func sendEmail(class string, data []byte) {

// drop e-mail job on a rate limited (max workers) queue
// already experienced a connection reset by peer locally
}

func sendEmailNotification(s *Stat, notifier *Notifier) {
var err error
var doc bytes.Buffer

t := template.New("notificationTemplate")
t, err = t.Parse(notifier.Template)
if err != nil {
log.Fatal("t.Parse of n.Template", err)
}

err = t.Execute(&doc, s.toMap())
if err != nil {
log.Fatal("t.Execute ", err)
return NotifierResponse{
error: err,
}

sendEmail(s.Key, doc.Bytes())
}
30 changes: 22 additions & 8 deletions notifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@ import (
"github.com/jmoiron/sqlx/types"
)

type NotifierResponse struct {
response *slackResponse
error error
}

type MessageNotifier interface {
sendMessage(string, []byte) NotifierResponse
}

type Notifier struct {
Id int `db:"id"`
NotificationType string `db:"notification_type"`
Expand All @@ -19,6 +28,16 @@ type Notifier struct {
// email address, slack channel, phone number, how to store?
}

func (n *Notifier) newNotifier() MessageNotifier {
switch n.NotificationType {
case "email":
return &emailNotifier{}
case "slack":
return &slackNotifier{}
}
return &slackNotifier{}
}

func (n *Notifier) getRules() []*Rule {
rules := []*Rule{}
n.Rules.Unmarshal(&rules)
Expand Down Expand Up @@ -60,19 +79,14 @@ func (n *Notifier) renderTemplate(s *Stat) []byte {
return doc.Bytes()
}

func (n *Notifier) notify(s *Stat) {
func (n *Notifier) notify(s *Stat, mn MessageNotifier) {
nt := n.NotificationType
fmt.Printf("Notifying notifier id: %d type: %s\n", n.Id, nt)

if !n.checkRules(s) {
// early return
return
}

message := n.renderTemplate(s)
switch nt {
case "email":
sendEmail(s.Key, message)
case "slack":
sendSlack(s.Key, message)
}
mn.sendMessage(s.Key, message)
}
58 changes: 57 additions & 1 deletion notifier_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,31 @@ import (
"github.com/stretchr/testify/assert"
)

type LocalMessageNotifier struct {
class string
message []byte
processed bool
}

func (mn *LocalMessageNotifier) sendMessage(class string, data []byte) NotifierResponse {
mn.class = class
mn.message = data
mn.processed = true

return NotifierResponse{}
}

func TestNewNotifier(t *testing.T) {
n := Notifier{}
assert.Equal(t, n.newNotifier(), &slackNotifier{})

n.NotificationType = "email"
assert.Equal(t, n.newNotifier(), &slackNotifier{})

n.NotificationType = "slack"
assert.Equal(t, n.newNotifier(), &slackNotifier{})
}

func TestNotifierCheckRulesSingle(t *testing.T) {
var rules = types.JsonText(`[{"key": "number", "type": "number", "setting": "eq", "value": "12"}]`)
n := Notifier{
Expand Down Expand Up @@ -73,10 +98,41 @@ func TestNotifierCheckRulesSettingIsBlank(t *testing.T) {
}

func TestNotifierNotify(t *testing.T) {
// fake sendSlackNotification somehow?
n := Notifier{
Id: 1,
NotificationType: "email",
Class: "User",
Template: "name: {{.name}}",
}

var jt = types.JsonText(`{"active": true, "name": "Go", "number": "12"}`)
s := Stat{"Mark", jt}

mn := &LocalMessageNotifier{}
n.notify(&s, mn)

assert.Equal(t, mn.class, "Mark")
assert.Equal(t, mn.message, []byte("name: Go"))
assert.Equal(t, mn.processed, true)
}

func TestNotifierNotifyReturnsEarlyIfRulesAreNotMet(t *testing.T) {
var rules = types.JsonText(`[{"key": "number", "type": "number", "setting": "gt", "value": "1"}]`)
n := Notifier{
Id: 1,
NotificationType: "email",
Class: "User",
Template: "name: {{.name}}",
Rules: rules,
}

var jt = types.JsonText(`{"active": true, "name": "Go", "number": "0"}`)
s := Stat{"Mark", jt}

mn := &LocalMessageNotifier{}
n.notify(&s, mn)

assert.Equal(t, mn.processed, false)
}

func TestNotifierRenderTemplate(t *testing.T) {
Expand Down
11 changes: 7 additions & 4 deletions slack.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@ import (
"net/url"
)

var transport http.RoundTripper
type slackNotifier struct {
}

type slackResponse struct {
Ok bool `json:"ok"`
Ts string `json:"ts"`
}

var transport http.RoundTripper

func getTransport() http.RoundTripper {
// If we have overridden this variable in testing
if transport != nil {
Expand All @@ -29,7 +32,7 @@ func SetTransport(t http.RoundTripper) {
}

// TODO: Get settings from env variables
func sendSlack(class string, data []byte) (*slackResponse, error) {
func (s *slackNotifier) sendMessage(class string, data []byte) NotifierResponse {
client := &http.Client{Transport: getTransport()}
// https://api.slack.com/methods/chat.postMessage
// format := "http://slack.com/api/chat.postMessage?token=%s&channel=%s&text=%s&username=%s&icon_url=%s"
Expand All @@ -46,7 +49,7 @@ func sendSlack(class string, data []byte) (*slackResponse, error) {
res, err := client.Get(url)
if err != nil {
log.Println("http.Get", err)
return &slackResponse{}, err
return NotifierResponse{&slackResponse{}, err}
}
defer res.Body.Close()
contents, err := ioutil.ReadAll(res.Body)
Expand All @@ -60,5 +63,5 @@ func sendSlack(class string, data []byte) (*slackResponse, error) {
log.Println("json.Unmarshal", err)
}

return slackResponse, err
return NotifierResponse{slackResponse, err}
}
5 changes: 3 additions & 2 deletions slack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ func TestSendSlack(t *testing.T) {
test_server := returnTestResponseForPath("/api/chat.postMessage", resp, t)
defer closeTestServer(test_server)

response, _ := sendSlack("mark", []byte{10, 10})
if response.Ok != true {
s := slackNotifier{}
notifierResponse := s.sendMessage("mark", []byte("Message"))
if notifierResponse.response.Ok != true {
t.Error("response is not correct")
}
}
2 changes: 1 addition & 1 deletion udp_listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func (s *Stat) notify() {

for i := 0; i < len(notifiers); i++ {
notifier := notifiers[i]
notifier.notify(s)
notifier.notify(s, notifier.newNotifier())
}
}

Expand Down

0 comments on commit 8cdbae3

Please sign in to comment.