Example #1
0
    def test_happy_path(self):
        """
    Successfully promoting a bundle.
    """

        self.adapter.seed_response('checkConsistency', {
            'state': True,
        })

        result_bundle = Bundle.from_tryte_strings([
            TransactionTrytes(self.trytes1),
            TransactionTrytes(self.trytes2),
        ])
        mock_send_transfer = mock.Mock(return_value={
            'bundle': result_bundle,
        })

        with mock.patch(
                'iota_async.commands.extended.send_transfer.SendTransferCommand._execute',
                mock_send_transfer,
        ):

            response = self.command(
                transaction=self.hash1,
                depth=3,
                minWeightMagnitude=16,
            )

        self.assertDictEqual(response, {
            'bundle': result_bundle,
        })
    def test_pass_happy_path(self):
        """
    The incoming response contains valid values.
    """
        filter_ = self._filter({
            # Trytes arrive from the node as strings.
            'trytes': [
                self.trytes1,
                self.trytes2,
            ],
            'duration': 42,
        })

        self.assertFilterPasses(filter_)

        self.assertDictEqual(
            filter_.cleaned_data,
            {
                'trytes': [
                    TransactionTrytes(self.trytes1),
                    TransactionTrytes(self.trytes2),
                ],
                'duration':
                42,
            },
        )
Example #3
0
    def test_happy_path(self):
        """
    Successful invocation of ``sendTrytes``.
    """
        self.adapter.seed_response(
            'getTransactionsToApprove', {
                'trunkTransaction': text_type(self.transaction1, 'ascii'),
                'branchTransaction': text_type(self.transaction2, 'ascii'),
            })

        self.adapter.seed_response(
            'attachToTangle', {
                'trytes': [
                    text_type(self.trytes1, 'ascii'),
                    text_type(self.trytes2, 'ascii'),
                ],
            })

        self.adapter.seed_response('broadcastTransactions', {})
        self.adapter.seed_response('storeTransactions', {})

        trytes = [
            TransactionTrytes(self.trytes1),
            TransactionTrytes(self.trytes2),
        ]

        response = self.command(
            trytes=trytes,
            depth=100,
            minWeightMagnitude=18,
        )

        self.assertDictEqual(response, {'trytes': trytes})
    def test_pass_compatible_types(self):
        """
    The incoming request contains values that can be converted into the
    expected types.
    """
        filter_ = self._filter({
            # Any value that can be converted into an ASCII representation of
            # a TryteString is allowed here.
            'trytes': [
                TransactionTrytes(self.trytes1),
                bytearray(self.trytes2.encode('ascii')),
            ],
        })

        self.assertFilterPasses(filter_)
        self.assertDictEqual(
            filter_.cleaned_data,
            {
                # Raw trytes are extracted to match the IRI's JSON protocol.
                'trytes': [
                    text_type(TransactionTrytes(self.trytes1)),
                    text_type(TransactionTrytes(self.trytes2)),
                ],
            },
        )
Example #5
0
    def setUp(self):
        super(BroadcastTransactionsRequestFilterTestCase, self).setUp()

        # Define a few valid values that we can reuse across tests.
        self.trytes1 = TransactionTrytes('RBTC9D9DCDQAEASBYBCCKBFA')
        self.trytes2 =\
          TransactionTrytes(
            'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHDWCTCEAKDCDFD9DSCSA'
          )
    def test_pass_compatible_types(self):
        """
    Incoming values can be converted into the expected types.
    """
        filter_ = self._filter({
            # Any value that can be converted into an ASCII representation of
            # a TransactionHash is valid here.
            'trunkTransaction':
            TransactionHash(self.txn_id),
            'branchTransaction':
            bytearray(self.txn_id.encode('ascii')),
            'trytes': [
                # ``trytes`` can contain any value that can be converted into a
                # TryteString.
                binary_type(TransactionTrytes(self.trytes1)),

                # This is probably wrong (s/b :py:class:`TransactionTrytes`),
                # but technically it's valid.
                TransactionHash(
                    b'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHDWCTCEAKDCDFD9DSCSA',
                ),
            ],

            # This still has to be an int, however.
            'minWeightMagnitude':
            30,
        })

        self.assertFilterPasses(filter_)
        self.assertDictEqual(
            filter_.cleaned_data,

            # After running through the filter, all of the values have been
            # converted to the correct types.
            {
                'trunkTransaction':
                self.txn_id,
                'branchTransaction':
                self.txn_id,
                'minWeightMagnitude':
                30,
                'trytes': [
                    text_type(TransactionTrytes(self.trytes1)),
                    text_type(
                        TransactionTrytes(
                            b'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHD'
                            b'WCTCEAKDCDFD9DSCSA99999999999999999999999', )),
                ],
            })
    def test_pass_happy_path(self):
        """
    The incoming request is valid.
    """
        request = {
            # Raw trytes are extracted to match the IRI's JSON protocol.
            'trytes': [
                text_type(TransactionTrytes(self.trytes1)),
                text_type(TransactionTrytes(self.trytes2)),
            ],
        }

        filter_ = self._filter(request)

        self.assertFilterPasses(filter_)
        self.assertDictEqual(filter_.cleaned_data, request)
Example #8
0
    def test_pass_happy_path(self):
        """
    Request is valid.
    """
        request = {
            'depth':
            100,
            'minWeightMagnitude':
            18,
            'trytes': [
                TransactionTrytes(self.trytes1),
                TransactionTrytes(self.trytes2),
            ],
            'reference':
            TransactionHash(self.trytes1),
        }

        filter_ = self._filter(request)

        self.assertFilterPasses(filter_)
        self.assertDictEqual(filter_.cleaned_data, request)
    def test_pass_happy_path(self):
        """
    The incoming request is valid.
    """
        request = {
            'trunkTransaction':
            text_type(TransactionHash(self.txn_id)),
            'branchTransaction':
            text_type(TransactionHash(self.txn_id)),
            'minWeightMagnitude':
            20,
            'trytes': [
                # Raw trytes are extracted to match the IRI's JSON protocol.
                text_type(TransactionTrytes(self.trytes1)),
                text_type(TransactionTrytes(self.trytes2)),
            ],
        }

        filter_ = self._filter(request)

        self.assertFilterPasses(filter_)
        self.assertDictEqual(filter_.cleaned_data, request)
Example #10
0
    def test_happy_path(self):
        """
    Successful invocation of ``broadcastAndStore``.
    """
        self.adapter.seed_response(
            'broadcastTransactions', {
                'trytes': [
                    text_type(self.trytes1, 'ascii'),
                    text_type(self.trytes2, 'ascii'),
                ],
            })

        self.adapter.seed_response('storeTransactions', {})

        trytes = [
            TransactionTrytes(self.trytes1),
            TransactionTrytes(self.trytes2),
        ]

        response = self.command(trytes=trytes)

        self.assertDictEqual(response, {'trytes': trytes})
Example #11
0
    def test_pass_compatible_types(self):
        """
    Request contains values that can be converted to the expected
    types.
    """
        filter_ = self._filter({
            # This can accept any TrytesCompatible values.
            'trytes': [
                binary_type(self.trytes1),
                bytearray(self.trytes2),
            ],
            'reference':
            binary_type(self.trytes2),

            # These still have to be ints, however.
            'depth':
            100,
            'minWeightMagnitude':
            18,
        })

        self.assertFilterPasses(filter_)
        self.assertDictEqual(
            filter_.cleaned_data,
            {
                'depth':
                100,
                'minWeightMagnitude':
                18,
                'trytes': [
                    TransactionTrytes(self.trytes1),
                    TransactionTrytes(self.trytes2),
                ],
                'reference':
                TransactionHash(self.trytes2)
            },
        )
Example #12
0
    def test_happy_path(self):
        """
    Sending a transfer successfully.
    """
        # noinspection SpellCheckingInspection
        transaction1 =\
          TransactionTrytes(
            b'GYPRVHBEZOOFXSHQBLCYW9ICTCISLHDBNMMVYD9JJHQMPQCTIQAQTJNNNJ9IDXLRCC'
            b'OYOXYPCLR9PBEY9ORZIEPPDNTI9CQWYZUOTAVBXPSBOFEQAPFLWXSWUIUSJMSJIIIZ'
            b'WIKIRH9GCOEVZFKNXEVCUCIIWZQCQEUVRZOCMEL9AMGXJNMLJCIA9UWGRPPHCEOPTS'
            b'VPKPPPCMQXYBHMSODTWUOABPKWFFFQJHCBVYXLHEWPD9YUDFTGNCYAKQKVEZYRBQRB'
            b'XIAUX9SVEDUKGMTWQIYXRGSWYRK9SRONVGTW9YGHSZRIXWGPCCUCDRMAXBPDFVHSRY'
            b'WHGB9DQSQFQKSNICGPIPTRZINYRXQAFSWSEWIFRMSBMGTNYPRWFSOIIWWT9IDSELM9'
            b'JUOOWFNCCSHUSMGNROBFJX9JQ9XT9PKEGQYQAWAFPRVRRVQPUQBHLSNTEFCDKBWRCD'
            b'X9EYOBB9KPMTLNNQLADBDLZPRVBCKVCYQEOLARJYAGTBFR9QLPKZBOYWZQOVKCVYRG'
            b'YI9ZEFIQRKYXLJBZJDBJDJVQZCGYQMROVHNDBLGNLQODPUXFNTADDVYNZJUVPGB9LV'
            b'PJIYLAPBOEHPMRWUIAJXVQOEM9ROEYUOTNLXVVQEYRQWDTQGDLEYFIYNDPRAIXOZEB'
            b'CS9P99AZTQQLKEILEVXMSHBIDHLXKUOMMNFKPYHONKEYDCHMUNTTNRYVMMEYHPGASP'
            b'ZXASKRUPWQSHDMU9VPS99ZZ9SJJYFUJFFMFORBYDILBXCAVJDPDFHTTTIYOVGLRDYR'
            b'TKHXJORJVYRPTDH9ZCPZ9ZADXZFRSFPIQKWLBRNTWJHXTOAUOL9FVGTUMMPYGYICJD'
            b'XMOESEVDJWLMCVTJLPIEKBE9JTHDQWV9MRMEWFLPWGJFLUXI9BXPSVWCMUWLZSEWHB'
            b'DZKXOLYNOZAPOYLQVZAQMOHGTTQEUAOVKVRRGAHNGPUEKHFVPVCOYSJAWHZU9DRROH'
            b'BETBAFTATVAUGOEGCAYUXACLSSHHVYDHMDGJP9AUCLWLNTFEVGQGHQXSKEMVOVSKQE'
            b'EWHWZUDTYOBGCURRZSJZLFVQQAAYQO9TRLFFN9HTDQXBSPPJYXMNGLLBHOMNVXNOWE'
            b'IDMJVCLLDFHBDONQJCJVLBLCSMDOUQCKKCQJMGTSTHBXPXAMLMSXRIPUBMBAWBFNLH'
            b'LUJTRJLDERLZFUBUSMF999XNHLEEXEENQJNOFFPNPQ9PQICHSATPLZVMVIWLRTKYPI'
            b'XNFGYWOJSQDAXGFHKZPFLPXQEHCYEAGTIWIJEZTAVLNUMAFWGGLXMBNUQTOFCNLJTC'
            b'DMWVVZGVBSEBCPFSM99FLOIDTCLUGPSEDLOKZUAEVBLWNMODGZBWOVQT9DPFOTSKRA'
            b'BQAVOQ9RXWBMAKFYNDCZOJGTCIDMQSQQSODKDXTPFLNOKSIZEOY9HFUTLQRXQMEPGO'
            b'XQGLLPNSXAUCYPGZMNWMQWSWCKAQYKXJTWINSGPPZG9HLDLEAWUWEVCTVRCBDFOXKU'
            b'ROXH9HXXAXVPEJFRSLOGRVGYZASTEBAQNXJJROCYRTDPYFUIQJVDHAKEG9YACV9HCP'
            b'JUEUKOYFNWDXCCJBIFQKYOXGRDHVTHEQUMHO999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999999999999999999999999999999999999'
            b'999999999999RKWEEVD99A99999999A99999999NFDPEEZCWVYLKZGSLCQNOFUSENI'
            b'XRHWWTZFBXMPSQHEDFWZULBZFEOMNLRNIDQKDNNIELAOXOVMYEI9PGTKORV9IKTJZQ'
            b'UBQAWTKBKZ9NEZHBFIMCLV9TTNJNQZUIJDFPTTCTKBJRHAITVSKUCUEMD9M9SQJ999'
            b'999TKORV9IKTJZQUBQAWTKBKZ9NEZHBFIMCLV9TTNJNQZUIJDFPTTCTKBJRHAITVSK'
            b'UCUEMD9M9SQJ999999999999999999999999999999999999999999999999999999'
            b'999999999999999999999999999999999'
          )

        mock_prepare_transfer =\
          mock.Mock(return_value={
            'trytes': [transaction1],
          })

        mock_send_trytes =\
          mock.Mock(return_value={
            'trytes': [transaction1],
          })

        with mock.patch(
                'iota_async.commands.extended.prepare_transfer.PrepareTransferCommand._execute',
                mock_prepare_transfer,
        ):
            with mock.patch(
                    'iota_async.commands.extended.send_trytes.SendTrytesCommand._execute',
                    mock_send_trytes,
            ):
                response = self.command(
                    depth=100,
                    minWeightMagnitude=18,
                    seed=Seed.random(),
                    transfers=[
                        ProposedTransaction(
                            address=Address(
                                b'9999999999999999999999999999999999999999'
                                b'99999999999999999999999999999999999999999'),
                            value=0,
                        ),
                    ],
                )

        bundle = response['bundle']  # type: Bundle
        self.assertEqual(len(bundle), 1)
        self.assertEqual(bundle[0].as_tryte_string(), transaction1)
Example #13
0
    def test_as_tryte_string(self):
        """
    Converting a Transaction into a TryteString.
    """
        transaction = Transaction(
            hash_=TransactionHash(
                b'SYABNCYPLULQQBTDCUWJPVVMYNWHKEHGAZPKRBGE'
                b'QKEHUIKJCHWGAUKLSYMDOUUBMXPKCPTNFWUFU9JKW'),
            signature_message_fragment=Fragment(
                b'GYPRVHBEZOOFXSHQBLCYW9ICTCISLHDBNMMVYD9JJHQMPQCTIQAQTJNNNJ9IDXLRCC'
                b'OYOXYPCLR9PBEY9ORZIEPPDNTI9CQWYZUOTAVBXPSBOFEQAPFLWXSWUIUSJMSJIIIZ'
                b'WIKIRH9GCOEVZFKNXEVCUCIIWZQCQEUVRZOCMEL9AMGXJNMLJCIA9UWGRPPHCEOPTS'
                b'VPKPPPCMQXYBHMSODTWUOABPKWFFFQJHCBVYXLHEWPD9YUDFTGNCYAKQKVEZYRBQRB'
                b'XIAUX9SVEDUKGMTWQIYXRGSWYRK9SRONVGTW9YGHSZRIXWGPCCUCDRMAXBPDFVHSRY'
                b'WHGB9DQSQFQKSNICGPIPTRZINYRXQAFSWSEWIFRMSBMGTNYPRWFSOIIWWT9IDSELM9'
                b'JUOOWFNCCSHUSMGNROBFJX9JQ9XT9PKEGQYQAWAFPRVRRVQPUQBHLSNTEFCDKBWRCD'
                b'X9EYOBB9KPMTLNNQLADBDLZPRVBCKVCYQEOLARJYAGTBFR9QLPKZBOYWZQOVKCVYRG'
                b'YI9ZEFIQRKYXLJBZJDBJDJVQZCGYQMROVHNDBLGNLQODPUXFNTADDVYNZJUVPGB9LV'
                b'PJIYLAPBOEHPMRWUIAJXVQOEM9ROEYUOTNLXVVQEYRQWDTQGDLEYFIYNDPRAIXOZEB'
                b'CS9P99AZTQQLKEILEVXMSHBIDHLXKUOMMNFKPYHONKEYDCHMUNTTNRYVMMEYHPGASP'
                b'ZXASKRUPWQSHDMU9VPS99ZZ9SJJYFUJFFMFORBYDILBXCAVJDPDFHTTTIYOVGLRDYR'
                b'TKHXJORJVYRPTDH9ZCPZ9ZADXZFRSFPIQKWLBRNTWJHXTOAUOL9FVGTUMMPYGYICJD'
                b'XMOESEVDJWLMCVTJLPIEKBE9JTHDQWV9MRMEWFLPWGJFLUXI9BXPSVWCMUWLZSEWHB'
                b'DZKXOLYNOZAPOYLQVZAQMOHGTTQEUAOVKVRRGAHNGPUEKHFVPVCOYSJAWHZU9DRROH'
                b'BETBAFTATVAUGOEGCAYUXACLSSHHVYDHMDGJP9AUCLWLNTFEVGQGHQXSKEMVOVSKQE'
                b'EWHWZUDTYOBGCURRZSJZLFVQQAAYQO9TRLFFN9HTDQXBSPPJYXMNGLLBHOMNVXNOWE'
                b'IDMJVCLLDFHBDONQJCJVLBLCSMDOUQCKKCQJMGTSTHBXPXAMLMSXRIPUBMBAWBFNLH'
                b'LUJTRJLDERLZFUBUSMF999XNHLEEXEENQJNOFFPNPQ9PQICHSATPLZVMVIWLRTKYPI'
                b'XNFGYWOJSQDAXGFHKZPFLPXQEHCYEAGTIWIJEZTAVLNUMAFWGGLXMBNUQTOFCNLJTC'
                b'DMWVVZGVBSEBCPFSM99FLOIDTCLUGPSEDLOKZUAEVBLWNMODGZBWOVQT9DPFOTSKRA'
                b'BQAVOQ9RXWBMAKFYNDCZOJGTCIDMQSQQSODKDXTPFLNOKSIZEOY9HFUTLQRXQMEPGO'
                b'XQGLLPNSXAUCYPGZMNWMQWSWCKAQYKXJTWINSGPPZG9HLDLEAWUWEVCTVRCBDFOXKU'
                b'ROXH9HXXAXVPEJFRSLOGRVGYZASTEBAQNXJJROCYRTDPYFUIQJVDHAKEG9YACV9HCP'
                b'JUEUKOYFNWDXCCJBIFQKYOXGRDHVTHEQUMHO999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999'),
            address=Address(b'99999999999999999999999999999999999999999'
                            b'9999999999999999999999999999999999999999'),
            value=0,
            timestamp=1480690413,
            current_index=1,
            last_index=1,
            bundle_hash=BundleHash(
                b'NFDPEEZCWVYLKZGSLCQNOFUSENIXRHWWTZFBXMPS'
                b'QHEDFWZULBZFEOMNLRNIDQKDNNIELAOXOVMYEI9PG'),
            trunk_transaction_hash=TransactionHash(
                b'TKORV9IKTJZQUBQAWTKBKZ9NEZHBFIMCLV9TTNJN'
                b'QZUIJDFPTTCTKBJRHAITVSKUCUEMD9M9SQJ999999'),
            branch_transaction_hash=TransactionHash(
                b'TKORV9IKTJZQUBQAWTKBKZ9NEZHBFIMCLV9TTNJN'
                b'QZUIJDFPTTCTKBJRHAITVSKUCUEMD9M9SQJ999999'),
            tag=Tag(b'999999999999999999999999999'),
            attachment_timestamp=1480690413,
            attachment_timestamp_lower_bound=1480690413,
            attachment_timestamp_upper_bound=1480690413,
            nonce=Nonce(b'999999999999999999999999999'),
        )

        self.assertEqual(
            transaction.as_tryte_string(),
            TransactionTrytes(
                b'GYPRVHBEZOOFXSHQBLCYW9ICTCISLHDBNMMVYD9JJHQMPQCTIQAQTJNNNJ9IDXLRCC'
                b'OYOXYPCLR9PBEY9ORZIEPPDNTI9CQWYZUOTAVBXPSBOFEQAPFLWXSWUIUSJMSJIIIZ'
                b'WIKIRH9GCOEVZFKNXEVCUCIIWZQCQEUVRZOCMEL9AMGXJNMLJCIA9UWGRPPHCEOPTS'
                b'VPKPPPCMQXYBHMSODTWUOABPKWFFFQJHCBVYXLHEWPD9YUDFTGNCYAKQKVEZYRBQRB'
                b'XIAUX9SVEDUKGMTWQIYXRGSWYRK9SRONVGTW9YGHSZRIXWGPCCUCDRMAXBPDFVHSRY'
                b'WHGB9DQSQFQKSNICGPIPTRZINYRXQAFSWSEWIFRMSBMGTNYPRWFSOIIWWT9IDSELM9'
                b'JUOOWFNCCSHUSMGNROBFJX9JQ9XT9PKEGQYQAWAFPRVRRVQPUQBHLSNTEFCDKBWRCD'
                b'X9EYOBB9KPMTLNNQLADBDLZPRVBCKVCYQEOLARJYAGTBFR9QLPKZBOYWZQOVKCVYRG'
                b'YI9ZEFIQRKYXLJBZJDBJDJVQZCGYQMROVHNDBLGNLQODPUXFNTADDVYNZJUVPGB9LV'
                b'PJIYLAPBOEHPMRWUIAJXVQOEM9ROEYUOTNLXVVQEYRQWDTQGDLEYFIYNDPRAIXOZEB'
                b'CS9P99AZTQQLKEILEVXMSHBIDHLXKUOMMNFKPYHONKEYDCHMUNTTNRYVMMEYHPGASP'
                b'ZXASKRUPWQSHDMU9VPS99ZZ9SJJYFUJFFMFORBYDILBXCAVJDPDFHTTTIYOVGLRDYR'
                b'TKHXJORJVYRPTDH9ZCPZ9ZADXZFRSFPIQKWLBRNTWJHXTOAUOL9FVGTUMMPYGYICJD'
                b'XMOESEVDJWLMCVTJLPIEKBE9JTHDQWV9MRMEWFLPWGJFLUXI9BXPSVWCMUWLZSEWHB'
                b'DZKXOLYNOZAPOYLQVZAQMOHGTTQEUAOVKVRRGAHNGPUEKHFVPVCOYSJAWHZU9DRROH'
                b'BETBAFTATVAUGOEGCAYUXACLSSHHVYDHMDGJP9AUCLWLNTFEVGQGHQXSKEMVOVSKQE'
                b'EWHWZUDTYOBGCURRZSJZLFVQQAAYQO9TRLFFN9HTDQXBSPPJYXMNGLLBHOMNVXNOWE'
                b'IDMJVCLLDFHBDONQJCJVLBLCSMDOUQCKKCQJMGTSTHBXPXAMLMSXRIPUBMBAWBFNLH'
                b'LUJTRJLDERLZFUBUSMF999XNHLEEXEENQJNOFFPNPQ9PQICHSATPLZVMVIWLRTKYPI'
                b'XNFGYWOJSQDAXGFHKZPFLPXQEHCYEAGTIWIJEZTAVLNUMAFWGGLXMBNUQTOFCNLJTC'
                b'DMWVVZGVBSEBCPFSM99FLOIDTCLUGPSEDLOKZUAEVBLWNMODGZBWOVQT9DPFOTSKRA'
                b'BQAVOQ9RXWBMAKFYNDCZOJGTCIDMQSQQSODKDXTPFLNOKSIZEOY9HFUTLQRXQMEPGO'
                b'XQGLLPNSXAUCYPGZMNWMQWSWCKAQYKXJTWINSGPPZG9HLDLEAWUWEVCTVRCBDFOXKU'
                b'ROXH9HXXAXVPEJFRSLOGRVGYZASTEBAQNXJJROCYRTDPYFUIQJVDHAKEG9YACV9HCP'
                b'JUEUKOYFNWDXCCJBIFQKYOXGRDHVTHEQUMHO999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999999999999999999999999999999999999999999999999999999999'
                b'999999999999RKWEEVD99A99999999A99999999NFDPEEZCWVYLKZGSLCQNOFUSENI'
                b'XRHWWTZFBXMPSQHEDFWZULBZFEOMNLRNIDQKDNNIELAOXOVMYEI9PGTKORV9IKTJZQ'
                b'UBQAWTKBKZ9NEZHBFIMCLV9TTNJNQZUIJDFPTTCTKBJRHAITVSKUCUEMD9M9SQJ999'
                b'999TKORV9IKTJZQUBQAWTKBKZ9NEZHBFIMCLV9TTNJNQZUIJDFPTTCTKBJRHAITVSK'
                b'UCUEMD9M9SQJ999999999999999999999999999999999RKWEEVD99RKWEEVD99RKW'
                b'EEVD99999999999999999999999999999'),
        )
Example #14
0
  def test_multiple_transactions(self):
    """
    Getting a bundle that contains multiple transactions.
    """
    bundle = Bundle.from_tryte_strings([
      TransactionTrytes(
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999WUQXEGBVIECGIWO9IGSYKWWPYCIVUJJGSJPWGIAFJPYSF9NSQOHWAHS9P'
        b'9PWQHOBXNNQIF9IRHVQXKPZW999999999999999999999999999XZUIENOTTBKJMDP'
        b'RXWGQYG9PWGTHNLFMVD99A99999999A99999999PDQWLVVDPUU9VIBODGMRIAZPGQX'
        b'DOGSEXIHKIBWSLDAWUKZCZMK9Z9YZSPCKBDJSVDPRQLJSTKUMTNVSXBGUEHHGAIWWQ'
        b'BCJZHZAQOWZMAIDAFUZBVMUVPWQJLUGGQKNKLMGTWXXNZKUCBJLEDAMYVRGABAWBY9'
        b'999MYIYBTGIOQYYZFJBLIAWMPSZEFFTXUZPCDIXSLLQDQSFYGQSQOGSPKCZNLVSZ9L'
        b'MCUWVNGEN9EJEW9999XZUIENOTTBKJMDPRXWGQYG9PWGTXUO9AXMP9FLMDRMADLRPW'
        b'CZCJBROYCDRJMYU9HDYJM9NDBFUPIZVTR'
      ),

      # Well, it was bound to happen sooner or later... the ASCII
      # representation of this tryte sequence contains a very naughty
      # phrase.  But I don't feel like doing another POW, so... enjoy.
      TransactionTrytes(
        b'NBTCPCFDEACCPCBDVC9DTCQAJ9RBTC9D9DCDQAEAKDCDFD9DSCFAJ9VBCDJDTCQAJ9'
        b'ZBMDYBCCKB99999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999999999999999999'
        b'999999999999999999999999999999999999999999999999999SYRABNN9JD9PNDL'
        b'IKUNCECUELTOHNLFMVD99999999999A99999999PDQWLVVDPUU9VIBODGMRIAZPGQX'
        b'DOGSEXIHKIBWSLDAWUKZCZMK9Z9YZSPCKBDJSVDPRQLJSTKUMTNVSXFSEWUNJOEGNU'
        b'I9QOCRFMYSIFAZLJHKZBPQZZYFG9ORYCRDX9TOMJPFCRB9R9KPUUGFPVOWYXFIWEW9'
        b'999BGUEHHGAIWWQBCJZHZAQOWZMAIDAFUZBVMUVPWQJLUGGQKNKLMGTWXXNZKUCBJL'
        b'EDAMYVRGABAWBY9999SYRABNN9JD9PNDLIKUNCECUELTOQZPSBDILVHJQVCEOICFAD'
        b'YKZVGMOAXJRQNTCKMHGTAUMPGJJMX9LNF'
      ),
    ])

    for txn in bundle:
      self.adapter.seed_response('getTrytes', {
        'trytes': [txn.as_tryte_string()],
      })

    self.adapter.seed_response('getTrytes', {
      'trytes': [
        'SPAMSPAMSPAM999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999999999999999999'
        '999999999999999999999999999999999999999999999999999JECDITWO9999999'
        '999999999999ONLFMVD99999999999999999999VVCHSQSRVFKSBONDWB9EAQEMQOY'
        'YRBIZHTBJLYNAVDHZPUZAZ9LYHXWKBEJ9IPR9FAMFLT9EEOHVYWUPRHHSRCILCLWFD'
        'GBYBFFOKMCSAPVD9VGZZRRGBLGMZMXD9RMZQDBLMGN9BATWZGULRBCYQEIKIRBPHC9'
        '999KTLTRSYOWBD9HVNP9GCUABARNGMYXUZKXWRPGOPETZLKYYC9Z9EYXIWVARUBMBM'
        'BPXGORN9WPBLY99999ZRBVQWULRFXDNDYZKRKIXPZQT9JJJH9FZU9PVWZJWLXBPODP'
        'EHMKTTAGEPLPHUQCZNLDSHERONOMHJCOI'
      ],
    })

    response = self.command(
      transaction =
        TransactionHash(
          b'TOYJPHKMLQNDVLDHDILARUJCCIUMQBLUSWPCTIVA'
          b'DRXICGYDGSVPXFTILFFGAPICYHGGJ9OHXINFX9999'
        ),
    )
    self.maxDiff = None
    self.assertListEqual(
      response['bundles'][0].as_json_compatible(),
      bundle.as_json_compatible(),
    )