2025-07-24 07:39:43 +02:00
|
|
|
package maintenance
|
2025-01-18 20:59:35 +01:00
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bamort/character"
|
2025-07-24 07:39:43 +02:00
|
|
|
"bamort/database"
|
2025-01-18 20:59:35 +01:00
|
|
|
"bamort/gsmaster"
|
2025-07-27 23:13:04 +02:00
|
|
|
"bamort/models"
|
2025-01-18 20:59:35 +01:00
|
|
|
"bamort/router"
|
|
|
|
|
"bamort/user"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/http/httptest"
|
2025-08-30 08:59:45 +02:00
|
|
|
"path/filepath"
|
2025-01-18 20:59:35 +01:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2025-08-30 08:59:45 +02:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
"gorm.io/driver/sqlite"
|
|
|
|
|
"gorm.io/gorm"
|
2025-01-18 20:59:35 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestMaintSetupCheck(t *testing.T) {
|
2025-07-24 07:39:43 +02:00
|
|
|
// Setup proper test database
|
|
|
|
|
database.SetupTestDB(true)
|
|
|
|
|
|
|
|
|
|
// Create a proper HTTP test context
|
|
|
|
|
gin.SetMode(gin.TestMode)
|
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
c, _ := gin.CreateTestContext(w)
|
|
|
|
|
|
|
|
|
|
// Call the handler
|
|
|
|
|
SetupCheck(c)
|
|
|
|
|
|
|
|
|
|
// Check the response
|
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
|
|
|
|
|
|
// Parse the JSON response
|
|
|
|
|
var response map[string]string
|
|
|
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, "Setup Check OK", response["message"])
|
2025-01-18 20:59:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestGetMasterData(t *testing.T) {
|
2026-01-02 12:07:28 +01:00
|
|
|
// Ensure fresh database connection
|
|
|
|
|
database.DB = nil
|
|
|
|
|
database.SetupTestDB()
|
2025-01-18 20:59:35 +01:00
|
|
|
// Initialize a Gin router
|
|
|
|
|
r := gin.Default()
|
|
|
|
|
router.SetupGin(r)
|
|
|
|
|
|
|
|
|
|
// Routes
|
|
|
|
|
protected := router.BaseRouterGrp(r)
|
2025-07-24 07:39:43 +02:00
|
|
|
character.RegisterRoutes(protected)
|
|
|
|
|
gsmaster.RegisterRoutes(protected)
|
|
|
|
|
protected.GET("/test", func(c *gin.Context) {
|
2025-01-18 20:59:35 +01:00
|
|
|
c.JSON(http.StatusOK, gin.H{"status": "Test OK"})
|
|
|
|
|
})
|
|
|
|
|
u := user.User{}
|
2026-01-02 12:07:28 +01:00
|
|
|
err := u.FirstId(1)
|
|
|
|
|
require.NoError(t, err, "Failed to load user with ID 1")
|
|
|
|
|
require.Equal(t, "admin", u.Role, "User 1 should be admin")
|
2025-01-18 20:59:35 +01:00
|
|
|
|
|
|
|
|
// Create a test HTTP request
|
|
|
|
|
req, _ := http.NewRequest("GET", "/api/maintenance", nil)
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
token := user.GenerateToken(&u)
|
|
|
|
|
req.Header.Set("Authorization", "Bearer "+token)
|
|
|
|
|
|
|
|
|
|
// Create a response recorder to capture the handler's response
|
|
|
|
|
respRecorder := httptest.NewRecorder()
|
|
|
|
|
|
|
|
|
|
// Perform the test request
|
|
|
|
|
r.ServeHTTP(respRecorder, req)
|
|
|
|
|
|
|
|
|
|
// Assert the response status code
|
|
|
|
|
assert.Equal(t, http.StatusOK, respRecorder.Code)
|
|
|
|
|
|
|
|
|
|
// Assert the response body
|
|
|
|
|
type dtaStruct struct {
|
2025-07-27 23:36:47 +02:00
|
|
|
Skills []models.Skill `json:"skills"`
|
|
|
|
|
Weaponskills []models.WeaponSkill `json:"weaponskills"`
|
2025-07-27 23:50:19 +02:00
|
|
|
Spell []models.Spell `json:"spells"`
|
2025-07-28 18:56:45 +02:00
|
|
|
Equipment []models.Equipment `json:"equipment"`
|
|
|
|
|
Weapons []models.Weapon `json:"weapons"`
|
2025-01-18 20:59:35 +01:00
|
|
|
}
|
|
|
|
|
var dta dtaStruct
|
2026-01-02 12:07:28 +01:00
|
|
|
errUnmarshal := json.Unmarshal(respRecorder.Body.Bytes(), &dta)
|
|
|
|
|
assert.NoError(t, errUnmarshal)
|
2025-01-18 20:59:35 +01:00
|
|
|
}
|
2025-07-24 07:39:43 +02:00
|
|
|
|
2025-01-18 20:59:35 +01:00
|
|
|
func TestGetMDSkillCategories(t *testing.T) {
|
2025-07-29 10:51:03 +02:00
|
|
|
database.SetupTestDB() //(false)
|
2025-07-28 22:27:33 +02:00
|
|
|
|
2025-07-27 23:13:04 +02:00
|
|
|
ski := models.Skill{}
|
2025-01-18 20:59:35 +01:00
|
|
|
categories, err := ski.GetSkillCategories()
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.LessOrEqual(t, 1, len(categories))
|
2025-07-24 07:39:43 +02:00
|
|
|
assert.Equal(t, "Wissen", categories[0])
|
2025-01-18 20:59:35 +01:00
|
|
|
}
|
2025-07-24 07:39:43 +02:00
|
|
|
|
2025-01-18 20:59:35 +01:00
|
|
|
func TestGetMDSkills(t *testing.T) {
|
2025-07-29 10:51:03 +02:00
|
|
|
database.SetupTestDB() //(false)
|
2025-01-18 20:59:35 +01:00
|
|
|
// Initialize a Gin router
|
|
|
|
|
r := gin.Default()
|
|
|
|
|
router.SetupGin(r)
|
|
|
|
|
|
|
|
|
|
// Routes
|
|
|
|
|
protected := router.BaseRouterGrp(r)
|
2025-07-24 07:39:43 +02:00
|
|
|
|
2025-01-18 20:59:35 +01:00
|
|
|
// Character routes
|
2025-07-24 07:39:43 +02:00
|
|
|
character.RegisterRoutes(protected)
|
|
|
|
|
gsmaster.RegisterRoutes(protected)
|
|
|
|
|
protected.GET("/test", func(c *gin.Context) {
|
2025-01-18 20:59:35 +01:00
|
|
|
c.JSON(http.StatusOK, gin.H{"status": "Test OK"})
|
|
|
|
|
})
|
2025-01-18 20:59:35 +01:00
|
|
|
u := user.User{}
|
|
|
|
|
u.FirstId(1)
|
2025-01-18 20:59:35 +01:00
|
|
|
|
|
|
|
|
// Create a test HTTP request
|
2025-07-24 07:39:43 +02:00
|
|
|
req, _ := http.NewRequest("GET", "/api/characters/20", nil)
|
2025-01-18 20:59:35 +01:00
|
|
|
//req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
//req.Header.Set("Authorization", "Bearer ${token}")
|
|
|
|
|
req.Header.Set("Authorization", "Bearer dc7a780.1:bba7f4daabda117f2a2c14263")
|
|
|
|
|
|
|
|
|
|
// Create a response recorder to capture the handler's response
|
|
|
|
|
respRecorder := httptest.NewRecorder()
|
|
|
|
|
|
|
|
|
|
// Perform the test request
|
|
|
|
|
r.ServeHTTP(respRecorder, req)
|
|
|
|
|
|
|
|
|
|
// Assert the response status code
|
|
|
|
|
assert.Equal(t, http.StatusOK, respRecorder.Code)
|
|
|
|
|
|
|
|
|
|
// Assert the response body
|
2025-07-28 21:35:29 +02:00
|
|
|
var listOfCharacter *models.Char
|
2025-01-18 20:59:35 +01:00
|
|
|
err := json.Unmarshal(respRecorder.Body.Bytes(), &listOfCharacter)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, "Harsk Hammerhuter, Zen", listOfCharacter.Name)
|
|
|
|
|
assert.Equal(t, "Zwerg", listOfCharacter.Rasse)
|
2025-07-24 07:39:43 +02:00
|
|
|
assert.Equal(t, 20, int(listOfCharacter.ID)) // Check the simulated ID
|
2025-01-18 20:59:35 +01:00
|
|
|
assert.Equal(t, "Krieger", listOfCharacter.Typ)
|
|
|
|
|
assert.Equal(t, 3, listOfCharacter.Grad)
|
|
|
|
|
//assert.Equal(t, "test", listOfCharacter.Owner)
|
|
|
|
|
//assert.Equal(t, false, listOfCharacter.Public)
|
|
|
|
|
|
|
|
|
|
}
|
2025-08-30 08:59:45 +02:00
|
|
|
|
|
|
|
|
func TestMaintMakeTestdataFromLive(t *testing.T) {
|
|
|
|
|
// Setup proper test database
|
|
|
|
|
database.SetupTestDB(true)
|
|
|
|
|
|
|
|
|
|
// Create a proper HTTP test context
|
|
|
|
|
gin.SetMode(gin.TestMode)
|
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
c, _ := gin.CreateTestContext(w)
|
|
|
|
|
|
|
|
|
|
// Call the handler
|
|
|
|
|
MakeTestdataFromLive(c)
|
|
|
|
|
|
|
|
|
|
// Check the response
|
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
|
|
|
|
|
|
// Parse the JSON response
|
|
|
|
|
var response map[string]interface{}
|
|
|
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, "Live database copied to file successfully", response["message"])
|
|
|
|
|
assert.Contains(t, response, "test_data_file")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestMaintReconnectDataBase(t *testing.T) {
|
|
|
|
|
// Create a proper HTTP test context
|
|
|
|
|
gin.SetMode(gin.TestMode)
|
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
c, _ := gin.CreateTestContext(w)
|
|
|
|
|
|
|
|
|
|
// Call the handler
|
|
|
|
|
ReconnectDataBase(c)
|
|
|
|
|
|
|
|
|
|
// Check the response
|
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
|
|
|
|
|
|
// Parse the JSON response
|
|
|
|
|
var response map[string]string
|
|
|
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, "Database reconnected successfully", response["message"])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestMaintReloadENV(t *testing.T) {
|
|
|
|
|
// Create a proper HTTP test context
|
|
|
|
|
gin.SetMode(gin.TestMode)
|
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
c, _ := gin.CreateTestContext(w)
|
|
|
|
|
|
|
|
|
|
// Call the handler
|
|
|
|
|
ReloadENV(c)
|
|
|
|
|
|
|
|
|
|
// Check the response
|
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
|
|
|
|
|
|
// Parse the JSON response
|
|
|
|
|
var response map[string]string
|
|
|
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, "Environment variables reloaded successfully", response["message"])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestMaintLoadPredefinedTestData(t *testing.T) {
|
|
|
|
|
// Setup proper test database
|
|
|
|
|
database.SetupTestDB(true)
|
|
|
|
|
|
|
|
|
|
// Create a proper HTTP test context
|
|
|
|
|
gin.SetMode(gin.TestMode)
|
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
c, _ := gin.CreateTestContext(w)
|
|
|
|
|
|
|
|
|
|
// Call the handler
|
|
|
|
|
LoadPredefinedTestData(c)
|
|
|
|
|
|
|
|
|
|
// The function should always attempt to load data, but may return different status codes
|
|
|
|
|
// based on whether the predefined test data file exists and is accessible
|
|
|
|
|
if w.Code == http.StatusOK {
|
|
|
|
|
// Parse the JSON response for success case
|
|
|
|
|
var response map[string]interface{}
|
|
|
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, "Predefined test data loaded successfully into in-memory database", response["message"])
|
|
|
|
|
assert.Contains(t, response, "test_data_file")
|
|
|
|
|
assert.Contains(t, response, "statistics")
|
|
|
|
|
} else {
|
|
|
|
|
// Check that it fails gracefully if no test data file exists or other issues
|
|
|
|
|
// Could be 404 (file not found), 500 (internal server error), etc.
|
|
|
|
|
assert.True(t, w.Code >= 400, "Should return an error status code when predefined data is not available")
|
2025-08-30 08:59:45 +02:00
|
|
|
|
2025-08-30 08:59:45 +02:00
|
|
|
// Verify error response structure
|
|
|
|
|
var response map[string]interface{}
|
|
|
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
|
|
|
if err == nil {
|
|
|
|
|
// If we can parse JSON, check for error field
|
|
|
|
|
assert.Contains(t, response, "error")
|
|
|
|
|
}
|
|
|
|
|
// If we can't parse JSON, that's also acceptable for some error cases
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLoadPredefinedTestDataFromFile(t *testing.T) {
|
|
|
|
|
// Create a temporary test database file
|
|
|
|
|
tempDir := t.TempDir()
|
|
|
|
|
testDataFile := filepath.Join(tempDir, "test_data.db")
|
|
|
|
|
|
|
|
|
|
// Create a simple test database with some data
|
|
|
|
|
sourceDB, err := gorm.Open(sqlite.Open(testDataFile), &gorm.Config{})
|
|
|
|
|
require.NoError(t, err, "Should create test database file")
|
|
|
|
|
|
|
|
|
|
// Migrate basic structures
|
|
|
|
|
err = sourceDB.AutoMigrate(&user.User{})
|
|
|
|
|
require.NoError(t, err, "Should migrate structures")
|
|
|
|
|
|
|
|
|
|
// Add test data
|
|
|
|
|
testUser := &user.User{
|
|
|
|
|
UserID: 1,
|
|
|
|
|
Username: "testuser",
|
|
|
|
|
Email: "test@example.com",
|
|
|
|
|
PasswordHash: "hash",
|
|
|
|
|
}
|
|
|
|
|
err = sourceDB.Create(testUser).Error
|
|
|
|
|
require.NoError(t, err, "Should create test user")
|
|
|
|
|
|
|
|
|
|
// Close the source database
|
|
|
|
|
if sqlDB, err := sourceDB.DB(); err == nil {
|
|
|
|
|
sqlDB.Close()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create target in-memory database
|
|
|
|
|
targetDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
|
|
|
|
require.NoError(t, err, "Should create target database")
|
|
|
|
|
defer func() {
|
|
|
|
|
if sqlDB, err := targetDB.DB(); err == nil {
|
|
|
|
|
sqlDB.Close()
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
// Test the function
|
|
|
|
|
err = LoadPredefinedTestDataFromFile(targetDB, testDataFile)
|
|
|
|
|
assert.NoError(t, err, "LoadPredefinedTestDataFromFile should succeed")
|
|
|
|
|
|
|
|
|
|
// Verify data was loaded
|
|
|
|
|
var userCount int64
|
|
|
|
|
err = targetDB.Model(&user.User{}).Count(&userCount).Error
|
|
|
|
|
assert.NoError(t, err, "Should be able to count users")
|
|
|
|
|
assert.Equal(t, int64(1), userCount, "Should have loaded the test user")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestMaintTransferSQLiteToMariaDB(t *testing.T) {
|
|
|
|
|
// Skip this test if we don't have MariaDB available
|
|
|
|
|
// This test would typically be an integration test
|
|
|
|
|
t.Skip("Skipping TransferSQLiteToMariaDB test - requires MariaDB setup")
|
|
|
|
|
|
|
|
|
|
// Note: This test would need:
|
|
|
|
|
// 1. A real MariaDB instance running
|
|
|
|
|
// 2. Proper test data setup in SQLite source
|
|
|
|
|
// 3. Verification of data transfer
|
|
|
|
|
//
|
|
|
|
|
// For unit testing, this would be better tested by testing the
|
|
|
|
|
// individual components like copySQLiteToMariaDB function separately
|
|
|
|
|
}
|