70 lines
2.2 KiB
Swift
70 lines
2.2 KiB
Swift
import Foundation
|
|
import Testing
|
|
@testable import CodexBarCore
|
|
|
|
struct GrokBillingResponseTests {
|
|
@Test
|
|
func `decodes full BillingConfigResponse and computes percent`() throws {
|
|
let json = #"""
|
|
{
|
|
"billingCycle": {
|
|
"billingPeriodStart": "2026-05-01T00:00:00Z",
|
|
"billingPeriodEnd": "2026-06-01T00:00:00Z"
|
|
},
|
|
"monthlyLimit": { "val": 99900 },
|
|
"onDemandCap": { "val": 0 },
|
|
"on_demand_enabled": false,
|
|
"disabledByConfig": false,
|
|
"usage": {
|
|
"includedUsed": { "val": 49950 },
|
|
"onDemandUsed": { "val": 0 },
|
|
"totalUsed": { "val": 49950 }
|
|
}
|
|
}
|
|
"""#
|
|
let data = Data(json.utf8)
|
|
let response = try JSONDecoder().decode(GrokBillingResponse.self, from: data)
|
|
|
|
#expect(response.monthlyLimit?.val == 99900)
|
|
#expect(response.usage?.totalUsed?.val == 49950)
|
|
#expect(response.monthlyUsedPercent == 50.0)
|
|
#expect(response.billingPeriodEndDate != nil)
|
|
#expect(response.billingPeriodMinutes == 31 * 24 * 60)
|
|
}
|
|
|
|
@Test
|
|
func `monthlyUsedPercent returns nil when limit missing`() throws {
|
|
let json = #"""
|
|
{
|
|
"usage": { "totalUsed": { "val": 100 } }
|
|
}
|
|
"""#
|
|
let data = Data(json.utf8)
|
|
let response = try JSONDecoder().decode(GrokBillingResponse.self, from: data)
|
|
#expect(response.monthlyUsedPercent == nil)
|
|
}
|
|
|
|
@Test
|
|
func `monthlyUsedPercent clamps over-100 usage`() throws {
|
|
let json = #"""
|
|
{
|
|
"monthlyLimit": { "val": 1000 },
|
|
"usage": { "totalUsed": { "val": 5000 } }
|
|
}
|
|
"""#
|
|
let data = Data(json.utf8)
|
|
let response = try JSONDecoder().decode(GrokBillingResponse.self, from: data)
|
|
#expect(response.monthlyUsedPercent == 100.0)
|
|
}
|
|
|
|
@Test
|
|
func `handles missing optional fields gracefully`() throws {
|
|
let json = #"{}"#
|
|
let data = Data(json.utf8)
|
|
let response = try JSONDecoder().decode(GrokBillingResponse.self, from: data)
|
|
#expect(response.billingCycle == nil)
|
|
#expect(response.monthlyLimit == nil)
|
|
#expect(response.monthlyUsedPercent == nil)
|
|
}
|
|
}
|