Skip to content

Commit

Permalink
tests for commands.go in ircclient package
Browse files Browse the repository at this point in the history
  • Loading branch information
cfindlayisme committed May 24, 2024
1 parent 2636719 commit 965dd53
Show file tree
Hide file tree
Showing 6 changed files with 168 additions and 36 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
22 changes: 11 additions & 11 deletions ircclient/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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 {
Expand Down
45 changes: 23 additions & 22 deletions ircclient/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
129 changes: 129 additions & 0 deletions ircclient/commands_test.go
Original file line number Diff line number Diff line change
@@ -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)
}
6 changes: 3 additions & 3 deletions requesthandlers/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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")
Expand All @@ -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")
Expand Down

0 comments on commit 965dd53

Please sign in to comment.