mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-27 01:53:19 +01:00
test(channelserver): add handler tests for guild ops, scout, board, and items
Cover the 4 handler files that had no tests: handlers_guild_ops.go,
handlers_guild_scout.go, handlers_guild_board.go, and handlers_items.go.
44 new tests exercise the error-logging paths added in 8fe6f60 and the
core handler logic (disband, resign, apply, leave, accept/reject/kick,
scout answer, message board CRUD, weekly stamps, item box parsing).
New mock types: mockGuildRepoOps (enhanced guild repo with configurable
errors and state tracking), mockUserRepoForItems, mockStampRepoForItems,
mockHouseRepoForItems. Coverage rises from 41.1% to 43.7%.
This commit is contained in:
241
server/channelserver/handlers_guild_board_test.go
Normal file
241
server/channelserver/handlers_guild_board_test.go
Normal file
@@ -0,0 +1,241 @@
|
||||
package channelserver
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"erupe-ce/network/mhfpacket"
|
||||
)
|
||||
|
||||
// --- handleMsgMhfUpdateGuildMessageBoard tests ---
|
||||
|
||||
func TestUpdateGuildMessageBoard_CreatePost(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charMock := newMockCharacterRepo()
|
||||
guildMock := &mockGuildRepoOps{
|
||||
membership: &GuildMember{GuildID: 10, CharID: 1, OrderIndex: 1},
|
||||
}
|
||||
guildMock.guild = &Guild{ID: 10}
|
||||
guildMock.guild.LeaderCharID = 1
|
||||
server.guildRepo = guildMock
|
||||
server.charRepo = charMock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
|
||||
AckHandle: 100,
|
||||
MessageOp: 0, // Create
|
||||
PostType: 0,
|
||||
StampID: 5,
|
||||
Title: "Test Title",
|
||||
Body: "Test Body",
|
||||
}
|
||||
|
||||
handleMsgMhfUpdateGuildMessageBoard(session, pkt)
|
||||
|
||||
if guildMock.createdPost == nil {
|
||||
t.Fatal("CreatePost should be called")
|
||||
}
|
||||
if guildMock.createdPost[0].(uint32) != 10 {
|
||||
t.Errorf("CreatePost guildID = %d, want 10", guildMock.createdPost[0])
|
||||
}
|
||||
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateGuildMessageBoard_DeletePost(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charMock := newMockCharacterRepo()
|
||||
guildMock := &mockGuildRepoOps{
|
||||
membership: &GuildMember{GuildID: 10, CharID: 1, OrderIndex: 1},
|
||||
}
|
||||
guildMock.guild = &Guild{ID: 10}
|
||||
guildMock.guild.LeaderCharID = 1
|
||||
server.guildRepo = guildMock
|
||||
server.charRepo = charMock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
|
||||
AckHandle: 100,
|
||||
MessageOp: 1, // Delete
|
||||
PostID: 42,
|
||||
}
|
||||
|
||||
handleMsgMhfUpdateGuildMessageBoard(session, pkt)
|
||||
|
||||
if guildMock.deletedPostID != 42 {
|
||||
t.Errorf("DeletePost postID = %d, want 42", guildMock.deletedPostID)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateGuildMessageBoard_NoGuild(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charMock := newMockCharacterRepo()
|
||||
guildMock := &mockGuildRepoOps{}
|
||||
guildMock.getErr = errNotFound
|
||||
server.guildRepo = guildMock
|
||||
server.charRepo = charMock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
|
||||
AckHandle: 100,
|
||||
MessageOp: 0,
|
||||
}
|
||||
|
||||
handleMsgMhfUpdateGuildMessageBoard(session, pkt)
|
||||
|
||||
// Returns early with empty success
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateGuildMessageBoard_Applicant(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charMock := newMockCharacterRepo()
|
||||
guildMock := &mockGuildRepoOps{
|
||||
hasAppResult: true, // is an applicant
|
||||
}
|
||||
guildMock.guild = &Guild{ID: 10}
|
||||
guildMock.guild.LeaderCharID = 999
|
||||
server.guildRepo = guildMock
|
||||
server.charRepo = charMock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
|
||||
AckHandle: 100,
|
||||
MessageOp: 0,
|
||||
}
|
||||
|
||||
handleMsgMhfUpdateGuildMessageBoard(session, pkt)
|
||||
|
||||
if guildMock.createdPost != nil {
|
||||
t.Error("Applicant should not be able to create posts")
|
||||
}
|
||||
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateGuildMessageBoard_HasAppError(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charMock := newMockCharacterRepo()
|
||||
guildMock := &mockGuildRepoOps{
|
||||
hasAppErr: errNotFound, // error checking app status
|
||||
}
|
||||
guildMock.guild = &Guild{ID: 10}
|
||||
guildMock.guild.LeaderCharID = 1
|
||||
server.guildRepo = guildMock
|
||||
server.charRepo = charMock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
|
||||
AckHandle: 100,
|
||||
MessageOp: 0,
|
||||
Title: "Test",
|
||||
Body: "Body",
|
||||
}
|
||||
|
||||
// Should log warning and treat as non-applicant (applicant=false on error)
|
||||
handleMsgMhfUpdateGuildMessageBoard(session, pkt)
|
||||
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
// --- handleMsgMhfEnumerateGuildMessageBoard tests ---
|
||||
|
||||
func TestEnumerateGuildMessageBoard_NoPosts(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charMock := newMockCharacterRepo()
|
||||
guildMock := &mockGuildRepoOps{
|
||||
posts: []*MessageBoardPost{},
|
||||
}
|
||||
guildMock.guild = &Guild{ID: 10}
|
||||
server.guildRepo = guildMock
|
||||
server.charRepo = charMock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfEnumerateGuildMessageBoard{
|
||||
AckHandle: 100,
|
||||
BoardType: 0,
|
||||
MaxPosts: 100,
|
||||
}
|
||||
|
||||
handleMsgMhfEnumerateGuildMessageBoard(session, pkt)
|
||||
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnumerateGuildMessageBoard_WithPosts(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charMock := newMockCharacterRepo()
|
||||
guildMock := &mockGuildRepoOps{
|
||||
posts: []*MessageBoardPost{
|
||||
{ID: 1, AuthorID: 100, StampID: 5, Title: "Hello", Body: "World", Timestamp: time.Now()},
|
||||
{ID: 2, AuthorID: 200, StampID: 0, Title: "Test", Body: "Post", Timestamp: time.Now()},
|
||||
},
|
||||
}
|
||||
guildMock.guild = &Guild{ID: 10}
|
||||
server.guildRepo = guildMock
|
||||
server.charRepo = charMock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfEnumerateGuildMessageBoard{
|
||||
AckHandle: 100,
|
||||
BoardType: 0,
|
||||
MaxPosts: 100,
|
||||
}
|
||||
|
||||
handleMsgMhfEnumerateGuildMessageBoard(session, pkt)
|
||||
|
||||
select {
|
||||
case p := <-session.sendPackets:
|
||||
if len(p.data) < 8 {
|
||||
t.Errorf("Response too short for 2 posts: %d bytes", len(p.data))
|
||||
}
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnumerateGuildMessageBoard_DBError(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charMock := newMockCharacterRepo()
|
||||
guildMock := &mockGuildRepoOps{
|
||||
listPostsErr: errNotFound,
|
||||
}
|
||||
guildMock.guild = &Guild{ID: 10}
|
||||
server.guildRepo = guildMock
|
||||
server.charRepo = charMock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfEnumerateGuildMessageBoard{
|
||||
AckHandle: 100,
|
||||
BoardType: 0,
|
||||
MaxPosts: 100,
|
||||
}
|
||||
|
||||
handleMsgMhfEnumerateGuildMessageBoard(session, pkt)
|
||||
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user