namespace FundLab.Api.Tests module ApiTests = open System open Xunit open FundLab.Api [] [] [] [] let ``missing or wrong bearer token is unauthorized`` header = Assert.Equal(AuthDecision.Unauthorized, Authentication.authorize "secret" header) [] let ``matching bearer token is authorized`` () = Assert.Equal(AuthDecision.Authorized, Authentication.authorize "secret" "Bearer secret") [] let ``health payload is non-sensitive`` () = let payload = Health.payload "fund-lab-api" Assert.Contains("\"status\":\"ok\"", payload) Assert.DoesNotContain("secret", payload) [] let ``AKShare NAV payload keeps missing publication time empty`` () = let payload = """ { "schema_version": "fund-lab.akshare.v1", "operation": "nav", "source": "akshare", "source_revision": "akshare-1.18.96/eastmoney", "collected_at": "2026-09-21T10:00:00Z", "instrument": { "code": "000001" }, "observations": [ { "nav_date": "2001-12-18", "published_at": null, "nav": "1.00000000", "accumulated_nav": null, "daily_return": "0.00" } ] } """ match MarketData.parseNavPayload payload with | Ok parsed -> let observation = parsed.Observations |> List.head Assert.Equal("000001", parsed.Code) Assert.Equal(DateOnly(2001, 12, 18), observation.NavDate) Assert.Equal(None, observation.PublishedAt) Assert.Equal(None, observation.AccumulatedNav) Assert.Equal(Some 0.00m, observation.DailyReturn) Assert.Equal(1.00000000m, observation.Nav) | Error message -> Assert.Fail(sprintf "expected valid NAV payload, got %s" message) [] let ``AKShare search payload preserves exact fund code and source`` () = let payload = """ { "schema_version": "fund-lab.akshare.v1", "operation": "search", "source": "akshare", "source_revision": "akshare-1.18.96/eastmoney", "collected_at": "2026-09-21T10:00:00Z", "instruments": [ { "code": "000001", "name": "华夏成长混合", "fund_type": "混合型-灵活" } ] } """ match MarketData.parseSearchPayload payload with | Ok parsed -> let instrument = parsed.Instruments |> List.head Assert.Equal("000001", instrument.Code) Assert.Equal("华夏成长混合", instrument.Name) Assert.Equal(Some "混合型-灵活", instrument.FundType) Assert.Equal("akshare", parsed.Source) | Error message -> Assert.Fail(sprintf "expected valid search payload, got %s" message)