mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-28 10:32:55 +01:00
test(channelserver): add mock-based handler unit tests
Leverage the new repository interfaces to test handler logic without a database. Adds shared mock implementations (achievement, mail, character, goocoo, guild) and 32 new handler tests covering achievement, mail, cafe/boost, and goocoo handlers.
This commit is contained in:
150
server/channelserver/handlers_goocoo_test.go
Normal file
150
server/channelserver/handlers_goocoo_test.go
Normal file
@@ -0,0 +1,150 @@
|
||||
package channelserver
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"erupe-ce/network/mhfpacket"
|
||||
)
|
||||
|
||||
func TestHandleMsgMhfEnumerateGuacot_Empty(t *testing.T) {
|
||||
server := createMockServer()
|
||||
mock := newMockGoocooRepo()
|
||||
server.goocooRepo = mock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfEnumerateGuacot{AckHandle: 100}
|
||||
|
||||
handleMsgMhfEnumerateGuacot(session, pkt)
|
||||
|
||||
select {
|
||||
case p := <-session.sendPackets:
|
||||
if len(p.data) < 4 {
|
||||
t.Fatal("Response too short")
|
||||
}
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHandleMsgMhfEnumerateGuacot_WithSlots(t *testing.T) {
|
||||
server := createMockServer()
|
||||
mock := newMockGoocooRepo()
|
||||
mock.slots[0] = []byte{0x01, 0x02, 0x03, 0x04} // slot 0 has data
|
||||
mock.slots[2] = []byte{0x05, 0x06, 0x07, 0x08} // slot 2 has data
|
||||
server.goocooRepo = mock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfEnumerateGuacot{AckHandle: 100}
|
||||
|
||||
handleMsgMhfEnumerateGuacot(session, pkt)
|
||||
|
||||
select {
|
||||
case p := <-session.sendPackets:
|
||||
// Header (4 bytes) + 2 goocoo entries
|
||||
if len(p.data) < 8 {
|
||||
t.Errorf("Response too short: %d bytes", len(p.data))
|
||||
}
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHandleMsgMhfUpdateGuacot_ClearSlot(t *testing.T) {
|
||||
server := createMockServer()
|
||||
mock := newMockGoocooRepo()
|
||||
mock.slots[1] = []byte{0x01, 0x02} // pre-existing data
|
||||
server.goocooRepo = mock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfUpdateGuacot{
|
||||
AckHandle: 100,
|
||||
Goocoos: []mhfpacket.Goocoo{
|
||||
{
|
||||
Index: 1,
|
||||
Data1: []int16{0, 0, 0}, // First byte 0 = clear
|
||||
Data2: []uint32{0},
|
||||
Name: []byte("test"),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
handleMsgMhfUpdateGuacot(session, pkt)
|
||||
|
||||
if len(mock.clearCalled) != 1 || mock.clearCalled[0] != 1 {
|
||||
t.Errorf("Expected ClearSlot(1), got %v", mock.clearCalled)
|
||||
}
|
||||
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHandleMsgMhfUpdateGuacot_SaveSlot(t *testing.T) {
|
||||
server := createMockServer()
|
||||
mock := newMockGoocooRepo()
|
||||
server.goocooRepo = mock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfUpdateGuacot{
|
||||
AckHandle: 100,
|
||||
Goocoos: []mhfpacket.Goocoo{
|
||||
{
|
||||
Index: 2,
|
||||
Data1: []int16{1, 2, 3}, // First byte non-zero = save
|
||||
Data2: []uint32{100, 200},
|
||||
Name: []byte("MyGoocoo"),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
handleMsgMhfUpdateGuacot(session, pkt)
|
||||
|
||||
if _, ok := mock.savedSlots[2]; !ok {
|
||||
t.Error("Expected SaveSlot to be called for slot 2")
|
||||
}
|
||||
if len(mock.clearCalled) != 0 {
|
||||
t.Error("ClearSlot should not be called for a save operation")
|
||||
}
|
||||
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHandleMsgMhfUpdateGuacot_SkipInvalidIndex(t *testing.T) {
|
||||
server := createMockServer()
|
||||
mock := newMockGoocooRepo()
|
||||
server.goocooRepo = mock
|
||||
session := createMockSession(1, server)
|
||||
|
||||
pkt := &mhfpacket.MsgMhfUpdateGuacot{
|
||||
AckHandle: 100,
|
||||
Goocoos: []mhfpacket.Goocoo{
|
||||
{
|
||||
Index: 5, // > 4, should be skipped
|
||||
Data1: []int16{1},
|
||||
Data2: []uint32{0},
|
||||
Name: []byte("Bad"),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
handleMsgMhfUpdateGuacot(session, pkt)
|
||||
|
||||
if len(mock.savedSlots) != 0 {
|
||||
t.Error("SaveSlot should not be called for index > 4")
|
||||
}
|
||||
if len(mock.clearCalled) != 0 {
|
||||
t.Error("ClearSlot should not be called for index > 4")
|
||||
}
|
||||
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Error("No response packet queued")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user