< Summary

Information
Class: UIBlazor.Services.Settings.ProfileService
Assembly: UIBlazor
File(s): /home/runner/work/InvAit/InvAit/UIBlazor/Services/Settings/ProfileService.cs
Tag: 71_26091983037
Line coverage
84%
Covered lines: 49
Uncovered lines: 9
Coverable lines: 58
Total lines: 131
Line coverage: 84.4%
Branch coverage
73%
Covered branches: 22
Total branches: 30
Branch coverage: 73.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_ActiveProfile()100%11100%
AfterInitAsync()100%44100%
UpdateActiveProfile()100%22100%
OnPropertyChanged(...)80%1010100%
NotifySkipSsl(...)100%11100%
DeleteProfileAsync()66.66%6680%
ActivateProfileAsync()75%4485.71%
ResetAsync()50%2292.3%
Dispose()0%620%

File(s)

/home/runner/work/InvAit/InvAit/UIBlazor/Services/Settings/ProfileService.cs

#LineLine coverage
 1using System.ComponentModel;
 2using Microsoft.JSInterop;
 3
 4namespace UIBlazor.Services.Settings;
 5
 6public class ProfileService(ILocalStorageService localStorage, ILogger<ProfileService> logger, IJSRuntime jSRuntime)
 77    : BaseSettingsProvider<ProfileOptions>(localStorage, logger, "ProfileSettings"), IProfileManager
 8{
 309    public ConnectionProfile ActiveProfile { get; private set; } = null!;
 10
 11    protected override async Task AfterInitAsync()
 12    {
 613        Current.PropertyChanged += OnPropertyChanged;
 14
 615        if (Current.Profiles.Count == 0)
 16        {
 117            await ResetAsync();
 18        }
 19
 2620        foreach (var profile in Current.Profiles)
 21        {
 722            profile.PropertyChanged += OnPropertyChanged;
 23        }
 24
 625        UpdateActiveProfile();
 626    }
 27
 28    private void UpdateActiveProfile()
 29    {
 1730        ActiveProfile = Current.Profiles.FirstOrDefault(p => p.Id == Current.ActiveProfileId) ?? Current.Profiles.First(
 831        NotifySkipSsl(ActiveProfile.SkipSSL);
 832    }
 33
 34    private void OnPropertyChanged(object? sender, PropertyChangedEventArgs e)
 35    {
 436        if (e.PropertyName == nameof(ProfileOptions.ActiveProfileId))
 37        {
 238            UpdateActiveProfile();
 39        }
 240        else if (e.PropertyName == nameof(ConnectionProfile.SkipSSL) && (sender as ConnectionProfile)?.Id == Current.Act
 41        {
 142            NotifySkipSsl(ActiveProfile.SkipSSL);
 43        }
 44
 445        PropertyChanged?.Invoke(sender, e);
 446        Debouncer.Trigger();
 447    }
 48
 49    public event PropertyChangedEventHandler? PropertyChanged;
 50
 51    private void NotifySkipSsl(bool skipSsl)
 52    {
 1053        _ = jSRuntime.InvokeAsync<string>("postVsMessage", new VsRequest { Action = BasicEnum.SkipSSL, Payload = skipSsl
 1054    }
 55
 56    public async Task DeleteProfileAsync(string profileId)
 57    {
 258        if (Current.Profiles.Count < 2)
 59        {
 160            return; // нельзя удалять единственный профиль.
 61        }
 62
 363        var profile = Current.Profiles.FirstOrDefault(p => p.Id == profileId);
 164        if (profile == null)
 065            return;
 66
 167        profile.PropertyChanged -= OnPropertyChanged;
 168        Current.Profiles.Remove(profile);
 69
 70        // актуализация активного профиля
 171        if (profileId == Current.ActiveProfileId)
 72        {
 073            await ActivateProfileAsync(Current.Profiles.First().Id, saveImediatly: true);
 74        }
 75        else
 76        {
 177            Debouncer.Trigger();
 78        }
 279    }
 80
 81    public async Task ActivateProfileAsync(string profileId, bool saveImediatly = false)
 82    {
 283        var profile = Current.Profiles.FirstOrDefault(p => p.Id == profileId);
 184        if (profile != null)
 85        {
 186            Current.ActiveProfileId = profileId;
 87
 188            NotifySkipSsl(profile.SkipSSL);
 89
 190            if (!saveImediatly)
 91            {
 092                Debouncer.Trigger();
 93            }
 94            else
 95            {
 196                await SaveAsync();
 97            }
 98        }
 199    }
 100
 101    public override async Task ResetAsync()
 102    {
 4103        foreach (var p in Current.Profiles)
 104        {
 0105            p.PropertyChanged -= OnPropertyChanged;
 106        }
 107
 2108        var defaultProfile = new ConnectionProfile
 2109        {
 2110            Name = "default",
 2111            Endpoint = "https://api.openai.com"
 2112        };
 113
 2114        defaultProfile.PropertyChanged += OnPropertyChanged;
 2115        Current.Profiles = [defaultProfile];
 2116        Current.ActiveProfileId = defaultProfile.Id;
 2117        ActiveProfile = defaultProfile;
 118
 2119        await SaveAsync();
 2120    }
 121
 122    public override void Dispose()
 123    {
 0124        base.Dispose();
 0125        Current.PropertyChanged -= OnPropertyChanged;
 0126        foreach (var p in Current.Profiles)
 127        {
 0128            p.PropertyChanged -= OnPropertyChanged;
 129        }
 0130    }
 131}