diff options
author | Florian Dold <florian@dold.me> | 2021-01-12 20:04:16 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2021-01-12 20:04:16 +0100 |
commit | a5681579fbddb001f5b7118fe705c6643581c722 (patch) | |
tree | c8bd46e6bf7a5c97ee3db676eae9405bfdf4d2b2 | |
parent | 6772c5479394cbdf404857f75263749a5c91bd41 (diff) |
make integration tests part of taler-wallet-cli
-rw-r--r-- | packages/taler-integrationtests/package.json | 25 | ||||
-rwxr-xr-x | packages/taler-integrationtests/scenario | 26 | ||||
-rw-r--r-- | packages/taler-integrationtests/src/scenario-rerun-payment-multiple.ts | 128 | ||||
-rwxr-xr-x | packages/taler-integrationtests/testrunner | 77 | ||||
-rw-r--r-- | packages/taler-integrationtests/tsconfig.json | 32 | ||||
-rw-r--r-- | packages/taler-wallet-cli/package.json | 2 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/index.ts | 20 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/denomStructures.ts (renamed from packages/taler-integrationtests/src/denomStructures.ts) | 0 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/faultInjection.ts (renamed from packages/taler-integrationtests/src/faultInjection.ts) | 0 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/harness.ts (renamed from packages/taler-integrationtests/src/harness.ts) | 123 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/helpers.ts (renamed from packages/taler-integrationtests/src/helpers.ts) | 0 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/merchantApiTypes.ts (renamed from packages/taler-integrationtests/src/merchantApiTypes.ts) | 0 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/scenario-prompt-payment.ts (renamed from packages/taler-integrationtests/src/scenario-prompt-payment.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-bank-api.ts (renamed from packages/taler-integrationtests/src/test-bank-api.ts) | 5 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-claim-loop.ts (renamed from packages/taler-integrationtests/src/test-claim-loop.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts (renamed from packages/taler-integrationtests/src/test-exchange-management.ts) | 5 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-fee-regression.ts (renamed from packages/taler-integrationtests/src/test-fee-regression.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts (renamed from packages/taler-integrationtests/src/test-merchant-longpolling.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts (renamed from packages/taler-integrationtests/src/test-merchant-refund-api.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts (renamed from packages/taler-integrationtests/src/test-pay-abort.ts) | 7 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts (renamed from packages/taler-integrationtests/src/test-pay-paid.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts (renamed from packages/taler-integrationtests/src/test-payment-claim.ts) | 11 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts (renamed from packages/taler-integrationtests/src/test-payment-fault.ts) | 5 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts (renamed from packages/taler-integrationtests/src/test-payment-idempotency.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-payment-multiple.ts (renamed from packages/taler-integrationtests/src/test-payment-multiple.ts) | 5 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts (renamed from packages/taler-integrationtests/src/test-payment-transient.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-payment.ts (renamed from packages/taler-integrationtests/src/test-payment.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts (renamed from packages/taler-integrationtests/src/test-paywall-flow.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts (renamed from packages/taler-integrationtests/src/test-refund-auto.ts) | 8 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts (renamed from packages/taler-integrationtests/src/test-refund-gone.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts (renamed from packages/taler-integrationtests/src/test-refund-incremental.ts) | 11 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-refund.ts (renamed from packages/taler-integrationtests/src/test-refund.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-revocation.ts (renamed from packages/taler-integrationtests/src/test-revocation.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts (renamed from packages/taler-integrationtests/src/test-timetravel-autorefresh.ts) | 5 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts (renamed from packages/taler-integrationtests/src/test-timetravel-withdraw.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-tipping.ts (renamed from packages/taler-integrationtests/src/test-tipping.ts) | 5 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-wallettesting.ts (renamed from packages/taler-integrationtests/src/test-wallettesting.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-withdrawal-abort-bank.ts (renamed from packages/taler-integrationtests/src/test-withdrawal-abort-bank.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-withdrawal-bank-integrated.ts (renamed from packages/taler-integrationtests/src/test-withdrawal-bank-integrated.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts (renamed from packages/taler-integrationtests/src/test-withdrawal-manual.ts) | 6 | ||||
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/testrunner.ts | 176 | ||||
-rw-r--r-- | pnpm-lock.yaml | 36 | ||||
-rw-r--r-- | tsconfig.build.json | 5 |
43 files changed, 339 insertions, 486 deletions
diff --git a/packages/taler-integrationtests/package.json b/packages/taler-integrationtests/package.json deleted file mode 100644 index 7da65b144..000000000 --- a/packages/taler-integrationtests/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "taler-integrationtests", - "version": "0.0.1", - "description": "Integration tests and fault injection for GNU Taler components", - "main": "index.js", - "scripts": { - "compile": "tsc -b", - "pretty": "prettier --write src" - }, - "author": "Florian Dold <dold@taler.net>", - "license": "AGPL-3.0-or-later", - "devDependencies": { - "esm": "^3.2.25", - "nyc": "^15.1.0", - "prettier": "^2.1.2", - "source-map-support": "^0.5.19", - "ts-node": "^9.0.0", - "typescript": "^4.0.5" - }, - "dependencies": { - "axios": "^0.21.0", - "taler-wallet-core": "workspace:*", - "tslib": "^2.0.3" - } -} diff --git a/packages/taler-integrationtests/scenario b/packages/taler-integrationtests/scenario deleted file mode 100755 index 9bef68ffa..000000000 --- a/packages/taler-integrationtests/scenario +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -# Simple test runner for the wallet integration tests. -# -# Usage: $0 TESTGLOB -# -# The TESTGLOB can be used to select which test cases to execute - -set -eu - -if [ "$#" -ne 1 ]; then - echo "Usage: $0 SCENARIO" - exit 1 -fi - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -cd $DIR - -./node_modules/.bin/tsc -b - -export ESM_OPTIONS='{"sourceMap": true}' - -file=lib/scenario-$1.js - -exec node -r source-map-support/register -r esm $file diff --git a/packages/taler-integrationtests/src/scenario-rerun-payment-multiple.ts b/packages/taler-integrationtests/src/scenario-rerun-payment-multiple.ts deleted file mode 100644 index 3a98987b3..000000000 --- a/packages/taler-integrationtests/src/scenario-rerun-payment-multiple.ts +++ /dev/null @@ -1,128 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2020 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - -/** - * Imports. - */ -import { - GlobalTestState, - BankService, - ExchangeService, - MerchantService, - WalletCli, - runTestWithState, - MerchantPrivateApi, -} from "./harness"; -import { withdrawViaBank } from "./helpers"; -import fs from "fs"; - -let existingTestDir = - process.env["TALER_TEST_OLD_DIR"] ?? "/tmp/taler-integrationtest-current"; - -if (!fs.existsSync(existingTestDir)) { - throw Error("old test dir not found"); -} - -existingTestDir = fs.realpathSync(existingTestDir); - -const prevT = new GlobalTestState({ - testDir: existingTestDir, -}); - -async function withdrawAndPay( - t: GlobalTestState, - wallet: WalletCli, - bank: BankService, - exchange: ExchangeService, - merchant: MerchantService, -): Promise<void> { - await withdrawViaBank(t, { wallet, bank, exchange, amount: "TESTKUDOS:100" }); - - // Set up order. - - const orderResp = await MerchantPrivateApi.createOrder(merchant, "default", { - order: { - summary: "Buy me!", - amount: "TESTKUDOS:80", - fulfillment_url: "taler://fulfillment-success/thx", - }, - }); - - let orderStatus = await MerchantPrivateApi.queryPrivateOrderStatus(merchant, { - orderId: orderResp.order_id, - }); - - t.assertTrue(orderStatus.order_status === "unpaid"); - - // Make wallet pay for the order - - const r1 = await wallet.apiRequest("preparePay", { - talerPayUri: orderStatus.taler_pay_uri, - }); - t.assertTrue(r1.type === "response"); - - const r2 = await wallet.apiRequest("confirmPay", { - // FIXME: should be validated, don't cast! - proposalId: (r1.result as any).proposalId, - }); - t.assertTrue(r2.type === "response"); - - // Check if payment was successful. - - orderStatus = await MerchantPrivateApi.queryPrivateOrderStatus(merchant, { - orderId: orderResp.order_id, - }); - - t.assertTrue(orderStatus.order_status === "paid"); -} - -/** - * Run test. - */ -runTestWithState(prevT, async (t: GlobalTestState) => { - // Set up test environment - - const bank = BankService.fromExistingConfig(t); - const exchange = ExchangeService.fromExistingConfig(t, "testexchange-1"); - const merchant = MerchantService.fromExistingConfig(t, "testmerchant-1"); - - await bank.start(); - await exchange.start(); - await merchant.start(); - await Promise.all([ - bank.pingUntilAvailable(), - merchant.pingUntilAvailable(), - exchange.pingUntilAvailable(), - ]); - - const wallet = new WalletCli(t); - - // Withdraw digital cash into the wallet. - - const repetitions = Number.parseInt(process.env["TALER_TEST_REPEAT"] ?? "1"); - - for (let rep = 0; rep < repetitions; rep++) { - console.log("repetition", rep); - try { - wallet.deleteDatabase(); - await withdrawAndPay(t, wallet, bank, exchange, merchant); - } catch (e) { - console.log("ignoring exception", e); - } - } - - await t.shutdown(); -}); diff --git a/packages/taler-integrationtests/testrunner b/packages/taler-integrationtests/testrunner deleted file mode 100755 index c03f6ed97..000000000 --- a/packages/taler-integrationtests/testrunner +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env bash - -# Simple test runner for the wallet integration tests. -# -# Usage: $0 TESTGLOB -# -# The TESTGLOB can be used to select which test cases to execute - -set -eu - -exit_int() { - echo "Interrupted..." - exit 2 -} - -trap "exit_int" INT - -if [ "$#" -ne 1 ]; then - echo "Usage: $0 TESTGLOB" - exit 1 -fi - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -cd $DIR - -./node_modules/.bin/tsc -b - -export ESM_OPTIONS='{"sourceMap": true}' - -shopt -s extglob - -num_exec=0 -num_fail=0 -num_succ=0 - -files_failed='' - -# Glob tests -for file in lib/$1?(.js); do - case "$file" in - */test-*.js) - echo "executing test $file" - ret=0 - node -r source-map-support/register -r esm $file || ret=$? - num_exec=$((num_exec+1)) - case $ret in - 0) - num_succ=$((num_succ+1)) - ;; - *) - num_fail=$((num_fail+1)) - files_failed=$files_failed:$file - ;; - esac - ;; - *) - continue - ;; - esac -done - -echo "-----------------------------------" -echo "Tests finished" -echo "$num_succ/$num_exec tests succeeded" -if [[ $num_fail != 0 ]]; then - echo "These tests failed:" - echo $files_failed | tr : \\n | sed '/^$/d' -fi -echo "-----------------------------------" - -if [[ $num_fail = 0 ]]; then - exit 0 -else - exit 1 -fi - diff --git a/packages/taler-integrationtests/tsconfig.json b/packages/taler-integrationtests/tsconfig.json deleted file mode 100644 index 2fe0853d4..000000000 --- a/packages/taler-integrationtests/tsconfig.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "compileOnSave": true, - "compilerOptions": { - "composite": true, - "declaration": true, - "declarationMap": false, - "target": "ES6", - "module": "ESNext", - "moduleResolution": "node", - "sourceMap": true, - "lib": ["es6"], - "types": ["node"], - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "strict": true, - "strictPropertyInitialization": false, - "outDir": "lib", - "noImplicitAny": true, - "noImplicitThis": true, - "incremental": true, - "esModuleInterop": true, - "importHelpers": true, - "rootDir": "./src", - "typeRoots": ["./node_modules/@types"] - }, - "references": [ - { - "path": "../taler-wallet-core" - } - ], - "include": ["src/**/*"] -} diff --git a/packages/taler-wallet-cli/package.json b/packages/taler-wallet-cli/package.json index 564cf7f4a..c3fa6e794 100644 --- a/packages/taler-wallet-cli/package.json +++ b/packages/taler-wallet-cli/package.json @@ -43,7 +43,9 @@ "typescript": "^4.0.5" }, "dependencies": { + "@types/minimatch": "^3.0.3", "axios": "^0.21.0", + "minimatch": "^3.0.4", "source-map-support": "^0.5.19", "taler-wallet-core": "workspace:*", "tslib": "^2.0.3" diff --git a/packages/taler-wallet-cli/src/index.ts b/packages/taler-wallet-cli/src/index.ts index 87a51f30d..e4f1ccb50 100644 --- a/packages/taler-wallet-cli/src/index.ts +++ b/packages/taler-wallet-cli/src/index.ts @@ -41,6 +41,7 @@ import { } from "taler-wallet-core"; import * as clk from "./clk"; import { deepStrictEqual } from "assert"; +import { getTestInfo, runTests } from "./integrationtests/testrunner"; // This module also serves as the entry point for the crypto // thread worker, and thus must expose these two handlers. @@ -749,6 +750,25 @@ const testCli = walletCli.subcommand("testingArgs", "testing", { help: "Subcommands for testing GNU Taler deployments.", }); +testCli + .subcommand("listIntegrationtests", "list-integrationtests") + .action(async (args) => { + for (const t of getTestInfo()) { + console.log(t.name); + } + }); + +testCli + .subcommand("runIntegrationtests", "run-integrationtests") + .maybeArgument("pattern", clk.STRING, { + help: "Glob pattern to select which tests to run", + }) + .action(async (args) => { + await runTests({ + include_pattern: args.runIntegrationtests.pattern, + }); + }); + testCli.subcommand("vectors", "vectors").action(async (args) => { printTestVectors(); }); diff --git a/packages/taler-integrationtests/src/denomStructures.ts b/packages/taler-wallet-cli/src/integrationtests/denomStructures.ts index 5ab9aca00..5ab9aca00 100644 --- a/packages/taler-integrationtests/src/denomStructures.ts +++ b/packages/taler-wallet-cli/src/integrationtests/denomStructures.ts diff --git a/packages/taler-integrationtests/src/faultInjection.ts b/packages/taler-wallet-cli/src/integrationtests/faultInjection.ts index a2d4836d9..a2d4836d9 100644 --- a/packages/taler-integrationtests/src/faultInjection.ts +++ b/packages/taler-wallet-cli/src/integrationtests/faultInjection.ts diff --git a/packages/taler-integrationtests/src/harness.ts b/packages/taler-wallet-cli/src/integrationtests/harness.ts index 58bcf2cf4..108b78540 100644 --- a/packages/taler-integrationtests/src/harness.ts +++ b/packages/taler-wallet-cli/src/integrationtests/harness.ts @@ -77,6 +77,7 @@ import { codecForPrepareTipResult, AcceptTipRequest, AbortPayWithRefundRequest, + handleWorkerError, } from "taler-wallet-core"; import { URL } from "url"; import axios, { AxiosError } from "axios"; @@ -93,6 +94,7 @@ import { import { ApplyRefundResponse } from "taler-wallet-core"; import { PendingOperationsResponse } from "taler-wallet-core"; import { CoinConfig } from "./denomStructures"; +import { after } from "taler-wallet-core/src/util/timer"; const exec = util.promisify(require("child_process").exec); @@ -236,11 +238,6 @@ export class GlobalTestState { this.testDir = params.testDir; this.procs = []; this.servers = []; - - process.on("SIGINT", () => this.shutdownSync()); - process.on("SIGTERM", () => this.shutdownSync()); - process.on("unhandledRejection", () => this.shutdownSync()); - process.on("uncaughtException", () => this.shutdownSync()); } async assertThrowsOperationErrorAsync( @@ -307,7 +304,7 @@ export class GlobalTestState { } } - private shutdownSync(): void { + shutdownSync(): void { for (const s of this.servers) { s.close(); s.removeAllListeners(); @@ -315,12 +312,8 @@ export class GlobalTestState { for (const p of this.procs) { if (p.proc.exitCode == null) { p.proc.kill("SIGTERM"); - } else { } } - console.log("*** test harness interrupted"); - console.log("*** test state can be found under", this.testDir); - process.exit(1); } spawnService( @@ -362,11 +355,6 @@ export class GlobalTestState { } this.inShutdown = true; console.log("shutting down"); - if (shouldLingerAlways()) { - console.log("*** test finished, but requested to linger"); - console.log("*** test state can be found under", this.testDir); - return; - } for (const s of this.servers) { s.close(); s.removeAllListeners(); @@ -1047,7 +1035,7 @@ export class ExchangeService implements ExchangeServiceInterface { } const year = new Date().getFullYear(); - for (let i = year; i < year+5; i++) { + for (let i = year; i < year + 5; i++) { await runCommand( this.globalState, "exchange-offline", @@ -1438,76 +1426,57 @@ export interface MerchantInstanceConfig { defaultPayDelay?: Duration; } -/** - * Check if the test should hang around after it failed. - */ -function shouldLinger(): boolean { - return ( - process.env["TALER_TEST_LINGER"] == "1" || - process.env["TALER_TEST_LINGER_ALWAYS"] == "1" - ); -} +type TestStatus = "pass" | "fail" | "skip"; -/** - * Check if the test should hang around even after it finished - * successfully. - */ -function shouldLingerAlways(): boolean { - return process.env["TALER_TEST_LINGER_ALWAYS"] == "1"; -} +export interface TestRunResult { + /** + * Name of the test. + */ + name: string; -function updateCurrentSymlink(testDir: string): void { - const currLink = path.join(os.tmpdir(), "taler-integrationtest-current"); - try { - fs.unlinkSync(currLink); - } catch (e) { - // Ignore - } - try { - fs.symlinkSync(testDir, currLink); - } catch (e) { - console.log(e); - // Ignore - } + /** + * How long did the test run? + */ + timeSec: number; + + status: TestStatus; } -export function runTestWithState( +export async function runTestWithState( gc: GlobalTestState, testMain: (t: GlobalTestState) => Promise<void>, -) { - const main = async () => { - let ret = 0; - try { - updateCurrentSymlink(gc.testDir); - console.log("running test in directory", gc.testDir); - await testMain(gc); - } catch (e) { - console.error("FATAL: test failed with exception", e); - ret = 1; - } finally { - if (gc) { - if (shouldLinger()) { - console.log("test logs and config can be found under", gc.testDir); - console.log("keeping test environment running"); - } else { - await gc.shutdown(); - console.log("test logs and config can be found under", gc.testDir); - process.exit(ret); - } - } - } + testName: string, +): Promise<TestRunResult> { + const startMs = new Date().getTime(); + + const handleSignal = () => { + gc.shutdownSync(); + console.warn("**** received fatal signal, shutting down test harness"); + process.exit(1); }; - main(); -} + process.on("SIGINT", handleSignal); + process.on("SIGTERM", handleSignal); + process.on("unhandledRejection", handleSignal); + process.on("uncaughtException", handleSignal); -export function runTest( - testMain: (gc: GlobalTestState) => Promise<void>, -): void { - const gc = new GlobalTestState({ - testDir: fs.mkdtempSync(path.join(os.tmpdir(), "taler-integrationtest-")), - }); - runTestWithState(gc, testMain); + let status: TestStatus; + try { + console.log("running test in directory", gc.testDir); + await testMain(gc); + status = "pass"; + } catch (e) { + console.error("FATAL: test failed with exception", e); + status = "fail"; + } finally { + await gc.shutdown(); + } + const afterMs = new Date().getTime(); + return { + name: testName, + timeSec: (afterMs - startMs) / 1000, + status, + }; } function shellWrap(s: string) { diff --git a/packages/taler-integrationtests/src/helpers.ts b/packages/taler-wallet-cli/src/integrationtests/helpers.ts index f4e676b61..f4e676b61 100644 --- a/packages/taler-integrationtests/src/helpers.ts +++ b/packages/taler-wallet-cli/src/integrationtests/helpers.ts diff --git a/packages/taler-integrationtests/src/merchantApiTypes.ts b/packages/taler-wallet-cli/src/integrationtests/merchantApiTypes.ts index 6782391a2..6782391a2 100644 --- a/packages/taler-integrationtests/src/merchantApiTypes.ts +++ b/packages/taler-wallet-cli/src/integrationtests/merchantApiTypes.ts diff --git a/packages/taler-integrationtests/src/scenario-prompt-payment.ts b/packages/taler-wallet-cli/src/integrationtests/scenario-prompt-payment.ts index 3c34075d1..e3c2af8e6 100644 --- a/packages/taler-integrationtests/src/scenario-prompt-payment.ts +++ b/packages/taler-wallet-cli/src/integrationtests/scenario-prompt-payment.ts @@ -17,13 +17,13 @@ /** * Imports. */ -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; +import { GlobalTestState, MerchantPrivateApi } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runPromptPaymentScenario(t: GlobalTestState) { // Set up test environment const { @@ -57,4 +57,4 @@ runTest(async (t: GlobalTestState) => { // Wait "forever" await new Promise(() => {}); -}); +} diff --git a/packages/taler-integrationtests/src/test-bank-api.ts b/packages/taler-wallet-cli/src/integrationtests/test-bank-api.ts index 08991e279..b5cf6d5ba 100644 --- a/packages/taler-integrationtests/src/test-bank-api.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-bank-api.ts @@ -18,7 +18,6 @@ * Imports. */ import { - runTest, GlobalTestState, WalletCli, ExchangeService, @@ -35,7 +34,7 @@ import { defaultCoinConfig } from "./denomStructures"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runBankApiTest(t: GlobalTestState) { // Set up test environment const db = await setupDb(t); @@ -134,4 +133,4 @@ runTest(async (t: GlobalTestState) => { t.assertTrue( balResp.balance.credit_debit_indicator === CreditDebitIndicator.Debit, ); -}); +} diff --git a/packages/taler-integrationtests/src/test-claim-loop.ts b/packages/taler-wallet-cli/src/integrationtests/test-claim-loop.ts index 8c4df8740..5a0540e90 100644 --- a/packages/taler-integrationtests/src/test-claim-loop.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-claim-loop.ts @@ -18,10 +18,8 @@ * Imports. */ import { - runTest, GlobalTestState, MerchantPrivateApi, - WalletCli, } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; import { URL } from "url"; @@ -32,7 +30,7 @@ import { URL } from "url"; * FIXME: Is this test still necessary? We initially wrote if to confirm/document * assumptions about how the merchant should work. */ -runTest(async (t: GlobalTestState) => { +export async function runClaimLoopTest(t: GlobalTestState) { // Set up test environment const { @@ -80,4 +78,4 @@ runTest(async (t: GlobalTestState) => { t.assertTrue(orderStatusAfter.order_status === "claimed"); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-exchange-management.ts b/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts index be990d9b6..0fbef5687 100644 --- a/packages/taler-integrationtests/src/test-exchange-management.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts @@ -18,7 +18,6 @@ * Imports. */ import { - runTest, GlobalTestState, WalletCli, setupDb, @@ -43,7 +42,7 @@ import { defaultCoinConfig } from "./denomStructures"; /** * Test if the wallet handles outdated exchange versions correct.y */ -runTest(async (t: GlobalTestState) => { +export async function runExchangeManagementTest(t: GlobalTestState) { // Set up test environment const db = await setupDb(t); @@ -247,4 +246,4 @@ runTest(async (t: GlobalTestState) => { // Make sure the faulty exchange isn't used for the suggestion. t.assertTrue(wd.possibleExchanges.length === 0); -}); +} diff --git a/packages/taler-integrationtests/src/test-fee-regression.ts b/packages/taler-wallet-cli/src/integrationtests/test-fee-regression.ts index 7b3193df2..c56fe7abf 100644 --- a/packages/taler-integrationtests/src/test-fee-regression.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-fee-regression.ts @@ -17,9 +17,7 @@ /** * Imports. */ -import { defaultCoinConfig } from "./denomStructures"; import { - runTest, GlobalTestState, BankService, ExchangeService, @@ -166,7 +164,7 @@ export async function createMyTestkudosEnvironment( /** * Run test for basic, bank-integrated withdrawal and payment. */ -runTest(async (t: GlobalTestState) => { +export async function runFeeRegressionTest(t: GlobalTestState) { // Set up test environment const { @@ -203,4 +201,4 @@ runTest(async (t: GlobalTestState) => { const txs = await wallet.getTransactions(); t.assertAmountEquals(txs.transactions[1].amountEffective, "TESTKUDOS:1.30"); console.log(txs); -}); +} diff --git a/packages/taler-integrationtests/src/test-merchant-longpolling.ts b/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts index 5189d247e..7ceccbf62 100644 --- a/packages/taler-integrationtests/src/test-merchant-longpolling.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; +import { GlobalTestState, MerchantPrivateApi } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; import { PreparePayResultType, @@ -30,7 +30,7 @@ import axios from "axios"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runMerchantLongpollingTest(t: GlobalTestState) { // Set up test environment const { @@ -129,4 +129,4 @@ runTest(async (t: GlobalTestState) => { }); t.assertTrue(confirmPayRes.type === ConfirmPayResultType.Done); -}); +} diff --git a/packages/taler-integrationtests/src/test-merchant-refund-api.ts b/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts index 121c571d2..27cf34b58 100644 --- a/packages/taler-integrationtests/src/test-merchant-refund-api.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts @@ -18,10 +18,8 @@ * Imports. */ import { - runTest, GlobalTestState, MerchantPrivateApi, - MerchantService, BankServiceInterface, MerchantServiceInterface, WalletCli, @@ -256,7 +254,7 @@ async function testRefundApiWithFulfillmentMessage( /** * Test case for the refund API of the merchant backend. */ -runTest(async (t: GlobalTestState) => { +export async function runMerchantRefundApiTest(t: GlobalTestState) { // Set up test environment const { @@ -283,4 +281,4 @@ runTest(async (t: GlobalTestState) => { exchange, merchant, }); -}); +} diff --git a/packages/taler-integrationtests/src/test-pay-abort.ts b/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts index 566500091..4fd6edc92 100644 --- a/packages/taler-integrationtests/src/test-pay-abort.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts @@ -23,7 +23,6 @@ * Imports. */ import { - runTest, GlobalTestState, MerchantService, ExchangeService, @@ -31,8 +30,6 @@ import { BankService, WalletCli, MerchantPrivateApi, - BankApi, - BankAccessApi, } from "./harness"; import { FaultInjectedExchangeService, @@ -46,7 +43,7 @@ import { withdrawViaBank, makeTestPayment } from "./helpers"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runPayAbortTest(t: GlobalTestState) { // Set up test environment const db = await setupDb(t); @@ -199,4 +196,4 @@ runTest(async (t: GlobalTestState) => { const txTypes = txr.transactions.map((x) => x.type); t.assertDeepEqual(txTypes, ["withdrawal", "payment", "refund"]); -}); +} diff --git a/packages/taler-integrationtests/src/test-pay-paid.ts b/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts index 40f7d014f..4d2706608 100644 --- a/packages/taler-integrationtests/src/test-pay-paid.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; +import { GlobalTestState, MerchantPrivateApi } from "./harness"; import { withdrawViaBank, createFaultInjectedMerchantTestkudosEnvironment, @@ -39,7 +39,7 @@ import { FaultInjectionRequestContext } from "./faultInjection"; * since we can't initiate payment via a "claimed" private order status * response. */ -runTest(async (t: GlobalTestState) => { +export async function runPayPaidTest(t: GlobalTestState) { // Set up test environment const { @@ -203,4 +203,4 @@ runTest(async (t: GlobalTestState) => { // Make sure the wallet is actually doing the replay properly. t.assertTrue(numPaidRequested == 1); t.assertTrue(numPayRequested == 0); -}); +} diff --git a/packages/taler-integrationtests/src/test-payment-claim.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts index 6aed7e9e1..ee8a8e49c 100644 --- a/packages/taler-integrationtests/src/test-payment-claim.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts @@ -17,19 +17,14 @@ /** * Imports. */ -import { - runTest, - GlobalTestState, - MerchantPrivateApi, - WalletCli, -} from "./harness"; +import { GlobalTestState, MerchantPrivateApi, WalletCli } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; import { PreparePayResultType, TalerErrorCode } from "taler-wallet-core"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runPaymentClaimTest(t: GlobalTestState) { // Set up test environment const { @@ -106,4 +101,4 @@ runTest(async (t: GlobalTestState) => { ); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-payment-fault.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts index ca31e8eeb..55609f3fc 100644 --- a/packages/taler-integrationtests/src/test-payment-fault.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts @@ -22,7 +22,6 @@ * Imports. */ import { - runTest, GlobalTestState, MerchantService, ExchangeService, @@ -44,7 +43,7 @@ import { defaultCoinConfig } from "./denomStructures"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runPaymentFaultTest(t: GlobalTestState) { // Set up test environment const db = await setupDb(t); @@ -207,4 +206,4 @@ runTest(async (t: GlobalTestState) => { }); t.assertTrue(orderStatus.order_status === "paid"); -}); +} diff --git a/packages/taler-integrationtests/src/test-payment-idempotency.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts index 85be04d59..4323a7c9d 100644 --- a/packages/taler-integrationtests/src/test-payment-idempotency.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; +import { GlobalTestState, MerchantPrivateApi } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; import { PreparePayResultType } from "taler-wallet-core"; @@ -25,7 +25,7 @@ import { PreparePayResultType } from "taler-wallet-core"; * Test the wallet-core payment API, especially that repeated operations * return the expected result. */ -runTest(async (t: GlobalTestState) => { +export async function runPaymentIdempotencyTest(t: GlobalTestState) { // Set up test environment const { @@ -100,4 +100,4 @@ runTest(async (t: GlobalTestState) => { t.assertTrue(preparePayResultAfter.paid === true); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-payment-multiple.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-multiple.ts index c6a0868af..6d05df33b 100644 --- a/packages/taler-integrationtests/src/test-payment-multiple.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-multiple.ts @@ -18,7 +18,6 @@ * Imports. */ import { - runTest, GlobalTestState, setupDb, BankService, @@ -109,7 +108,7 @@ async function setupTest( * * This test uses a very sub-optimal denomination structure. */ -runTest(async (t: GlobalTestState) => { +export async function runPaymentMultipleTest(t: GlobalTestState) { // Set up test environment const { merchant, bank, exchange } = await setupTest(t); @@ -158,4 +157,4 @@ runTest(async (t: GlobalTestState) => { t.assertTrue(orderStatus.order_status === "paid"); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-payment-transient.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts index dc7ebbb1d..73973bdc0 100644 --- a/packages/taler-integrationtests/src/test-payment-transient.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; +import { GlobalTestState, MerchantPrivateApi } from "./harness"; import { withdrawViaBank, createFaultInjectedMerchantTestkudosEnvironment, @@ -41,7 +41,7 @@ import { * Run test for a payment where the merchant has a transient * failure in /pay */ -runTest(async (t: GlobalTestState) => { +export async function runPaymentTransientTest(t: GlobalTestState) { // Set up test environment const { @@ -169,4 +169,4 @@ runTest(async (t: GlobalTestState) => { `expected status 202 (after paying), but got ${publicOrderStatusResp.status}`, ); } -}); +}
\ No newline at end of file diff --git a/packages/taler-integrationtests/src/test-payment.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment.ts index 8a1240dab..68713fd9d 100644 --- a/packages/taler-integrationtests/src/test-payment.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-payment.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { runTest, GlobalTestState } from "./harness"; +import { GlobalTestState } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank, @@ -27,7 +27,7 @@ import { /** * Run test for basic, bank-integrated withdrawal and payment. */ -runTest(async (t: GlobalTestState) => { +export async function runPaymentTest(t: GlobalTestState) { // Set up test environment const { @@ -50,4 +50,4 @@ runTest(async (t: GlobalTestState) => { await makeTestPayment(t, { wallet, merchant, order }); await wallet.runUntilDone(); -}); +} diff --git a/packages/taler-integrationtests/src/test-paywall-flow.ts b/packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts index 54c8ab463..5eeb7d274 100644 --- a/packages/taler-integrationtests/src/test-paywall-flow.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; +import { GlobalTestState, MerchantPrivateApi } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; import { PreparePayResultType, @@ -29,7 +29,7 @@ import axios from "axios"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runPaywallFlowTest(t: GlobalTestState) { // Set up test environment const { @@ -230,4 +230,4 @@ runTest(async (t: GlobalTestState) => { console.log(publicOrderStatusResp.data); t.assertTrue(pubUnpaidStatus.already_paid_order_id === firstOrderId); -}); +} diff --git a/packages/taler-integrationtests/src/test-refund-auto.ts b/packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts index 1a7055fd4..afac993be 100644 --- a/packages/taler-integrationtests/src/test-refund-auto.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts @@ -17,14 +17,14 @@ /** * Imports. */ -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; +import { GlobalTestState, MerchantPrivateApi } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; -import { CoreApiResponse, durationFromSpec } from "taler-wallet-core"; +import { durationFromSpec } from "taler-wallet-core"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runRefundAutoTest(t: GlobalTestState) { // Set up test environment const { @@ -97,4 +97,4 @@ runTest(async (t: GlobalTestState) => { t.assertDeepEqual(transactionTypes, ["withdrawal", "payment", "refund"]); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-refund-gone.ts b/packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts index 764d5c28d..483e9e06d 100644 --- a/packages/taler-integrationtests/src/test-refund-gone.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; +import { GlobalTestState, MerchantPrivateApi } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank, @@ -33,7 +33,7 @@ import { /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runRefundGoneTest(t: GlobalTestState) { // Set up test environment const { @@ -124,4 +124,4 @@ runTest(async (t: GlobalTestState) => { console.log(JSON.stringify(r, undefined, 2)); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-refund-incremental.ts b/packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts index 7ad406daf..d90a4b5f6 100644 --- a/packages/taler-integrationtests/src/test-refund-incremental.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts @@ -17,19 +17,14 @@ /** * Imports. */ -import { - runTest, - GlobalTestState, - delayMs, - MerchantPrivateApi, -} from "./harness"; +import { GlobalTestState, delayMs, MerchantPrivateApi } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; import { TransactionType, Amounts, durationFromSpec } from "taler-wallet-core"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runRefundIncrementalTest(t: GlobalTestState) { // Set up test environment const { @@ -188,4 +183,4 @@ runTest(async (t: GlobalTestState) => { } await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-refund.ts b/packages/taler-wallet-cli/src/integrationtests/test-refund.ts index 908136518..12e6b178f 100644 --- a/packages/taler-integrationtests/src/test-refund.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-refund.ts @@ -18,13 +18,13 @@ * Imports. */ import { durationFromSpec } from "taler-wallet-core"; -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; +import { GlobalTestState, MerchantPrivateApi } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runRefundTest(t: GlobalTestState) { // Set up test environment const { @@ -100,4 +100,4 @@ runTest(async (t: GlobalTestState) => { console.log(JSON.stringify(r, undefined, 2)); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-revocation.ts b/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts index 32cb5d620..ac989855c 100644 --- a/packages/taler-integrationtests/src/test-revocation.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts @@ -18,9 +18,7 @@ * Imports. */ import { - runTest, GlobalTestState, - MerchantPrivateApi, ExchangeService, MerchantService, WalletCli, @@ -63,7 +61,7 @@ async function revokeAllWalletCoins(req: { /** * Basic time travel test. */ -runTest(async (t: GlobalTestState) => { +export async function runRevocationTest(t: GlobalTestState) { // Set up test environment const { @@ -119,4 +117,4 @@ runTest(async (t: GlobalTestState) => { } await makeTestPayment(t, { wallet, merchant, order }); -}); +} diff --git a/packages/taler-integrationtests/src/test-timetravel-autorefresh.ts b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts index 382051c8a..747f6d75d 100644 --- a/packages/taler-integrationtests/src/test-timetravel-autorefresh.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts @@ -31,7 +31,6 @@ import { GlobalTestState, MerchantPrivateApi, MerchantService, - runTest, setupDb, WalletCli, } from "./harness"; @@ -67,7 +66,7 @@ async function applyTimeTravel( /** * Basic time travel test. */ -runTest(async (t: GlobalTestState) => { +export async function runTimetravelAutorefreshTest(t: GlobalTestState) { // Set up test environment const db = await setupDb(t); @@ -201,4 +200,4 @@ runTest(async (t: GlobalTestState) => { }); t.assertTrue(cpr.type === ConfirmPayResultType.Done); -}); +} diff --git a/packages/taler-integrationtests/src/test-timetravel-withdraw.ts b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts index e0124d462..b4de50b95 100644 --- a/packages/taler-integrationtests/src/test-timetravel-withdraw.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { runTest, GlobalTestState } from "./harness"; +import { GlobalTestState } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank, @@ -28,7 +28,7 @@ import { Duration, TransactionType } from "taler-wallet-core"; /** * Basic time travel test. */ -runTest(async (t: GlobalTestState) => { +export async function runTimetravelWithdrawTest(t: GlobalTestState){ // Set up test environment const { @@ -87,4 +87,4 @@ runTest(async (t: GlobalTestState) => { // This doesn't work yet, see https://bugs.taler.net/n/6585 // await wallet.runUntilDone({ maxRetries: 5 }); -}); +}
\ No newline at end of file diff --git a/packages/taler-integrationtests/src/test-tipping.ts b/packages/taler-wallet-cli/src/integrationtests/test-tipping.ts index 4735de81a..01ec6c1bb 100644 --- a/packages/taler-integrationtests/src/test-tipping.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-tipping.ts @@ -18,7 +18,6 @@ * Imports. */ import { - runTest, GlobalTestState, MerchantPrivateApi, BankApi, @@ -28,7 +27,7 @@ import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runTippingTest(t: GlobalTestState) { // Set up test environment const { @@ -125,4 +124,4 @@ runTest(async (t: GlobalTestState) => { // Check twice so make sure tip handling is idempotent await doTip(); await doTip(); -}); +} diff --git a/packages/taler-integrationtests/src/test-wallettesting.ts b/packages/taler-wallet-cli/src/integrationtests/test-wallettesting.ts index a6014a88d..cdb954858 100644 --- a/packages/taler-integrationtests/src/test-wallettesting.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-wallettesting.ts @@ -22,13 +22,13 @@ /** * Imports. */ -import { runTest, GlobalTestState } from "./harness"; +import { GlobalTestState } from "./harness"; import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runWallettestingTest(t: GlobalTestState) { const { wallet, bank, @@ -84,4 +84,4 @@ runTest(async (t: GlobalTestState) => { t.assertDeepEqual(txTypes, ["withdrawal", "payment"]); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-withdrawal-abort-bank.ts b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-abort-bank.ts index dd848b93d..9a4e6004b 100644 --- a/packages/taler-integrationtests/src/test-withdrawal-abort-bank.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-abort-bank.ts @@ -17,14 +17,14 @@ /** * Imports. */ -import { runTest, GlobalTestState, BankApi, BankAccessApi } from "./harness"; +import { GlobalTestState, BankApi, BankAccessApi } from "./harness"; import { createSimpleTestkudosEnvironment } from "./helpers"; import { codecForBalancesResponse, TalerErrorCode } from "taler-wallet-core"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runWithdrawalAbortBankTest(t: GlobalTestState) { // Set up test environment const { wallet, bank, exchange } = await createSimpleTestkudosEnvironment(t); @@ -64,4 +64,4 @@ runTest(async (t: GlobalTestState) => { ); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-withdrawal-bank-integrated.ts b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-bank-integrated.ts index d54309b31..89f5104a9 100644 --- a/packages/taler-integrationtests/src/test-withdrawal-bank-integrated.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-bank-integrated.ts @@ -17,14 +17,14 @@ /** * Imports. */ -import { runTest, GlobalTestState, BankApi, BankAccessApi } from "./harness"; +import { GlobalTestState, BankApi, BankAccessApi } from "./harness"; import { createSimpleTestkudosEnvironment } from "./helpers"; import { codecForBalancesResponse } from "taler-wallet-core"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runWithdrawalBankIntegratedTest(t: GlobalTestState) { // Set up test environment const { wallet, bank, exchange } = await createSimpleTestkudosEnvironment(t); @@ -68,4 +68,4 @@ runTest(async (t: GlobalTestState) => { t.assertAmountEquals("TESTKUDOS:9.72", balResp.balances[0].available); await t.shutdown(); -}); +} diff --git a/packages/taler-integrationtests/src/test-withdrawal-manual.ts b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts index aeac74d9f..ef0db4a19 100644 --- a/packages/taler-integrationtests/src/test-withdrawal-manual.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { runTest, GlobalTestState, BankApi } from "./harness"; +import { GlobalTestState, BankApi } from "./harness"; import { createSimpleTestkudosEnvironment } from "./helpers"; import { CoreApiResponse } from "taler-wallet-core"; import { codecForBalancesResponse } from "taler-wallet-core"; @@ -25,7 +25,7 @@ import { codecForBalancesResponse } from "taler-wallet-core"; /** * Run test for basic, bank-integrated withdrawal. */ -runTest(async (t: GlobalTestState) => { +export async function runTestWithdrawalManualTest(t: GlobalTestState) { // Set up test environment const { @@ -75,4 +75,4 @@ runTest(async (t: GlobalTestState) => { t.assertAmountEquals("TESTKUDOS:9.72", balResp.balances[0].available); await t.shutdown(); -}); +} diff --git a/packages/taler-wallet-cli/src/integrationtests/testrunner.ts b/packages/taler-wallet-cli/src/integrationtests/testrunner.ts new file mode 100644 index 000000000..d9804562e --- /dev/null +++ b/packages/taler-wallet-cli/src/integrationtests/testrunner.ts @@ -0,0 +1,176 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +import { GlobalTestState, runTestWithState, TestRunResult } from "./harness"; +import { runPaymentTest } from "./test-payment"; +import * as fs from "fs"; +import * as path from "path"; +import * as os from "os"; +import { runBankApiTest } from "./test-bank-api"; +import { runClaimLoopTest } from "./test-claim-loop"; +import { runExchangeManagementTest } from "./test-exchange-management"; +import { runFeeRegressionTest } from "./test-fee-regression"; +import { runMerchantLongpollingTest } from "./test-merchant-longpolling"; +import { runMerchantRefundApiTest } from "./test-merchant-refund-api"; +import { runPayAbortTest } from "./test-pay-abort"; +import { runPayPaidTest } from "./test-pay-paid"; +import { runPaymentClaimTest } from "./test-payment-claim"; +import { runPaymentFaultTest } from "./test-payment-fault"; +import { runPaymentIdempotencyTest } from "./test-payment-idempotency"; +import { runPaymentMultipleTest } from "./test-payment-multiple"; +import { runPaymentTransientTest } from "./test-payment-transient"; +import { runPaywallFlowTest } from "./test-paywall-flow"; +import { runRefundAutoTest } from "./test-refund-auto"; +import { runRefundGoneTest } from "./test-refund-gone"; +import { runRefundIncrementalTest } from "./test-refund-incremental"; +import { runRefundTest } from "./test-refund"; +import { runRevocationTest } from "./test-revocation"; +import { runTimetravelAutorefreshTest } from "./test-timetravel-autorefresh"; +import { runTimetravelWithdrawTest } from "./test-timetravel-withdraw"; +import { runTippingTest } from "./test-tipping"; +import { runWallettestingTest } from "./test-wallettesting"; +import { runTestWithdrawalManualTest } from "./test-withdrawal-manual"; +import { runWithdrawalAbortBankTest } from "./test-withdrawal-abort-bank"; +import { runWithdrawalBankIntegratedTest } from "./test-withdrawal-bank-integrated"; +import M from "minimatch"; + +/** + * Test runner. + */ + +/** + * Spec for one test. + */ +interface TestMainFunction { + (t: GlobalTestState): Promise<void>; +} + +const allTests: TestMainFunction[] = [ + runBankApiTest, + runClaimLoopTest, + runExchangeManagementTest, + runFeeRegressionTest, + runMerchantLongpollingTest, + runMerchantRefundApiTest, + runPayAbortTest, + runPayPaidTest, + runPaymentClaimTest, + runPaymentFaultTest, + runPaymentIdempotencyTest, + runPaymentMultipleTest, + runPaymentTransientTest, + runPaywallFlowTest, + runRefundAutoTest, + runRefundGoneTest, + runRefundIncrementalTest, + runRefundTest, + runRevocationTest, + runTimetravelAutorefreshTest, + runTimetravelWithdrawTest, + runTippingTest, + runWallettestingTest, + runWithdrawalAbortBankTest, + runWithdrawalBankIntegratedTest, + runWallettestingTest, + runPaymentTest, +]; + +export interface TestRunSpec { + include_pattern?: string; +} + +export interface TestInfo { + name: string; +} + +function updateCurrentSymlink(testDir: string): void { + const currLink = path.join(os.tmpdir(), "taler-integrationtests-current"); + try { + fs.unlinkSync(currLink); + } catch (e) { + // Ignore + } + try { + fs.symlinkSync(testDir, currLink); + } catch (e) { + console.log(e); + // Ignore + } +} + +export function getTestName(tf: TestMainFunction): string { + const res = tf.name.match(/run([a-zA-Z0-9]*)Test/); + if (!res) { + throw Error("invalid test name, must be 'run${NAME}Test'"); + } + return res[1] + .replace(/[a-z0-9][A-Z]/, (x) => { + return x[0] + "-" + x[1]; + }) + .toLowerCase(); +} + +export async function runTests(spec: TestRunSpec) { + const testRootDir = fs.mkdtempSync( + path.join(os.tmpdir(), "taler-integrationtests-"), + ); + updateCurrentSymlink(testRootDir); + console.log("testsuite root directory: ", testRootDir); + + let numTotal = 0; + let numFail = 0; + let numSkip = 0; + let numPass = 0; + + const testResults: TestRunResult[] = []; + + for (const [n, testCase] of allTests.entries()) { + const testName = getTestName(testCase); + if (spec.include_pattern && !M(testName, spec.include_pattern)) { + continue; + } + const testDir = path.join(testRootDir, testName); + fs.mkdirSync(testDir); + console.log(`running test ${testName}`); + const gc = new GlobalTestState({ + testDir, + }); + const result = await runTestWithState(gc, testCase, testName); + testResults.push(result); + console.log(result); + numTotal++; + if (result.status === "fail") { + numFail++; + } else if (result.status === "skip") { + numSkip++; + } else if (result.status === "pass") { + numPass++; + } + } + const resultsFile = path.join(testRootDir, "results.json"); + fs.writeFileSync( + path.join(testRootDir, "results.json"), + JSON.stringify({ testResults }, undefined, 2), + ); + console.log(`See ${resultsFile} for details`); + console.log(`Passed: ${numPass}/${numTotal}`); +} + +export function getTestInfo(): TestInfo[] { + return allTests.map((x) => ({ + name: getTestName(x), + })); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a81089d8a..9c3dcaac0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,7 +34,7 @@ importers: packages/taler-integrationtests: dependencies: axios: 0.21.0 - taler-wallet-core: 'link:../taler-wallet-core' + taler-wallet-core: link:../taler-wallet-core tslib: 2.0.3 devDependencies: esm: 3.2.25 @@ -49,13 +49,13 @@ importers: nyc: ^15.1.0 prettier: ^2.1.2 source-map-support: ^0.5.19 - taler-wallet-core: 'workspace:*' + taler-wallet-core: workspace:* ts-node: ^9.0.0 tslib: ^2.0.3 typescript: ^4.0.5 packages/taler-wallet-android: dependencies: - taler-wallet-core: 'link:../taler-wallet-core' + taler-wallet-core: link:../taler-wallet-core tslib: 2.0.3 devDependencies: '@rollup/plugin-commonjs': 16.0.0_rollup@2.33.2 @@ -80,14 +80,16 @@ importers: rollup: ^2.33.2 rollup-plugin-sourcemaps: ^0.6.3 rollup-plugin-terser: ^7.0.2 - taler-wallet-core: 'workspace:*' + taler-wallet-core: workspace:* tslib: ^2.0.3 typescript: ^4.0.5 packages/taler-wallet-cli: dependencies: + '@types/minimatch': 3.0.3 axios: 0.21.0 + minimatch: 3.0.4 source-map-support: 0.5.19 - taler-wallet-core: 'link:../taler-wallet-core' + taler-wallet-core: link:../taler-wallet-core tslib: 2.0.3 devDependencies: '@rollup/plugin-commonjs': 16.0.0_rollup@2.33.2 @@ -107,15 +109,17 @@ importers: '@rollup/plugin-json': ^4.1.0 '@rollup/plugin-node-resolve': ^10.0.0 '@rollup/plugin-replace': ^2.3.4 + '@types/minimatch': ^3.0.3 '@types/node': ^14.14.7 axios: ^0.21.0 + minimatch: ^3.0.4 prettier: ^2.1.2 rimraf: ^3.0.2 rollup: ^2.33.2 rollup-plugin-sourcemaps: ^0.6.3 rollup-plugin-terser: ^7.0.2 source-map-support: ^0.5.19 - taler-wallet-core: 'workspace:*' + taler-wallet-core: workspace:* tslib: ^2.0.3 typedoc: ^0.19.2 typescript: ^4.0.5 @@ -125,7 +129,7 @@ importers: axios: 0.21.0 big-integer: 1.6.48 fflate: 0.3.10 - idb-bridge: 'link:../idb-bridge' + idb-bridge: link:../idb-bridge source-map-support: 0.5.19 tslib: 2.0.3 devDependencies: @@ -144,7 +148,7 @@ importers: jed: 1.1.1 nyc: 15.1.0 po2json: 0.4.5 - pogen: 'link:../pogen' + pogen: link:../pogen prettier: 2.1.2 rimraf: 3.0.2 rollup: 2.33.2 @@ -169,11 +173,11 @@ importers: eslint-plugin-react-hooks: ^4.2.0 esm: ^3.2.25 fflate: ^0.3.10 - idb-bridge: 'workspace:*' + idb-bridge: workspace:* jed: ^1.1.1 nyc: ^15.1.0 po2json: ^0.4.5 - pogen: 'workspace:*' + pogen: workspace:* prettier: ^2.1.2 rimraf: ^3.0.2 rollup: ^2.33.2 @@ -186,7 +190,7 @@ importers: packages/taler-wallet-webextension: dependencies: moment: 2.29.1 - taler-wallet-core: 'link:../taler-wallet-core' + taler-wallet-core: link:../taler-wallet-core tslib: 2.0.3 devDependencies: '@rollup/plugin-commonjs': 16.0.0_rollup@2.33.2 @@ -232,7 +236,7 @@ importers: rollup-plugin-ignore: ^1.0.9 rollup-plugin-sourcemaps: ^0.6.3 rollup-plugin-terser: ^7.0.2 - taler-wallet-core: 'workspace:*' + taler-wallet-core: workspace:* tslib: ^2.0.3 typescript: ^4.0.5 lockfileVersion: 5.2 @@ -684,6 +688,10 @@ packages: dev: true resolution: integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + /@types/minimatch/3.0.3: + dev: false + resolution: + integrity: sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== /@types/node/10.17.13: dev: true resolution: @@ -1222,7 +1230,6 @@ packages: resolution: integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== /balanced-match/1.0.0: - dev: true resolution: integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= /big-integer/1.6.48: @@ -1264,7 +1271,6 @@ packages: dependencies: balanced-match: 1.0.0 concat-map: 0.0.1 - dev: true resolution: integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== /braces/3.0.2: @@ -1525,7 +1531,6 @@ packages: resolution: integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= /concat-map/0.0.1: - dev: true resolution: integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= /concordance/5.0.1: @@ -3431,7 +3436,6 @@ packages: /minimatch/3.0.4: dependencies: brace-expansion: 1.1.11 - dev: true resolution: integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== /minimist/1.2.5: diff --git a/tsconfig.build.json b/tsconfig.build.json index 6755b8e80..6db804a34 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,7 +1,7 @@ { "compileOnSave": true, "compilerOptions": { - "composite": true, + "composite": true }, "references": [ { @@ -11,9 +11,6 @@ "path": "packages/taler-wallet-core/" }, { - "path": "packages/taler-integrationtests" - }, - { "path": "packages/taler-wallet-cli" } ], |