import Foundationimport Testing@testable import CodexBarCore struct DeepSeekUsageCostParserTests { // Fixtures use date 2026-05-26 private let fixtureNow = Date(timeIntervalSince1970: 1_779_796_800) // 2026-05-26 12:00:00 UTC private let fixtureCalendar: Calendar = { var cal = Calendar.current cal.timeZone = TimeZone(identifier: "UTC") ?? .current return cal }() // MARK: - Amount Parser Tests @Test func `amount parser decodes total and days`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"}, {"type": "REQUEST", "amount": "1212"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"}, {"type": "REQUEST", "amount": "1212"} ] } ] } ] } } } """ let payload = try DeepSeekUsageCostParser.decodeAmountPayload(data: Data(json.utf8)) #expect(payload.code == 0) #expect(payload.data?.bizCode == 0) #expect(payload.data?.bizData?.total?.count == 1) #expect(payload.data?.bizData?.total?[0].model == "deepseek-v4-flash") #expect(payload.data?.bizData?.days?.count == 1) #expect(payload.data?.bizData?.days?[0].date == "2026-05-26") } @Test func `amount parser handles missing biz_data gracefully`() throws { let json = """ { "code": 0, "msg": "", "data": null } """ let payload = try DeepSeekUsageCostParser.decodeAmountPayload(data: Data(json.utf8)) #expect(payload.code == 0) #expect(payload.data?.bizData?.total == nil) #expect(payload.data?.bizData?.days == nil) } // MARK: - Cost Parser Tests @Test func `cost parser decodes total, days, and currency`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1.3054320000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"}, {"type": "REQUEST", "amount": "0"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1.3054320000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"}, {"type": "REQUEST", "amount": "0"} ] } ] } ], "currency": "CNY" } ] } } """ let payload = try DeepSeekUsageCostParser.decodeCostPayload(data: Data(json.utf8)) #expect(payload.code == 0) #expect(payload.data?.bizCode == 0) #expect(payload.data?.bizData?[0].currency == "CNY") #expect(payload.data?.bizData?[0].total?.count == 1) #expect(payload.data?.bizData?[0].days?.count == 1) #expect(payload.data?.bizData?[0].days?[0].date == "2026-05-26") } @Test func `cost parser handles empty biz_data`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [] } } """ let payload = try DeepSeekUsageCostParser.decodeCostPayload(data: Data(json.utf8)) #expect(payload.code == 0) #expect(payload.data?.bizData?.isEmpty == true) } // MARK: - String Parsing Tests @Test func `string token parsing works`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "RESPONSE_TOKEN", "amount": "656338"} ] } ], "days": [] } } } """ let payload = try DeepSeekUsageCostParser.decodeAmountPayload(data: Data(json.utf8)) #expect(payload.data?.bizData?.total?[0].usage?[0].type == "PROMPT_CACHE_HIT_TOKEN") #expect(payload.data?.bizData?.total?[0].usage?[0].amount == "100686720") } @Test func `decimal cost parsing works`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"} ] } ], "days": [], "currency": "CNY" } ] } } """ let payload = try DeepSeekUsageCostParser.decodeCostPayload(data: Data(json.utf8)) #expect(payload.data?.bizData?[0].total?[0].usage?[0].amount == "2.0137344000000000") } // MARK: - Aggregation Tests @Test func `aggregation computes today token totals`() throws { let amountJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"}, {"type": "REQUEST", "amount": "1212"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"}, {"type": "REQUEST", "amount": "1212"} ] } ] } ] } } } """ let costJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1.3054320000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"}, {"type": "REQUEST", "amount": "0"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1.3054320000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"}, {"type": "REQUEST", "amount": "0"} ] } ] } ], "currency": "CNY" } ] } } """ let summary = try DeepSeekUsageFetcher._parseUsageSummaryForTesting( amountData: Data(amountJSON.utf8), costData: Data(costJSON.utf8), now: self.fixtureNow, calendar: self.fixtureCalendar) // Today is 2026-05-26 per the test data #expect(summary.todayTokens == 102_648_490) // 100_686_720 + 1_305_432 + 656_338 #expect(summary.requestCount == 1212) #expect(summary.currency == "CNY") } @Test func `aggregation uses injected now and calendar for today bucket`() throws { let amountJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100"}, {"type": "REQUEST", "amount": "1"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100"}, {"type": "REQUEST", "amount": "1"} ] } ] } ] } } } """ let costJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [], "days": [], "currency": "CNY" } ] } } """ var nextMonthUTC = Calendar(identifier: .gregorian) nextMonthUTC.timeZone = TimeZone(identifier: "UTC") ?? .current let injectedNow = try #require(nextMonthUTC.date(from: DateComponents(year: 2026, month: 6, day: 1, hour: 12))) let summary = try DeepSeekUsageFetcher._parseUsageSummaryForTesting( amountData: Data(amountJSON.utf8), costData: Data(costJSON.utf8), now: injectedNow, calendar: nextMonthUTC) #expect(summary.todayTokens == 0) #expect(summary.currentMonthTokens == 0) } @Test func `aggregation computes today cost totals`() throws { let amountJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "RESPONSE_TOKEN", "amount": "656338"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "RESPONSE_TOKEN", "amount": "656338"} ] } ] } ] } } } """ let costJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"} ] } ] } ], "currency": "CNY" } ] } } """ let summary = try DeepSeekUsageFetcher._parseUsageSummaryForTesting( amountData: Data(amountJSON.utf8), costData: Data(costJSON.utf8), now: self.fixtureNow, calendar: self.fixtureCalendar) #expect(abs((summary.todayCost ?? 0) - 3.3264104) < 0.0001) #expect(summary.currentMonthCost != nil) } @Test func `aggregation computes model and category breakdown`() throws { let amountJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"} ] } ], "days": [] } } } """ let costJSON = """ { "code": 0, "msg": "", "data": {Lines 1–500 of 855. Load more
import Foundation import Testing @testable import CodexBarCore struct DeepSeekUsageCostParserTests { // Fixtures use date 2026-05-26 private let fixtureNow = Date(timeIntervalSince1970: 1_779_796_800) // 2026-05-26 12:00:00 UTC private let fixtureCalendar: Calendar = { var cal = Calendar.current cal.timeZone = TimeZone(identifier: "UTC") ?? .current return cal }() // MARK: - Amount Parser Tests @Test func `amount parser decodes total and days`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"}, {"type": "REQUEST", "amount": "1212"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"}, {"type": "REQUEST", "amount": "1212"} ] } ] } ] } } } """ let payload = try DeepSeekUsageCostParser.decodeAmountPayload(data: Data(json.utf8)) #expect(payload.code == 0) #expect(payload.data?.bizCode == 0) #expect(payload.data?.bizData?.total?.count == 1) #expect(payload.data?.bizData?.total?[0].model == "deepseek-v4-flash") #expect(payload.data?.bizData?.days?.count == 1) #expect(payload.data?.bizData?.days?[0].date == "2026-05-26") } @Test func `amount parser handles missing biz_data gracefully`() throws { let json = """ { "code": 0, "msg": "", "data": null } """ let payload = try DeepSeekUsageCostParser.decodeAmountPayload(data: Data(json.utf8)) #expect(payload.code == 0) #expect(payload.data?.bizData?.total == nil) #expect(payload.data?.bizData?.days == nil) } // MARK: - Cost Parser Tests @Test func `cost parser decodes total, days, and currency`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1.3054320000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"}, {"type": "REQUEST", "amount": "0"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1.3054320000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"}, {"type": "REQUEST", "amount": "0"} ] } ] } ], "currency": "CNY" } ] } } """ let payload = try DeepSeekUsageCostParser.decodeCostPayload(data: Data(json.utf8)) #expect(payload.code == 0) #expect(payload.data?.bizCode == 0) #expect(payload.data?.bizData?[0].currency == "CNY") #expect(payload.data?.bizData?[0].total?.count == 1) #expect(payload.data?.bizData?[0].days?.count == 1) #expect(payload.data?.bizData?[0].days?[0].date == "2026-05-26") } @Test func `cost parser handles empty biz_data`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [] } } """ let payload = try DeepSeekUsageCostParser.decodeCostPayload(data: Data(json.utf8)) #expect(payload.code == 0) #expect(payload.data?.bizData?.isEmpty == true) } // MARK: - String Parsing Tests @Test func `string token parsing works`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "RESPONSE_TOKEN", "amount": "656338"} ] } ], "days": [] } } } """ let payload = try DeepSeekUsageCostParser.decodeAmountPayload(data: Data(json.utf8)) #expect(payload.data?.bizData?.total?[0].usage?[0].type == "PROMPT_CACHE_HIT_TOKEN") #expect(payload.data?.bizData?.total?[0].usage?[0].amount == "100686720") } @Test func `decimal cost parsing works`() throws { let json = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"} ] } ], "days": [], "currency": "CNY" } ] } } """ let payload = try DeepSeekUsageCostParser.decodeCostPayload(data: Data(json.utf8)) #expect(payload.data?.bizData?[0].total?[0].usage?[0].amount == "2.0137344000000000") } // MARK: - Aggregation Tests @Test func `aggregation computes today token totals`() throws { let amountJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"}, {"type": "REQUEST", "amount": "1212"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"}, {"type": "REQUEST", "amount": "1212"} ] } ] } ] } } } """ let costJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1.3054320000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"}, {"type": "REQUEST", "amount": "0"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1.3054320000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"}, {"type": "REQUEST", "amount": "0"} ] } ] } ], "currency": "CNY" } ] } } """ let summary = try DeepSeekUsageFetcher._parseUsageSummaryForTesting( amountData: Data(amountJSON.utf8), costData: Data(costJSON.utf8), now: self.fixtureNow, calendar: self.fixtureCalendar) // Today is 2026-05-26 per the test data #expect(summary.todayTokens == 102_648_490) // 100_686_720 + 1_305_432 + 656_338 #expect(summary.requestCount == 1212) #expect(summary.currency == "CNY") } @Test func `aggregation uses injected now and calendar for today bucket`() throws { let amountJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100"}, {"type": "REQUEST", "amount": "1"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100"}, {"type": "REQUEST", "amount": "1"} ] } ] } ] } } } """ let costJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [], "days": [], "currency": "CNY" } ] } } """ var nextMonthUTC = Calendar(identifier: .gregorian) nextMonthUTC.timeZone = TimeZone(identifier: "UTC") ?? .current let injectedNow = try #require(nextMonthUTC.date(from: DateComponents(year: 2026, month: 6, day: 1, hour: 12))) let summary = try DeepSeekUsageFetcher._parseUsageSummaryForTesting( amountData: Data(amountJSON.utf8), costData: Data(costJSON.utf8), now: injectedNow, calendar: nextMonthUTC) #expect(summary.todayTokens == 0) #expect(summary.currentMonthTokens == 0) } @Test func `aggregation computes today cost totals`() throws { let amountJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "RESPONSE_TOKEN", "amount": "656338"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "RESPONSE_TOKEN", "amount": "656338"} ] } ] } ] } } } """ let costJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": [ { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"} ] } ], "days": [ { "date": "2026-05-26", "data": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "2.0137344000000000"}, {"type": "RESPONSE_TOKEN", "amount": "1.3126760000000000"} ] } ] } ], "currency": "CNY" } ] } } """ let summary = try DeepSeekUsageFetcher._parseUsageSummaryForTesting( amountData: Data(amountJSON.utf8), costData: Data(costJSON.utf8), now: self.fixtureNow, calendar: self.fixtureCalendar) #expect(abs((summary.todayCost ?? 0) - 3.3264104) < 0.0001) #expect(summary.currentMonthCost != nil) } @Test func `aggregation computes model and category breakdown`() throws { let amountJSON = """ { "code": 0, "msg": "", "data": { "biz_code": 0, "biz_msg": "", "biz_data": { "total": [ { "model": "deepseek-v4-flash", "usage": [ {"type": "PROMPT_CACHE_HIT_TOKEN", "amount": "100686720"}, {"type": "PROMPT_CACHE_MISS_TOKEN", "amount": "1305432"}, {"type": "RESPONSE_TOKEN", "amount": "656338"} ] } ], "days": [] } } } """ let costJSON = """ { "code": 0, "msg": "", "data": {