Your IP : 216.73.216.224


Current Path : /home/hotlineuser/mobius/cmd/mobius-hotline-server/
Upload File :
Current File : //home/hotlineuser/mobius/cmd/mobius-hotline-server/main_test.go

package main

import (
	"os"
	"path"
	"testing"

	"github.com/jhalter/mobius/internal/mobius"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestCopyDir(t *testing.T) {
	// Test using the actual embedded config directory
	dstDir := t.TempDir()

	// Execute copyDir with the embedded mobius/config directory
	err := copyDir("mobius/config", dstDir)
	require.NoError(t, err)

	// Verify some expected files exist (based on the embedded config)
	expectedFiles := []string{
		"config.yaml",
		"Agreement.txt",
		"MessageBoard.txt",
		"ThreadedNews.yaml",
		"Users/admin.yaml",
		"Users/guest.yaml",
		"banner.jpg",
	}

	for _, expectedFile := range expectedFiles {
		fullPath := path.Join(dstDir, expectedFile)
		assert.FileExists(t, fullPath, "Expected file %s to exist", expectedFile)

		// Verify file is not empty
		info, err := os.Stat(fullPath)
		require.NoError(t, err)
		assert.Greater(t, info.Size(), int64(0), "File %s should not be empty", expectedFile)
	}

	// Verify directories were created
	expectedDirs := []string{
		"Users",
		"Files",
	}

	for _, expectedDir := range expectedDirs {
		fullPath := path.Join(dstDir, expectedDir)
		info, err := os.Stat(fullPath)
		require.NoError(t, err)
		assert.True(t, info.IsDir(), "Expected %s to be a directory", expectedDir)
	}
}

func TestCopyDirNonexistentSource(t *testing.T) {
	dstDir := t.TempDir()

	err := copyDir("nonexistent/directory", dstDir)
	assert.Error(t, err)
	assert.Contains(t, err.Error(), "failed to read source directory")
}

func TestCopyDirRecursive(t *testing.T) {
	// Test the recursive functionality using embedded config
	dstDir := t.TempDir()

	err := copyDirRecursive("mobius/config", dstDir)
	require.NoError(t, err)

	// Verify nested structure is copied correctly
	nestedPath := path.Join(dstDir, "Users", "admin.yaml")
	assert.FileExists(t, nestedPath)

	// Verify nested Files directory
	filesDir := path.Join(dstDir, "Files")
	info, err := os.Stat(filesDir)
	require.NoError(t, err)
	assert.True(t, info.IsDir())
}

func TestCopyFile(t *testing.T) {
	dstDir := t.TempDir()
	dstFile := path.Join(dstDir, "copied.yaml")

	// Copy a single file from embedded config
	err := copyFile("mobius/config/config.yaml", dstFile)
	require.NoError(t, err)

	// Verify file was copied correctly
	assert.FileExists(t, dstFile)

	// Verify file is not empty
	info, err := os.Stat(dstFile)
	require.NoError(t, err)
	assert.Greater(t, info.Size(), int64(0))
}

func TestCopyFileErrors(t *testing.T) {
	t.Run("source file does not exist", func(t *testing.T) {
		dstDir := t.TempDir()
		err := copyFile("nonexistent.txt", path.Join(dstDir, "dest.txt"))
		assert.Error(t, err)
		assert.Contains(t, err.Error(), "failed to open source file")
	})

	t.Run("destination directory does not exist", func(t *testing.T) {
		err := copyFile("mobius/config/config.yaml", "/nonexistent/directory/dest.txt")
		assert.Error(t, err)
		assert.Contains(t, err.Error(), "failed to create destination file")
	})
}

func TestCopyDirPermissions(t *testing.T) {
	dstDir := t.TempDir()

	err := copyDir("mobius/config", dstDir)
	require.NoError(t, err)

	// Check directory permissions
	info, err := os.Stat(path.Join(dstDir, "Users"))
	require.NoError(t, err)
	assert.True(t, info.IsDir())

	// Check that directory has reasonable permissions (at least readable/executable)
	mode := info.Mode()
	assert.True(t, mode&0400 != 0, "Directory should be readable")
	assert.True(t, mode&0100 != 0, "Directory should be executable")
}

func TestFindConfigPath(t *testing.T) {
	// Test function behavior by checking it returns one of the expected paths or fallback
	t.Run("returns valid path", func(t *testing.T) {
		result := findConfigPath()

		// Should return either one of the search paths that exists, or "config" fallback
		validPaths := append([]string{"config"}, mobius.ConfigSearchOrder...)

		found := false
		for _, validPath := range validPaths {
			if result == validPath {
				found = true
				break
			}
		}

		assert.True(t, found, "findConfigPath should return one of the valid paths or fallback, got: %s", result)
	})

	// Test directory vs file validation
	t.Run("validates directory vs file", func(t *testing.T) {
		// This test verifies the function logic but can't control system directories
		// The function correctly validates that only directories are returned
		result := findConfigPath()

		// Verify result is an actual directory if it exists
		if result != "config" {
			info, err := os.Stat(result)
			require.NoError(t, err, "Returned path should exist")
			assert.True(t, info.IsDir(), "Returned path should be a directory")
		}
	})

	// Test with existing directory
	t.Run("finds existing directory", func(t *testing.T) {
		tmpDir := t.TempDir()
		originalDir, err := os.Getwd()
		require.NoError(t, err)
		defer func() { _ = os.Chdir(originalDir) }()

		err = os.Chdir(tmpDir)
		require.NoError(t, err)

		// Create a config directory
		err = os.Mkdir("config", 0755)
		require.NoError(t, err)

		result := findConfigPath()
		assert.Equal(t, "config", result)
	})
}