@algorandfoundation/algokit-utils 1.0.0-beta.4 → 1.0.0-beta.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -2
- package/{dist/account.d.ts → account.d.ts} +41 -36
- package/account.d.ts.map +1 -0
- package/{dist/account.js → account.js} +59 -44
- package/account.js.map +1 -0
- package/amount.d.ts +20 -0
- package/amount.d.ts.map +1 -0
- package/amount.js +36 -0
- package/amount.js.map +1 -0
- package/app-client.d.ts +14 -0
- package/app-client.d.ts.map +1 -0
- package/app-client.js +19 -0
- package/app-client.js.map +1 -0
- package/app-deploy.d.ts +95 -0
- package/app-deploy.d.ts.map +1 -0
- package/{dist/deploy-app.js → app-deploy.js} +158 -121
- package/app-deploy.js.map +1 -0
- package/app.d.ts +153 -0
- package/app.d.ts.map +1 -0
- package/app.js +582 -0
- package/app.js.map +1 -0
- package/index.d.ts +14 -0
- package/index.d.ts.map +1 -0
- package/{dist/index.js → index.js} +7 -3
- package/index.js.map +1 -0
- package/{dist/indexer-lookup.d.ts → indexer-lookup.d.ts} +11 -4
- package/indexer-lookup.d.ts.map +1 -0
- package/{dist/indexer-lookup.js → indexer-lookup.js} +19 -9
- package/indexer-lookup.js.map +1 -0
- package/{dist/localnet.d.ts → localnet.d.ts} +10 -10
- package/localnet.d.ts.map +1 -0
- package/{dist/localnet.js → localnet.js} +16 -16
- package/localnet.js.map +1 -0
- package/{dist/network-client.d.ts → network-client.d.ts} +15 -24
- package/network-client.d.ts.map +1 -0
- package/{dist/network-client.js → network-client.js} +16 -16
- package/{dist/network-client.js.map → network-client.js.map} +1 -1
- package/package.json +5 -93
- package/testing/account.d.ts +14 -0
- package/testing/account.d.ts.map +1 -0
- package/testing/account.js +31 -0
- package/testing/account.js.map +1 -0
- package/testing/fixtures/algokit-log-capture-fixture.d.ts +19 -0
- package/testing/fixtures/algokit-log-capture-fixture.d.ts.map +1 -0
- package/testing/fixtures/algokit-log-capture-fixture.js +43 -0
- package/testing/fixtures/algokit-log-capture-fixture.js.map +1 -0
- package/testing/fixtures/algorand-fixture.d.ts +24 -0
- package/testing/fixtures/algorand-fixture.d.ts.map +1 -0
- package/testing/fixtures/algorand-fixture.js +60 -0
- package/testing/fixtures/algorand-fixture.js.map +1 -0
- package/testing/fixtures/index.d.ts +3 -0
- package/testing/fixtures/index.d.ts.map +1 -0
- package/testing/fixtures/index.js +19 -0
- package/testing/fixtures/index.js.map +1 -0
- package/testing/index.d.ts +6 -0
- package/testing/index.d.ts.map +1 -0
- package/testing/index.js +22 -0
- package/testing/index.js.map +1 -0
- package/testing/indexer.d.ts +12 -0
- package/testing/indexer.d.ts.map +1 -0
- package/testing/indexer.js +40 -0
- package/testing/indexer.js.map +1 -0
- package/testing/test-logger.d.ts +41 -0
- package/testing/test-logger.d.ts.map +1 -0
- package/testing/test-logger.js +71 -0
- package/testing/test-logger.js.map +1 -0
- package/testing/transaction-logger.d.ts +29 -0
- package/testing/transaction-logger.d.ts.map +1 -0
- package/testing/transaction-logger.js +71 -0
- package/testing/transaction-logger.js.map +1 -0
- package/transaction.d.ts +121 -0
- package/transaction.d.ts.map +1 -0
- package/transaction.js +364 -0
- package/transaction.js.map +1 -0
- package/transfer.d.ts +22 -0
- package/transfer.d.ts.map +1 -0
- package/transfer.js +67 -0
- package/transfer.js.map +1 -0
- package/types/account.d.ts +55 -0
- package/types/account.d.ts.map +1 -0
- package/types/account.js +91 -0
- package/types/account.js.map +1 -0
- package/types/algo-http-client-with-retry.d.ts.map +1 -0
- package/{dist → types}/algo-http-client-with-retry.js +2 -2
- package/types/algo-http-client-with-retry.js.map +1 -0
- package/{dist/types → types}/algod.d.ts +28 -15
- package/types/algod.d.ts.map +1 -0
- package/{dist/algo-amount.d.ts → types/amount.d.ts} +9 -3
- package/types/amount.d.ts.map +1 -0
- package/{dist/algo-amount.js → types/amount.js} +13 -3
- package/types/amount.js.map +1 -0
- package/types/app-client.d.ts +282 -0
- package/types/app-client.d.ts.map +1 -0
- package/types/app-client.js +529 -0
- package/types/app-client.js.map +1 -0
- package/types/app-spec.d.ts +141 -0
- package/types/app-spec.d.ts.map +1 -0
- package/{dist/types/appspec.js → types/app-spec.js} +5 -7
- package/types/app-spec.js.map +1 -0
- package/types/app.d.ts +285 -0
- package/types/app.d.ts.map +1 -0
- package/types/app.js +32 -0
- package/types/app.js.map +1 -0
- package/types/config.d.ts +32 -0
- package/types/config.d.ts.map +1 -0
- package/types/config.js +53 -0
- package/types/config.js.map +1 -0
- package/types/indexer.d.ts +624 -0
- package/types/indexer.d.ts.map +1 -0
- package/{dist/types → types}/indexer.js +9 -0
- package/types/indexer.js.map +1 -0
- package/{dist/config.d.ts → types/logging.d.ts} +2 -16
- package/types/logging.d.ts.map +1 -0
- package/{dist/config.js → types/logging.js} +5 -24
- package/types/logging.js.map +1 -0
- package/types/logic-error.d.ts +37 -0
- package/types/logic-error.d.ts.map +1 -0
- package/types/logic-error.js +50 -0
- package/types/logic-error.js.map +1 -0
- package/types/network-client.d.ts +11 -0
- package/types/network-client.d.ts.map +1 -0
- package/types/network-client.js +3 -0
- package/types/network-client.js.map +1 -0
- package/types/testing.d.ts +89 -0
- package/types/testing.d.ts.map +1 -0
- package/types/testing.js +3 -0
- package/types/testing.js.map +1 -0
- package/types/transaction.d.ts +112 -0
- package/types/transaction.d.ts.map +1 -0
- package/types/transaction.js +3 -0
- package/types/transaction.js.map +1 -0
- package/types/transfer.d.ts +32 -0
- package/types/transfer.d.ts.map +1 -0
- package/types/transfer.js +3 -0
- package/types/transfer.js.map +1 -0
- package/types/urlTokenBaseHTTPClient.d.ts.map +1 -0
- package/types/urlTokenBaseHTTPClient.js.map +1 -0
- package/LICENSE +0 -21
- package/dist/account.d.ts.map +0 -1
- package/dist/account.js.map +0 -1
- package/dist/algo-amount.d.ts.map +0 -1
- package/dist/algo-amount.js.map +0 -1
- package/dist/algo-http-client-with-retry.d.ts.map +0 -1
- package/dist/algo-http-client-with-retry.js.map +0 -1
- package/dist/app.d.ts +0 -150
- package/dist/app.d.ts.map +0 -1
- package/dist/app.js +0 -156
- package/dist/app.js.map +0 -1
- package/dist/application-client.d.ts +0 -71
- package/dist/application-client.d.ts.map +0 -1
- package/dist/application-client.js +0 -145
- package/dist/application-client.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/deploy-app.d.ts +0 -149
- package/dist/deploy-app.d.ts.map +0 -1
- package/dist/deploy-app.js.map +0 -1
- package/dist/index.d.ts +0 -11
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/indexer-lookup.d.ts.map +0 -1
- package/dist/indexer-lookup.js.map +0 -1
- package/dist/localnet.d.ts.map +0 -1
- package/dist/localnet.js.map +0 -1
- package/dist/network-client.d.ts.map +0 -1
- package/dist/package.json +0 -20
- package/dist/transaction.d.ts +0 -152
- package/dist/transaction.d.ts.map +0 -1
- package/dist/transaction.js +0 -268
- package/dist/transaction.js.map +0 -1
- package/dist/transfer.d.ts +0 -24
- package/dist/transfer.d.ts.map +0 -1
- package/dist/transfer.js +0 -33
- package/dist/transfer.js.map +0 -1
- package/dist/types/algod.d.ts.map +0 -1
- package/dist/types/appspec.d.ts +0 -79
- package/dist/types/appspec.d.ts.map +0 -1
- package/dist/types/appspec.js.map +0 -1
- package/dist/types/indexer.d.ts +0 -314
- package/dist/types/indexer.d.ts.map +0 -1
- package/dist/types/indexer.js.map +0 -1
- package/dist/urlTokenBaseHTTPClient.d.ts.map +0 -1
- package/dist/urlTokenBaseHTTPClient.js.map +0 -1
- /package/{dist → types}/algo-http-client-with-retry.d.ts +0 -0
- /package/{dist/types → types}/algod.js +0 -0
- /package/{dist/types → types}/algod.js.map +0 -0
- /package/{dist → types}/urlTokenBaseHTTPClient.d.ts +0 -0
- /package/{dist → types}/urlTokenBaseHTTPClient.js +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getTestAccount = void 0;
|
|
7
|
+
const algosdk_1 = __importDefault(require("algosdk"));
|
|
8
|
+
const __1 = require("../");
|
|
9
|
+
const account_1 = require("../account");
|
|
10
|
+
const transfer_1 = require("../transfer");
|
|
11
|
+
/**
|
|
12
|
+
* Creates an ephemeral Algorand account for the purposes of testing.
|
|
13
|
+
* Returns a newly created random test account that is funded from the dispenser
|
|
14
|
+
* DO NOT USE THIS TO CREATE A MAINNET ACCOUNT!
|
|
15
|
+
* Note: By default this will log the mnemonic of the account.
|
|
16
|
+
* @param param0 The config for the test account to generate
|
|
17
|
+
* @param algod An algod client
|
|
18
|
+
* @param kmd A KMD client, if not specified then a default KMD client will be loaded from environment variables
|
|
19
|
+
* @returns The account, with private key loaded
|
|
20
|
+
*/
|
|
21
|
+
async function getTestAccount({ suppressLog, initialFunds }, algod, kmd) {
|
|
22
|
+
const account = algosdk_1.default.generateAccount();
|
|
23
|
+
__1.Config.getLogger(suppressLog).info(`New test account created with address '${account.addr}' and mnemonic '${algosdk_1.default.secretKeyToMnemonic(account.sk)}'.`);
|
|
24
|
+
const dispenser = await (0, account_1.getDispenserAccount)(algod, kmd);
|
|
25
|
+
await (0, transfer_1.transferAlgos)({ from: dispenser, to: account.addr, amount: initialFunds, note: 'Funding test account', suppressLog }, algod);
|
|
26
|
+
const accountInfo = await algod.accountInformation(account.addr).do();
|
|
27
|
+
__1.Config.getLogger(suppressLog).info('Test account funded; account balance: %d µAlgos', accountInfo.amount);
|
|
28
|
+
return account;
|
|
29
|
+
}
|
|
30
|
+
exports.getTestAccount = getTestAccount;
|
|
31
|
+
//# sourceMappingURL=account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/testing/account.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAwD;AACxD,2BAA4B;AAC5B,wCAAgD;AAChD,0CAA2C;AAG3C;;;;;;;;;GASG;AACI,KAAK,UAAU,cAAc,CAAC,EAAE,WAAW,EAAE,YAAY,EAAwB,EAAE,KAAc,EAAE,GAAS;IACjH,MAAM,OAAO,GAAG,iBAAO,CAAC,eAAe,EAAE,CAAA;IAEzC,UAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAChC,0CAA0C,OAAO,CAAC,IAAI,mBAAmB,iBAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CACrH,CAAA;IAED,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAmB,EAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAEvD,MAAM,IAAA,wBAAa,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,CAAA;IAElI,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAA;IAErE,UAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iDAAiD,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAEzG,OAAO,OAAO,CAAA;AAChB,CAAC;AAhBD,wCAgBC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AlgoKitLogCaptureFixture } from '../../types/testing';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a test fixture for capturing AlgoKit logs.
|
|
4
|
+
*
|
|
5
|
+
* @example ```typescript
|
|
6
|
+
* const logs = algoKitLogCaptureFixture()
|
|
7
|
+
*
|
|
8
|
+
* beforeEach(logs.beforeEach)
|
|
9
|
+
* afterEach(logs.afterEach)
|
|
10
|
+
*
|
|
11
|
+
* test('My test', () => {
|
|
12
|
+
* const capturedLogs = logs.testLogger.capturedLogs
|
|
13
|
+
* })
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @returns The fixture
|
|
17
|
+
*/
|
|
18
|
+
export declare const algoKitLogCaptureFixture: () => AlgoKitLogCaptureFixture;
|
|
19
|
+
//# sourceMappingURL=algokit-log-capture-fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algokit-log-capture-fixture.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/algokit-log-capture-fixture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAG9D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,wBAqB5C,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.algoKitLogCaptureFixture = void 0;
|
|
4
|
+
const __1 = require("../../");
|
|
5
|
+
const test_logger_1 = require("../test-logger");
|
|
6
|
+
/**
|
|
7
|
+
* Creates a test fixture for capturing AlgoKit logs.
|
|
8
|
+
*
|
|
9
|
+
* @example ```typescript
|
|
10
|
+
* const logs = algoKitLogCaptureFixture()
|
|
11
|
+
*
|
|
12
|
+
* beforeEach(logs.beforeEach)
|
|
13
|
+
* afterEach(logs.afterEach)
|
|
14
|
+
*
|
|
15
|
+
* test('My test', () => {
|
|
16
|
+
* const capturedLogs = logs.testLogger.capturedLogs
|
|
17
|
+
* })
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @returns The fixture
|
|
21
|
+
*/
|
|
22
|
+
const algoKitLogCaptureFixture = () => {
|
|
23
|
+
const originalLogger = __1.Config.logger;
|
|
24
|
+
let hybridLogger;
|
|
25
|
+
return {
|
|
26
|
+
get testLogger() {
|
|
27
|
+
return hybridLogger;
|
|
28
|
+
},
|
|
29
|
+
beforeEach: () => {
|
|
30
|
+
hybridLogger = new test_logger_1.TestLogger(originalLogger);
|
|
31
|
+
__1.Config.configure({
|
|
32
|
+
logger: hybridLogger,
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
afterEach: () => {
|
|
36
|
+
__1.Config.configure({
|
|
37
|
+
logger: originalLogger,
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
exports.algoKitLogCaptureFixture = algoKitLogCaptureFixture;
|
|
43
|
+
//# sourceMappingURL=algokit-log-capture-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algokit-log-capture-fixture.js","sourceRoot":"","sources":["../../../src/testing/fixtures/algokit-log-capture-fixture.ts"],"names":[],"mappings":";;;AAAA,8BAA+B;AAE/B,gDAA2C;AAE3C;;;;;;;;;;;;;;;GAeG;AACI,MAAM,wBAAwB,GAAmC,GAAG,EAAE;IAC3E,MAAM,cAAc,GAAG,UAAM,CAAC,MAAM,CAAA;IAEpC,IAAI,YAAwB,CAAA;IAE5B,OAAO;QACL,IAAI,UAAU;YACZ,OAAO,YAAY,CAAA;QACrB,CAAC;QACD,UAAU,EAAE,GAAG,EAAE;YACf,YAAY,GAAG,IAAI,wBAAU,CAAC,cAAc,CAAC,CAAA;YAC7C,UAAM,CAAC,SAAS,CAAC;gBACf,MAAM,EAAE,YAAY;aACrB,CAAC,CAAA;QACJ,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,UAAM,CAAC,SAAS,CAAC;gBACf,MAAM,EAAE,cAAc;aACvB,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AArBY,QAAA,wBAAwB,4BAqBpC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AlgorandFixture, AlgorandFixtureConfig } from '../../types/testing';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a test fixture for automated testing against Algorand.
|
|
4
|
+
* By default it tests against an environment variable specified client
|
|
5
|
+
* if the standard environment variables are specified, otherwise against
|
|
6
|
+
* a default LocalNet instance, but you can pass in an algod, indexer
|
|
7
|
+
* and/or kmd if you want to test against an explicitly defined network.
|
|
8
|
+
*
|
|
9
|
+
* @example ```typescript
|
|
10
|
+
* const algorand = algorandFixture()
|
|
11
|
+
*
|
|
12
|
+
* beforeEach(algorand.beforeEach, 10_000)
|
|
13
|
+
*
|
|
14
|
+
* test('My test', async () => {
|
|
15
|
+
* const {algod, indexer, testAccount, ...} = algorand.context
|
|
16
|
+
* // test things...
|
|
17
|
+
* })
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @param fixtureConfig The fixture configuration
|
|
21
|
+
* @returns The fixture
|
|
22
|
+
*/
|
|
23
|
+
export declare const algorandFixture: (fixtureConfig?: AlgorandFixtureConfig) => AlgorandFixture;
|
|
24
|
+
//# sourceMappingURL=algorand-fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algorand-fixture.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/algorand-fixture.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAuD,MAAM,qBAAqB,CAAA;AAEjI;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,mBAAoB,qBAAqB,KAAG,eAyCvE,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.algorandFixture = void 0;
|
|
4
|
+
const __1 = require("../");
|
|
5
|
+
const __2 = require("../../");
|
|
6
|
+
/**
|
|
7
|
+
* Creates a test fixture for automated testing against Algorand.
|
|
8
|
+
* By default it tests against an environment variable specified client
|
|
9
|
+
* if the standard environment variables are specified, otherwise against
|
|
10
|
+
* a default LocalNet instance, but you can pass in an algod, indexer
|
|
11
|
+
* and/or kmd if you want to test against an explicitly defined network.
|
|
12
|
+
*
|
|
13
|
+
* @example ```typescript
|
|
14
|
+
* const algorand = algorandFixture()
|
|
15
|
+
*
|
|
16
|
+
* beforeEach(algorand.beforeEach, 10_000)
|
|
17
|
+
*
|
|
18
|
+
* test('My test', async () => {
|
|
19
|
+
* const {algod, indexer, testAccount, ...} = algorand.context
|
|
20
|
+
* // test things...
|
|
21
|
+
* })
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @param fixtureConfig The fixture configuration
|
|
25
|
+
* @returns The fixture
|
|
26
|
+
*/
|
|
27
|
+
const algorandFixture = (fixtureConfig) => {
|
|
28
|
+
const algodConfig = process && process.env && process.env.ALGOD_SERVER ? (0, __2.getAlgodConfigFromEnvironment)() : (0, __2.getDefaultLocalNetConfig)('algod');
|
|
29
|
+
const indexerConfig = process && process.env && process.env.INDEXER_SERVER ? (0, __2.getIndexerConfigFromEnvironment)() : (0, __2.getDefaultLocalNetConfig)('indexer');
|
|
30
|
+
const kmdConfig = process && process.env && process.env.ALGOD_SERVER
|
|
31
|
+
? { ...algodConfig, port: process?.env?.KMD_PORT ?? '4002' }
|
|
32
|
+
: (0, __2.getDefaultLocalNetConfig)('kmd');
|
|
33
|
+
const algod = fixtureConfig?.algod ?? (0, __2.getAlgoClient)(algodConfig);
|
|
34
|
+
const indexer = fixtureConfig?.indexer ?? (0, __2.getAlgoIndexerClient)(indexerConfig);
|
|
35
|
+
const kmd = fixtureConfig?.kmd ?? (0, __2.getAlgoKmdClient)(kmdConfig);
|
|
36
|
+
let context;
|
|
37
|
+
const beforeEach = async () => {
|
|
38
|
+
__2.Config.configure({ debug: true });
|
|
39
|
+
const transactionLogger = new __1.TransactionLogger();
|
|
40
|
+
const transactionLoggerAlgod = transactionLogger.capture(algod);
|
|
41
|
+
context = {
|
|
42
|
+
algod: transactionLoggerAlgod,
|
|
43
|
+
indexer: indexer,
|
|
44
|
+
kmd: kmd,
|
|
45
|
+
testAccount: await (0, __1.getTestAccount)({ initialFunds: fixtureConfig?.testAccountFunding ?? (0, __2.algos)(10), suppressLog: true }, transactionLoggerAlgod, kmd),
|
|
46
|
+
generateAccount: (params) => (0, __1.getTestAccount)(params, transactionLoggerAlgod, kmd),
|
|
47
|
+
transactionLogger: transactionLogger,
|
|
48
|
+
waitForIndexer: () => transactionLogger.waitForIndexer(indexer),
|
|
49
|
+
waitForIndexerTransaction: (transactionId) => (0, __1.runWhenIndexerCaughtUp)(() => (0, __2.lookupTransactionById)(transactionId, indexer)),
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
return {
|
|
53
|
+
get context() {
|
|
54
|
+
return context;
|
|
55
|
+
},
|
|
56
|
+
beforeEach,
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
exports.algorandFixture = algorandFixture;
|
|
60
|
+
//# sourceMappingURL=algorand-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algorand-fixture.js","sourceRoot":"","sources":["../../../src/testing/fixtures/algorand-fixture.ts"],"names":[],"mappings":";;;AAAA,2BAA+E;AAC/E,8BAUe;AAIf;;;;;;;;;;;;;;;;;;;;GAoBG;AACI,MAAM,eAAe,GAAG,CAAC,aAAqC,EAAmB,EAAE;IACxF,MAAM,WAAW,GACf,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAA,iCAA6B,GAAE,CAAC,CAAC,CAAC,IAAA,4BAAwB,EAAC,OAAO,CAAC,CAAA;IAC1H,MAAM,aAAa,GACjB,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAA,mCAA+B,GAAE,CAAC,CAAC,CAAC,IAAA,4BAAwB,EAAC,SAAS,CAAC,CAAA;IAChI,MAAM,SAAS,GACb,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAChD,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,MAAM,EAAE;QAC5D,CAAC,CAAC,IAAA,4BAAwB,EAAC,KAAK,CAAC,CAAA;IAErC,MAAM,KAAK,GAAG,aAAa,EAAE,KAAK,IAAI,IAAA,iBAAa,EAAC,WAAW,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,aAAa,EAAE,OAAO,IAAI,IAAA,wBAAoB,EAAC,aAAa,CAAC,CAAA;IAC7E,MAAM,GAAG,GAAG,aAAa,EAAE,GAAG,IAAI,IAAA,oBAAgB,EAAC,SAAS,CAAC,CAAA;IAC7D,IAAI,OAAsC,CAAA;IAE1C,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,UAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACjC,MAAM,iBAAiB,GAAG,IAAI,qBAAiB,EAAE,CAAA;QACjD,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/D,OAAO,GAAG;YACR,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,OAAO;YAChB,GAAG,EAAE,GAAG;YACR,WAAW,EAAE,MAAM,IAAA,kBAAc,EAC/B,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,IAAI,IAAA,SAAK,EAAC,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,EACnF,sBAAsB,EACtB,GAAG,CACJ;YACD,eAAe,EAAE,CAAC,MAA4B,EAAE,EAAE,CAAC,IAAA,kBAAc,EAAC,MAAM,EAAE,sBAAsB,EAAE,GAAG,CAAC;YACtG,iBAAiB,EAAE,iBAAiB;YACpC,cAAc,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC;YAC/D,yBAAyB,EAAE,CAAC,aAAqB,EAAE,EAAE,CAAC,IAAA,0BAAsB,EAAC,GAAG,EAAE,CAAC,IAAA,yBAAqB,EAAC,aAAa,EAAE,OAAO,CAAC,CAAC;SAClI,CAAA;IACH,CAAC,CAAA;IAED,OAAO;QACL,IAAI,OAAO;YACT,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,UAAU;KACX,CAAA;AACH,CAAC,CAAA;AAzCY,QAAA,eAAe,mBAyC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAA;AAC7C,cAAc,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./algokit-log-capture-fixture"), exports);
|
|
18
|
+
__exportStar(require("./algorand-fixture"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/fixtures/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gEAA6C;AAC7C,qDAAkC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA"}
|
package/testing/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./account"), exports);
|
|
18
|
+
__exportStar(require("./fixtures"), exports);
|
|
19
|
+
__exportStar(require("./indexer"), exports);
|
|
20
|
+
__exportStar(require("./test-logger"), exports);
|
|
21
|
+
__exportStar(require("./transaction-logger"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,6CAA0B;AAC1B,4CAAyB;AACzB,gDAA6B;AAC7B,uDAAoC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs the given indexer call until a 404 error is no longer returned.
|
|
3
|
+
* Tried every 200ms up to 20 times.
|
|
4
|
+
* Very rudimentary implementation designed for automated testing.
|
|
5
|
+
* @example ```typescript
|
|
6
|
+
* const transaction = await runWhenIndexerCaughtUp(() => indexer.lookupTransactionByID(txnId).do())
|
|
7
|
+
* ```
|
|
8
|
+
* @param run The code to run
|
|
9
|
+
* @returns The result (as a promise), or throws if the indexer didn't catch up in time
|
|
10
|
+
*/
|
|
11
|
+
export declare function runWhenIndexerCaughtUp<T>(run: () => Promise<T>): Promise<T>;
|
|
12
|
+
//# sourceMappingURL=indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../src/testing/indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBjF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runWhenIndexerCaughtUp = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Runs the given indexer call until a 404 error is no longer returned.
|
|
6
|
+
* Tried every 200ms up to 20 times.
|
|
7
|
+
* Very rudimentary implementation designed for automated testing.
|
|
8
|
+
* @example ```typescript
|
|
9
|
+
* const transaction = await runWhenIndexerCaughtUp(() => indexer.lookupTransactionByID(txnId).do())
|
|
10
|
+
* ```
|
|
11
|
+
* @param run The code to run
|
|
12
|
+
* @returns The result (as a promise), or throws if the indexer didn't catch up in time
|
|
13
|
+
*/
|
|
14
|
+
async function runWhenIndexerCaughtUp(run) {
|
|
15
|
+
let result = null;
|
|
16
|
+
let ok = false;
|
|
17
|
+
let tries = 0;
|
|
18
|
+
while (!ok) {
|
|
19
|
+
try {
|
|
20
|
+
result = await run();
|
|
21
|
+
ok = true;
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
if (e?.status === 404) {
|
|
26
|
+
tries++;
|
|
27
|
+
if (tries > 20) {
|
|
28
|
+
throw e;
|
|
29
|
+
}
|
|
30
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
throw e;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
exports.runWhenIndexerCaughtUp = runWhenIndexerCaughtUp;
|
|
40
|
+
//# sourceMappingURL=indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/testing/indexer.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;GASG;AACI,KAAK,UAAU,sBAAsB,CAAI,GAAqB;IACnE,IAAI,MAAM,GAAa,IAAI,CAAA;IAC3B,IAAI,EAAE,GAAG,KAAK,CAAA;IACd,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,OAAO,CAAC,EAAE,EAAE;QACV,IAAI;YACF,MAAM,GAAG,MAAM,GAAG,EAAE,CAAA;YACpB,EAAE,GAAG,IAAI,CAAA;YACT,8DAA8D;SAC/D;QAAC,OAAO,CAAM,EAAE;YACf,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,EAAE;gBACrB,KAAK,EAAE,CAAA;gBACP,IAAI,KAAK,GAAG,EAAE,EAAE;oBACd,MAAM,CAAC,CAAA;iBACR;gBACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;aAC/D;iBAAM;gBACL,MAAM,CAAC,CAAA;aACR;SACF;KACF;IAED,OAAO,MAAW,CAAA;AACpB,CAAC;AAvBD,wDAuBC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Logger } from '../types/logging';
|
|
2
|
+
import { LogSnapshotConfig } from '../types/testing';
|
|
3
|
+
/** Exposes an AlgoKit logger which captures log messages, while wrapping an original logger.
|
|
4
|
+
* This is useful for automated testing.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TestLogger implements Logger {
|
|
7
|
+
private originalLogger;
|
|
8
|
+
private logs;
|
|
9
|
+
/**
|
|
10
|
+
* Create a new test logger that wraps the given logger if provided.
|
|
11
|
+
* @param originalLogger The optional original logger to wrap.
|
|
12
|
+
*/
|
|
13
|
+
constructor(originalLogger?: Logger);
|
|
14
|
+
/** Returns all logs captured thus far. */
|
|
15
|
+
get capturedLogs(): string[];
|
|
16
|
+
/** Clears all logs captured so far. */
|
|
17
|
+
clear(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Returns a captured log snapshot.
|
|
20
|
+
* This helps ensure that the provided configuration items won't appear
|
|
21
|
+
* with random values in the log snapshot, but rather will get substituted with predictable ids.
|
|
22
|
+
*
|
|
23
|
+
* https://jestjs.io/docs/snapshot-testing#2-tests-should-be-deterministic
|
|
24
|
+
*
|
|
25
|
+
* @example Jest Example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const logger = new TestLogger()
|
|
28
|
+
* ...
|
|
29
|
+
* expect(logger.getLogSnapshot()).toMatchSnapshot()
|
|
30
|
+
* ```
|
|
31
|
+
* @param config The snapshot configuration
|
|
32
|
+
* @returns The snapshotted logs.
|
|
33
|
+
*/
|
|
34
|
+
getLogSnapshot(config?: LogSnapshotConfig): string;
|
|
35
|
+
error(message: string, ...optionalParams: unknown[]): void;
|
|
36
|
+
warn(message: string, ...optionalParams: unknown[]): void;
|
|
37
|
+
info(message: string, ...optionalParams: unknown[]): void;
|
|
38
|
+
verbose(message: string, ...optionalParams: unknown[]): void;
|
|
39
|
+
debug(message: string, ...optionalParams: unknown[]): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=test-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-logger.d.ts","sourceRoot":"","sources":["../../src/testing/test-logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;GAEG;AACH,qBAAa,UAAW,YAAW,MAAM;IACvC,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,IAAI,CAAU;IAEtB;;;OAGG;gBACS,cAAc,CAAC,EAAE,MAAM;IAKnC,0CAA0C;IAC1C,IAAI,YAAY,IAAI,MAAM,EAAE,CAE3B;IAED,uCAAuC;IACvC,KAAK;IAIL;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CAAC,MAAM,CAAC,EAAE,iBAAiB;IAczC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI;IAI1D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI;IAIzD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI;IAIzD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI;IAI5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI;CAI3D"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestLogger = void 0;
|
|
4
|
+
const __1 = require("../");
|
|
5
|
+
/** Exposes an AlgoKit logger which captures log messages, while wrapping an original logger.
|
|
6
|
+
* This is useful for automated testing.
|
|
7
|
+
*/
|
|
8
|
+
class TestLogger {
|
|
9
|
+
/**
|
|
10
|
+
* Create a new test logger that wraps the given logger if provided.
|
|
11
|
+
* @param originalLogger The optional original logger to wrap.
|
|
12
|
+
*/
|
|
13
|
+
constructor(originalLogger) {
|
|
14
|
+
this.originalLogger = originalLogger;
|
|
15
|
+
this.logs = [];
|
|
16
|
+
}
|
|
17
|
+
/** Returns all logs captured thus far. */
|
|
18
|
+
get capturedLogs() {
|
|
19
|
+
return this.logs;
|
|
20
|
+
}
|
|
21
|
+
/** Clears all logs captured so far. */
|
|
22
|
+
clear() {
|
|
23
|
+
this.logs = [];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns a captured log snapshot.
|
|
27
|
+
* This helps ensure that the provided configuration items won't appear
|
|
28
|
+
* with random values in the log snapshot, but rather will get substituted with predictable ids.
|
|
29
|
+
*
|
|
30
|
+
* https://jestjs.io/docs/snapshot-testing#2-tests-should-be-deterministic
|
|
31
|
+
*
|
|
32
|
+
* @example Jest Example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const logger = new TestLogger()
|
|
35
|
+
* ...
|
|
36
|
+
* expect(logger.getLogSnapshot()).toMatchSnapshot()
|
|
37
|
+
* ```
|
|
38
|
+
* @param config The snapshot configuration
|
|
39
|
+
* @returns The snapshotted logs.
|
|
40
|
+
*/
|
|
41
|
+
getLogSnapshot(config) {
|
|
42
|
+
const { transactions: transactionIds, accounts, apps } = config ?? {};
|
|
43
|
+
let snapshot = this.capturedLogs.join('\n');
|
|
44
|
+
transactionIds?.forEach((txn, id) => (snapshot = snapshot.replace(new RegExp(typeof txn === 'string' ? txn : txn.txID(), 'g'), `TXID_${id + 1}`)));
|
|
45
|
+
accounts?.forEach((sender, id) => (snapshot = snapshot.replace(new RegExp(typeof sender === 'string' ? sender : (0, __1.getSenderAddress)(sender), 'g'), `ACCOUNT_${id + 1}`)));
|
|
46
|
+
apps?.forEach((app, id) => (snapshot = snapshot.replace(new RegExp(`\\b${app.toString()}\\b(?! bytes)`, 'g'), `APP_${id + 1}`)));
|
|
47
|
+
return snapshot;
|
|
48
|
+
}
|
|
49
|
+
error(message, ...optionalParams) {
|
|
50
|
+
this.originalLogger?.error(message, ...optionalParams);
|
|
51
|
+
this.logs.push(`ERROR: ${message}${optionalParams.length ? ` | ${JSON.stringify(optionalParams)}` : ''}`);
|
|
52
|
+
}
|
|
53
|
+
warn(message, ...optionalParams) {
|
|
54
|
+
this.originalLogger?.warn(message, ...optionalParams);
|
|
55
|
+
this.logs.push(`WARN: ${message}${optionalParams.length ? ` | ${JSON.stringify(optionalParams)}` : ''}`);
|
|
56
|
+
}
|
|
57
|
+
info(message, ...optionalParams) {
|
|
58
|
+
this.originalLogger?.info(message, ...optionalParams);
|
|
59
|
+
this.logs.push(`INFO: ${message}${optionalParams.length ? ` | ${JSON.stringify(optionalParams)}` : ''}`);
|
|
60
|
+
}
|
|
61
|
+
verbose(message, ...optionalParams) {
|
|
62
|
+
this.originalLogger?.verbose(message, ...optionalParams);
|
|
63
|
+
this.logs.push(`VERBOSE: ${message}${optionalParams.length ? ` | ${JSON.stringify(optionalParams)}` : ''}`);
|
|
64
|
+
}
|
|
65
|
+
debug(message, ...optionalParams) {
|
|
66
|
+
this.originalLogger?.debug(message, ...optionalParams);
|
|
67
|
+
this.logs.push(`DEBUG: ${message}${optionalParams.length ? ` | ${JSON.stringify(optionalParams)}` : ''}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.TestLogger = TestLogger;
|
|
71
|
+
//# sourceMappingURL=test-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-logger.js","sourceRoot":"","sources":["../../src/testing/test-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Algodv2, Indexer } from 'algosdk';
|
|
2
|
+
/**
|
|
3
|
+
* Allows you to keep track of Algorand transaction IDs by wrapping an `Algodv2` in a proxy.
|
|
4
|
+
* Useful for automated tests.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TransactionLogger {
|
|
7
|
+
private _sentTransactionIds;
|
|
8
|
+
/**
|
|
9
|
+
* The list of transaction IDs that has been logged thus far.
|
|
10
|
+
*/
|
|
11
|
+
get sentTransactionIds(): Readonly<string[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Clear all logged IDs.
|
|
14
|
+
*/
|
|
15
|
+
clear(): void;
|
|
16
|
+
/**
|
|
17
|
+
* The method that captures raw transactions and stores the transaction IDs.
|
|
18
|
+
*/
|
|
19
|
+
logRawTransaction(signedTransactions: Uint8Array | Uint8Array[]): void;
|
|
20
|
+
/** Return a proxy that wraps the given Algodv2 with this transaction logger.
|
|
21
|
+
*
|
|
22
|
+
* @param algod The `Algodv2` to wrap
|
|
23
|
+
* @returns The wrapped `Algodv2`, any transactions sent using this algod instance will be logged by this transaction logger
|
|
24
|
+
*/
|
|
25
|
+
capture(algod: Algodv2): Algodv2;
|
|
26
|
+
/** Wait until all logged transactions IDs appear in the given `Indexer`. */
|
|
27
|
+
waitForIndexer(indexer: Indexer): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=transaction-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-logger.d.ts","sourceRoot":"","sources":["../../src/testing/transaction-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2B,OAAO,EAAE,MAAM,SAAS,CAAA;AAGnE;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,mBAAmB,CAAe;IAE1C;;OAEG;IACH,IAAI,kBAAkB,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,CAE3C;IAED;;OAEG;IACH,KAAK;IAIL;;OAEG;IACH,iBAAiB,CAAC,kBAAkB,EAAE,UAAU,GAAG,UAAU,EAAE;IAY/D;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIhC,4EAA4E;IACtE,cAAc,CAAC,OAAO,EAAE,OAAO;CAGtC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionLogger = void 0;
|
|
4
|
+
const algosdk_1 = require("algosdk");
|
|
5
|
+
const _1 = require("./");
|
|
6
|
+
/**
|
|
7
|
+
* Allows you to keep track of Algorand transaction IDs by wrapping an `Algodv2` in a proxy.
|
|
8
|
+
* Useful for automated tests.
|
|
9
|
+
*/
|
|
10
|
+
class TransactionLogger {
|
|
11
|
+
constructor() {
|
|
12
|
+
this._sentTransactionIds = [];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The list of transaction IDs that has been logged thus far.
|
|
16
|
+
*/
|
|
17
|
+
get sentTransactionIds() {
|
|
18
|
+
return this._sentTransactionIds;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Clear all logged IDs.
|
|
22
|
+
*/
|
|
23
|
+
clear() {
|
|
24
|
+
this._sentTransactionIds = [];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The method that captures raw transactions and stores the transaction IDs.
|
|
28
|
+
*/
|
|
29
|
+
logRawTransaction(signedTransactions) {
|
|
30
|
+
if (Array.isArray(signedTransactions)) {
|
|
31
|
+
for (const stxn of signedTransactions) {
|
|
32
|
+
const decoded = (0, algosdk_1.decodeSignedTransaction)(stxn);
|
|
33
|
+
this._sentTransactionIds.push(decoded.txn.txID());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const decoded = (0, algosdk_1.decodeSignedTransaction)(signedTransactions);
|
|
38
|
+
this._sentTransactionIds.push(decoded.txn.txID());
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Return a proxy that wraps the given Algodv2 with this transaction logger.
|
|
42
|
+
*
|
|
43
|
+
* @param algod The `Algodv2` to wrap
|
|
44
|
+
* @returns The wrapped `Algodv2`, any transactions sent using this algod instance will be logged by this transaction logger
|
|
45
|
+
*/
|
|
46
|
+
capture(algod) {
|
|
47
|
+
return new Proxy(algod, new TransactionLoggingAlgodv2ProxyHandler(this));
|
|
48
|
+
}
|
|
49
|
+
/** Wait until all logged transactions IDs appear in the given `Indexer`. */
|
|
50
|
+
async waitForIndexer(indexer) {
|
|
51
|
+
await Promise.all(this._sentTransactionIds.map((txnId) => (0, _1.runWhenIndexerCaughtUp)(() => indexer.lookupTransactionByID(txnId).do())));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.TransactionLogger = TransactionLogger;
|
|
55
|
+
class TransactionLoggingAlgodv2ProxyHandler {
|
|
56
|
+
constructor(transactionLogger) {
|
|
57
|
+
this.transactionLogger = transactionLogger;
|
|
58
|
+
}
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
get(target, property, receiver) {
|
|
61
|
+
if (property === 'sendRawTransaction') {
|
|
62
|
+
return (stxOrStxs) => {
|
|
63
|
+
this.transactionLogger.logRawTransaction(stxOrStxs);
|
|
64
|
+
return target[property].call(receiver, stxOrStxs);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
+
return target[property];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=transaction-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-logger.js","sourceRoot":"","sources":["../../src/testing/transaction-logger.ts"],"names":[],"mappings":";;;AAAA,qCAAmE;AACnE,yBAA2C;AAE3C;;;GAGG;AACH,MAAa,iBAAiB;IAA9B;QACU,wBAAmB,GAAa,EAAE,CAAA;IA4C5C,CAAC;IA1CC;;OAEG;IACH,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAA;IACjC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,kBAA6C;QAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;YACrC,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE;gBACrC,MAAM,OAAO,GAAG,IAAA,iCAAuB,EAAC,IAAI,CAAC,CAAA;gBAC7C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;aAClD;SACF;aAAM;YACL,MAAM,OAAO,GAAG,IAAA,iCAAuB,EAAC,kBAAkB,CAAC,CAAA;YAC3D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;SAClD;IACH,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAc;QACpB,OAAO,IAAI,KAAK,CAAU,KAAK,EAAE,IAAI,qCAAqC,CAAC,IAAI,CAAC,CAAC,CAAA;IACnF,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,cAAc,CAAC,OAAgB;QACnC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,yBAAsB,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IACrI,CAAC;CACF;AA7CD,8CA6CC;AAED,MAAM,qCAAqC;IAGzC,YAAY,iBAAoC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;IAC5C,CAAC;IAED,8DAA8D;IAC9D,GAAG,CAAC,MAAe,EAAE,QAAyB,EAAE,QAAa;QAC3D,IAAI,QAAQ,KAAK,oBAAoB,EAAE;YACrC,OAAO,CAAC,SAAoC,EAAE,EAAE;gBAC9C,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;gBACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;YACnD,CAAC,CAAA;SACF;QACD,8DAA8D;QAC9D,OAAQ,MAAc,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC;CACF"}
|