Files
xo-stack/packages/stack/tests/utils/graphql-client.spec.ts
T

185 lines
4.8 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { GraphQLClient } from '../../src/utils/index.js';
import {
monitorSyncTipsSubscriptionQuery,
monitorSyncTipsQuery,
monitorSyncTipsSchema,
} from '../../src/blockchain/blockchain-chaingraph-helpers.js';
const chaingraphServer = 'https://gql.chaingraph.pat.mn/v1/graphql';
describe('GraphQLClient', () => {
const graphQLClient = new GraphQLClient(chaingraphServer);
it("should succesfully subscribe to 'MonitorSyncTips' messages and receive a valid response from server", async () => {
/**
* Query in SDL:
*
`subscription MonitorSyncTips ($nameFilter: String = "bchn-mainnet") {
node (where: { name: { _like: $nameFilter } }) {
name
user_agent
latest_tip: accepted_blocks(
limit: 1,
order_by: { block_internal_id: desc }
) {
accepted_at
block {
hash
height
}
}
}
}`
*/
const response = await graphQLClient.subscribe(
'MonitorSyncTipsSubscriptionTest',
monitorSyncTipsSubscriptionQuery,
true, // wait For response on subscribe
{
chainFilter: 'bchn-chipnet',
},
);
expect(response).toBeTypeOf('object');
expect(response).not.toBeInstanceOf(Error);
expect(response).not.toBeNull();
await graphQLClient.unsubscribe(['MonitorSyncTipsSubscriptionTest']);
});
it("should succesfully query latest 'MonitorSyncTips'", async () => {
/**
* Query in SDL:
*
`query MonitorSyncTips ( $chainFilter: String = "bchn-mainnet" ) {
node ( where: { name: { _like: $chainFilter } } ) {
name
user_agent
latest_tip: accepted_blocks(
limit: 1,
order_by: { block_internal_id: desc }
) {
accepted_at
block {
hash
height
}
}
}
}`
*/
const response = await graphQLClient.request(
'monitorSyncTipsQuery',
monitorSyncTipsQuery,
{ chainFilter: 'bchn-mainnet' },
);
// Validate the response notification payload.
monitorSyncTipsSchema.parse(response);
expect(response).toBeTypeOf('object');
expect(response).not.toBeInstanceOf(Error);
expect(response).not.toBeNull();
});
it("should succesfully request 'GetJonathan100CashAccount' and receive a valid response from server", async () => {
/**
* Query in SDL:
*
`query GetJonathan100CashAccount {
search_output_prefix(
args: { locking_bytecode_prefix_hex: "6a0401010101084a6f6e617468616e" },
where: {
transaction: { block_inclusions: { block: { height: { _eq: 563720 } } } }
}
) {
transaction {
hash
data_carrier_outputs {
locking_bytecode
output_index
}
block_inclusions {
block {
hash
height
}
}
}
}
}`
*/
const getJonathan100CashAccount = {
query: {
__name: 'GetJonathan100CashAccount',
search_output_prefix: {
__args: {
args: {
locking_bytecode_prefix_hex: '6a0401010101084a6f6e617468616e',
},
where: {
transaction: {
block_inclusions: {
block: {
height: {
_eq: 563720,
},
},
},
},
},
},
transaction: {
hash: true,
data_carrier_outputs: {
locking_bytecode: true,
output_index: true,
},
block_inclusions: {
block: {
hash: true,
height: true,
},
},
},
},
},
};
const expectedResponse = {
data: {
search_output_prefix: [
{
transaction: {
hash: '\\x590d1fdf7e04af0ee08f9194bb9e8d1971bdcbf55d29303d5bf32d4eae5e7136',
data_carrier_outputs: [
{
locking_bytecode:
'\\x6a0401010101084a6f6e617468616e1501ebdeb6430f3d16a9c6758d6c0d7a400c8e6bbee4',
output_index: '0',
},
],
block_inclusions: [
{
block: {
hash: '\\x000000000000000002abbeff5f6fb22a0b3b5c2685c6ef4ed2d2257ed54e9dcb',
height: '563720',
},
},
],
},
},
],
},
};
const response = await graphQLClient.request(
'GetJonathan100CashAccount',
getJonathan100CashAccount,
);
expect(response).toEqual(expectedResponse);
});
});