Test-BookmarkBackupTool.ps1

# =====================================================================================
# BookmarkBackupTool Module - Test Suite
# =====================================================================================
# This script validates that the module is working correctly
# Run this after installation to ensure everything is functioning properly

#Requires -Version 5.1

[CmdletBinding()]
param(
    [Parameter(Mandatory = $false)]
    [switch]$Detailed
)

$ErrorActionPreference = 'Continue'
$testResults = @()
$testCount = 0
$passCount = 0
$failCount = 0

function Write-TestResult {
    param(
        [string]$TestName,
        [bool]$Passed,
        [string]$Message = ""
    )
    
    $script:testCount++
    
    if ($Passed) {
        $script:passCount++
        Write-Host " [PASS] $TestName" -ForegroundColor Green
    } else {
        $script:failCount++
        Write-Host " [FAIL] $TestName" -ForegroundColor Red
        if ($Message) {
            Write-Host " $Message" -ForegroundColor Yellow
        }
    }
    
    $script:testResults += @{
        Name = $TestName
        Passed = $Passed
        Message = $Message
    }
}

Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "BookmarkBackupTool Module Test Suite" -ForegroundColor Cyan
Write-Host "========================================`n" -ForegroundColor Cyan

# =====================================================================================
# Test 1: Module Loading
# =====================================================================================
Write-Host "[Test 1] Module Loading Tests" -ForegroundColor Yellow

try {
    Import-Module BookmarkBackupTool -Force -ErrorAction Stop
    Write-TestResult "Module Import" $true
} catch {
    Write-TestResult "Module Import" $false $_.Exception.Message
    Write-Host "`nCRITICAL: Module cannot be loaded. Stopping tests." -ForegroundColor Red
    exit 1
}

$module = Get-Module BookmarkBackupTool
Write-TestResult "Module Loaded in Session" ($null -ne $module)

if ($module) {
    Write-TestResult "Module Version Check" ($module.Version -eq '5.0.0')
    if ($Detailed) {
        Write-Host " Module Path: $($module.Path)" -ForegroundColor Gray
        Write-Host " Module Version: $($module.Version)" -ForegroundColor Gray
    }
}

# =====================================================================================
# Test 2: Function Exports
# =====================================================================================
Write-Host "`n[Test 2] Function Export Tests" -ForegroundColor Yellow

$requiredFunctions = @(
    'Export-Bookmarks',
    'Import-Bookmarks',
    'Show-BookmarkGUI',
    'Get-HomeSharePath',
    'Test-BrowserInstalled',
    'Test-BrowserRunning',
    'Get-BrowserProfiles',
    'Backup-ExistingBookmarks',
    'New-BookmarkScheduledTask',
    'Remove-BookmarkScheduledTask',
    'Get-BookmarkConfiguration',
    'Set-BookmarkConfiguration',
    'Test-BookmarkPrerequisites'
)

foreach ($func in $requiredFunctions) {
    $exists = Get-Command $func -Module BookmarkBackupTool -ErrorAction SilentlyContinue
    Write-TestResult "Function: $func" ($null -ne $exists)
}

# =====================================================================================
# Test 3: Alias Exports
# =====================================================================================
Write-Host "`n[Test 3] Alias Export Tests" -ForegroundColor Yellow

$requiredAliases = @(
    'Export-BrowserBookmarks',
    'Import-BrowserBookmarks',
    'Backup-Bookmarks',
    'Restore-Bookmarks'
)

foreach ($alias in $requiredAliases) {
    $exists = Get-Alias $alias -ErrorAction SilentlyContinue
    Write-TestResult "Alias: $alias" ($null -ne $exists)
}

# =====================================================================================
# Test 4: Help System
# =====================================================================================
Write-Host "`n[Test 4] Help System Tests" -ForegroundColor Yellow

$helpTest = Get-Help Export-Bookmarks
Write-TestResult "Export-Bookmarks Help" ($null -ne $helpTest -and $helpTest.Synopsis)

$helpTest = Get-Help Import-Bookmarks
Write-TestResult "Import-Bookmarks Help" ($null -ne $helpTest -and $helpTest.Synopsis)

$helpTest = Get-Help Show-BookmarkGUI
Write-TestResult "Show-BookmarkGUI Help" ($null -ne $helpTest -and $helpTest.Synopsis)

# =====================================================================================
# Test 5: Configuration System
# =====================================================================================
Write-Host "`n[Test 5] Configuration System Tests" -ForegroundColor Yellow

try {
    $config = Get-BookmarkConfiguration -ErrorAction Stop
    Write-TestResult "Get Configuration" ($null -ne $config)
    
    if ($config) {
        Write-TestResult "Config Has Version" ($config.Version -eq '5.0')
        Write-TestResult "Config Has Default Browsers" ($config.DefaultBrowsers.Count -gt 0)
        Write-TestResult "Config Has Logging Setting" ($null -ne $config.LoggingEnabled)
    }
} catch {
    Write-TestResult "Get Configuration" $false $_.Exception.Message
}

# =====================================================================================
# Test 6: Utility Functions
# =====================================================================================
Write-Host "`n[Test 6] Utility Function Tests" -ForegroundColor Yellow

try {
    $path = Get-HomeSharePath -ErrorAction Stop
    Write-TestResult "Get-HomeSharePath" ($null -ne $path -and $path.Length -gt 0)
    if ($Detailed -and $path) {
        Write-Host " Detected Path: $path" -ForegroundColor Gray
    }
} catch {
    Write-TestResult "Get-HomeSharePath" $false $_.Exception.Message
}

try {
    $result = Test-BookmarkPrerequisites -ErrorAction Stop
    Write-TestResult "Test-BookmarkPrerequisites" $true
} catch {
    Write-TestResult "Test-BookmarkPrerequisites" $false $_.Exception.Message
}

# =====================================================================================
# Test 7: Browser Detection
# =====================================================================================
Write-Host "`n[Test 7] Browser Detection Tests" -ForegroundColor Yellow

$browsers = @('Chrome', 'Edge', 'Firefox')
foreach ($browser in $browsers) {
    try {
        $installed = Test-BrowserInstalled -BrowserName $browser -ErrorAction Stop
        Write-TestResult "$browser Detection" $true
        
        if ($Detailed) {
            Write-Host " $browser Installed: $installed" -ForegroundColor Gray
            if ($installed) {
                $running = Test-BrowserRunning -BrowserName $browser
                Write-Host " $browser Running: $running" -ForegroundColor Gray
            }
        }
    } catch {
        Write-TestResult "$browser Detection" $false $_.Exception.Message
    }
}

# =====================================================================================
# Test 8: Parameter Validation
# =====================================================================================
Write-Host "`n[Test 8] Parameter Validation Tests" -ForegroundColor Yellow

try {
    # Test with invalid browser (should fail gracefully)
    $params = (Get-Command Test-BrowserInstalled).Parameters['BrowserName']
    $validValues = $params.Attributes | Where-Object {$_ -is [System.Management.Automation.ValidateSetAttribute]}
    Write-TestResult "Browser Parameter Validation" ($validValues.ValidValues.Count -eq 3)
} catch {
    Write-TestResult "Browser Parameter Validation" $false $_.Exception.Message
}

try {
    # Test WhatIf support
    $cmd = Get-Command Export-Bookmarks
    $supportsWhatIf = $cmd.Parameters.ContainsKey('WhatIf')
    Write-TestResult "Export-Bookmarks WhatIf Support" $supportsWhatIf
} catch {
    Write-TestResult "Export-Bookmarks WhatIf Support" $false $_.Exception.Message
}

try {
    # Test Confirm support
    $cmd = Get-Command Import-Bookmarks
    $supportsConfirm = $cmd.Parameters.ContainsKey('Confirm')
    Write-TestResult "Import-Bookmarks Confirm Support" $supportsConfirm
} catch {
    Write-TestResult "Import-Bookmarks Confirm Support" $false $_.Exception.Message
}

# =====================================================================================
# Test 9: File System Tests (Safe)
# =====================================================================================
Write-Host "`n[Test 9] File System Tests" -ForegroundColor Yellow

$testPath = Join-Path $env:TEMP "BookmarkToolTest_$(Get-Random)"

try {
    # Test path creation
    New-Item -ItemType Directory -Path $testPath -Force | Out-Null
    Write-TestResult "Create Test Directory" (Test-Path $testPath)
    
    # Test configuration directory
    $configDir = "$env:USERPROFILE\.bookmarktool"
    if (Test-Path $configDir) {
        Write-TestResult "Configuration Directory Exists" $true
    } else {
        Write-TestResult "Configuration Directory" $false "Directory not created yet (normal for first run)"
    }
    
    # Cleanup
    if (Test-Path $testPath) {
        Remove-Item $testPath -Force -Recurse
    }
} catch {
    Write-TestResult "File System Operations" $false $_.Exception.Message
}

# =====================================================================================
# Test 10: Advanced Features
# =====================================================================================
Write-Host "`n[Test 10] Advanced Feature Tests" -ForegroundColor Yellow

try {
    # Check if GUI components are available
    Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop
    Write-TestResult "Windows Forms Available" $true
} catch {
    Write-TestResult "Windows Forms Available" $false "GUI may not work"
}

try {
    # Test scheduled task functions exist
    $taskCmd = Get-Command New-BookmarkScheduledTask -ErrorAction Stop
    Write-TestResult "Scheduled Task Functions" ($null -ne $taskCmd)
} catch {
    Write-TestResult "Scheduled Task Functions" $false $_.Exception.Message
}

# =====================================================================================
# Test Summary
# =====================================================================================
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "Test Summary" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan

$passRate = if ($testCount -gt 0) { [math]::Round(($passCount / $testCount) * 100, 1) } else { 0 }

Write-Host "Total Tests: $testCount" -ForegroundColor White
Write-Host "Passed: $passCount" -ForegroundColor Green
Write-Host "Failed: $failCount" -ForegroundColor $(if($failCount -gt 0){'Red'}else{'Gray'})
Write-Host "Pass Rate: $passRate%" -ForegroundColor $(if($passRate -ge 90){'Green'}elseif($passRate -ge 70){'Yellow'}else{'Red'})

if ($failCount -eq 0) {
    Write-Host "`n[PASS] All tests passed! Module is working correctly." -ForegroundColor Green
    Write-Host " You can now use the module with confidence." -ForegroundColor Cyan
} elseif ($failCount -le 2) {
    Write-Host "`n[WARNING] Most tests passed, but some issues detected." -ForegroundColor Yellow
    Write-Host " Module should work, but review failures above." -ForegroundColor Yellow
} else {
    Write-Host "`n[FAIL] Multiple test failures detected." -ForegroundColor Red
    Write-Host " Please review the failures and reinstall if needed." -ForegroundColor Red
}

# =====================================================================================
# Detailed Results (Optional)
# =====================================================================================
if ($Detailed) {
    Write-Host "`n========================================" -ForegroundColor Cyan
    Write-Host "Detailed Test Results" -ForegroundColor Cyan
    Write-Host "========================================`n" -ForegroundColor Cyan
    
    foreach ($result in $testResults) {
        $status = if ($result.Passed) { "[PASS]" } else { "[FAIL]" }
        $color = if ($result.Passed) { "Green" } else { "Red" }
        
        Write-Host "$status $($result.Name)" -ForegroundColor $color
        if ($result.Message) {
            Write-Host " -> $($result.Message)" -ForegroundColor Yellow
        }
    }
}

Write-Host "`n========================================`n" -ForegroundColor Cyan

# Exit with appropriate code
if ($failCount -eq 0) {
    exit 0
} else {
    exit 1
}