mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-29 03:52:41 +02:00
test(channelserver): add unit tests for helpers, kouryou, scenario, seibattle, and distitem handlers
Cover previously untested handler files with mock-based unit tests: - handlers_helpers: load/save character data, ack helpers, updateRights - handlers_kouryou: get/add/exchange points with success and error paths - handlers_scenario: scenario counter serialization, 128-entry trim, category exchange flags - handlers_seibattle: all type codes, Earth response format, data size validation - handlers_distitem: enumerate/apply/acquire distributions, description retrieval
This commit is contained in:
211
server/channelserver/handlers_helpers_test.go
Normal file
211
server/channelserver/handlers_helpers_test.go
Normal file
@@ -0,0 +1,211 @@
|
||||
package channelserver
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestLoadCharacterData_Success(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charRepo := newMockCharacterRepo()
|
||||
charRepo.columns["test_col"] = []byte{0xAA, 0xBB, 0xCC}
|
||||
server.charRepo = charRepo
|
||||
session := createMockSession(1, server)
|
||||
|
||||
loadCharacterData(session, 100, "test_col", nil)
|
||||
|
||||
select {
|
||||
case pkt := <-session.sendPackets:
|
||||
if pkt.data == nil {
|
||||
t.Fatal("Response packet should have data")
|
||||
}
|
||||
default:
|
||||
t.Fatal("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadCharacterData_EmptyUsesDefault(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charRepo := newMockCharacterRepo()
|
||||
server.charRepo = charRepo
|
||||
session := createMockSession(1, server)
|
||||
|
||||
defaultData := []byte{0x01, 0x02, 0x03}
|
||||
loadCharacterData(session, 100, "missing_col", defaultData)
|
||||
|
||||
select {
|
||||
case pkt := <-session.sendPackets:
|
||||
if pkt.data == nil {
|
||||
t.Fatal("Response packet should have data")
|
||||
}
|
||||
default:
|
||||
t.Fatal("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadCharacterData_Error(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charRepo := newMockCharacterRepo()
|
||||
charRepo.loadColumnErr = errors.New("db error")
|
||||
server.charRepo = charRepo
|
||||
session := createMockSession(1, server)
|
||||
|
||||
defaultData := []byte{0xFF}
|
||||
loadCharacterData(session, 100, "test_col", defaultData)
|
||||
|
||||
// Should still send a response (with default data)
|
||||
select {
|
||||
case pkt := <-session.sendPackets:
|
||||
if pkt.data == nil {
|
||||
t.Fatal("Response packet should have data even on error")
|
||||
}
|
||||
default:
|
||||
t.Fatal("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSaveCharacterData_Success(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charRepo := newMockCharacterRepo()
|
||||
server.charRepo = charRepo
|
||||
session := createMockSession(1, server)
|
||||
|
||||
data := []byte{0x01, 0x02, 0x03}
|
||||
saveCharacterData(session, 100, "test_col", data, 100)
|
||||
|
||||
// Should save and ack
|
||||
if saved := charRepo.columns["test_col"]; saved == nil {
|
||||
t.Error("Data should be saved to repo")
|
||||
}
|
||||
|
||||
select {
|
||||
case pkt := <-session.sendPackets:
|
||||
if pkt.data == nil {
|
||||
t.Fatal("Response packet should have data")
|
||||
}
|
||||
default:
|
||||
t.Fatal("No response packet queued")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSaveCharacterData_TooLarge(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charRepo := newMockCharacterRepo()
|
||||
server.charRepo = charRepo
|
||||
session := createMockSession(1, server)
|
||||
|
||||
data := make([]byte, 200)
|
||||
saveCharacterData(session, 100, "test_col", data, 50)
|
||||
|
||||
// Should fail with ack
|
||||
if _, ok := charRepo.columns["test_col"]; ok {
|
||||
t.Error("Data should NOT be saved when too large")
|
||||
}
|
||||
|
||||
select {
|
||||
case pkt := <-session.sendPackets:
|
||||
if pkt.data == nil {
|
||||
t.Fatal("Response packet should have data")
|
||||
}
|
||||
default:
|
||||
t.Fatal("Should queue a fail ack")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSaveCharacterData_SaveError(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charRepo := newMockCharacterRepo()
|
||||
charRepo.saveErr = errors.New("save failed")
|
||||
server.charRepo = charRepo
|
||||
session := createMockSession(1, server)
|
||||
|
||||
data := []byte{0x01}
|
||||
saveCharacterData(session, 100, "test_col", data, 100)
|
||||
|
||||
// Should still queue a fail ack
|
||||
select {
|
||||
case pkt := <-session.sendPackets:
|
||||
if pkt.data == nil {
|
||||
t.Fatal("Response packet should have data")
|
||||
}
|
||||
default:
|
||||
t.Fatal("Should queue a fail ack on save error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSaveCharacterData_NoMaxSize(t *testing.T) {
|
||||
server := createMockServer()
|
||||
charRepo := newMockCharacterRepo()
|
||||
server.charRepo = charRepo
|
||||
session := createMockSession(1, server)
|
||||
|
||||
data := make([]byte, 5000)
|
||||
saveCharacterData(session, 100, "test_col", data, 0)
|
||||
|
||||
// maxSize=0 means no limit
|
||||
if saved := charRepo.columns["test_col"]; saved == nil {
|
||||
t.Error("Data should be saved when maxSize is 0 (no limit)")
|
||||
}
|
||||
|
||||
select {
|
||||
case <-session.sendPackets:
|
||||
default:
|
||||
t.Fatal("Should queue success ack")
|
||||
}
|
||||
}
|
||||
|
||||
func TestDoAckEarthSucceed(t *testing.T) {
|
||||
server := createMockServer()
|
||||
server.erupeConfig.EarthID = 42
|
||||
session := createMockSession(1, server)
|
||||
|
||||
doAckEarthSucceed(session, 100, nil)
|
||||
|
||||
select {
|
||||
case pkt := <-session.sendPackets:
|
||||
if pkt.data == nil {
|
||||
t.Fatal("Response should have data")
|
||||
}
|
||||
default:
|
||||
t.Fatal("Should queue a packet")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateRights(t *testing.T) {
|
||||
server := createMockServer()
|
||||
userRepo := &mockUserRepoGacha{}
|
||||
userRepo.rights = 30
|
||||
server.userRepo = userRepo
|
||||
session := createMockSession(1, server)
|
||||
|
||||
updateRights(session)
|
||||
|
||||
select {
|
||||
case pkt := <-session.sendPackets:
|
||||
if pkt.data == nil {
|
||||
t.Fatal("Should queue MsgSysUpdateRight")
|
||||
}
|
||||
default:
|
||||
t.Fatal("updateRights should queue a packet")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateRights_Error(t *testing.T) {
|
||||
server := createMockServer()
|
||||
userRepo := &mockUserRepoGacha{rightsErr: errors.New("db error")}
|
||||
server.userRepo = userRepo
|
||||
session := createMockSession(1, server)
|
||||
|
||||
// Should not panic, falls back to rights=2
|
||||
updateRights(session)
|
||||
|
||||
select {
|
||||
case pkt := <-session.sendPackets:
|
||||
if pkt.data == nil {
|
||||
t.Fatal("Should queue MsgSysUpdateRight even on error")
|
||||
}
|
||||
default:
|
||||
t.Fatal("updateRights should queue a packet even on error")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user