an atproto pds written in F# (.NET 9) 馃
pds
fsharp
giraffe
dotnet
atproto
1module PDSharp.Tests.Health
2
3open System
4open Xunit
5open PDSharp.Core.Health
6
7[<Fact>]
8let ``getDiskUsage returns disk info for valid path`` () =
9 let result = getDiskUsage "."
10
11 match result with
12 | Some usage ->
13 Assert.True(usage.TotalBytes > 0L)
14 Assert.True(usage.FreeBytes >= 0L)
15 Assert.True(usage.UsedBytes >= 0L)
16 Assert.True(usage.UsedPercent >= 0.0 && usage.UsedPercent <= 100.0)
17 | None -> Assert.True(true)
18
19[<Fact>]
20let ``getDiskUsage UsedPercent is calculated correctly`` () =
21 let result = getDiskUsage "."
22
23 match result with
24 | Some usage ->
25 let expectedUsed = usage.TotalBytes - usage.FreeBytes
26 Assert.Equal(expectedUsed, usage.UsedBytes)
27 let expectedPercent = float usage.UsedBytes / float usage.TotalBytes * 100.0
28 Assert.True(abs (usage.UsedPercent - expectedPercent) < 0.1)
29 | None -> Assert.True(true)
30
31[<Fact>]
32let ``getDiskUsage IsCritical is true when usage > 90 percent`` () =
33 let result = getDiskUsage "."
34
35 match result with
36 | Some usage -> Assert.Equal(usage.UsedPercent >= 90.0, usage.IsCritical)
37 | None -> Assert.True(true)
38
39[<Fact>]
40let ``checkDatabaseHealth returns healthy for existing file`` () =
41 let tempPath = System.IO.Path.GetTempFileName()
42
43 try
44 let connStr = $"Data Source={tempPath}"
45 let result = checkDatabaseHealth connStr
46 Assert.True result.IsHealthy
47 Assert.True result.Message.IsNone
48 finally
49 System.IO.File.Delete tempPath
50
51[<Fact>]
52let ``checkDatabaseHealth returns unhealthy for missing file`` () =
53 let connStr = "Data Source=/nonexistent/path/to/database.db"
54 let result = checkDatabaseHealth connStr
55 Assert.False result.IsHealthy
56 Assert.True result.Message.IsSome
57
58[<Fact>]
59let ``checkDatabaseHealth handles invalid connection string`` () =
60 let connStr = "invalid"
61 let result = checkDatabaseHealth connStr
62 Assert.False result.IsHealthy
63 Assert.True result.Message.IsSome
64
65[<Fact>]
66let ``getBackupStatus returns stale when no backup`` () =
67 let result = getBackupStatus None
68 Assert.True result.IsStale
69 Assert.True result.LastBackupTime.IsNone
70 Assert.True result.BackupAgeHours.IsNone
71
72[<Fact>]
73let ``getBackupStatus returns not stale for recent backup`` () =
74 let recentTime = DateTimeOffset.UtcNow.AddHours(-1.0)
75 let result = getBackupStatus (Some recentTime)
76 Assert.False result.IsStale
77 Assert.True result.LastBackupTime.IsSome
78 Assert.True result.BackupAgeHours.IsSome
79 Assert.True(result.BackupAgeHours.Value < 24.0)
80
81[<Fact>]
82let ``getBackupStatus returns stale for old backup`` () =
83 let oldTime = DateTimeOffset.UtcNow.AddHours(-25.0)
84 let result = getBackupStatus (Some oldTime)
85 Assert.True result.IsStale
86 Assert.True(result.BackupAgeHours.Value > 24.0)
87
88[<Fact>]
89let ``HealthState tracks uptime correctly`` () =
90 let state = HealthState()
91 state.SetStartTime(DateTimeOffset.UtcNow.AddSeconds(-10.0))
92 let uptime = state.GetUptime()
93 Assert.True(uptime >= 9L && uptime <= 12L)
94
95[<Fact>]
96let ``HealthState records backup time`` () =
97 let state = HealthState()
98 Assert.True state.LastBackupTime.IsNone
99 state.RecordBackup()
100 Assert.True state.LastBackupTime.IsSome
101
102[<Fact>]
103let ``buildHealthStatus constructs complete status`` () =
104 let state = HealthState()
105 let tempPath = System.IO.Path.GetTempFileName()
106
107 try
108 let connStr = $"Data Source={tempPath}"
109 let status = buildHealthStatus "1.0.0" state connStr "."
110
111 Assert.Equal("1.0.0", status.Version)
112 Assert.True(status.UptimeSeconds >= 0L)
113 Assert.True status.DatabaseStatus.IsHealthy
114 Assert.True status.BackupStatus.IsSome
115 finally
116 System.IO.File.Delete tempPath