1package twitch
2
3import (
4	"encoding/json"
5	"fmt"
6	"io/ioutil"
7	"testing"
8)
9
10type ircTest struct {
11	Input    string
12	Expected ircMessage
13}
14
15func ircTests() ([]*ircTest, error) {
16	tests := struct {
17		Tests []*ircTest
18	}{}
19
20	data, err := ioutil.ReadFile("test_resources/irctests.json")
21	if err != nil {
22		return nil, fmt.Errorf("ircTests: failed to read file: %s", err)
23	}
24
25	if err := json.Unmarshal(data, &tests); err != nil {
26		return nil, fmt.Errorf("ircTests: failed to unmarshal data: %s", err)
27	}
28
29	return tests.Tests, nil
30}
31
32func TestCanParseIRCMessage(t *testing.T) {
33	tests, err := ircTests()
34	if err != nil {
35		t.Error(err)
36		return
37	}
38
39	for _, test := range tests {
40		actual, err := parseIRCMessage(test.Input)
41		if err != nil {
42			t.Error(err)
43			continue
44		}
45
46		assertStringMapsEqual(t, test.Expected.Tags, actual.Tags)
47		assertStringsEqual(t, test.Expected.Source.Nickname, actual.Source.Nickname)
48		assertStringsEqual(t, test.Expected.Source.Username, actual.Source.Username)
49		assertStringsEqual(t, test.Expected.Source.Host, actual.Source.Host)
50		assertStringsEqual(t, test.Expected.Command, actual.Command)
51		assertStringSlicesEqual(t, test.Expected.Params, actual.Params)
52	}
53}
54
55func TestCantParsePartialIRCMessage(t *testing.T) {
56	testMessage := "@badges=;color=;display-name=ZZZi;emotes=;flags=;id=75bb6b6b-e36c-49af-a293-16024738ab92;mod=0;room-id=36029255;subscriber=0;tmi-sent-ts=1551476573570;turbo"
57
58	actual, err := parseIRCMessage(testMessage)
59
60	expectedTags := map[string]string{
61		"badges":       "",
62		"color":        "",
63		"display-name": "ZZZi",
64		"emotes":       "",
65		"flags":        "",
66		"id":           "75bb6b6b-e36c-49af-a293-16024738ab92",
67		"mod":          "0",
68		"room-id":      "36029255",
69		"subscriber":   "0",
70		"tmi-sent-ts":  "1551476573570",
71		"turbo":        "",
72	}
73	assertStringMapsEqual(t, expectedTags, actual.Tags)
74
75	assertStringsEqual(t, "", actual.Source.Nickname)
76	assertStringsEqual(t, "", actual.Source.Username)
77	assertStringsEqual(t, "", actual.Source.Host)
78	assertStringsEqual(t, "", actual.Command)
79	assertStringSlicesEqual(t, nil, actual.Params)
80
81	assertStringsEqual(t, "parseIRCMessage: partial message", err.Error())
82
83}
84
85func TestCantParseNoCommandIRCMessage(t *testing.T) {
86	testMessage := "@badges=;color=#00FF7F;display-name=Danielps1;emotes=;message-id=20;thread-id=32591953_77829817;turbo=0;user-id=32591953;user-type= :danielps1!danielps1@danielps1.tmi.twitch.tv"
87
88	actual, err := parseIRCMessage(testMessage)
89
90	expectedTags := map[string]string{
91		"badges":       "",
92		"color":        "#00FF7F",
93		"display-name": "Danielps1",
94		"emotes":       "",
95		"message-id":   "20",
96		"thread-id":    "32591953_77829817",
97		"turbo":        "0",
98		"user-id":      "32591953",
99		"user-type":    "",
100	}
101	assertStringMapsEqual(t, expectedTags, actual.Tags)
102
103	assertStringsEqual(t, "danielps1", actual.Source.Nickname)
104	assertStringsEqual(t, "danielps1", actual.Source.Username)
105	assertStringsEqual(t, "danielps1.tmi.twitch.tv", actual.Source.Host)
106	assertStringsEqual(t, "", actual.Command)
107	assertStringSlicesEqual(t, nil, actual.Params)
108
109	assertStringsEqual(t, "parseIRCMessage: no command", err.Error())
110}
111