Home Reference Source Test

test/specs/generic/consensus/base/transaction/BasicTransaction.spec.js

describe('BasicTransaction', () => {
    const senderPubKey = PublicKey.unserialize(BufferUtils.fromBase64(Dummy.publicKey1));
    let senderAddress;
    const recipientAddr = Address.unserialize(BufferUtils.fromBase64(Dummy.address1));
    const value = 1;
    const fee = 1;
    const validityStartHeight = 1;
    const networkId = 4;
    const signature = Signature.unserialize(BufferUtils.fromBase64(Dummy.signature1));

    beforeAll(() => {
        senderAddress = senderPubKey.toAddress();
    });

    it('is correctly created', () => {
        const tx1 = new BasicTransaction(senderPubKey, recipientAddr, value, fee, validityStartHeight, signature, networkId);

        expect(tx1._format).toEqual(Transaction.Format.BASIC);
        expect(tx1.senderPubKey.equals(senderPubKey)).toEqual(true);
        expect(tx1.recipient.equals(recipientAddr)).toEqual(true);
        expect(tx1.value).toEqual(value);
        expect(tx1.fee).toEqual(fee);
        expect(tx1.validityStartHeight).toEqual(validityStartHeight);
        expect(tx1.networkId).toEqual(networkId);
        expect(tx1.signature.equals(signature)).toBeTruthy();
    });

    it('is serializable and unserializable', () => {
        const tx1 = new BasicTransaction(senderPubKey, recipientAddr, value, fee, validityStartHeight, signature, networkId);
        const tx2 = Transaction.unserialize(tx1.serialize());

        expect(tx2._format).toEqual(Transaction.Format.BASIC);
        expect(tx2.senderPubKey.equals(senderPubKey)).toEqual(true);
        expect(tx2.recipient.equals(recipientAddr)).toEqual(true);
        expect(tx2.value).toEqual(value);
        expect(tx2.fee).toEqual(fee);
        expect(tx2.validityStartHeight).toEqual(validityStartHeight);
        expect(tx2.networkId).toEqual(networkId);
        expect(tx2.signature.equals(signature)).toBeTruthy();
        expect(tx2.equals(tx1)).toBe(true);
    });

    it('is self plain', () => {
        const tx1 = new BasicTransaction(senderPubKey, recipientAddr, value, fee, validityStartHeight, signature, networkId);
        const tx2 = Transaction.fromPlain(tx1);

        expect(tx2._format).toEqual(Transaction.Format.BASIC);
        expect(tx2.senderPubKey.equals(senderPubKey)).toEqual(true);
        expect(tx2.recipient.equals(recipientAddr)).toEqual(true);
        expect(tx2.value).toEqual(value);
        expect(tx2.fee).toEqual(fee);
        expect(tx2.validityStartHeight).toEqual(validityStartHeight);
        expect(tx2.networkId).toEqual(networkId);
        expect(tx2.signature.equals(signature)).toBeTruthy();
        expect(tx2.equals(tx1)).toBe(true);
    });

    it('can be converted to plain and back', () => {
        const tx1 = new BasicTransaction(senderPubKey, recipientAddr, value, fee, validityStartHeight, signature, networkId);
        const plainTx = JSON.stringify(tx1.toPlain());
        const tx2 = Transaction.fromPlain(JSON.parse(plainTx));

        expect(tx2._format).toEqual(Transaction.Format.BASIC);
        expect(tx2.senderPubKey.equals(senderPubKey)).toEqual(true);
        expect(tx2.recipient.equals(recipientAddr)).toEqual(true);
        expect(tx2.value).toEqual(value);
        expect(tx2.fee).toEqual(fee);
        expect(tx2.validityStartHeight).toEqual(validityStartHeight);
        expect(tx2.networkId).toEqual(networkId);
        expect(tx2.signature.equals(signature)).toBeTruthy();
        expect(tx2.equals(tx1)).toBe(true);
    });

    it('can falsify an invalid signature', () => {
        const tx1 = new BasicTransaction(senderPubKey, recipientAddr, value, fee, validityStartHeight, signature);
        expect(tx1.verify()).toBe(false);
    });

    it('can falsify a transaction from a different network ID', () => {
        const users = TestBlockchain.getUsers(2);
        const tx2 = TestBlockchain.createTransaction(users[0].publicKey, users[1].address, 1000, 20, 0, users[0].privateKey, undefined, 0);
        expect(tx2.verify()).toBe(false);
    });

    it('can verify a valid signature', () => {
        const users = TestBlockchain.getUsers(2);
        const tx = TestBlockchain.createTransaction(users[0].publicKey, users[1].address, 1000, 20, 0, users[0].privateKey);
        expect(tx.verify()).toBeTruthy();
    });
});