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.
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,
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.