Home Reference Source Test

test/specs/generic/consensus/base/transaction/index/TransactionStoreEntry.spec.js

describe('TransactionStoreEntry', () => {

    it('correctly constructs transactions from block', (done) => {
        (async () => {
            const blockchain = await TestBlockchain.createVolatileTest(0);

            const senderPubKey = blockchain.users[0].publicKey;
            const senderAddress = blockchain.users[0].address;
            const recipientAddress = blockchain.users[1].address;
            const signature = Signature.unserialize(BufferUtils.fromBase64(Dummy.signature1));
            const proof = BufferUtils.fromAscii('ABCD');
            const tx1 = new BasicTransaction(senderPubKey, recipientAddress, 1, 1, 1, signature);
            const tx2 = new ExtendedTransaction(senderAddress, Account.Type.BASIC, recipientAddress, Account.Type.BASIC, 1, 1, 1, Transaction.Flag.NONE, new Uint8Array(0), proof);
            const tx3 = new ExtendedTransaction(senderAddress, Account.Type.BASIC, recipientAddress, Account.Type.BASIC, 100, 0, 1, Transaction.Flag.NONE, new Uint8Array(0), proof);

            /** @type {Array.<Transaction>} */
            const transactions = [tx1, tx2, tx3];
            transactions.sort((a, b) => a.compareBlockOrder(b));

            const block = await blockchain.createBlock({ transactions });
            const blockHash = block.hash();

            /** @type {Array.<TransactionStoreEntry>} */
            const entries = TransactionStoreEntry.fromBlock(block);
            expect(entries.length).toBe(3);

            for (let i=0; i<entries.length; ++i) {
                /** @type {TransactionStoreEntry} */
                const entry = entries[i];
                expect(entry.transactionHash.equals(transactions[i].hash())).toBeTruthy();
                expect(entry.sender.equals(transactions[i].sender)).toBeTruthy();
                expect(entry.recipient.equals(transactions[i].recipient)).toBeTruthy();
                expect(entry.blockHeight).toBe(block.height);
                expect(entry.index).toBe(i);
                expect(entry.blockHash.equals(blockHash)).toBeTruthy();
            }
        })().then(done, done.fail);
    });

    it('can convert to/from JSON', (done) => {
        (async () => {
            const transactionHash = Hash.fromBase64('kosgNmlD4q/RHrwOri5TqTvxd6T881vMZNUDcE5l4gI=');
            const sender = Address.fromBase64('0oYHRko0a7iUj3R1NJCNTQfL+Ow=');
            const recipient = Address.fromBase64('1IicaaUOJg19oMq0fr6PURzTauA=');
            const blockHash = Hash.fromBase64('KkDO+gbOchNDSX5eZwB0fv12VQkurEhoHHLz5J8u+HU=');

            const entry = new TransactionStoreEntry(transactionHash, sender, recipient, 2, blockHash, 3);
            const json = entry.toJSON();
            expect(json).toEqual({transactionHashBuffer: transactionHash.serialize(), senderBuffer: sender.serialize(), recipientBuffer: recipient.serialize(), blockHash: blockHash.toBase64(), blockHeight: 2, index: 3});

            const entry2 = TransactionStoreEntry.fromJSON(entry.key, json);
            expect(entry2.transactionHash.equals(entry.transactionHash)).toBeTruthy();
            expect(entry2.sender.equals(entry.sender)).toBeTruthy();
            expect(entry2.recipient.equals(entry.recipient)).toBeTruthy();
            expect(entry2.blockHeight).toBe(entry.blockHeight);
            expect(entry2.index).toBe(entry.index);
            expect(entry2.blockHash.equals(entry.blockHash)).toBeTruthy();
        })().then(done, done.fail);
    });
});