UNPKG

opendb_test_rpc

Version:

general purpose library for OpenDB blockchain

264 lines 26.9 kB
import OPENDB from '..'; // OPENDB instance for API call let BP_ENDPOINT, opendb; beforeEach(async () => { BP_ENDPOINT = 'ws://13.200.184.78:11110'; // BP_ENDPOINT = 'wss://sql-ws.guardianlink.io/ws' opendb = new OPENDB(BP_ENDPOINT); await opendb.connect(); }); // Positive case describe('Open DB Client test', () => { it('Connection Test', () => { expect(opendb.client.endpoint).toBe(BP_ENDPOINT); expect(opendb.client.connect()).not.toBeNull(); expect(opendb.client.isConnected).toBeTruthy(); }); it('RPC test', () => { expect(opendb.client.rpc).toBeTruthy(); expect(opendb.client.rpc.connect).toBeTruthy(); expect(opendb.client.rpc.onClose).toBeTruthy(); }); }); describe('Open DB BP test Block', () => { it('getBlockList Test with valid params', async () => { const getBlockListData = await opendb.bp.getBlockList(1, 2); expect(getBlockListData).toBeTruthy(); expect(getBlockListData).toEqual({ blocks: [ { height: 55188700, hash: '5c7dd5cb60fea526fd2178670bbe016867950fc7b70224c2d4b76adc660a12f0', timestamp: 1712661847000182000, timestamp_human: '2024-04-09T11:24:07.000182111Z', version: 16777216, producer: '8d7604acfdb391891a4c795f0939425b6d58bd50a81e579d15f06ecd381ad549', merkle_root: 'e618e37920219dd949a6bc81bf9910936c9ec191d1d92b828ba1ff90dd5a3755', parent: 'be5990f750cf2b09ec8eb2894668cd3affdd6838191b63378181b7835dd0d5a8', tx_count: 3, }, { height: 55188699, hash: 'be5990f750cf2b09ec8eb2894668cd3affdd6838191b63378181b7835dd0d5a8', timestamp: 1712661844000170000, timestamp_human: '2024-04-09T11:24:04.00017005Z', version: 16777216, producer: '8d7604acfdb391891a4c795f0939425b6d58bd50a81e579d15f06ecd381ad549', merkle_root: '7e86227f99300da914901c391f7793095bd2d1df6ffb7624603ba7dd0c2553c8', parent: 'f70c535bbef0a74d3b102592f33ee33ad99696caaf371df9418c7859786b4aa1', tx_count: 3, }, ], pagination: { page: 1, size: 2, total: 318843, pages: 159422 }, }); }); it('getBlockByHash Test with valid Hash', async () => { await expect(opendb.bp.getBlockByHash('1ec2d8ea08f85fa911323ef41ae2f133992ffae75a9bd86f64d679132f821651')).toBeTruthy(); }); it('getBlockByHeight Test with valid Height', async () => { await expect(opendb.bp.getBlockByHeight(55188697)).toBeTruthy(); }); }); describe('Open DB BP test TransactionList', () => { it('getTransactionList Test with valid params', async () => { const getTransactionListData = await opendb.bp.getTransactionList(1, 2); expect(getTransactionListData).toBeTruthy(); expect(getTransactionListData).toEqual({ transactions: [ { block_height: 55188700, index: 2, hash: 'db47d3ae0010ef44e56536f6a0f84fd1dcfc94ce425f09176151400ab505fbb9', block_hash: '5c7dd5cb60fea526fd2178670bbe016867950fc7b70224c2d4b76adc660a12f0', timestamp: 1712661845716714500, timestamp_human: '2024-04-09T11:24:05.716714379Z', type: 9, address: '1a7b0959bbd0d0ec529278a61c0056c277bffe75b2646e1699b46b10a90210be', raw: '{"Space":33172803584,"Memory":14789107712,"LoadAvgPerCPU":0.0275,"TargetUser":null,"GasPrice":1,"TokenType":0,"NodeID":"000005f4f22c06f76c43c4f48d5a7ec1309cc94030cbf9ebae814172884ac8b5","Nonce":318843,"TxType":9,"Timestamp":"2024-04-09T11:24:05.716714379Z","DataHash":"db47d3ae0010ef44e56536f6a0f84fd1dcfc94ce425f09176151400ab505fbb9","Signee":{"Curve":{"P":115792089237316195423570985008687907853269984665640564039457584007908834671663,"N":115792089237316195423570985008687907852837564279074904382605163141518161494337,"B":7,"Gx":55066263022277343669578718895168534326250603453777594175500187360389116729240,"Gy":32670510020758816978083085130507043184471273380659243275938904335757337482424,"BitSize":256,"Name":"","H":1},"X":65719270943604338427905752337893210135845472056018326024127522629670524209686,"Y":35497802239556337884222127738547385904561999414342714456895417367493562245332},"Signature":{"R":38675844899950829639690380171382593038923764384816603554883127048781541395881,"S":34237655500141589236100238282878058242372634904943393953512937461423001370083}}', tx: { DataHash: 'db47d3ae0010ef44e56536f6a0f84fd1dcfc94ce425f09176151400ab505fbb9', GasPrice: 1, LoadAvgPerCPU: 0.0275, Memory: 14789107712, NodeID: '000005f4f22c06f76c43c4f48d5a7ec1309cc94030cbf9ebae814172884ac8b5', Nonce: 318843, Signature: { R: 3.867584489995083e76, S: 3.4237655500141586e76 }, Signee: { Curve: { B: 7, BitSize: 256, Gx: 5.5066263022277344e76, Gy: 3.2670510020758816e76, H: 1, N: 1.157920892373162e77, Name: '', P: 1.157920892373162e77, }, X: 6.571927094360434e76, Y: 3.549780223955634e76, }, Space: 33172803584, TargetUser: null, Timestamp: '2024-04-09T11:24:05.716714379Z', TokenType: 0, TxType: 9, }, }, { block_height: 55188700, index: 1, hash: '942f47cb2a331ee5c37f5b23b7b3b4261033ccd39cc12fc66adcaa48664f1d6a', block_hash: '5c7dd5cb60fea526fd2178670bbe016867950fc7b70224c2d4b76adc660a12f0', timestamp: 1712661845770187800, timestamp_human: '2024-04-09T11:24:05.770187851Z', type: 9, address: 'ba0ba731c7a76ccef2c1170f42038f7e228dfb474ef0190dfe35d9a37911ed37', raw: '{"Space":33172803584,"Memory":14789107712,"LoadAvgPerCPU":0.0275,"TargetUser":null,"GasPrice":1,"TokenType":0,"NodeID":"000005aa62048f85da4ae9698ed59c14ec0d48a88a07c15a32265634e7e64ade","Nonce":318843,"TxType":9,"Timestamp":"2024-04-09T11:24:05.770187851Z","DataHash":"942f47cb2a331ee5c37f5b23b7b3b4261033ccd39cc12fc66adcaa48664f1d6a","Signee":{"Curve":{"P":115792089237316195423570985008687907853269984665640564039457584007908834671663,"N":115792089237316195423570985008687907852837564279074904382605163141518161494337,"B":7,"Gx":55066263022277343669578718895168534326250603453777594175500187360389116729240,"Gy":32670510020758816978083085130507043184471273380659243275938904335757337482424,"BitSize":256,"Name":"","H":1},"X":46889149913685178140156963369364502857171763704599626739506996032145349700896,"Y":107351296487730405960229873787712063587054507408879896649250634583933168665635},"Signature":{"R":48816205973163661129696558208109977111499883738533422344063974348392988798502,"S":32520652476819776705229003905131857051523200598119728185685160196802626427851}}', tx: { DataHash: '942f47cb2a331ee5c37f5b23b7b3b4261033ccd39cc12fc66adcaa48664f1d6a', GasPrice: 1, LoadAvgPerCPU: 0.0275, Memory: 14789107712, NodeID: '000005aa62048f85da4ae9698ed59c14ec0d48a88a07c15a32265634e7e64ade', Nonce: 318843, Signature: { R: 4.8816205973163663e76, S: 3.2520652476819775e76 }, Signee: { Curve: { B: 7, BitSize: 256, Gx: 5.5066263022277344e76, Gy: 3.2670510020758816e76, H: 1, N: 1.157920892373162e77, Name: '', P: 1.157920892373162e77, }, X: 4.6889149913685175e76, Y: 1.073512964877304e77, }, Space: 33172803584, TargetUser: null, Timestamp: '2024-04-09T11:24:05.770187851Z', TokenType: 0, TxType: 9, }, }, ], pagination: { page: 1, size: 2, total: 956535, pages: 478268 }, }); }); it('getTransactionListOfBlock Test with valid params', async () => { await expect(opendb.bp.getTransactionListOfBlock(42170, 1, 4)).toBeTruthy(); }); it('getTransactionByHash Test with valid Hash', async () => { await expect(opendb.bp.getTransactionByHash('942f47cb2a331ee5c37f5b23b7b3b4261033ccd39cc12fc66adcaa48664f1d6a')).toBeTruthy(); }); }); // Negative case describe('Open DB Client test', () => { it('should throw error for empty hostname', async () => { opendb = new OPENDB(''); await expect(opendb.connect()).rejects.toThrow(); }); it('should throw error for invalid hostname', async () => { opendb = new OPENDB('unknown:3330'); await expect(opendb.connect()).rejects.toThrow(); }); }); describe('Open DB BP test Block', () => { //Testcase for Negative case getBlockListData -without params,invalid page number,invalid size it('getBlockListData Test invalid page number', async () => { const getBlockListData = await opendb.bp.getBlockList(67159428, 1); expect(getBlockListData.blocks).toEqual([]); }); it('getBlockListData Test without params', async () => { const getBlockListData = await opendb.bp.getBlockList(); expect(getBlockListData.blocks).toBeTruthy(); // -------TODO: Without parameter its get data from page 1 and first 10 record }); it('getBlockListData Test 0 size', async () => { const getBlockListData = await opendb.bp.getBlockList(6, 0); expect(getBlockListData.blocks).toBeTruthy(); // -------TODO: Valid page number 6 and size tobe 0 it means function retun data 6th page 10 records }); //Testcase for Negative case getBlockListData -without params,invalid Hash it('getBlockByHashData Test without params', async () => { // Failed case // '1ec2d8ea08f85fa911323ef41ae2f133992ffae75a9bd86f64d679132f821651' // -------TODO: Cannot check this case because of timeout await expect(opendb.bp.getBlockByHash()).rejects.toThrow(); }); it('getBlockByHashData Test with wrong Hash', async () => { // Failed case // -------TODO: Cannot check this case because of timeout await expect(opendb.bp.getBlockByHash('1ec2d8ea08f85fa911323ef41ae2f133992ffae75a9bd86f64d679132f821655')).toBeTruthy(); }); //Testcase for Negative case getBlockListData -without params,invalid Height it('getBlockByHeightData Test without param(height)', async () => { // Failed case // -------TODO: Cannot check this case because of timeout await expect(opendb.bp.getBlockByHeight()).toBeTruthy(); }); it('getBlockByHeightData Test Wrong param(height)', async () => { // Failed case // -------TODO: Cannot check this case because of timeout await expect(opendb.bp.getBlockByHeight(13)).toBeTruthy(); // 4324235453453453434- replace 13 to this number i change for tslint }); }); describe('Open DB BP test TransactionList', () => { //=========> getTransactionListData it('getTransactionListData Test without param', async () => { // -------TODO: Without parameter its get data from page 1 and first 10 record await expect(opendb.bp.getTransactionList()).toBeTruthy(); }); it('getTransactionListData Test invalid pagenumber', async () => { const getTransactionListData = await opendb.bp.getTransactionList(333956535, 1); // -------TODO: invalid pagenumber its get data from page 333956535 and first 1 record expect(getTransactionListData).toBeTruthy(); expect(getTransactionListData.transactions).toBeNull(); }); it('getTransactionListData Test 0 size', async () => { // -------TODO: Without parameter its get data from page 1 and first 10 record await expect(opendb.bp.getTransactionList(1, 0)).toBeTruthy(); }); //==========> getTransactionListOfBlockData it('getTransactionListOfBlockData Test without param', async () => { // TODO: Received function did not throw await expect(opendb.bp.getTransactionListOfBlock()).rejects.toThrow(); }); it('getTransactionListOfBlockData Test invalid Height', async () => { const getTransactionListOfBlockData = await opendb.bp.getTransactionListOfBlock(99955188695, 1, 58); // TODO: invalid height to get empty result expect(getTransactionListOfBlockData.transactions).toEqual([]); }); it('getTransactionListOfBlockData Test invalid Height without from, to', async () => { const getTransactionListOfBlockData = await opendb.bp.getTransactionListOfBlock(99955188695); // TODO: invalid height to get empty result expect(getTransactionListOfBlockData.transactions).toEqual([]); }); it('getTransactionListOfBlockData Test valid Height without from, to', async () => { const getTransactionListOfBlockData = await opendb.bp.getTransactionListOfBlock(55188695); // TODO: Default 10 record load fro the height 55188695 expect(getTransactionListOfBlockData.transactions).not.toBeNull(); }); //==================> getTransactionByHashData it('getTransactionByHashData Test without Hash', async () => { // -------TODO: Cannot check this case because of timeout await expect(opendb.bp.getTransactionByHash('')).toBeTruthy(); }); it('getTransactionByHashData Test with wromg Hash', async () => { //Failed case // 942f47cb2a331ee5c37f5b23b7b3b4261033ccd39cc12fc66adcaa48664f1d6a // -------TODO: Cannot check this case because of timeout await expect(opendb.bp.getTransactionByHash('942f47cb2a331ee5c37f5b23b7b3b4261033ccd39cc12fc66adcaa48664f1d98')).toBeTruthy(); }); }); describe('Open DB BP getBlockListData test Block', () => { it('getBlockListData Test invalid size', async () => { await expect(opendb.bp.getBlockList(6, 12) //763387168172361827 - replace 12 to this number i change for tslint ).rejects.toThrow(); // -------TODO: Received function did not throw }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnAudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9fX3Rlc3RzX18vYnAudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxJQUFJLENBQUE7QUFDdkIsK0JBQStCO0FBQy9CLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQTtBQUN2QixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDcEIsV0FBVyxHQUFHLDBCQUEwQixDQUFBO0lBQ3hDLGtEQUFrRDtJQUNsRCxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDaEMsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7QUFDeEIsQ0FBQyxDQUFDLENBQUE7QUFDRixnQkFBZ0I7QUFDaEIsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtJQUNuQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNoRCxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1FBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUM5QyxNQUFNLENBQUMsTUFBTSxD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