accept tos test case

This commit is contained in:
Sebastian 2022-04-12 00:41:16 -03:00
parent d34eeb5c8c
commit afecab8000
No known key found for this signature in database
GPG Key ID: BE4FF68352439FC1
3 changed files with 167 additions and 10 deletions

View File

@ -2,3 +2,4 @@ extension/
/storybook-static/
/.linaria-cache/
/lib
/coverage

View File

@ -19,7 +19,8 @@
* @author Sebastian Javier Marchano (sebasjm)
*/
import { ExchangeListItem } from "@gnu-taler/taler-util";
import { Amounts, ExchangeListItem, GetExchangeTosResult } from "@gnu-taler/taler-util";
import { ExchangeWithdrawDetails } from "@gnu-taler/taler-wallet-core";
import { expect } from "chai";
import { mountHook } from "../test-utils.js";
import { useComponentState } from "./Withdraw.js";
@ -93,4 +94,156 @@ describe("Withdraw CTA states", () => {
await assertNoPendingUpdate()
});
it("should be able to withdraw if tos are ok", async () => {
const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() =>
useComponentState('taler-withdraw://', {
listExchanges: async () => ({ exchanges }),
getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({
amount: 'ARS:2',
possibleExchanges: exchanges,
}),
getExchangeWithdrawalInfo: async (): Promise<ExchangeWithdrawDetails> => ({
withdrawalAmountRaw: 'ARS:5',
withdrawalAmountEffective: 'ARS:5',
} as any),
getExchangeTos: async (): Promise<GetExchangeTosResult> => ({
contentType: 'text',
content: 'just accept',
acceptedEtag: 'v1',
currentEtag: 'v1'
})
} as any),
);
{
const { status, hook } = getLastResultOrThrow()
expect(status).equals('loading-uri')
expect(hook).undefined;
}
await waitNextUpdate()
{
const { status, hook } = getLastResultOrThrow()
expect(status).equals('loading-info')
expect(hook).undefined;
}
await waitNextUpdate()
{
const state = getLastResultOrThrow()
expect(state.status).equals("success")
if (state.status !== "success") return;
expect(state.exchange.isDirty).false
expect(state.exchange.value).equal("http://exchange.demo.taler.net")
expect(state.exchange.list).deep.equal({
"http://exchange.demo.taler.net": "http://exchange.demo.taler.net"
})
expect(state.showExchangeSelection).false
expect(state.toBeReceived).deep.equal(Amounts.parseOrThrow("ARS:2"))
expect(state.withdrawalFee).deep.equal(Amounts.parseOrThrow("ARS:0"))
expect(state.chosenAmount).deep.equal(Amounts.parseOrThrow("ARS:2"))
expect(state.doWithdrawal.disabled).false
expect(state.mustAcceptFirst).false
}
await assertNoPendingUpdate()
});
it("should be accept the tos before withdraw", async () => {
const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() =>
useComponentState('taler-withdraw://', {
listExchanges: async () => ({ exchanges }),
getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({
amount: 'ARS:2',
possibleExchanges: exchanges,
}),
getExchangeWithdrawalInfo: async (): Promise<ExchangeWithdrawDetails> => ({
withdrawalAmountRaw: 'ARS:5',
withdrawalAmountEffective: 'ARS:5',
} as any),
getExchangeTos: async (): Promise<GetExchangeTosResult> => ({
contentType: 'text',
content: 'just accept',
acceptedEtag: 'v1',
currentEtag: 'v2'
}),
setExchangeTosAccepted: async () => ({})
} as any),
);
{
const { status, hook } = getLastResultOrThrow()
expect(status).equals('loading-uri')
expect(hook).undefined;
}
await waitNextUpdate()
{
const { status, hook } = getLastResultOrThrow()
expect(status).equals('loading-info')
expect(hook).undefined;
}
await waitNextUpdate()
{
const state = getLastResultOrThrow()
expect(state.status).equals("success")
if (state.status !== "success") return;
expect(state.exchange.isDirty).false
expect(state.exchange.value).equal("http://exchange.demo.taler.net")
expect(state.exchange.list).deep.equal({
"http://exchange.demo.taler.net": "http://exchange.demo.taler.net"
})
expect(state.showExchangeSelection).false
expect(state.toBeReceived).deep.equal(Amounts.parseOrThrow("ARS:2"))
expect(state.withdrawalFee).deep.equal(Amounts.parseOrThrow("ARS:0"))
expect(state.chosenAmount).deep.equal(Amounts.parseOrThrow("ARS:2"))
expect(state.doWithdrawal.disabled).true
expect(state.mustAcceptFirst).true
// accept TOS
state.tosProps?.onAccept(true)
}
await waitNextUpdate()
{
const state = getLastResultOrThrow()
expect(state.status).equals("success")
if (state.status !== "success") return;
expect(state.exchange.isDirty).false
expect(state.exchange.value).equal("http://exchange.demo.taler.net")
expect(state.exchange.list).deep.equal({
"http://exchange.demo.taler.net": "http://exchange.demo.taler.net"
})
expect(state.showExchangeSelection).false
expect(state.toBeReceived).deep.equal(Amounts.parseOrThrow("ARS:2"))
expect(state.withdrawalFee).deep.equal(Amounts.parseOrThrow("ARS:0"))
expect(state.chosenAmount).deep.equal(Amounts.parseOrThrow("ARS:2"))
expect(state.doWithdrawal.disabled).false
expect(state.mustAcceptFirst).true
}
await assertNoPendingUpdate()
});
});

View File

@ -195,7 +195,7 @@ export function useComponentState(
const [withdrawError, setWithdrawError] = useState<TalerError | undefined>(
undefined,
);
const [confirmDisabled, setConfirmDisabled] = useState<boolean>(false);
const [doingWithdraw, setDoingWithdraw] = useState<boolean>(false);
const [showExchangeSelection, setShowExchangeSelection] = useState(false);
const [nextExchange, setNextExchange] = useState<string | undefined>();
@ -222,7 +222,7 @@ export function useComponentState(
async function doWithdrawAndCheckError(): Promise<void> {
try {
setConfirmDisabled(true);
setDoingWithdraw(true);
if (!talerWithdrawUri) return;
const res = await api.acceptWithdrawal(
talerWithdrawUri,
@ -235,8 +235,8 @@ export function useComponentState(
if (e instanceof TalerError) {
setWithdrawError(e);
}
setConfirmDisabled(false);
}
setDoingWithdraw(false);
}
const exchanges = thisCurrencyExchanges.reduce(
@ -259,9 +259,9 @@ export function useComponentState(
const exchangeHandler: SelectFieldHandler = {
onChange: setNextExchange,
value: nextExchange || thisExchange,
value: nextExchange ?? thisExchange,
list: exchanges,
isDirty: nextExchange !== thisExchange,
isDirty: nextExchange !== undefined,
};
const editExchange: ButtonHandler = {
@ -278,6 +278,7 @@ export function useComponentState(
onClick: async () => {
setCustomExchange(exchangeHandler.value);
setShowExchangeSelection(false);
setNextExchange(undefined);
},
};
@ -307,6 +308,10 @@ export function useComponentState(
}
}
const mustAcceptFirst =
termsState !== undefined &&
(termsState.status === "changed" || termsState.status === "new");
return {
status: "success",
hook: undefined,
@ -321,7 +326,7 @@ export function useComponentState(
doWithdrawal: {
onClick: doWithdrawAndCheckError,
error: withdrawError,
disabled: confirmDisabled,
disabled: doingWithdraw || (mustAcceptFirst && !reviewed),
},
tosProps: !termsState
? undefined
@ -332,9 +337,7 @@ export function useComponentState(
reviewing: reviewing,
terms: termsState,
},
mustAcceptFirst:
termsState !== undefined &&
(termsState.status === "changed" || termsState.status === "new"),
mustAcceptFirst,
};
}