From 965dd53f50d9963426e0ed025bab6468ca407937 Mon Sep 17 00:00:00 2001 From: Chuck Findlay Date: Fri, 24 May 2024 01:18:23 -0300 Subject: [PATCH] tests for commands.go in ircclient package --- go.mod | 1 + go.sum | 1 + ircclient/client.go | 22 +++---- ircclient/commands.go | 45 ++++++------- ircclient/commands_test.go | 129 +++++++++++++++++++++++++++++++++++++ requesthandlers/http.go | 6 +- 6 files changed, 168 insertions(+), 36 deletions(-) create mode 100644 ircclient/commands_test.go diff --git a/go.mod b/go.mod index cc71efb..484e246 100644 --- a/go.mod +++ b/go.mod @@ -31,6 +31,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/stretchr/testify v1.9.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect diff --git a/go.sum b/go.sum index d8a0aff..1ebc58f 100644 --- a/go.sum +++ b/go.sum @@ -80,6 +80,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= diff --git a/ircclient/client.go b/ircclient/client.go index 5139e52..87a7dc0 100644 --- a/ircclient/client.go +++ b/ircclient/client.go @@ -8,7 +8,7 @@ import ( "github.com/cfindlayisme/wmb/env" ) -var ircConnection net.Conn +var IrcConnection net.Conn func Connect(server string) error { conn, err := net.Dial("tcp", server) @@ -24,36 +24,36 @@ func Connect(server string) error { } func initialize() { - SetNick(env.GetNick()) - SetUser() + SetNick(IrcConnection, env.GetNick()) + SetUser(IrcConnection) if env.GetNickservPassword() != "" { - SendMessage("NickServ", "IDENTIFY "+env.GetNickservPassword()) + SendMessage(IrcConnection, "NickServ", "IDENTIFY "+env.GetNickservPassword()) } if env.GetSelfMode() != "" { - SetMode(env.GetNick(), env.GetSelfMode()) + SetMode(IrcConnection, env.GetNick(), env.GetSelfMode()) } // Join our primary channel - JoinChannel(env.GetChannel()) + JoinChannel(IrcConnection, env.GetChannel()) // Also join our non-primary channels for _, channel := range env.GetOtherChannels() { - JoinChannel(channel) + JoinChannel(IrcConnection, channel) } } func Disconnect() error { - return ircConnection.Close() + return IrcConnection.Close() } func setConnection(conn net.Conn) { - ircConnection = conn + IrcConnection = conn } func Loop() { for { - message, err := readMessage(ircConnection) + message, err := readMessage(IrcConnection) if err != nil { log.Println("Failed to read message on TCP buffer:", err) break @@ -63,7 +63,7 @@ func Loop() { words := strings.Split(message, " ") if strings.HasPrefix(message, "PING") { - ReturnPong(ircConnection, message) + ReturnPong(IrcConnection, message) } else if len(words) >= 2 && words[1] == "PRIVMSG" { processPrivmsg(words) } else { diff --git a/ircclient/commands.go b/ircclient/commands.go index ce23d58..3b57c83 100644 --- a/ircclient/commands.go +++ b/ircclient/commands.go @@ -2,67 +2,68 @@ package ircclient import ( "fmt" + "net" ) -func SetNick(nick string) error { - _, err := fmt.Fprintf(ircConnection, "NICK "+nick+"\r\n") +func SetNick(conn net.Conn, nick string) error { + _, err := fmt.Fprintf(conn, "NICK "+nick+"\r\n") return err } -func JoinChannel(channel string) error { - _, err := fmt.Fprintf(ircConnection, "JOIN "+channel+"\r\n") +func JoinChannel(conn net.Conn, channel string) error { + _, err := fmt.Fprintf(conn, "JOIN "+channel+"\r\n") return err } -func PartChannel(channel string) error { - _, err := fmt.Fprintf(ircConnection, "PART "+channel+"\r\n") +func PartChannel(conn net.Conn, channel string) error { + _, err := fmt.Fprintf(conn, "PART "+channel+"\r\n") return err } -func SetMode(channel string, mode string) error { - _, err := fmt.Fprintf(ircConnection, "MODE "+channel+" "+mode+"\r\n") +func SetMode(conn net.Conn, channel string, mode string) error { + _, err := fmt.Fprintf(conn, "MODE "+channel+" "+mode+"\r\n") return err } -func SetTopic(channel string, topic string) error { +func SetTopic(conn net.Conn, channel string, topic string) error { cleanTopic := CleanMessage(topic) - _, err := fmt.Fprintf(ircConnection, "TOPIC "+channel+" "+cleanTopic+"\r\n") + _, err := fmt.Fprintf(conn, "TOPIC "+channel+" "+cleanTopic+"\r\n") return err } -func InviteUser(nick string, channel string) error { - _, err := fmt.Fprintf(ircConnection, "INVITE "+nick+" "+channel+"\r\n") +func InviteUser(conn net.Conn, nick string, channel string) error { + _, err := fmt.Fprintf(conn, "INVITE "+nick+" "+channel+"\r\n") return err } -func KickUser(nick string, channel string, message string) error { +func KickUser(conn net.Conn, nick string, channel string, message string) error { if message == "" { message = "Kicked" } - _, err := fmt.Fprintf(ircConnection, "KICK "+channel+" "+nick+" :"+message+"\r\n") + _, err := fmt.Fprintf(conn, "KICK "+channel+" "+nick+" :"+message+"\r\n") return err } -func Quote(command string) error { - _, err := fmt.Fprintf(ircConnection, command+"\r\n") +func Quote(conn net.Conn, command string) error { + _, err := fmt.Fprintf(conn, command+"\r\n") return err } -func SendMessage(target string, message string) error { +func SendMessage(conn net.Conn, target string, message string) error { ircMessage := CleanMessage(message) - _, err := fmt.Fprintf(ircConnection, "PRIVMSG "+target+" :"+ircMessage+"\r\n") + _, err := fmt.Fprintf(conn, "PRIVMSG "+target+" :"+ircMessage+"\r\n") return err } -func SendNotice(target string, message string) error { +func SendNotice(conn net.Conn, target string, message string) error { ircMessage := CleanMessage(message) - _, err := fmt.Fprintf(ircConnection, "NOTICE "+target+" :"+ircMessage+"\r\n") + _, err := fmt.Fprintf(conn, "NOTICE "+target+" :"+ircMessage+"\r\n") return err } -func SetUser() error { - _, err := fmt.Fprintf(ircConnection, "USER wmb 0 * :Webhook message bot\r\n") +func SetUser(conn net.Conn) error { + _, err := fmt.Fprintf(conn, "USER wmb 0 * :Webhook message bot\r\r\n") return err } diff --git a/ircclient/commands_test.go b/ircclient/commands_test.go new file mode 100644 index 0000000..170f04b --- /dev/null +++ b/ircclient/commands_test.go @@ -0,0 +1,129 @@ +package ircclient_test + +import ( + "net" + "testing" + + "github.com/cfindlayisme/wmb/ircclient" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +type MockConn struct { + mock.Mock + net.Conn +} + +func (m *MockConn) Write(b []byte) (n int, err error) { + args := m.Called(b) + return args.Int(0), args.Error(1) +} + +func TestSetNick(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("NICK nick\r\n")).Return(10, nil) + + err := ircclient.SetNick(conn, "nick") + require.NoError(t, err) + + conn.AssertExpectations(t) +} + +func TestJoinChannel(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("JOIN #channel\r\n")).Return(12, nil) + + err := ircclient.JoinChannel(conn, "#channel") + require.NoError(t, err) + + conn.AssertExpectations(t) +} + +func TestPartChannel(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("PART #channel\r\n")).Return(12, nil) + + err := ircclient.PartChannel(conn, "#channel") + require.NoError(t, err) + + conn.AssertExpectations(t) +} + +func TestSetMode(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("MODE #channel +o\r\n")).Return(15, nil) + + err := ircclient.SetMode(conn, "#channel", "+o") + require.NoError(t, err) + + conn.AssertExpectations(t) +} +func TestSetTopic(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("TOPIC #channel topic\r\n")).Return(20, nil) // Remove the `:` before `topic` + + err := ircclient.SetTopic(conn, "#channel", "topic") + require.NoError(t, err) + + conn.AssertExpectations(t) +} + +func TestInviteUser(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("INVITE nick #channel\r\n")).Return(20, nil) + + err := ircclient.InviteUser(conn, "nick", "#channel") + require.NoError(t, err) + + conn.AssertExpectations(t) +} + +func TestKickUser(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("KICK #channel nick :Kicked\r\n")).Return(26, nil) + + err := ircclient.KickUser(conn, "nick", "#channel", "") + require.NoError(t, err) + + conn.AssertExpectations(t) +} + +func TestQuote(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("command\r\n")).Return(9, nil) // Remove the `QUOTE ` before `command` + + err := ircclient.Quote(conn, "command") + require.NoError(t, err) + + conn.AssertExpectations(t) +} + +func TestSendMessage(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("PRIVMSG #channel :message\r\n")).Return(26, nil) + + err := ircclient.SendMessage(conn, "#channel", "message") + require.NoError(t, err) + + conn.AssertExpectations(t) +} + +func TestSendNotice(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("NOTICE #channel :message\r\n")).Return(24, nil) + + err := ircclient.SendNotice(conn, "#channel", "message") + require.NoError(t, err) + + conn.AssertExpectations(t) +} + +func TestSetUser(t *testing.T) { + conn := new(MockConn) + conn.On("Write", []byte("USER wmb 0 * :Webhook message bot\r\r\n")).Return(37, nil) + + err := ircclient.SetUser(conn) + require.NoError(t, err) + + conn.AssertExpectations(t) +} diff --git a/requesthandlers/http.go b/requesthandlers/http.go index ecd6ab3..68193e0 100644 --- a/requesthandlers/http.go +++ b/requesthandlers/http.go @@ -42,7 +42,7 @@ func PostMessage(c *gin.Context) { return } - err := ircclient.SendMessage(env.GetChannel(), ircclient.FormatMessage(msg)) + err := ircclient.SendMessage(ircclient.IrcConnection, env.GetChannel(), ircclient.FormatMessage(msg)) if err != nil { c.String(http.StatusInternalServerError, "Failed to send message to IRC server") @@ -66,7 +66,7 @@ func PostDirectedMessage(c *gin.Context) { return } - err := ircclient.SendMessage(dmsg.Target, ircclient.FormatMessage(msg)) + err := ircclient.SendMessage(ircclient.IrcConnection, dmsg.Target, ircclient.FormatMessage(msg)) if err != nil { c.String(http.StatusInternalServerError, "Failed to send message to IRC server") @@ -87,7 +87,7 @@ func QueryMessage(c *gin.Context) { return } - err := ircclient.SendMessage(env.GetChannel(), ircclient.FormatMessage(msg)) + err := ircclient.SendMessage(ircclient.IrcConnection, env.GetChannel(), ircclient.FormatMessage(msg)) if err != nil { c.String(http.StatusInternalServerError, "Failed to send message to IRC server")