• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Aldaviva / FreshPager / 14142699615

29 Mar 2025 05:36AM UTC coverage: 52.261% (+4.0%) from 48.214%
14142699615

push

github

Aldaviva
Allow the configuration to specify the socket for multi-socket Kasa outlets. Split resource handlers into their own classes because Program.cs was getting too big.

28 of 98 branches covered (28.57%)

41 of 133 new or added lines in 4 files covered. (30.83%)

104 of 199 relevant lines covered (52.26%)

3.1 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

85.71
/FreshPager/Program.cs
1
using Bom.Squad;
2
using FreshPager;
3
using FreshPager.Data;
4
using Kasa;
5
using Microsoft.Extensions.Options;
6
using Pager.Duty;
7
using Pager.Duty.Webhooks;
8
using System.Collections.Concurrent;
9
using Options = Kasa.Options;
10

11
BomSquad.DefuseUtf8Bom();
5✔
12

13
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
5✔
14

15
builder.Host
5✔
16
    .UseWindowsService()
5✔
17
    .UseSystemd();
5✔
18

19
builder.Services
5✔
20
    .Configure<Configuration>(builder.Configuration)
5✔
21
    .AddSingleton<PagerDutyFactory>(provider => key => new PagerDuty(key) { HttpClient = provider.GetRequiredService<HttpClient>() })
×
22
    .AddSingleton(provider => {
5✔
23
        int checkCount = provider.GetRequiredService<IOptions<Configuration>>().Value.pagerDutyIntegrationKeysByFreshpingCheckId.Count;
5✔
24
        return new ConcurrentDictionary<Check, string>(Math.Min(checkCount * 2, Environment.ProcessorCount), checkCount);
5✔
25
    })
5✔
26
    .AddSingleton<KasaParameters>(provider => provider.GetRequiredService<IOptions<Configuration>>().Value is
10!
27
            { alarmLightUrl: not "<TCP URL of Kasa outlet with optional 0-indexed socket number as path, e.g. 'tcp://192.168.1.100/0'>" and { } url }
10✔
28
        && Uri.TryCreate(url, UriKind.Absolute, out Uri? alarmLightUrl) ? new KasaParameters(alarmLightUrl.Host,
10✔
29
            alarmLightUrl.Segments.ElementAtOrDefault(1) is { } socket && int.TryParse(socket.TrimEnd('/'), out int socketId) ? socketId : null) : null!)
10✔
30
    .AddSingleton<IKasaOutlet>(provider => {
5✔
31
        if (provider.GetService<KasaParameters>() is { } kasaParameters) {
5!
NEW
32
            Options kasaOptions = new() { LoggerFactory = provider.GetService<ILoggerFactory>() };
×
NEW
33
            return kasaParameters.socketId is not null
×
NEW
34
                ? new MultiSocketKasaOutlet(kasaParameters.hostname, kasaOptions)
×
NEW
35
                : new KasaOutlet(kasaParameters.hostname, kasaOptions);
×
36
        } else {
5✔
37
            return null!;
5✔
38
        }
5✔
39
    })
5✔
40
    .AddSingleton<WebhookResource>(provider => provider.GetRequiredService<IOptions<Configuration>>().Value is { pagerDutyWebhookSecrets: not ["<My PagerDuty webhook secret>"] and { } secrets }
5!
41
        ? new WebhookResource(secrets) : null!)
5✔
42
    .AddSingleton<WebResource, FreshpingResource>()
5✔
43
    .AddSingleton<WebResource, PagerDutyResource>()
5✔
44
    .AddHttpClient();
5✔
45

46
await using WebApplication webapp = builder.Build();
5✔
47

48
foreach (WebResource resource in webapp.Services.GetServices<WebResource>()) {
30✔
49
    resource.map(webapp);
10✔
50
}
51

52
await webapp.RunAsync();
5✔
53

54
internal delegate IPagerDuty PagerDutyFactory(string integrationKey);
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc