< Summary

Information
Class: Pomodoro.Web.Services.ServiceInitializationService
Assembly: Pomodoro.Web
File(s): /home/runner/work/Pomodoro/Pomodoro/src/Pomodoro.Web/Services/ServiceInitializationService.cs
Line coverage
100%
Covered lines: 42
Uncovered lines: 0
Coverable lines: 42
Total lines: 83
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
IsTestEnvironment()100%22100%
InitializeServicesAsync()100%11100%

File(s)

/home/runner/work/Pomodoro/Pomodoro/src/Pomodoro.Web/Services/ServiceInitializationService.cs

#LineLine coverage
 1using Microsoft.Extensions.Logging;
 2using Pomodoro.Web.Services;
 3
 4namespace Pomodoro.Web.Services;
 5
 6/// <summary>
 7/// Service for initializing application services.
 8/// Extracted from Program.cs for testability.
 9/// </summary>
 10public interface IServiceInitializationService
 11{
 12    Task InitializeServicesAsync(IServiceProvider serviceProvider);
 13}
 14
 15public class ServiceInitializationService : IServiceInitializationService
 16{
 17    private readonly ILogger<ServiceInitializationService> _logger;
 18
 1919    public ServiceInitializationService(ILogger<ServiceInitializationService> logger)
 1920    {
 1921        _logger = logger;
 1922    }
 23
 24    // Made public virtual for testing purposes
 25    public virtual bool IsTestEnvironment()
 426    {
 27        // Check if running in Playwright/test environment
 28        // Playwright runs in headless mode which may not support IndexedDB properly
 429        var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
 430        return environment == "Development" && !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("PLAYWRIGHT_TEST
 431    }
 32
 33    public async Task InitializeServicesAsync(IServiceProvider serviceProvider)
 1234    {
 35        // Initialize IndexedDB first (required by other services)
 36        // Make it optional - don't fail if it times out (may happen in headless browsers)
 37        try
 1238        {
 1239            var indexedDb = serviceProvider.GetRequiredService<IIndexedDbService>();
 1240            await indexedDb.InitializeAsync();
 1141            _logger.LogInformation("IndexedDB initialized");
 1142        }
 143        catch (Exception ex)
 144        {
 145            _logger.LogWarning(ex, "IndexedDB initialization failed - continuing without IndexedDB");
 146        }
 47
 48        // Get service references for parallel initialization
 1249        var taskService = serviceProvider.GetRequiredService<ITaskService>();
 1250        var activityService = serviceProvider.GetRequiredService<IActivityService>();
 1251        var timerService = serviceProvider.GetRequiredService<ITimerService>();
 1252        var keyboardShortcutService = serviceProvider.GetRequiredService<IKeyboardShortcutService>();
 53
 54        // Initialize independent services in parallel for faster startup
 55        // TaskService and ActivityService don't depend on each other
 56        // TimerService loads settings independently
 1257        var initTasks = new List<Task>
 1258        {
 1259            taskService.InitializeAsync(),
 1260            activityService.InitializeAsync(),
 1261            timerService.InitializeAsync(),
 1262            keyboardShortcutService.InitializeAsync()
 1263        };
 64
 65        // Wait for all services to complete
 1266        await Task.WhenAll(initTasks);
 1267        _logger.LogInformation("TaskService, ActivityService, TimerService, and KeyboardShortcutService initialized");
 68
 69        // Initialize ConsentService to wire up event handlers
 70        try
 1271        {
 1272            var consentService = serviceProvider.GetRequiredService<IConsentService>();
 1273            consentService.Initialize();
 1174            _logger.LogInformation("ConsentService initialized");
 1175        }
 176        catch (Exception ex)
 177        {
 178            _logger.LogWarning(ex, "ConsentService initialization failed - continuing");
 179        }
 80
 1281        _logger.LogInformation("All services initialized successfully");
 1282    }
 83}