Codebase list golang-github-nlopes-slack / run/33fb859d-7349-4038-abd4-9c43e3922006/main reminders_test.go
run/33fb859d-7349-4038-abd4-9c43e3922006/main

Tree @run/33fb859d-7349-4038-abd4-9c43e3922006/main (Download .tar.gz)

reminders_test.go @run/33fb859d-7349-4038-abd4-9c43e3922006/mainraw · history · blame

package slack

import (
	"net/http"
	"reflect"
	"testing"
)

type remindersHandler struct {
	gotParams map[string]string
	response  string
}

func newRemindersHandler() *remindersHandler {
	return &remindersHandler{
		gotParams: make(map[string]string),
	}
}

func (rh *remindersHandler) accumulateFormValue(k string, r *http.Request) {
	if v := r.FormValue(k); v != "" {
		rh.gotParams[k] = v
	}
}

func (rh *remindersHandler) handler(w http.ResponseWriter, r *http.Request) {
	rh.accumulateFormValue("channel", r)
	rh.accumulateFormValue("user", r)
	rh.accumulateFormValue("text", r)
	rh.accumulateFormValue("time", r)
	rh.accumulateFormValue("reminder", r)
	w.Header().Set("Content-Type", "application/json")
	if rh.gotParams["text"] == "trigger-error" || rh.gotParams["reminder"] == "trigger-error" {
		w.Write([]byte(`{ "ok": false, "error": "oh no" }`))
	} else {
		w.Write([]byte(`{ "ok": true }`))
	}
}

func TestSlack_AddReminder(t *testing.T) {
	once.Do(startServer)
	api := New("testing-token", OptionAPIURL("http://"+serverAddr+"/"))
	tests := []struct {
		chanID     string
		userID     string
		text       string
		time       string
		wantParams map[string]string
		expectErr  bool
	}{
		{
			"someChannelID",
			"",
			"hello world",
			"tomorrow at 9am",
			map[string]string{
				"text":    "hello world",
				"time":    "tomorrow at 9am",
				"channel": "someChannelID",
			},
			false,
		},
		{
			"someChannelID",
			"",
			"trigger-error",
			"tomorrow at 9am",
			map[string]string{
				"text":    "trigger-error",
				"time":    "tomorrow at 9am",
				"channel": "someChannelID",
			},
			true,
		},
		{
			"",
			"someUserID",
			"hello world",
			"tomorrow at 9am",
			map[string]string{
				"text": "hello world",
				"time": "tomorrow at 9am",
				"user": "someUserID",
			},
			false,
		},
		{
			"",
			"someUserID",
			"trigger-error",
			"tomorrow at 9am",
			map[string]string{
				"text": "trigger-error",
				"time": "tomorrow at 9am",
				"user": "someUserID",
			},
			true,
		},
	}
	var rh *remindersHandler
	http.HandleFunc("/reminders.add", func(w http.ResponseWriter, r *http.Request) { rh.handler(w, r) })
	for i, test := range tests {
		rh = newRemindersHandler()
		var err error
		if test.chanID != "" {
			_, err = api.AddChannelReminder(test.chanID, test.text, test.time)
		} else {
			_, err = api.AddUserReminder(test.userID, test.text, test.time)
		}
		if test.expectErr == false && err != nil {
			t.Fatalf("%d: Unexpected error: %s", i, err)
		} else if test.expectErr == true && err == nil {
			t.Fatalf("%d: Expected error but got none!", i)
		}
		if !reflect.DeepEqual(rh.gotParams, test.wantParams) {
			t.Errorf("%d: Got params %#v, want %#v", i, rh.gotParams, test.wantParams)
		}
	}
}

func TestSlack_DeleteReminder(t *testing.T) {
	once.Do(startServer)
	api := New("testing-token", OptionAPIURL("http://"+serverAddr+"/"))
	tests := []struct {
		reminder   string
		wantParams map[string]string
		expectErr  bool
	}{
		{
			"foo",
			map[string]string{
				"reminder": "foo",
			},
			false,
		},
		{
			"trigger-error",
			map[string]string{
				"reminder": "trigger-error",
			},
			true,
		},
	}
	var rh *remindersHandler
	http.HandleFunc("/reminders.delete", func(w http.ResponseWriter, r *http.Request) { rh.handler(w, r) })
	for i, test := range tests {
		rh = newRemindersHandler()
		err := api.DeleteReminder(test.reminder)
		if test.expectErr == false && err != nil {
			t.Fatalf("%d: Unexpected error: %s", i, err)
		} else if test.expectErr == true && err == nil {
			t.Fatalf("%d: Expected error but got none!", i)
		}
		if !reflect.DeepEqual(rh.gotParams, test.wantParams) {
			t.Errorf("%d: Got params %#v, want %#v", i, rh.gotParams, test.wantParams)
		}
	}
}