Have you considered that adding something to allow the developers to access contract archive/creation events for those 4 commands in DAML script? That can simulate the behaviour of Ledger API streaming service and will make writing testing cases a lot simpler.
Do you need access to the full transaction stream or just to an individual transaction that results as part of a submit? For the latter, I have a branch that provides a submitTree function that returns the full transaction tree. It is still pending some other changes so I cannot provide a timeline for when this will be released atm. We don’t have any concrete plans to expose the full transaction stream in DAML Script atm but I had some vague thoughts about it in the past and if there’s a good usecase for it, it’s reasonable to add it.
Note that you can “fake” access to the transaction by calling query before and after the submit and looking at the delta. However, that only works for specific template types.
Most of time my test cases only care about the result of the command, e.g. the exercise command results in contract ABC:1 archived and contract BCD:3 created.
Using query are good idea. Let me give it a go. Thanks. Just curious what kind of template support it?
query supports all template types. What I mean by specific is that query only returns the contracts of one template so you can only answer the question “which contracts have been produced of this given template” rather than the more general “which contracts have been produced”. Of course, in a test case you usually can figure out all template types that might have been produced and you can call query once for each of them.
Here’s a full example in case that’s useful:
module Main where
import Daml.Script
template T1
with
sig : Party
where
signatory sig
preconsuming choice MakeMore : (ContractId T1, ContractId T2)
controller sig
do
c1 <- create this
c2 <- create T2 with sig
return (c1, c2)
template T2
with
sig : Party
where
signatory sig
setup : Script ()
setup = script do
alice <- allocatePartyWithHint "Alice" (PartyIdHint "Alice")
c0 <- submit alice do createCmd T1 with sig = alice
prev <- query @T1 alice
(c1, c2) <- submit alice do exerciseCmd c0 MakeMore
post <- query @T1 alice
assert (c0 `elem` (map fst prev))
assert (c0 `notElem` (map fst post))
What @cocreature meant is that, when you call query, you have to give it a type of template, and you only get the existing contracts for that one specific template. In the case of my example code above, prev and post only know about T1 contracts, but don’t contain any information about T2 contracts. So if you wanted to check multiple contract types, you’d need a separate call to query per template.
Thanks for the example. That helps a lot. 