[purchasing] load purchase states
This commit is contained in:
parent
b470799586
commit
79f6f81766
|
@ -33,6 +33,12 @@ type
|
||||||
SlotId* = distinct array[32, byte]
|
SlotId* = distinct array[32, byte]
|
||||||
RequestId* = distinct array[32, byte]
|
RequestId* = distinct array[32, byte]
|
||||||
Nonce* = distinct array[32, byte]
|
Nonce* = distinct array[32, byte]
|
||||||
|
RequestState* {.pure.} = enum
|
||||||
|
New
|
||||||
|
Started
|
||||||
|
Cancelled
|
||||||
|
Finished
|
||||||
|
Failed
|
||||||
|
|
||||||
proc `==`*(x, y: Nonce): bool {.borrow.}
|
proc `==`*(x, y: Nonce): bool {.borrow.}
|
||||||
proc `==`*(x, y: RequestId): bool {.borrow.}
|
proc `==`*(x, y: RequestId): bool {.borrow.}
|
||||||
|
|
|
@ -31,6 +31,10 @@ method getRequest*(market: Market,
|
||||||
Future[?StorageRequest] {.base, async.} =
|
Future[?StorageRequest] {.base, async.} =
|
||||||
raiseAssert("not implemented")
|
raiseAssert("not implemented")
|
||||||
|
|
||||||
|
method getState*(market: Market,
|
||||||
|
requestId: RequestId): Future[?RequestState] {.base, async.} =
|
||||||
|
raiseAssert("not implemented")
|
||||||
|
|
||||||
method getHost*(market: Market,
|
method getHost*(market: Market,
|
||||||
requestId: RequestId,
|
requestId: RequestId,
|
||||||
slotIndex: UInt256): Future[?Address] {.base, async.} =
|
slotIndex: UInt256): Future[?Address] {.base, async.} =
|
||||||
|
|
|
@ -1,3 +1,27 @@
|
||||||
import ../statemachine
|
import ../statemachine
|
||||||
|
import ./submitted
|
||||||
|
import ./started
|
||||||
|
import ./cancelled
|
||||||
|
import ./error
|
||||||
|
|
||||||
type PurchaseUnknown* = ref object of PurchaseState
|
type PurchaseUnknown* = ref object of PurchaseState
|
||||||
|
|
||||||
|
method enterAsync(state: PurchaseUnknown) {.async.} =
|
||||||
|
without purchase =? (state.context as Purchase):
|
||||||
|
raiseAssert "invalid state"
|
||||||
|
|
||||||
|
try:
|
||||||
|
if requestState =? await purchase.market.getState(purchase.request.id):
|
||||||
|
case requestState
|
||||||
|
of RequestState.New:
|
||||||
|
state.switch(PurchaseSubmitted())
|
||||||
|
of RequestState.Started:
|
||||||
|
state.switch(PurchaseStarted())
|
||||||
|
of RequestState.Cancelled:
|
||||||
|
state.switch(PurchaseCancelled())
|
||||||
|
of RequestState.Finished:
|
||||||
|
discard # TODO
|
||||||
|
of RequestState.Failed:
|
||||||
|
discard # TODO
|
||||||
|
except CatchableError as error:
|
||||||
|
state.switch(PurchaseError(error: error))
|
||||||
|
|
|
@ -10,6 +10,7 @@ type
|
||||||
MockMarket* = ref object of Market
|
MockMarket* = ref object of Market
|
||||||
activeRequests*: Table[Address, seq[RequestId]]
|
activeRequests*: Table[Address, seq[RequestId]]
|
||||||
requested*: seq[StorageRequest]
|
requested*: seq[StorageRequest]
|
||||||
|
state*: Table[RequestId, RequestState]
|
||||||
fulfilled*: seq[Fulfillment]
|
fulfilled*: seq[Fulfillment]
|
||||||
filled*: seq[Slot]
|
filled*: seq[Slot]
|
||||||
withdrawn*: seq[RequestId]
|
withdrawn*: seq[RequestId]
|
||||||
|
@ -49,6 +50,9 @@ type
|
||||||
proc hash*(address: Address): Hash =
|
proc hash*(address: Address): Hash =
|
||||||
hash(address.toArray)
|
hash(address.toArray)
|
||||||
|
|
||||||
|
proc hash*(requestId: RequestId): Hash =
|
||||||
|
hash(requestId.toArray)
|
||||||
|
|
||||||
proc new*(_: type MockMarket): MockMarket =
|
proc new*(_: type MockMarket): MockMarket =
|
||||||
MockMarket(signer: Address.example)
|
MockMarket(signer: Address.example)
|
||||||
|
|
||||||
|
@ -74,6 +78,10 @@ method getRequest(market: MockMarket,
|
||||||
return some request
|
return some request
|
||||||
return none StorageRequest
|
return none StorageRequest
|
||||||
|
|
||||||
|
method getState*(market: MockMarket,
|
||||||
|
requestId: RequestId): Future[?RequestState] {.async.} =
|
||||||
|
return market.state.?[requestId]
|
||||||
|
|
||||||
method getHost(market: MockMarket,
|
method getHost(market: MockMarket,
|
||||||
requestId: RequestId,
|
requestId: RequestId,
|
||||||
slotIndex: UInt256): Future[?Address] {.async.} =
|
slotIndex: UInt256): Future[?Address] {.async.} =
|
||||||
|
|
|
@ -106,3 +106,16 @@ suite "Purchasing":
|
||||||
check isSome purchasing.getPurchase(PurchaseId(request1.id))
|
check isSome purchasing.getPurchase(PurchaseId(request1.id))
|
||||||
check isSome purchasing.getPurchase(PurchaseId(request2.id))
|
check isSome purchasing.getPurchase(PurchaseId(request2.id))
|
||||||
check isNone purchasing.getPurchase(PurchaseId(request3.id))
|
check isNone purchasing.getPurchase(PurchaseId(request3.id))
|
||||||
|
|
||||||
|
test "loads correct state for purchases from market":
|
||||||
|
let me = await market.getSigner()
|
||||||
|
let request1, request2, request3 = StorageRequest.example
|
||||||
|
market.requested = @[request1, request2, request3]
|
||||||
|
market.activeRequests[me] = @[request1.id, request2.id, request3.id]
|
||||||
|
market.state[request1.id] = RequestState.New
|
||||||
|
market.state[request2.id] = RequestState.Started
|
||||||
|
market.state[request3.id] = RequestState.Cancelled
|
||||||
|
await purchasing.load()
|
||||||
|
check purchasing.getPurchase(PurchaseId(request1.id)).?finished == false.some
|
||||||
|
check purchasing.getPurchase(PurchaseId(request2.id)).?finished == true.some
|
||||||
|
check purchasing.getPurchase(PurchaseId(request3.id)).?finished == true.some
|
||||||
|
|
Loading…
Reference in New Issue