Compare commits
2 Commits
feat/add-c
...
fix/irc-nu
| Author | SHA1 | Date | |
|---|---|---|---|
| 38d222f6a7 | |||
|
|
8d91ad852c |
@@ -28,6 +28,18 @@ const (
|
|||||||
defaultHistLimit = 50
|
defaultHistLimit = 50
|
||||||
maxHistLimit = 500
|
maxHistLimit = 500
|
||||||
cmdPrivmsg = "PRIVMSG"
|
cmdPrivmsg = "PRIVMSG"
|
||||||
|
|
||||||
|
// IRC numeric reply codes per RFC 1459/2812.
|
||||||
|
ircErrNoSuchNick = "401"
|
||||||
|
ircErrNoSuchChannel = "403"
|
||||||
|
ircErrNoRecipient = "411"
|
||||||
|
ircErrNoTextToSend = "412"
|
||||||
|
ircErrUnknownCommand = "421"
|
||||||
|
ircErrNoNicknameGiven = "431"
|
||||||
|
ircErrErroneusNickname = "432"
|
||||||
|
ircErrNicknameInUse = "433"
|
||||||
|
ircErrNotOnChannel = "442"
|
||||||
|
ircErrNeedMoreParams = "461"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (hdlr *Handlers) maxBodySize() int64 {
|
func (hdlr *Handlers) maxBodySize() int64 {
|
||||||
@@ -63,6 +75,43 @@ func (hdlr *Handlers) authSession(
|
|||||||
return sessionID, clientID, nick, nil
|
return sessionID, clientID, nick, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// serverName returns the configured server name or the
|
||||||
|
// default "neoirc".
|
||||||
|
func (hdlr *Handlers) serverName() string {
|
||||||
|
if hdlr.params.Config.ServerName != "" {
|
||||||
|
return hdlr.params.Config.ServerName
|
||||||
|
}
|
||||||
|
|
||||||
|
return "neoirc"
|
||||||
|
}
|
||||||
|
|
||||||
|
// respondIRCError sends an IRC numeric error reply as a
|
||||||
|
// JSON response with HTTP 200 OK. This is used for errors
|
||||||
|
// in IRC command processing (as opposed to HTTP transport
|
||||||
|
// errors). The params slice contains IRC-style positional
|
||||||
|
// parameters (e.g. the target nick or channel).
|
||||||
|
func (hdlr *Handlers) respondIRCError(
|
||||||
|
writer http.ResponseWriter,
|
||||||
|
request *http.Request,
|
||||||
|
nick, numeric, msg string,
|
||||||
|
params ...string,
|
||||||
|
) {
|
||||||
|
resp := map[string]any{
|
||||||
|
"command": numeric,
|
||||||
|
"from": hdlr.serverName(),
|
||||||
|
"to": nick,
|
||||||
|
"body": []string{msg},
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(params) > 0 {
|
||||||
|
resp["params"] = params
|
||||||
|
}
|
||||||
|
|
||||||
|
hdlr.respondJSON(
|
||||||
|
writer, request, resp, http.StatusOK,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
func (hdlr *Handlers) requireAuth(
|
func (hdlr *Handlers) requireAuth(
|
||||||
writer http.ResponseWriter,
|
writer http.ResponseWriter,
|
||||||
request *http.Request,
|
request *http.Request,
|
||||||
@@ -226,11 +275,7 @@ func (hdlr *Handlers) deliverMOTD(
|
|||||||
clientID, sessionID int64,
|
clientID, sessionID int64,
|
||||||
) {
|
) {
|
||||||
motd := hdlr.params.Config.MOTD
|
motd := hdlr.params.Config.MOTD
|
||||||
serverName := hdlr.params.Config.ServerName
|
serverName := hdlr.serverName()
|
||||||
|
|
||||||
if serverName == "" {
|
|
||||||
serverName = "neoirc"
|
|
||||||
}
|
|
||||||
|
|
||||||
if motd == "" {
|
if motd == "" {
|
||||||
return
|
return
|
||||||
@@ -557,10 +602,10 @@ func (hdlr *Handlers) HandleSendCommand() http.HandlerFunc {
|
|||||||
payload.To = strings.TrimSpace(payload.To)
|
payload.To = strings.TrimSpace(payload.To)
|
||||||
|
|
||||||
if payload.Command == "" {
|
if payload.Command == "" {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"command required",
|
nick, ircErrUnknownCommand,
|
||||||
http.StatusBadRequest,
|
"No command given",
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -631,10 +676,11 @@ func (hdlr *Handlers) dispatchCommand(
|
|||||||
},
|
},
|
||||||
http.StatusOK)
|
http.StatusOK)
|
||||||
default:
|
default:
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"unknown command: "+command,
|
nick, ircErrUnknownCommand,
|
||||||
http.StatusBadRequest,
|
command+" :Unknown command",
|
||||||
|
command,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -648,10 +694,10 @@ func (hdlr *Handlers) handlePrivmsg(
|
|||||||
bodyLines func() []string,
|
bodyLines func() []string,
|
||||||
) {
|
) {
|
||||||
if target == "" {
|
if target == "" {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"to field required",
|
nick, ircErrNoRecipient,
|
||||||
http.StatusBadRequest,
|
"No recipient given ("+command+")",
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -659,10 +705,10 @@ func (hdlr *Handlers) handlePrivmsg(
|
|||||||
|
|
||||||
lines := bodyLines()
|
lines := bodyLines()
|
||||||
if len(lines) == 0 {
|
if len(lines) == 0 {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"body required",
|
nick, ircErrNoTextToSend,
|
||||||
http.StatusBadRequest,
|
"No text to send",
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -694,10 +740,11 @@ func (hdlr *Handlers) handleChannelMsg(
|
|||||||
request.Context(), target,
|
request.Context(), target,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"channel not found",
|
nick, ircErrNoSuchChannel,
|
||||||
http.StatusNotFound,
|
"No such channel",
|
||||||
|
target,
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -720,10 +767,11 @@ func (hdlr *Handlers) handleChannelMsg(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !isMember {
|
if !isMember {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"not a member of this channel",
|
nick, ircErrNotOnChannel,
|
||||||
http.StatusForbidden,
|
"You're not on that channel",
|
||||||
|
target,
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -761,7 +809,7 @@ func (hdlr *Handlers) handleChannelMsg(
|
|||||||
|
|
||||||
hdlr.respondJSON(writer, request,
|
hdlr.respondJSON(writer, request,
|
||||||
map[string]string{"id": msgUUID, "status": "sent"},
|
map[string]string{"id": msgUUID, "status": "sent"},
|
||||||
http.StatusCreated)
|
http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hdlr *Handlers) handleDirectMsg(
|
func (hdlr *Handlers) handleDirectMsg(
|
||||||
@@ -775,10 +823,11 @@ func (hdlr *Handlers) handleDirectMsg(
|
|||||||
request.Context(), target,
|
request.Context(), target,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"user not found",
|
nick, ircErrNoSuchNick,
|
||||||
http.StatusNotFound,
|
"No such nick/channel",
|
||||||
|
target,
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -805,7 +854,7 @@ func (hdlr *Handlers) handleDirectMsg(
|
|||||||
|
|
||||||
hdlr.respondJSON(writer, request,
|
hdlr.respondJSON(writer, request,
|
||||||
map[string]string{"id": msgUUID, "status": "sent"},
|
map[string]string{"id": msgUUID, "status": "sent"},
|
||||||
http.StatusCreated)
|
http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hdlr *Handlers) handleJoin(
|
func (hdlr *Handlers) handleJoin(
|
||||||
@@ -815,10 +864,11 @@ func (hdlr *Handlers) handleJoin(
|
|||||||
nick, target string,
|
nick, target string,
|
||||||
) {
|
) {
|
||||||
if target == "" {
|
if target == "" {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"to field required",
|
nick, ircErrNeedMoreParams,
|
||||||
http.StatusBadRequest,
|
"Not enough parameters",
|
||||||
|
"JOIN",
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -830,10 +880,11 @@ func (hdlr *Handlers) handleJoin(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !validChannelRe.MatchString(channel) {
|
if !validChannelRe.MatchString(channel) {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"invalid channel name",
|
nick, ircErrNoSuchChannel,
|
||||||
http.StatusBadRequest,
|
"No such channel",
|
||||||
|
channel,
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -895,10 +946,11 @@ func (hdlr *Handlers) handlePart(
|
|||||||
body json.RawMessage,
|
body json.RawMessage,
|
||||||
) {
|
) {
|
||||||
if target == "" {
|
if target == "" {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"to field required",
|
nick, ircErrNeedMoreParams,
|
||||||
http.StatusBadRequest,
|
"Not enough parameters",
|
||||||
|
"PART",
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -913,10 +965,11 @@ func (hdlr *Handlers) handlePart(
|
|||||||
request.Context(), channel,
|
request.Context(), channel,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"channel not found",
|
nick, ircErrNoSuchChannel,
|
||||||
http.StatusNotFound,
|
"No such channel",
|
||||||
|
channel,
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -967,10 +1020,10 @@ func (hdlr *Handlers) handleNick(
|
|||||||
) {
|
) {
|
||||||
lines := bodyLines()
|
lines := bodyLines()
|
||||||
if len(lines) == 0 {
|
if len(lines) == 0 {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"body required (new nick)",
|
nick, ircErrNoNicknameGiven,
|
||||||
http.StatusBadRequest,
|
"No nickname given",
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -979,10 +1032,11 @@ func (hdlr *Handlers) handleNick(
|
|||||||
newNick := strings.TrimSpace(lines[0])
|
newNick := strings.TrimSpace(lines[0])
|
||||||
|
|
||||||
if !validNickRe.MatchString(newNick) {
|
if !validNickRe.MatchString(newNick) {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"invalid nick",
|
nick, ircErrErroneusNickname,
|
||||||
http.StatusBadRequest,
|
"Erroneous nickname",
|
||||||
|
newNick,
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -1003,10 +1057,11 @@ func (hdlr *Handlers) handleNick(
|
|||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), "UNIQUE") {
|
if strings.Contains(err.Error(), "UNIQUE") {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"nick already in use",
|
nick, ircErrNicknameInUse,
|
||||||
http.StatusConflict,
|
"Nickname is already in use",
|
||||||
|
newNick,
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -1093,10 +1148,11 @@ func (hdlr *Handlers) handleTopic(
|
|||||||
bodyLines func() []string,
|
bodyLines func() []string,
|
||||||
) {
|
) {
|
||||||
if target == "" {
|
if target == "" {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"to field required",
|
nick, ircErrNeedMoreParams,
|
||||||
http.StatusBadRequest,
|
"Not enough parameters",
|
||||||
|
"TOPIC",
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -1104,10 +1160,11 @@ func (hdlr *Handlers) handleTopic(
|
|||||||
|
|
||||||
lines := bodyLines()
|
lines := bodyLines()
|
||||||
if len(lines) == 0 {
|
if len(lines) == 0 {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"body required (topic text)",
|
nick, ircErrNeedMoreParams,
|
||||||
http.StatusBadRequest,
|
"Not enough parameters",
|
||||||
|
"TOPIC",
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -1140,10 +1197,11 @@ func (hdlr *Handlers) handleTopic(
|
|||||||
request.Context(), channel,
|
request.Context(), channel,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
hdlr.respondError(
|
hdlr.respondIRCError(
|
||||||
writer, request,
|
writer, request,
|
||||||
"channel not found",
|
nick, ircErrNoSuchChannel,
|
||||||
http.StatusNotFound,
|
"No such channel",
|
||||||
|
channel,
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -668,11 +668,18 @@ func TestJoinMissingTo(t *testing.T) {
|
|||||||
tserver := newTestServer(t)
|
tserver := newTestServer(t)
|
||||||
token := tserver.createSession("joiner3")
|
token := tserver.createSession("joiner3")
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(
|
status, result := tserver.sendCommand(
|
||||||
token, map[string]any{commandKey: joinCmd},
|
token, map[string]any{commandKey: joinCmd},
|
||||||
)
|
)
|
||||||
if status != http.StatusBadRequest {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 400, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "461" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 461, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -699,9 +706,9 @@ func TestChannelMessage(t *testing.T) {
|
|||||||
bodyKey: []string{"hello world"},
|
bodyKey: []string{"hello world"},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
if status != http.StatusCreated {
|
if status != http.StatusOK {
|
||||||
t.Fatalf(
|
t.Fatalf(
|
||||||
"expected 201, got %d: %v", status, result,
|
"expected 200, got %d: %v", status, result,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -728,11 +735,18 @@ func TestMessageMissingBody(t *testing.T) {
|
|||||||
commandKey: joinCmd, toKey: "#test",
|
commandKey: joinCmd, toKey: "#test",
|
||||||
})
|
})
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(token, map[string]any{
|
status, result := tserver.sendCommand(token, map[string]any{
|
||||||
commandKey: privmsgCmd, toKey: "#test",
|
commandKey: privmsgCmd, toKey: "#test",
|
||||||
})
|
})
|
||||||
if status != http.StatusBadRequest {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 400, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "412" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 412, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -740,12 +754,19 @@ func TestMessageMissingTo(t *testing.T) {
|
|||||||
tserver := newTestServer(t)
|
tserver := newTestServer(t)
|
||||||
token := tserver.createSession("noto")
|
token := tserver.createSession("noto")
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(token, map[string]any{
|
status, result := tserver.sendCommand(token, map[string]any{
|
||||||
commandKey: privmsgCmd,
|
commandKey: privmsgCmd,
|
||||||
bodyKey: []string{"hello"},
|
bodyKey: []string{"hello"},
|
||||||
})
|
})
|
||||||
if status != http.StatusBadRequest {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 400, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "411" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 411, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -760,7 +781,7 @@ func TestNonMemberCannotSend(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Alice tries to send without joining.
|
// Alice tries to send without joining.
|
||||||
status, _ := tserver.sendCommand(
|
status, result := tserver.sendCommand(
|
||||||
aliceToken,
|
aliceToken,
|
||||||
map[string]any{
|
map[string]any{
|
||||||
commandKey: privmsgCmd,
|
commandKey: privmsgCmd,
|
||||||
@@ -768,8 +789,15 @@ func TestNonMemberCannotSend(t *testing.T) {
|
|||||||
bodyKey: []string{"sneaky"},
|
bodyKey: []string{"sneaky"},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
if status != http.StatusForbidden {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 403, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "442" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 442, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -786,9 +814,9 @@ func TestDirectMessage(t *testing.T) {
|
|||||||
bodyKey: []string{"hey bob"},
|
bodyKey: []string{"hey bob"},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
if status != http.StatusCreated {
|
if status != http.StatusOK {
|
||||||
t.Fatalf(
|
t.Fatalf(
|
||||||
"expected 201, got %d: %v", status, result,
|
"expected 200, got %d: %v", status, result,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -818,13 +846,20 @@ func TestDMToNonexistentUser(t *testing.T) {
|
|||||||
tserver := newTestServer(t)
|
tserver := newTestServer(t)
|
||||||
token := tserver.createSession("dmsender")
|
token := tserver.createSession("dmsender")
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(token, map[string]any{
|
status, result := tserver.sendCommand(token, map[string]any{
|
||||||
commandKey: privmsgCmd,
|
commandKey: privmsgCmd,
|
||||||
toKey: "nobody",
|
toKey: "nobody",
|
||||||
bodyKey: []string{"hello?"},
|
bodyKey: []string{"hello?"},
|
||||||
})
|
})
|
||||||
if status != http.StatusNotFound {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 404, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "401" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 401, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -871,12 +906,19 @@ func TestNickCollision(t *testing.T) {
|
|||||||
|
|
||||||
tserver.createSession("taken_nick")
|
tserver.createSession("taken_nick")
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(token, map[string]any{
|
status, result := tserver.sendCommand(token, map[string]any{
|
||||||
commandKey: "NICK",
|
commandKey: "NICK",
|
||||||
bodyKey: []string{"taken_nick"},
|
bodyKey: []string{"taken_nick"},
|
||||||
})
|
})
|
||||||
if status != http.StatusConflict {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 409, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "433" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 433, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -884,12 +926,19 @@ func TestNickInvalid(t *testing.T) {
|
|||||||
tserver := newTestServer(t)
|
tserver := newTestServer(t)
|
||||||
token := tserver.createSession("nickval")
|
token := tserver.createSession("nickval")
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(token, map[string]any{
|
status, result := tserver.sendCommand(token, map[string]any{
|
||||||
commandKey: "NICK",
|
commandKey: "NICK",
|
||||||
bodyKey: []string{"bad nick!"},
|
bodyKey: []string{"bad nick!"},
|
||||||
})
|
})
|
||||||
if status != http.StatusBadRequest {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 400, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "432" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 432, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -897,11 +946,18 @@ func TestNickEmptyBody(t *testing.T) {
|
|||||||
tserver := newTestServer(t)
|
tserver := newTestServer(t)
|
||||||
token := tserver.createSession("nicknobody")
|
token := tserver.createSession("nicknobody")
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(
|
status, result := tserver.sendCommand(
|
||||||
token, map[string]any{commandKey: "NICK"},
|
token, map[string]any{commandKey: "NICK"},
|
||||||
)
|
)
|
||||||
if status != http.StatusBadRequest {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 400, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "431" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 431, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -938,12 +994,19 @@ func TestTopicMissingTo(t *testing.T) {
|
|||||||
tserver := newTestServer(t)
|
tserver := newTestServer(t)
|
||||||
token := tserver.createSession("topicnoto")
|
token := tserver.createSession("topicnoto")
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(token, map[string]any{
|
status, result := tserver.sendCommand(token, map[string]any{
|
||||||
commandKey: "TOPIC",
|
commandKey: "TOPIC",
|
||||||
bodyKey: []string{"topic"},
|
bodyKey: []string{"topic"},
|
||||||
})
|
})
|
||||||
if status != http.StatusBadRequest {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 400, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "461" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 461, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -955,11 +1018,18 @@ func TestTopicMissingBody(t *testing.T) {
|
|||||||
commandKey: joinCmd, toKey: "#topictest",
|
commandKey: joinCmd, toKey: "#topictest",
|
||||||
})
|
})
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(token, map[string]any{
|
status, result := tserver.sendCommand(token, map[string]any{
|
||||||
commandKey: "TOPIC", toKey: "#topictest",
|
commandKey: "TOPIC", toKey: "#topictest",
|
||||||
})
|
})
|
||||||
if status != http.StatusBadRequest {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 400, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "461" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 461, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1027,11 +1097,18 @@ func TestUnknownCommand(t *testing.T) {
|
|||||||
tserver := newTestServer(t)
|
tserver := newTestServer(t)
|
||||||
token := tserver.createSession("cmdtest")
|
token := tserver.createSession("cmdtest")
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(
|
status, result := tserver.sendCommand(
|
||||||
token, map[string]any{commandKey: "BOGUS"},
|
token, map[string]any{commandKey: "BOGUS"},
|
||||||
)
|
)
|
||||||
if status != http.StatusBadRequest {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 400, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "421" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 421, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1039,11 +1116,18 @@ func TestEmptyCommand(t *testing.T) {
|
|||||||
tserver := newTestServer(t)
|
tserver := newTestServer(t)
|
||||||
token := tserver.createSession("emptycmd")
|
token := tserver.createSession("emptycmd")
|
||||||
|
|
||||||
status, _ := tserver.sendCommand(
|
status, result := tserver.sendCommand(
|
||||||
token, map[string]any{commandKey: ""},
|
token, map[string]any{commandKey: ""},
|
||||||
)
|
)
|
||||||
if status != http.StatusBadRequest {
|
if status != http.StatusOK {
|
||||||
t.Fatalf("expected 400, got %d", status)
|
t.Fatalf("expected 200, got %d", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[commandKey] != "421" {
|
||||||
|
t.Fatalf(
|
||||||
|
"expected IRC 421, got %v",
|
||||||
|
result[commandKey],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user