summaryrefslogtreecommitdiff
path: root/tests/FundLab.Web.Tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests/FundLab.Web.Tests')
-rw-r--r--tests/FundLab.Web.Tests/BoundaryTests.fs76
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/FundLab.Web.Tests/BoundaryTests.fs b/tests/FundLab.Web.Tests/BoundaryTests.fs
index d48d08b..015ed45 100644
--- a/tests/FundLab.Web.Tests/BoundaryTests.fs
+++ b/tests/FundLab.Web.Tests/BoundaryTests.fs
@@ -379,6 +379,7 @@ module ConfirmationBoundaryTests =
[|
{ instrumentCode = "000001"
units = "40.00000000"
+ reservedUnits = "0.00000000"
costCash = "100.00"
lastConfirmedAt = "2026-09-21T11:00:00+00:00"
valuationNav = someText "2.61000000"
@@ -386,6 +387,7 @@ module ConfirmationBoundaryTests =
valuationCollectedAt = someText "2026-09-21T09:30:00+00:00" }
{ instrumentCode = "110011"
units = "10.00000000"
+ reservedUnits = "5.00000000"
costCash = "25.00"
lastConfirmedAt = "2026-09-21T11:00:00+00:00"
valuationNav = null
@@ -559,3 +561,77 @@ module ConfirmationBoundaryTests =
let stalePositions, _ = update (PositionsReadCompleted(3, samplePositions ())) cleared
Assert.Equal(None, stalePositions.positions)
+
+module RedemptionBoundaryTests =
+
+ let sampleRedemptionRaw (status: string) : RawRedemption =
+ {
+ id = "9b2f1c3d-0000-0000-0000-000000000001"
+ instrumentCode = "000001"
+ units = "150.00000000"
+ feeAmount = "1.50"
+ status = status
+ submittedAt = "2026-09-21T10:00:00+00:00"
+ tradeDate = "2026-09-21"
+ pendingReason = null
+ confirmedAt = null
+ confirmedNav = null
+ confirmedNavDate = null
+ confirmedProceeds = null
+ confirmedCostReleased = null
+ }
+
+ let confirmedRedemptionRaw () : RawRedemption =
+ let someText (value: string) : obj = box { case = "Some"; fields = [| value |] }
+
+ { sampleRedemptionRaw "confirmed" with
+ pendingReason = null
+ confirmedAt = someText "2026-09-21T11:00:00+00:00"
+ confirmedNav = someText "2.50000000"
+ confirmedNavDate = someText "2026-09-21"
+ confirmedProceeds = someText "373.50"
+ confirmedCostReleased = someText "375.00" }
+
+ [<Fact>]
+ let ``redemption decode keeps decimal strings and option fields`` () =
+ let confirmed = Api.decodeRedemption (confirmedRedemptionRaw ())
+
+ Assert.Equal("confirmed", confirmed.status)
+ Assert.Equal("150.00000000", confirmed.units)
+ Assert.Equal("1.50", confirmed.feeAmount)
+ Assert.Equal("2.50000000", confirmed.confirmedNav.Value)
+ Assert.Equal("373.50", confirmed.confirmedProceeds.Value)
+ Assert.Equal("375.00", confirmed.confirmedCostReleased.Value)
+ Assert.Equal(None, confirmed.pendingReason)
+
+ let sampleRedemptionPositions () : RawPositions =
+ {
+ availableCash = "9900.00"
+ reservedCash = "101.50"
+ positions =
+ [|
+ { instrumentCode = "000001"
+ units = "40.00000000"
+ reservedUnits = "0.00000000"
+ costCash = "100.00"
+ lastConfirmedAt = "2026-09-21T11:00:00+00:00"
+ valuationNav = null
+ valuationNavDate = null
+ valuationCollectedAt = null }
+ { instrumentCode = "110011"
+ units = "10.00000000"
+ reservedUnits = "5.00000000"
+ costCash = "25.00"
+ lastConfirmedAt = "2026-09-21T11:00:00+00:00"
+ valuationNav = null
+ valuationNavDate = null
+ valuationCollectedAt = null }
+ |]
+ }
+
+ [<Fact>]
+ let ``positions decode keeps reserved units for frozen shares`` () =
+ let decoded = Api.decodePositions (sampleRedemptionPositions ())
+
+ Assert.Equal("0.00000000", decoded.positions[0].reservedUnits)
+ Assert.Equal("5.00000000", decoded.positions[1].reservedUnits)