test: add coverage tests to reach 65% total coverage

Add 16 test files across 4 packages covering previously untested
handler paths: guild board operations, house/warehouse management,
tower/tenrouirai progress, diva schedule, festa info, cafe duration,
API error paths, sign server responses, and byteframe boundaries.
This commit is contained in:
Houmgaor
2026-02-26 23:17:12 +01:00
parent cdc4cd9ba3
commit a68d76c55f
16 changed files with 3077 additions and 0 deletions

View File

@@ -0,0 +1,270 @@
package signserver
import (
"fmt"
"strings"
"testing"
"time"
cfg "erupe-ce/config"
"go.uber.org/zap"
)
func TestMakeSignResponse_PS3Client(t *testing.T) {
config := &cfg.Config{
PatchServerFile: "http://patch.example.com/file",
PatchServerManifest: "http://patch.example.com/manifest",
DebugOptions: cfg.DebugOptions{
CapLink: cfg.CapLinkOptions{
Values: []uint16{0, 0, 0, 0, 0},
},
},
GameplayOptions: cfg.GameplayOptions{
MezFesSoloTickets: 100,
MezFesGroupTickets: 100,
},
}
server := newMakeSignResponseServer(config)
server.charRepo = &mockSignCharacterRepo{
characters: []character{
{ID: 1, Name: "TestHunter", HR: 100, GR: 50, WeaponType: 3, LastLogin: 1700000000},
},
}
conn := newMockConn()
session := &Session{
logger: zap.NewNop(),
server: server,
rawConn: conn,
client: PS3,
}
result := session.makeSignResponse(1)
if len(result) == 0 {
t.Error("makeSignResponse() returned empty result")
}
if result[0] != uint8(SIGN_SUCCESS) {
t.Errorf("first byte = %d, want %d (SIGN_SUCCESS)", result[0], SIGN_SUCCESS)
}
}
func TestMakeSignResponse_PS3NoPatchServer(t *testing.T) {
config := &cfg.Config{
PatchServerFile: "",
PatchServerManifest: "",
DebugOptions: cfg.DebugOptions{
CapLink: cfg.CapLinkOptions{
Values: []uint16{0, 0, 0, 0, 0},
},
},
}
server := newMakeSignResponseServer(config)
conn := newMockConn()
session := &Session{
logger: zap.NewNop(),
server: server,
rawConn: conn,
client: PS3,
}
result := session.makeSignResponse(1)
if len(result) == 0 {
t.Fatal("makeSignResponse() returned empty result")
}
if result[0] != uint8(SIGN_EABORT) {
t.Errorf("first byte = %d, want %d (SIGN_EABORT)", result[0], SIGN_EABORT)
}
}
func TestMakeSignResponse_HideLoginNotice(t *testing.T) {
config := &cfg.Config{
HideLoginNotice: true,
DebugOptions: cfg.DebugOptions{
CapLink: cfg.CapLinkOptions{
Values: []uint16{0, 0, 0, 0, 0},
},
},
GameplayOptions: cfg.GameplayOptions{
MezFesSoloTickets: 100,
MezFesGroupTickets: 100,
},
}
server := newMakeSignResponseServer(config)
server.charRepo = &mockSignCharacterRepo{
characters: []character{
{ID: 1, Name: "TestHunter", HR: 50},
},
}
conn := newMockConn()
session := &Session{
logger: zap.NewNop(),
server: server,
rawConn: conn,
client: PC100,
}
defer func() {
if r := recover(); r != nil {
panicStr := fmt.Sprintf("%v", r)
if strings.Contains(panicStr, "index out of range") {
t.Errorf("array bounds panic: %v", r)
}
}
}()
result := session.makeSignResponse(1)
if len(result) == 0 {
t.Error("makeSignResponse() returned empty result")
}
}
func TestMakeSignResponse_MaxLauncherHR(t *testing.T) {
config := &cfg.Config{
DebugOptions: cfg.DebugOptions{
MaxLauncherHR: true,
CapLink: cfg.CapLinkOptions{
Values: []uint16{0, 0, 0, 0, 0},
},
},
GameplayOptions: cfg.GameplayOptions{
MezFesSoloTickets: 100,
MezFesGroupTickets: 100,
},
}
server := newMakeSignResponseServer(config)
server.charRepo = &mockSignCharacterRepo{
characters: []character{
{ID: 1, Name: "TestHunter", HR: 50},
},
}
conn := newMockConn()
session := &Session{
logger: zap.NewNop(),
server: server,
rawConn: conn,
client: PC100,
}
defer func() {
if r := recover(); r != nil {
panicStr := fmt.Sprintf("%v", r)
if strings.Contains(panicStr, "index out of range") {
t.Errorf("array bounds panic: %v", r)
}
}
}()
result := session.makeSignResponse(1)
if len(result) == 0 {
t.Error("makeSignResponse() returned empty result")
}
}
func TestMakeSignResponse_FriendsOverflow(t *testing.T) {
config := &cfg.Config{
DebugOptions: cfg.DebugOptions{
CapLink: cfg.CapLinkOptions{
Values: []uint16{0, 0, 0, 0, 0},
},
},
GameplayOptions: cfg.GameplayOptions{
MezFesSoloTickets: 100,
MezFesGroupTickets: 100,
},
}
// Create 300 friends (> 255)
friends := make([]members, 300)
for i := range friends {
friends[i] = members{CID: uint32(i + 1), ID: uint32(i + 1000), Name: fmt.Sprintf("Friend%d", i)}
}
server := newMakeSignResponseServer(config)
server.charRepo = &mockSignCharacterRepo{
characters: []character{
{ID: 1, Name: "TestHunter", HR: 50},
},
friends: friends,
}
conn := newMockConn()
session := &Session{
logger: zap.NewNop(),
server: server,
rawConn: conn,
client: PC100,
}
defer func() {
if r := recover(); r != nil {
panicStr := fmt.Sprintf("%v", r)
if strings.Contains(panicStr, "index out of range") {
t.Errorf("array bounds panic: %v", r)
}
}
}()
result := session.makeSignResponse(1)
if len(result) == 0 {
t.Error("makeSignResponse() returned empty result")
}
}
func TestMakeSignResponse_GuildmatesOverflow(t *testing.T) {
config := &cfg.Config{
DebugOptions: cfg.DebugOptions{
CapLink: cfg.CapLinkOptions{
Values: []uint16{0, 0, 0, 0, 0},
},
},
GameplayOptions: cfg.GameplayOptions{
MezFesSoloTickets: 100,
MezFesGroupTickets: 100,
},
}
guildmates := make([]members, 260)
for i := range guildmates {
guildmates[i] = members{CID: uint32(i + 1), ID: uint32(i + 1000), Name: fmt.Sprintf("Mate%d", i)}
}
server := newMakeSignResponseServer(config)
server.charRepo = &mockSignCharacterRepo{
characters: []character{
{ID: 1, Name: "TestHunter", HR: 50},
},
guildmates: guildmates,
}
server.userRepo = &mockSignUserRepo{
returnExpiry: time.Now().Add(time.Hour * 24 * 30),
lastLogin: time.Now(),
}
conn := newMockConn()
session := &Session{
logger: zap.NewNop(),
server: server,
rawConn: conn,
client: PC100,
}
defer func() {
if r := recover(); r != nil {
panicStr := fmt.Sprintf("%v", r)
if strings.Contains(panicStr, "index out of range") {
t.Errorf("array bounds panic: %v", r)
}
}
}()
result := session.makeSignResponse(1)
if len(result) == 0 {
t.Error("makeSignResponse() returned empty result")
}
}