I’m currently implementing Taler integration into Tryton. This includes a test-suite. Anyhow, testing payments is cumbersome in e.g. CI tests. sandcastle-ng is great, as it provides some merchants already, thus one “only” needs to create a bank account for the customer.
But how can one automate wallet operations like withdrawal and payments?
Do you want to automate the wallet? You can run taler-wallet-cli in daemon mode and send commands to it (via a unix domain socket)!
It’s not very well documented as this point, but the basic commands are:
# Run the wallet as a daemon
taler-wallet-cli advanced serve
# Instead of using one-shot commands, let the wallet talk to the daemon
export TALER_WALLET_CONNECTION=$HOME/.wallet-core.sock
# Run wallet commands
taler-wallet-cli transactions
[...]
taler-wallet-cli api $request "$payload"
[...]
taler-wallet-cli handle-uri "$taler_uri"
[...]
No, actually I don’t want to interact with the wallet.
The aim is to test the integration against the merchant backend. This is: create order, get order state (paid, unpaid, failed), refund order, get refund state.
I imaging some kind of REST-API backdoor to tell the merchant backend: treat this order as if the customer has paid, as if they did not pay, as if they did pick up the refund, etc.
This is more like mocking answers - expect that I don’t want to mock the answers, since I need to test whether my tooling work correctly with the “real” answers. (Though, if it’s the only way, I might mock.)
We currently don’t have any mocking like this on the roadmap. The easiest way would be to just run an exchange / merchant backend (e.g. via sandcastle-ng) and use a real (headless) wallet to test the integration.
Is there anything about this approach that would not work for you?
I understand that a mocked system is much work and this is why it not on the roadmap. Using sandcastle-ng would be an acceptable solution.
The main issue with this approach is: For operating the wallet, the test suite needs to run shell commands, and this has to be done in the container. Thus there are a lot of additional dependencies on the user’s environment: docker or podman, name of the container, maybe more.
My ideas for working around this: Implement a stupid HTTP service running in the container and proxying wallet operations.
Beside this, I need to know the respective commands to execute. (As of now I did not manage to withdraw KUDOS from the sandcastle bank into the cli-wallet.)