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