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