Skip to content

Commit 98dce0d

Browse files
author
andraz maier
committed
feat: add balance decreasing payment reference tests
1 parent 7962060 commit 98dce0d

File tree

6 files changed

+218
-3
lines changed

6 files changed

+218
-3
lines changed

.gitlab-ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ e2e_test:
3030
- curl -o test/e2e_tests/db/db_btc2_testnet https://githubstatic.flare.center/db_btc2_testnet
3131
- curl -o test/e2e_tests/db/db_doge_testnet https://githubstatic.flare.center/db_doge_testnet
3232
- curl -o test/e2e_tests/db/db_xrp_testnet https://githubstatic.flare.center/db_xrp_testnet
33+
- curl -o test/e2e_tests/db/db_xrp2_testnet https://githubstatic.flare.center/db_xrp2_testnet
3334
script:
3435
- yarn test ci
3536

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ Download the database instances from the following links and move them to `/e2e_
4646
- [BTC2 Testnet Database](https://githubstatic.flare.center/db_btc2_testnet) as `db_btc2_testnet`
4747
- [DOGE Testnet Database](https://githubstatic.flare.center/db_doge_testnet) as `db_doge_testnet`
4848
- [XRP Testnet Database](https://githubstatic.flare.center/db_xrp_testnet) as `db_xrp_testnet`
49+
- [XRP2 Testnet Database](https://githubstatic.flare.center/db_xrp2_testnet) as `db_xrp2_testnet`
50+
51+
or simply run
52+
53+
```bash
54+
yarn test download
55+
```
4956

5057
Currently, all databases are from testnets.
5158

test/e2e_tests/btc/address_validity/address_validity_mic.e2e-spec.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ describe('/AddressValidity/mic', () => {
6060
.set('X-API-KEY', '12345')
6161
.expect(200);
6262

63-
console.log(response.body);
6463
expect(response.body.status).to.be.equal('INVALID: INVALID ADDRESS TYPE');
6564
expect(response.body.messageIntegrityCode.length).to.be.equal(66);
6665
});
@@ -81,7 +80,6 @@ describe('/AddressValidity/mic', () => {
8180
.set('X-API-KEY', '12345')
8281
.expect(200);
8382

84-
console.log(response.body);
8583
expect(response.body.status).to.be.equal('INVALID: INVALID ADDRESS LENGTH');
8684
expect(response.body.messageIntegrityCode.length).to.be.equal(66);
8785
});

test/e2e_tests/run_tests.sh

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ _download_db_dumps() {
3131
echo "Downloading XRP Testnet Database..."
3232
curl -L -o "$DB_DIR/db_xrp_testnet" $BASE_DOWNLOAD_URL/db_xrp_testnet
3333

34+
echo "Downloading XRP2 Testnet Database..."
35+
curl -L -o "$DB_DIR/db_xrp2_testnet" $BASE_DOWNLOAD_URL/db_xrp2_testnet
36+
3437
echo "All testnet database dumps downloaded"
3538
}
3639

@@ -69,12 +72,14 @@ make_db(){
6972
docker compose -f test/e2e_tests/db/docker-compose.yaml cp test/e2e_tests/db/db_btc2_testnet postgres_testing_db:/tmp/dbdumpbtc2
7073
docker compose -f test/e2e_tests/db/docker-compose.yaml cp test/e2e_tests/db/db_doge_testnet postgres_testing_db:/tmp/dbdumpdoge
7174
docker compose -f test/e2e_tests/db/docker-compose.yaml cp test/e2e_tests/db/db_xrp_testnet postgres_testing_db:/tmp/dbdumpxrp
75+
docker compose -f test/e2e_tests/db/docker-compose.yaml cp test/e2e_tests/db/db_xrp2_testnet postgres_testing_db:/tmp/dbdumpxrp2
7276
_wait_for_pg_ready
7377

7478
_make_db btc
7579
_make_db btc2
7680
_make_db doge
7781
_make_db xrp
82+
_make_db xrp2
7883
else
7984
docker compose -f test/e2e_tests/db/docker-compose.yaml cp test/e2e_tests/db/db_${VERIFIER_TYPE}_testnet postgres_testing_db:/tmp/dbdump
8085
_wait_for_pg_ready
@@ -95,11 +100,13 @@ _make_db_ci(){
95100
cp test/e2e_tests/db/db_btc2_testnet /tmp/dbdumpbtc2
96101
cp test/e2e_tests/db/db_doge_testnet /tmp/dbdumpdoge
97102
cp test/e2e_tests/db/db_xrp_testnet /tmp/dbdumpxrp
103+
cp test/e2e_tests/db/db_xrp2_testnet /tmp/dbdumpxrp2
98104

99105
_make_db btc
100106
_make_db btc2
101107
_make_db doge
102108
_make_db xrp
109+
_make_db xrp2
103110
}
104111

105112
_run_all_tests(){
@@ -130,7 +137,8 @@ Commands:
130137
run Run e2e tests (create DBs for all verifier types, run tests, delete DBs)
131138
coverage Run e2e tests with coverage (create DBs for all verifier types, run tests with coverage, delete DBs)
132139
make_db <type> Create mock DB for a verifier type, <type> can be 'btc', 'doge' or 'xrp'.
133-
delete_db Delete mock DB
140+
delete_db Delete mock DB
141+
download Download all DB dumps
134142
"
135143
}
136144

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { standardAddressHash } from '@flarenetwork/mcc';
2+
import { expect } from 'chai';
3+
import * as request from 'supertest';
4+
import { app } from '../helper';
5+
6+
describe('BalanceDecreasingTransaction: payment reference is zero', () => {
7+
it('Failed escrow create tx', async () => {
8+
const payload = {
9+
attestationType:
10+
'0x42616c616e636544656372656173696e675472616e73616374696f6e00000000',
11+
sourceId:
12+
'0x7465737458525000000000000000000000000000000000000000000000000000',
13+
requestBody: {
14+
transactionId:
15+
'C1F0BF9E9864E84B35C32443DB23769F70F15C6D961DC041CCDD9F27B9C1CFEA',
16+
sourceAddressIndicator: standardAddressHash(
17+
'rnzDX5EkigqCxyWieLvbbqqZSavpfvuzQB',
18+
),
19+
},
20+
};
21+
const response = await request(app.getHttpServer())
22+
.post('/BalanceDecreasingTransaction/prepareResponse')
23+
.send(payload)
24+
.set('X-API-KEY', '12345')
25+
.expect(200)
26+
.expect('Content-Type', /json/);
27+
28+
expect(response.body.status).to.be.equal('VALID');
29+
expect(
30+
response.body.response.responseBody.standardPaymentReference,
31+
).to.be.equal(
32+
'0x0000000000000000000000000000000000000000000000000000000000000000',
33+
);
34+
});
35+
36+
it('Successful escrow create tx', async () => {
37+
const payload = {
38+
attestationType:
39+
'0x42616c616e636544656372656173696e675472616e73616374696f6e00000000',
40+
sourceId:
41+
'0x7465737458525000000000000000000000000000000000000000000000000000',
42+
requestBody: {
43+
transactionId:
44+
'848EE47D7A7C526239D87125CF6DE9D0346229F787899B11737213BB87896FD7',
45+
sourceAddressIndicator: standardAddressHash(
46+
'rnzDX5EkigqCxyWieLvbbqqZSavpfvuzQB',
47+
),
48+
},
49+
};
50+
const response = await request(app.getHttpServer())
51+
.post('/BalanceDecreasingTransaction/prepareResponse')
52+
.send(payload)
53+
.set('X-API-KEY', '12345')
54+
.expect(200)
55+
.expect('Content-Type', /json/);
56+
57+
expect(response.body.status).to.be.equal('VALID');
58+
expect(
59+
response.body.response.responseBody.standardPaymentReference,
60+
).to.be.equal(
61+
'0x0000000000000000000000000000000000000000000000000000000000000000',
62+
);
63+
});
64+
});

test/e2e_tests/xrp2/helper.ts

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
import { ChainType } from '@flarenetwork/mcc';
2+
import {
3+
INestApplication,
4+
MiddlewareConsumer,
5+
Module,
6+
NestModule,
7+
ValidationPipe,
8+
} from '@nestjs/common';
9+
import { ConfigModule, ConfigService } from '@nestjs/config';
10+
import { NestFactory } from '@nestjs/core';
11+
import { TypeOrmModule } from '@nestjs/typeorm';
12+
import helmet from 'helmet';
13+
import { ApiKeyStrategy } from '../../../src/auth/apikey.strategy';
14+
import { AuthModule } from '../../../src/auth/auth.module';
15+
import { AuthService } from '../../../src/auth/auth.service';
16+
import {
17+
getDatabaseEntities,
18+
IConfig,
19+
VerifierServerConfig,
20+
} from '../../../src/config/configuration';
21+
import { XRPAddressValidityVerifierController } from '../../../src/controllers/address-validity-verifier.controller';
22+
import { XRPBalanceDecreasingTransactionVerifierController } from '../../../src/controllers/balance-decreasing-transaction-verifier.controller';
23+
import { XRPConfirmedBlockHeightExistsVerifierController } from '../../../src/controllers/confirmed-block-height-exists-verifier.controller';
24+
import { XRPHealthController } from '../../../src/controllers/health.controller';
25+
import { XrpIndexerController } from '../../../src/controllers/indexer.controller';
26+
import { XRPPaymentVerifierController } from '../../../src/controllers/payment-verifier.controller';
27+
import { XRPReferencedPaymentNonexistenceVerifierController } from '../../../src/controllers/referenced-payment-nonexistence-verifier.controller';
28+
import { LoggerMiddleware } from '../../../src/middleware/LoggerMiddleware';
29+
import { XRPAddressValidityVerifierService } from '../../../src/services/address-validity-verifier.service';
30+
import { XRPBalanceDecreasingTransactionVerifierService } from '../../../src/services/balance-decreasing-transaction-verifier.service';
31+
import { XRPConfirmedBlockHeightExistsVerifierService } from '../../../src/services/confirmed-block-height-exists-verifier.service';
32+
import { XrpExternalIndexerEngineService } from '../../../src/services/indexer-services/xrp-indexer.service';
33+
import { XRPPaymentVerifierService } from '../../../src/services/payment-verifier.service';
34+
import { XRPReferencedPaymentNonexistenceVerifierService } from '../../../src/services/referenced-payment-nonexistence-verifier.service';
35+
36+
function getConfig() {
37+
const api_keys = process.env.API_KEYS?.split(',') || [''];
38+
const verifier_type = ChainType.XRP;
39+
const isTestnet = process.env.TESTNET == 'true';
40+
41+
let database = 'db';
42+
const isCoverage = process.env.RUNNING_ALL_TESTS == 'true';
43+
if (isCoverage) {
44+
database = 'dbxrp2';
45+
}
46+
47+
const db = {
48+
database: database,
49+
host: process.env.DB_HOST || '127.0.0.1',
50+
port: parseInt(process.env.DB_PORT) || 8080,
51+
username: process.env.DB_USERNAME || 'username',
52+
password: process.env.DB_PASSWORD || 'password',
53+
};
54+
55+
const entities = getDatabaseEntities(verifier_type);
56+
57+
const verifierConfig: VerifierServerConfig = {
58+
verifierType: verifier_type,
59+
numberOfConfirmations: parseInt(process.env.NUMBER_OF_CONFIRMATIONS || '6'),
60+
indexerServerPageLimit: parseInt(
61+
process.env.INDEXER_SERVER_PAGE_LIMIT || '100',
62+
),
63+
};
64+
65+
const config: IConfig = {
66+
port: parseInt(process.env.PORT || '3120'),
67+
api_keys,
68+
verifierConfig,
69+
db: db,
70+
typeOrmModuleOptions: {
71+
...db,
72+
type: 'postgres',
73+
entities: entities,
74+
synchronize: false,
75+
migrationsRun: false,
76+
logging: false,
77+
},
78+
isTestnet,
79+
};
80+
return config;
81+
}
82+
83+
@Module({
84+
imports: [
85+
ConfigModule.forRoot({
86+
load: [getConfig],
87+
isGlobal: true,
88+
}),
89+
TypeOrmModule.forRootAsync({
90+
imports: [ConfigModule],
91+
useFactory: (config: ConfigService<IConfig>) =>
92+
config.get('typeOrmModuleOptions'),
93+
inject: [ConfigService],
94+
}),
95+
AuthModule,
96+
],
97+
controllers: [
98+
XRPHealthController,
99+
XrpIndexerController,
100+
XRPAddressValidityVerifierController,
101+
XRPBalanceDecreasingTransactionVerifierController,
102+
XRPConfirmedBlockHeightExistsVerifierController,
103+
XRPPaymentVerifierController,
104+
XRPReferencedPaymentNonexistenceVerifierController,
105+
],
106+
providers: [
107+
ApiKeyStrategy,
108+
AuthService,
109+
XrpExternalIndexerEngineService,
110+
XRPAddressValidityVerifierService,
111+
XRPBalanceDecreasingTransactionVerifierService,
112+
XRPConfirmedBlockHeightExistsVerifierService,
113+
XRPPaymentVerifierService,
114+
XRPReferencedPaymentNonexistenceVerifierService,
115+
],
116+
})
117+
export class XRPVerifierServerModule implements NestModule {
118+
configure(consumer: MiddlewareConsumer) {
119+
consumer.apply(LoggerMiddleware).forRoutes('*');
120+
}
121+
}
122+
123+
export let app: INestApplication;
124+
125+
before(async () => {
126+
app = await NestFactory.create(XRPVerifierServerModule);
127+
128+
app.use(helmet());
129+
app.useGlobalPipes(new ValidationPipe({ transform: true }));
130+
app.enableCors();
131+
132+
await app.listen(3125, '0.0.0.0');
133+
});
134+
135+
after(async () => {
136+
await app.close();
137+
});

0 commit comments

Comments
 (0)