aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/util/coinSelection.test.ts
blob: f678e75e78857aa2251e2a92961b3bcccd6f6df2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 This file is part of GNU Taler
 (C) 2022 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/>
 */
import {
  AbsoluteTime,
  AgeRestriction,
  AmountJson,
  Amounts,
  DenomKeyType,
  Duration,
  TransactionAmountMode,
} from "@gnu-taler/taler-util";
import test, { ExecutionContext } from "ava";
import { testing_greedySelectPeer } from "./coinSelection.js"

type Tester<T> = {
  deep: {
    equal(another: T): ReturnType<ExecutionContext["deepEqual"]>;
    equals(another: T): ReturnType<ExecutionContext["deepEqual"]>;
  }
}

function expect<T>(t: ExecutionContext, thing: T): Tester<T> {
  return {
    deep: {
      equal: (another: T) => t.deepEqual(thing, another),
      equals: (another: T) => t.deepEqual(thing, another),
    },
  };
}

const inTheDistantFuture = AbsoluteTime.toProtocolTimestamp(
  AbsoluteTime.addDuration(AbsoluteTime.now(), Duration.fromSpec({ hours: 1 }))
)
const inThePast = AbsoluteTime.toProtocolTimestamp(
  AbsoluteTime.subtractDuraction(AbsoluteTime.now(), Duration.fromSpec({ hours: 1 }))
)
test("should select the coin", (t) => {
  const instructedAmount = Amounts.parseOrThrow("LOCAL:2")
  const tally = {
    amountAcc: Amounts.zeroOfCurrency(instructedAmount.currency),
    depositFeesAcc: Amounts.zeroOfCurrency(instructedAmount.currency),
    lastDepositFee: Amounts.zeroOfCurrency(instructedAmount.currency),
  };
  const coins = testing_greedySelectPeer(
    // candidates available
    [{
      "denomPub": {
        "age_mask": 0,
        "cipher": DenomKeyType.Rsa,
        "rsa_public_key": "PPP"
      },
      "denomPubHash": "XXX",
      "value": "LOCAL:10",
      "feeDeposit": "LOCAL:0.1",
      "feeRefresh": "LOCAL:0",
      "feeRefund": "LOCAL:0",
      "feeWithdraw": "LOCAL:0",
      "stampExpireDeposit": inTheDistantFuture,
      "stampExpireLegal": inTheDistantFuture,
      "stampExpireWithdraw": inTheDistantFuture,
      "stampStart": inThePast,
      "exchangeBaseUrl": "http://exchange.localhost/",
      "numAvailable": 5,
      "maxAge": 32
    }],
    instructedAmount, tally);

  expect(t, coins).deep.equal({
    "XXX;32;http://exchange.localhost/": {
      exchangeBaseUrl: "http://exchange.localhost/",
      denomPubHash: "XXX",
      maxAge: 32,
      contributions: [Amounts.parseOrThrow("LOCAL:2")],
    }
  });
});