aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-harness/src/harness/harness.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-harness/src/harness/harness.ts')
-rw-r--r--packages/taler-harness/src/harness/harness.ts299
1 files changed, 2 insertions, 297 deletions
diff --git a/packages/taler-harness/src/harness/harness.ts b/packages/taler-harness/src/harness/harness.ts
index a16cef7ba..df3c9b215 100644
--- a/packages/taler-harness/src/harness/harness.ts
+++ b/packages/taler-harness/src/harness/harness.ts
@@ -57,6 +57,8 @@ import {
WalletNotification,
codecForAny,
AccountAddDetails,
+ MerchantInstanceConfig,
+ PartialMerchantInstanceConfig,
} from "@gnu-taler/taler-util";
import {
createPlatformHttpLib,
@@ -1339,23 +1341,12 @@ export interface MerchantConfig {
overrideTestDir?: string;
}
-export interface PrivateOrderStatusQuery {
- instance?: string;
- orderId: string;
- sessionId?: string;
-}
-
export interface MerchantServiceInterface {
makeInstanceBaseUrl(instanceName?: string): string;
readonly port: number;
readonly name: string;
}
-export interface DeleteTippingReserveArgs {
- reservePub: string;
- purge?: boolean;
-}
-
/**
* Default HTTP client handle for the integration test harness.
*/
@@ -1364,232 +1355,6 @@ export const harnessHttpLib = createPlatformHttpLib({
enableThrottling: false,
});
-/**
- * FIXME: Move this out of the harness.
- */
-export class MerchantApiClient {
- /**
- * Base URL for the particular instance that this merchant API client
- * is for.
- */
- private baseUrl: string;
-
- readonly auth: MerchantAuthConfiguration;
-
- constructor(baseUrl: string, auth?: MerchantAuthConfiguration) {
- this.baseUrl = baseUrl;
-
- this.auth = auth ?? {
- method: "external",
- };
- }
-
- httpClient = createPlatformHttpLib({
- allowHttp: true,
- enableThrottling: false,
- });
-
- async changeAuth(auth: MerchantAuthConfiguration): Promise<void> {
- const url = new URL("private/auth", this.baseUrl);
- const res = await this.httpClient.fetch(url.href, {
- method: "POST",
- body: auth,
- headers: this.makeAuthHeader(),
- });
- await expectSuccessResponseOrThrow(res);
- }
-
- async deleteTippingReserve(req: DeleteTippingReserveArgs): Promise<void> {
- const url = new URL(`private/reserves/${req.reservePub}`, this.baseUrl);
- if (req.purge) {
- url.searchParams.set("purge", "YES");
- }
- const resp = await this.httpClient.fetch(url.href, {
- method: "DELETE",
- headers: this.makeAuthHeader(),
- });
- logger.info(`delete status: ${resp.status}`);
- return;
- }
-
- async createTippingReserve(
- req: CreateMerchantTippingReserveRequest,
- ): Promise<MerchantReserveCreateConfirmation> {
- const url = new URL("private/reserves", this.baseUrl);
- const resp = await this.httpClient.fetch(url.href, {
- method: "POST",
- body: req,
- headers: this.makeAuthHeader(),
- });
- const respData = readSuccessResponseJsonOrThrow(
- resp,
- codecForMerchantReserveCreateConfirmation(),
- );
- return respData;
- }
-
- async getPrivateInstanceInfo(): Promise<any> {
- const url = new URL("private", this.baseUrl);
- const resp = await this.httpClient.fetch(url.href, {
- method: "GET",
- headers: this.makeAuthHeader(),
- });
- return await resp.json();
- }
-
- async getPrivateTipReserves(): Promise<TippingReserveStatus> {
- const url = new URL("private/reserves", this.baseUrl);
- const resp = await this.httpClient.fetch(url.href, {
- method: "GET",
- headers: this.makeAuthHeader(),
- });
- // FIXME: Validate!
- return await resp.json();
- }
-
- async deleteInstance(instanceId: string) {
- const url = new URL(`management/instances/${instanceId}`, this.baseUrl);
- const resp = await this.httpClient.fetch(url.href, {
- method: "DELETE",
- headers: this.makeAuthHeader(),
- });
- await expectSuccessResponseOrThrow(resp);
- }
-
- async createInstance(req: MerchantInstanceConfig): Promise<void> {
- const url = new URL("management/instances", this.baseUrl);
- await this.httpClient.fetch(url.href, {
- method: "POST",
- body: req,
- headers: this.makeAuthHeader(),
- });
- }
-
- async getInstances(): Promise<MerchantInstancesResponse> {
- const url = new URL("management/instances", this.baseUrl);
- const resp = await this.httpClient.fetch(url.href, {
- headers: this.makeAuthHeader(),
- });
- return resp.json();
- }
-
- async getInstanceFullDetails(instanceId: string): Promise<any> {
- const url = new URL(`management/instances/${instanceId}`, this.baseUrl);
- try {
- const resp = await this.httpClient.fetch(url.href, {
- headers: this.makeAuthHeader(),
- });
- return resp.json();
- } catch (e) {
- throw e;
- }
- }
-
- async createOrder(
- req: MerchantPostOrderRequest,
- ): Promise<MerchantPostOrderResponse> {
- let url = new URL("private/orders", this.baseUrl);
- const resp = await harnessHttpLib.fetch(url.href, {
- method: "POST",
- body: req,
- headers: this.makeAuthHeader(),
- });
- return readSuccessResponseJsonOrThrow(
- resp,
- codecForMerchantPostOrderResponse(),
- );
- }
-
- async queryPrivateOrderStatus(
- query: PrivateOrderStatusQuery,
- ): Promise<MerchantOrderPrivateStatusResponse> {
- const reqUrl = new URL(`private/orders/${query.orderId}`, this.baseUrl);
- if (query.sessionId) {
- reqUrl.searchParams.set("session_id", query.sessionId);
- }
- const resp = await harnessHttpLib.fetch(reqUrl.href, {
- headers: this.makeAuthHeader(),
- });
- return readSuccessResponseJsonOrThrow(
- resp,
- codecForMerchantOrderPrivateStatusResponse(),
- );
- }
-
- async giveTip(req: RewardCreateRequest): Promise<RewardCreateConfirmation> {
- const reqUrl = new URL(`private/tips`, this.baseUrl);
- const resp = await harnessHttpLib.fetch(reqUrl.href, {
- method: "POST",
- body: req,
- });
- // FIXME: validate
- return resp.json();
- }
-
- async queryTippingReserves(): Promise<TippingReserveStatus> {
- const reqUrl = new URL(`private/reserves`, this.baseUrl);
- const resp = await harnessHttpLib.fetch(reqUrl.href, {
- headers: this.makeAuthHeader(),
- });
- // FIXME: validate
- return resp.json();
- }
-
- async giveRefund(r: {
- instance: string;
- orderId: string;
- amount: string;
- justification: string;
- }): Promise<{ talerRefundUri: string }> {
- const reqUrl = new URL(`private/orders/${r.orderId}/refund`, this.baseUrl);
- const resp = await harnessHttpLib.fetch(reqUrl.href, {
- method: "POST",
- body: {
- refund: r.amount,
- reason: r.justification,
- },
- });
- const respBody = await resp.json();
- return {
- talerRefundUri: respBody.taler_refund_uri,
- };
- }
-
- async createTemplate(req: MerchantTemplateAddDetails) {
- let url = new URL("private/templates", this.baseUrl);
- const resp = await harnessHttpLib.fetch(url.href, {
- method: "POST",
- body: req,
- headers: this.makeAuthHeader(),
- });
- if (resp.status !== 204) {
- throw Error("failed to create template");
- }
- }
-
- private makeAuthHeader(): Record<string, string> {
- switch (this.auth.method) {
- case "external":
- return {};
- case "token":
- return {
- Authorization: `Bearer ${this.auth.token}`,
- };
- }
- }
-}
-
-export interface CreateMerchantTippingReserveRequest {
- // Amount that the merchant promises to put into the reserve
- initial_balance: AmountString;
-
- // Exchange the merchant intends to use for tipping
- exchange_url: string;
-
- // Desired wire method, for example "iban" or "x-taler-bank"
- wire_method: string;
-}
-
export class MerchantService implements MerchantServiceInterface {
static fromExistingConfig(
gc: GlobalTestState,
@@ -1814,66 +1579,6 @@ export class MerchantService implements MerchantServiceInterface {
}
}
-export interface MerchantAuthConfiguration {
- method: "external" | "token";
- token?: string;
-}
-
-// FIXME: Why do we need this? Describe / fix!
-export interface PartialMerchantInstanceConfig {
- auth?: MerchantAuthConfiguration;
- id: string;
- name: string;
- paytoUris: string[];
- address?: unknown;
- jurisdiction?: unknown;
- defaultWireTransferDelay?: TalerProtocolDuration;
- defaultPayDelay?: TalerProtocolDuration;
-}
-
-// FIXME: Move all these types into merchant-api-types.ts!
-
-type FacadeCredentials = NoFacadeCredentials | BasicAuthFacadeCredentials;
-interface NoFacadeCredentials {
- type: "none";
-}
-interface BasicAuthFacadeCredentials {
- type: "basic";
-
- // Username to use to authenticate
- username: string;
-
- // Password to use to authenticate
- password: string;
-}
-
-interface MerchantBankAccount {
- // The payto:// URI where the wallet will send coins.
- payto_uri: string;
-
- // Optional base URL for a facade where the
- // merchant backend can see incoming wire
- // transfers to reconcile its accounting
- // with that of the exchange. Used by
- // taler-merchant-wirewatch.
- credit_facade_url?: string;
-
- // Credentials for accessing the credit facade.
- credit_facade_credentials?: FacadeCredentials;
-}
-
-export interface MerchantInstanceConfig {
- accounts: MerchantBankAccount[];
- auth: MerchantAuthConfiguration;
- id: string;
- name: string;
- address: unknown;
- jurisdiction: unknown;
- use_stefan: boolean;
- default_wire_transfer_delay: TalerProtocolDuration;
- default_pay_delay: TalerProtocolDuration;
-}
-
type TestStatus = "pass" | "fail" | "skip";
export interface TestRunResult {