コード例 #1
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']
コード例 #2
0
    def test_src_wallet_from_wanted_anyway(self):
        '''
		В случае загрузки кошелька он удаляется из поиска,
		даже если искомых транзакций там нет.
		'''
        src = FakeWallet()
        dst = IncomeWallet(src, 555)
        APP.test_client().put('/wallet/%s' % dst.id(),
                              data=str(WalletString(dst)))
        APP.test_client().put('/wallet/%s' % src.id(),
                              data=str(WalletString(src)))
        response = APP.test_client().get('/tasks')
        assert not any(t['id'] == src.id() for t in response.json['tasks']
                       if t['type'] == 'wanted')
コード例 #3
0
 def test_wallet_ok(self):
     ''' Сервер возвращает содержимое кошелька '''
     wallet = FakeWallet()
     APP.test_client().put('/wallet/%s' % wallet.id(),
                           data=str(WalletString(wallet)))
     response = APP.test_client().get('/wallet/%s' % wallet.id())
     assert response.status_code == status.HTTP_200_OK
コード例 #4
0
 def test_wallet_count(self):
     ''' Количество кошельков меняется, как минимум не равно 1 '''
     wallet = FullWallet(RootWallet(), 666, APP.test_client())
     APP.test_client().put('/wallet/%s' % wallet.id(),
                           data=str(WalletString(wallet)))
     response = APP.test_client().get('/')
     assert response.json['wallets'] >= 2
コード例 #5
0
    def test_src_wallet_wanted_once(self):
        '''
		Известные отправители отправители помещаются в список tasks
		только один раз
		'''
        src = FakeWallet()
        dst = IncomeWallet(src, 777)
        APP.test_client().put('/wallet/%s' % dst.id(),
                              data=str(WalletString(dst)))
        APP.test_client().put('/wallet/%s' % dst.id(),
                              data=str(WalletString(dst)))
        response = APP.test_client().get('/tasks')
        assert len([
            t for t in response.json['tasks']
            if t['type'] == 'wanted' and t['id'] == src.id()
        ]) == 1
コード例 #6
0
 def test_wrong_request(self):
     ''' Зaгрузка другого кошелька - это ошибка 400 '''
     wallet = FakeWallet()
     self.put_wallet(wallet)
     response = APP.test_client().put('/wallet/%s' % wallet.id(),
                                      data=str(WalletString(FakeWallet())))
     assert response.status_code == status.HTTP_400_BAD_REQUEST
コード例 #7
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
コード例 #8
0
 def test_incoming_transaction_bnf_is_sender(self):
     ''' Идентификатор корневого должен фигурировать в транзакции получателя '''
     root_wallet = RootWallet()
     wallet = FullWallet(root_wallet, 1000, APP.test_client())
     APP.test_client().put('/wallet/%s' % wallet.id(),
                           data=str(WalletString(wallet)))
     response = APP.test_client().get('/wallet/%s' % wallet.id())
     assert root_wallet.id() in response.json['body']
コード例 #9
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')
コード例 #10
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')
コード例 #11
0
 def test_dst_wallet_from_wanted(self):
     ''' Кошельки получатели удаляются из списка tasks '''
     wallet = FullWallet(RootWallet(), 1000, APP.test_client())
     APP.test_client().put('/wallet/%s' % wallet.id(),
                           data=str(WalletString(wallet)))
     response = APP.test_client().get('/tasks')
     assert not any(t['id'] == wallet.id() for t in response.json['tasks']
                    if t['type'] == 'wanted')
コード例 #12
0
    def test_src_wallet_to_wanted_alone(self):
        '''
		Ищем кошелек только один раз, не зависимо от того,
		для каких еще кошельков он нужен
		'''
        src = FakeWallet()
        dst1 = IncomeWallet(src, 1500)
        APP.test_client().put('/wallet/%s' % dst1.id(),
                              data=str(WalletString(dst1)))
        dst2 = IncomeWallet(src, 100)
        APP.test_client().put('/wallet/%s' % dst2.id(),
                              data=str(WalletString(dst2)))
        response = APP.test_client().get('/tasks')
        assert len([
            t for t in response.json['tasks']
            if t['type'] == 'wanted' and t['id'] == src.id()
        ]) == 1
コード例 #13
0
 def test_wrong_key(self):
     ''' Зaгрузка кошелька с другим ключем - это ошибка 400 '''
     wallet = FakeWallet()
     self.put_wallet(wallet)
     fake = FakeWallet()
     response = APP.test_client().put('/wallet/%s' % wallet.id(),
                                      data=str(WalletString(fake)).replace(
                                          fake.id(), wallet.id()))
     assert response.status_code == status.HTTP_400_BAD_REQUEST
コード例 #14
0
 def test_src_wallet_to_wanted(self):
     ''' Кошельки отправители помещаются в список tasks '''
     src = FakeWallet()
     dst = IncomeWallet(src, 1500)
     APP.test_client().put('/wallet/%s' % dst.id(),
                           data=str(WalletString(dst)))
     response = APP.test_client().get('/tasks')
     assert any(t['id'] == src.id() and t.get('who', None) == dst.id()
                for t in response.json['tasks'] if t['type'] == 'wanted')
コード例 #15
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)))))
コード例 #16
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())
コード例 #17
0
 def test_remotes_not_need_tasks(self):
     ''' В списке задач отсутствую задачи поиска, если кошелек присутствует '''
     wallet = FakeWallet()
     APP.test_client().get(
         '/', headers={'X-Zold-Score': '3/3: %s' % WalletScore(wallet)})
     APP.test_client().put('/wallet/%s' % wallet.id(),
                           data=str(WalletString(wallet)))
     response = APP.test_client().get('/tasks')
     assert response.status_code == status.HTTP_200_OK
     assert not any(t['id'] == wallet.id() for t in response.json['tasks']
                    if t['type'] == 'wanted')
コード例 #18
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'
コード例 #19
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))
コード例 #20
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')
コード例 #21
0
 def put_wallet(self, wallet):
     ''' Отправка кошелька'''
     return APP.test_client().put('/wallet/%s' % wallet.id(),
                                  data=str(WalletString(wallet)))