TWG refund tests.

Arriving to the point where Libeufin services get
launched and configured with multiple users.  The
configuration provides: bank accounts, bank connections
and facades; all being created via the abstraction
"bundling" layer of one Libeufin 'user'.
This commit is contained in:
MS 2021-02-15 10:43:05 +01:00
parent 118975fee3
commit 7a2ab04da8
No known key found for this signature in database
GPG Key ID: 8D526861953F4C0F
3 changed files with 168 additions and 9 deletions

View File

@ -21,9 +21,11 @@ import axios from "axios";
import { URL } from "@gnu-taler/taler-wallet-core";
import {
GlobalTestState,
DbInfo,
pingProc,
ProcessWrapper,
runCommand,
setupDb,
sh,
} from "./harness";
@ -35,6 +37,12 @@ export interface LibeufinNexusServiceInterface {
baseUrl: string;
}
export interface LibeufinServices {
libeufinSandbox: LibeufinSandboxServiceInterface;
libeufinNexus: LibeufinNexusServiceInterface;
commonDb: DbInfo;
}
export interface LibeufinSandboxConfig {
httpPort: number;
databaseJdbcUri: string;
@ -255,11 +263,13 @@ export interface SimulateIncomingTransactionRequest {
export class NexusUserBundle {
userReq: CreateNexusUserRequest;
connReq: CreateEbicsBankConnectionRequest;
twg: CreateTalerWireGatewayFacadeRequest;
twgReq: CreateTalerWireGatewayFacadeRequest;
twgTransferPermission: PostNexusPermissionRequest;
twgHistoryPermission: PostNexusPermissionRequest;
localAccountName: string;
remoteAccountName: string;
constructor(ebicsURL: string, salt: string) {
constructor(salt: string, ebicsURL: string) {
this.userReq = {
username: `username-${salt}`,
password: `password-${salt}`,
@ -268,12 +278,12 @@ export class NexusUserBundle {
this.connReq = {
name: `connection-${salt}`,
ebicsURL: ebicsURL,
hostID: `ebicshost-${salt}`,
partnerID: `ebicspartner-${salt}`,
userID: `ebicsuser-${salt}`,
hostID: `ebicshost,${salt}`,
partnerID: `ebicspartner,${salt}`,
userID: `ebicsuser,${salt}`,
};
this.twg = {
this.twgReq = {
currency: "EUR",
name: `twg-${salt}`,
reserveTransferLevel: "report",
@ -282,6 +292,26 @@ export class NexusUserBundle {
};
this.remoteAccountName = `remote-account-${salt}`;
this.localAccountName = `local-account-${salt}`;
this.twgTransferPermission = {
action: "grant",
permission: {
subjectType: `username-${salt}`,
subjectId: "twguser",
resourceType: "facade",
resourceId: `twg-${salt}`,
permissionName: "facade.talerWireGateway.transfer",
},
};
this.twgHistoryPermission = {
action: "grant",
permission: {
subjectType: `username-${salt}`,
subjectId: "twguser",
resourceType: "facade",
resourceId: `twg-${salt}`,
permissionName: "facade.talerWireGateway.history",
},
};
}
}
@ -303,9 +333,9 @@ export class SandboxUserBundle {
label: `remote-account-${salt}`,
name: `Taler Exchange: ${salt}`,
subscriber: {
hostID: `ebicshost-${salt}`,
partnerID: `ebicspartner-${salt}`,
userID: `ebicsuser-${salt}`,
hostID: `ebicshost,${salt}`,
partnerID: `ebicspartner,${salt}`,
userID: `ebicsuser,${salt}`,
},
};
}
@ -873,3 +903,81 @@ export namespace LibeufinNexusApi {
);
}
}
/**
* Launch Nexus and Sandbox.
*/
export async function launchLibeufinServices(
t: GlobalTestState,
nexusUserBundle: NexusUserBundle[],
sandboxUserBundle: SandboxUserBundle[],
): Promise<LibeufinServices> {
const db = await setupDb(t);
const libeufinSandbox = await LibeufinSandboxService.create(t, {
httpPort: 5010,
databaseJdbcUri: `jdbc:sqlite:${t.testDir}/libeufin-sandbox.sqlite3`,
});
await libeufinSandbox.start();
await libeufinSandbox.pingUntilAvailable();
const libeufinNexus = await LibeufinNexusService.create(t, {
httpPort: 5011,
databaseJdbcUri: `jdbc:sqlite:${t.testDir}/libeufin-nexus.sqlite3`,
});
await libeufinNexus.start();
await libeufinNexus.pingUntilAvailable();
console.log("Libeufin services launched!");
for (let sb of sandboxUserBundle) {
await LibeufinSandboxApi.createEbicsHost(
libeufinSandbox,
sb.ebicsBankAccount.subscriber.hostID,
);
await LibeufinSandboxApi.createEbicsSubscriber(
libeufinSandbox,
sb.ebicsBankAccount.subscriber,
);
await LibeufinSandboxApi.createEbicsBankAccount(
libeufinSandbox,
sb.ebicsBankAccount,
);
}
console.log("Sandbox user(s) / account(s) / subscriber(s): created");
for (let nb of nexusUserBundle) {
await LibeufinNexusApi.createEbicsBankConnection(libeufinNexus, nb.connReq);
await LibeufinNexusApi.connectBankConnection(
libeufinNexus,
nb.connReq.name,
);
await LibeufinNexusApi.fetchAccounts(libeufinNexus, nb.connReq.name);
await LibeufinNexusApi.importConnectionAccount(
libeufinNexus,
nb.connReq.name,
nb.remoteAccountName,
nb.localAccountName,
);
await LibeufinNexusApi.createTwgFacade(libeufinNexus, nb.twgReq);
await LibeufinNexusApi.createUser(libeufinNexus, nb.userReq);
await LibeufinNexusApi.postPermission(
libeufinNexus,
nb.twgTransferPermission,
);
await LibeufinNexusApi.postPermission(
libeufinNexus,
nb.twgHistoryPermission,
);
}
console.log(
"Nexus user(s) / connection(s) / facade(s) / permission(s): created",
);
return {
commonDb: db,
libeufinNexus: libeufinNexus,
libeufinSandbox: libeufinSandbox,
};
}

View File

@ -0,0 +1,49 @@
/*
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 { CoreApiResponse } from "@gnu-taler/taler-wallet-core";
import { CoinConfig, defaultCoinConfig } from "./denomStructures";
import { GlobalTestState } from "./harness";
import {
SandboxUserBundle,
NexusUserBundle,
launchLibeufinServices,
} from "./libeufin";
/**
* Run basic test with LibEuFin.
*/
export async function runLibeufinRefundTest(t: GlobalTestState) {
const user01nexus = new NexusUserBundle(
"01",
"http://localhost:5010/ebicsweb",
);
const user01sandbox = new SandboxUserBundle("01");
const user02nexus = new NexusUserBundle(
"02",
"http://localhost:5010/ebicsweb",
);
const user02sandbox = new SandboxUserBundle("02");
await launchLibeufinServices(
t,
[user01nexus, user02nexus],
[user01sandbox, user02sandbox],
);
}

View File

@ -55,6 +55,7 @@ import { runWithdrawalBankIntegratedTest } from "./test-withdrawal-bank-integrat
import M from "minimatch";
import { runMerchantExchangeConfusionTest } from "./test-merchant-exchange-confusion";
import { runLibeufinBasicTest } from "./test-libeufin-basic";
import { runLibeufinRefundTest } from "./test-libeufin-refund";
import { runLibeufinTutorialTest } from "./test-libeufin-tutorial";
import { runDepositTest } from "./test-deposit";
import CancellationToken from "cancellationtoken";
@ -79,6 +80,7 @@ const allTests: TestMainFunction[] = [
runFeeRegressionTest,
runLibeufinBasicTest,
runLibeufinTutorialTest,
runLibeufinRefundTest,
runMerchantExchangeConfusionTest,
runMerchantLongpollingTest,
runMerchantRefundApiTest,