Esempio n. 1
0
 def test_put_wallet_many_times(self):
     ''' При многократной загрузке, кошелек должен оставаться согласованным '''
     src = FullWallet(RootWallet(), 1000, APP.test_client())
     dst = FakeWallet()
     transaction = FakeTransaction(src, dst, -400)
     wallet = TransactionWallet(src, transaction)
     self.put_wallet(wallet)
     self.put_wallet(wallet)
     response = APP.test_client().get('/wallet/%s' % wallet.id())
     assert len(
         list(
             OutgoingTransactions(
                 StringWallet(response.json['body']).transactions()))) == 1
Esempio n. 2
0
    def test_put_wallet_negative_balance(self):
        '''
		Загрузка кошелька с негативным балансом - не ошибка
		но избыточные транзакции не проверяем и не сохраняем
		'''
        src_wallet = FakeWallet()
        dst_wallet = FakeWallet()
        transact = FakeTransaction(src_wallet, dst_wallet, -1000)
        wallet = TransactionWallet(src_wallet, transact)
        self.put_wallet(wallet)
        response = APP.test_client().get('/wallet/%s' % wallet.id())
        assert response.status_code == status.HTTP_200_OK
        # Транзакция не возвращается, поскольку не прошла проверку.
        assert response.json['body'] == str(WalletString(src_wallet))
Esempio n. 3
0
    def test_put_root_wallet_import_all_valid(self):
        '''
		Загрузка корневого кошелька
		На нем не бывает нехватки средств
		И все транзакции необходимо проверять и принимать
		'''
        src_wallet = RootWallet()
        dst_wallet = FakeWallet()
        transact = FakeTransaction(src_wallet, dst_wallet, -1000)
        wallet = TransactionWallet(src_wallet, transact)
        self.put_wallet(wallet)
        response = APP.test_client().get('/wallet/%s' % wallet.id())
        assert response.status_code == status.HTTP_200_OK
        # Там могут быть левые транзакции, поэтому ищем нашу
        assert str(TransactionString(transact)) in response.json['body']
Esempio n. 4
0
def api_get_wallet(wallet_id):
    ''' Содержимое кошелька '''
    try:
        wallet = DbWallets(APP.config).wallet(wallet_id)
        for tnx in DbTransactions().unapproved(wallet_id):
            if tnx.prefix() in wallet.public():
                tnx.update(TransactionDstStatus.GOOD)
        # @todo #215 Список транзакций должен формироваться в DbWallet
        transactions = list(
            OrderedTransactions(
                itertools.chain(DbTransactions().select(src_id=wallet_id),
                                DbTransactions().incoming(wallet_id))))
        return {
            'protocol':
            APP.config['ZOLD_PROTOCOL'],
            'version':
            APP.config['ZOLD_VERSION'],
            'id':
            wallet_id,
            'body':
            str(WalletString(TransactionWallet(wallet, *transactions))),
            'mtime':
            str(transactions[-1].time() if transactions else NowTime()),
            'score':
            ScoreJson(MainScore(APP.config), APP.config['STRENGTH']).json()
        }
    except RuntimeError:
        return {}, 404
Esempio n. 5
0
 def test_src_wallet_from_wanted_trivial(self):
     ''' Кошелек убирается из поиска, простой случай '''
     src = FullWallet(RootWallet(), 3000, APP.test_client())
     dst = FakeWallet()
     transaction = FakeTransaction(src, dst, -777)
     APP.test_client().put(
         '/wallet/%s' % dst.id(),
         data=str(
             WalletString(
                 TransactionWallet(dst,
                                   IncomingTransaction(src, transaction)))))
     APP.test_client().put(
         '/wallet/%s' % src.id(),
         data=str(WalletString(TransactionWallet(src, transaction))))
     response = APP.test_client().get('/tasks')
     assert not any(t['id'] == src.id() for t in response.json['tasks']
                    if t['type'] == 'wanted')
Esempio n. 6
0
 def test_full_payout(self):
     ''' Cписание с кошелька последних средств '''
     wallet = FullWallet(RootWallet(), 1000, APP.test_client())
     self.put_wallet(
         TransactionWallet(wallet,
                           FakeTransaction(wallet, FakeWallet(), -1000)))
     response = APP.test_client().get('/wallet/%s/balance' % wallet.id())
     assert response.data == b'0'
Esempio n. 7
0
 def __init__(self, sponsor, amount, client):
     self.wallet = FakeWallet()
     client.put('/wallet/%s' % sponsor.id(),
                data=str(
                    WalletString(
                        TransactionWallet(
                            sponsor,
                            FakeTransaction(sponsor, self.wallet,
                                            -amount)))))
Esempio n. 8
0
 def test_wallet_mtime(self):
     ''' В отзыве сервера присутствует время последней модификации кошелька '''
     root_wallet = RootWallet()
     wallet = FakeWallet()
     transaction = FakeTransaction(root_wallet, wallet, -555)
     APP.test_client().put(
         '/wallet/%s' % root_wallet.id(),
         data=str(WalletString(TransactionWallet(root_wallet,
                                                 transaction))))
     response = APP.test_client().get('/wallet/%s' % root_wallet.id())
     assert response.json['mtime'] == str(transaction.time())
Esempio n. 9
0
 def test_wallet_balance(self):
     ''' Запрос баланса по кошельку '''
     wallet = FullWallet(RootWallet(), 1000, APP.test_client())
     APP.test_client().put('/wallet/%s' % wallet.id(),
                           data=str(
                               WalletString(
                                   TransactionWallet(
                                       wallet,
                                       FakeTransaction(
                                           wallet, FakeWallet(), -250)))))
     response = APP.test_client().get('/wallet/%s/balance' % wallet.id())
     assert response.data == b'750'
Esempio n. 10
0
 def test_incoming_transaction_approved(self):
     ''' Входящая транзакций должна сразу появиться в кошельке получателе '''
     root_wallet = RootWallet()
     wallet = FakeWallet()
     transaction = FakeTransaction(root_wallet, wallet, -777)
     APP.test_client().put('/wallet/%s' % wallet.id(),
                           data=str(WalletString(wallet)))
     APP.test_client().put(
         '/wallet/%s' % root_wallet.id(),
         data=str(WalletString(TransactionWallet(root_wallet,
                                                 transaction))))
     response = APP.test_client().get('/wallet/%s' % wallet.id())
     assert root_wallet.id() in response.json['body']
Esempio n. 11
0
    def test_put_wallet_negative_balance_partial(self):
        '''
		Загрузка кошелька с негативным балансом - не ошибка
		но избыточные транзакции не проверяем и не сохраняем
		Но хорошие принимаем
		'''
        root_wallet = RootWallet()
        src_wallet = FakeWallet()
        self.put_wallet(
            TransactionWallet(root_wallet,
                              FakeTransaction(root_wallet, src_wallet, -1500)))
        dst_wallet = FakeWallet()
        transaction1 = FakeTransaction(src_wallet, dst_wallet, -1000)
        transaction2 = FakeTransaction(src_wallet, dst_wallet, -600)
        self.put_wallet(
            TransactionWallet(src_wallet, transaction1, transaction2))
        response = APP.test_client().get('/wallet/%s' % src_wallet.id())
        assert response.status_code == status.HTTP_200_OK
        assert str(TransactionString(transaction1)) in response.json['body']
        # Вторая транзакция не должна проходить
        assert str(
            TransactionString(transaction2)) not in response.json['body']
Esempio n. 12
0
 def test_known_src_wallet_not_wanted(self):
     ''' Известные отправители отправители не помещаются в список tasks '''
     src_wallet = FullWallet(RootWallet(), 1000, APP.test_client())
     wallet = FakeWallet()
     dst_wallet = FakeWallet()
     src_transaction = FakeTransaction(src_wallet, dst_wallet, -777)
     transaction = FakeTransaction(wallet, dst_wallet, -1500)
     APP.test_client().put(
         '/wallet/%s' % src_wallet.id(),
         data=str(
             WalletString(TransactionWallet(src_wallet, src_transaction))))
     APP.test_client().put(
         '/wallet/%s' % dst_wallet.id(),
         data=str(
             WalletString(
                 TransactionWallet(
                     dst_wallet,
                     IncomingTransaction(src_wallet, src_transaction),
                     IncomingTransaction(wallet, transaction),
                 ))))
     response = APP.test_client().get('/tasks')
     assert not any(t['id'] == src_wallet.id()
                    for t in response.json['tasks']
                    if t['type'] == 'wanted')
Esempio n. 13
0
    def test_dst_wallet_from_wanted_if_not_match(self):
        '''
		Кошельки получатели удаляются из списка tasks,
		даже если не совпадает префикс
		'''
        src = FullWallet(RootWallet(), 1000, APP.test_client())
        dst = FakeWallet()
        transaction = BadPrefixTransaction(src, dst, -100)
        APP.test_client().put(
            '/wallet/%s' % src.id(),
            data=str(WalletString(TransactionWallet(src, transaction))))
        APP.test_client().put('/wallet/%s' % dst.id(),
                              data=str(WalletString(dst)))
        response = APP.test_client().get('/tasks')
        assert not any(t['id'] in [src.id(), dst.id()]
                       for t in response.json['tasks']
                       if t['type'] == 'wanted')