test harness: abstracting import of BankService

This commit is contained in:
ms 2021-10-29 15:07:16 +02:00
parent 32318a80f4
commit 1419751bfb
No known key found for this signature in database
GPG Key ID: 8D526861953F4C0F

View File

@ -607,118 +607,126 @@ export namespace BankApi {
} }
} }
export class BankService implements BankServiceInterface { /**
proc: ProcessWrapper | undefined; * Method explained here:
* https://github.com/microsoft/TypeScript/issues/2552
*/
module BankServices {
export class PybankService implements BankServiceInterface {
proc: ProcessWrapper | undefined;
static fromExistingConfig(gc: GlobalTestState): BankService { static fromExistingConfig(gc: GlobalTestState): BankService {
const cfgFilename = gc.testDir + "/bank.conf"; const cfgFilename = gc.testDir + "/bank.conf";
console.log("reading bank config from", cfgFilename); console.log("reading bank config from", cfgFilename);
const config = Configuration.load(cfgFilename); const config = Configuration.load(cfgFilename);
const bc: BankConfig = { const bc: BankConfig = {
allowRegistrations: config allowRegistrations: config
.getYesNo("bank", "allow_registrations") .getYesNo("bank", "allow_registrations")
.required(), .required(),
currency: config.getString("taler", "currency").required(), currency: config.getString("taler", "currency").required(),
database: config.getString("bank", "database").required(), database: config.getString("bank", "database").required(),
httpPort: config.getNumber("bank", "http_port").required(), httpPort: config.getNumber("bank", "http_port").required(),
}; };
return new BankService(gc, bc, cfgFilename); return new BankService(gc, bc, cfgFilename);
} }
static async create( static async create(
gc: GlobalTestState, gc: GlobalTestState,
bc: BankConfig, bc: BankConfig,
): Promise<BankService> { ): Promise<BankService> {
const config = new Configuration(); const config = new Configuration();
setTalerPaths(config, gc.testDir + "/talerhome"); setTalerPaths(config, gc.testDir + "/talerhome");
config.setString("taler", "currency", bc.currency); config.setString("taler", "currency", bc.currency);
config.setString("bank", "database", bc.database); config.setString("bank", "database", bc.database);
config.setString("bank", "http_port", `${bc.httpPort}`); config.setString("bank", "http_port", `${bc.httpPort}`);
config.setString("bank", "serve", "http"); config.setString("bank", "serve", "http");
config.setString("bank", "max_debt_bank", `${bc.currency}:999999`); config.setString("bank", "max_debt_bank", `${bc.currency}:999999`);
config.setString("bank", "max_debt", bc.maxDebt ?? `${bc.currency}:100`); config.setString("bank", "max_debt", bc.maxDebt ?? `${bc.currency}:100`);
config.setString( config.setString(
"bank", "bank",
"allow_registrations", "allow_registrations",
bc.allowRegistrations ? "yes" : "no", bc.allowRegistrations ? "yes" : "no",
); );
const cfgFilename = gc.testDir + "/bank.conf"; const cfgFilename = gc.testDir + "/bank.conf";
config.write(cfgFilename); config.write(cfgFilename);
await sh( await sh(
gc, gc,
"taler-bank-manage_django", "taler-bank-manage_django",
`taler-bank-manage -c '${cfgFilename}' django migrate`, `taler-bank-manage -c '${cfgFilename}' django migrate`,
); );
await sh( await sh(
gc, gc,
"taler-bank-manage_django", "taler-bank-manage_django",
`taler-bank-manage -c '${cfgFilename}' django provide_accounts`, `taler-bank-manage -c '${cfgFilename}' django provide_accounts`,
); );
return new BankService(gc, bc, cfgFilename); return new BankService(gc, bc, cfgFilename);
} }
setSuggestedExchange(e: ExchangeServiceInterface, exchangePayto: string) { setSuggestedExchange(e: ExchangeServiceInterface, exchangePayto: string) {
const config = Configuration.load(this.configFile); const config = Configuration.load(this.configFile);
config.setString("bank", "suggested_exchange", e.baseUrl); config.setString("bank", "suggested_exchange", e.baseUrl);
config.setString("bank", "suggested_exchange_payto", exchangePayto); config.setString("bank", "suggested_exchange_payto", exchangePayto);
} }
get baseUrl(): string { get baseUrl(): string {
return `http://localhost:${this.bankConfig.httpPort}/`; return `http://localhost:${this.bankConfig.httpPort}/`;
} }
async createExchangeAccount( async createExchangeAccount(
accountName: string, accountName: string,
password: string, password: string,
): Promise<HarnessExchangeBankAccount> { ): Promise<HarnessExchangeBankAccount> {
await sh( await sh(
this.globalTestState, this.globalTestState,
"taler-bank-manage_django", "taler-bank-manage_django",
`taler-bank-manage -c '${this.configFile}' django add_bank_account ${accountName}`, `taler-bank-manage -c '${this.configFile}' django add_bank_account ${accountName}`,
); );
await sh( await sh(
this.globalTestState, this.globalTestState,
"taler-bank-manage_django", "taler-bank-manage_django",
`taler-bank-manage -c '${this.configFile}' django changepassword_unsafe ${accountName} ${password}`, `taler-bank-manage -c '${this.configFile}' django changepassword_unsafe ${accountName} ${password}`,
); );
await sh( await sh(
this.globalTestState, this.globalTestState,
"taler-bank-manage_django", "taler-bank-manage_django",
`taler-bank-manage -c '${this.configFile}' django top_up ${accountName} ${this.bankConfig.currency}:100000`, `taler-bank-manage -c '${this.configFile}' django top_up ${accountName} ${this.bankConfig.currency}:100000`,
); );
return { return {
accountName: accountName, accountName: accountName,
accountPassword: password, accountPassword: password,
accountPaytoUri: `payto://x-taler-bank/${accountName}`, accountPaytoUri: `payto://x-taler-bank/${accountName}`,
wireGatewayApiBaseUrl: `http://localhost:${this.bankConfig.httpPort}/taler-wire-gateway/${accountName}/`, wireGatewayApiBaseUrl: `http://localhost:${this.bankConfig.httpPort}/taler-wire-gateway/${accountName}/`,
}; };
} }
get port() { get port() {
return this.bankConfig.httpPort; return this.bankConfig.httpPort;
} }
private constructor( private constructor(
private globalTestState: GlobalTestState, private globalTestState: GlobalTestState,
private bankConfig: BankConfig, private bankConfig: BankConfig,
private configFile: string, private configFile: string,
) {} ) {}
async start(): Promise<void> { async start(): Promise<void> {
this.proc = this.globalTestState.spawnService( this.proc = this.globalTestState.spawnService(
"taler-bank-manage", "taler-bank-manage",
["-c", this.configFile, "serve"], ["-c", this.configFile, "serve"],
"bank", "bank",
); );
} }
async pingUntilAvailable(): Promise<void> { async pingUntilAvailable(): Promise<void> {
const url = `http://localhost:${this.bankConfig.httpPort}/config`; const url = `http://localhost:${this.bankConfig.httpPort}/config`;
await pingProc(this.proc, url, "bank"); await pingProc(this.proc, url, "bank");
}
} }
} }
import BankService = BankServices.PybankService;
export { BankService };
export class FakeBankService { export class FakeBankService {
proc: ProcessWrapper | undefined; proc: ProcessWrapper | undefined;