855 lines · 25.5 KB · Swift
RawDownload
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.