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']
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')
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
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
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
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
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
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']
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')
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')
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')
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
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
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')
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)))))
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())
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')
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'
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))
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')
def put_wallet(self, wallet): ''' Отправка кошелька''' return APP.test_client().put('/wallet/%s' % wallet.id(), data=str(WalletString(wallet)))