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 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_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 test_remotes_tasks(self): ''' В списке задач присутствуют задачи поиска кошелька ''' wallet = FakeWallet() APP.test_client().get( '/', headers={'X-Zold-Score': '3/3: %s' % WalletScore(wallet)}) response = APP.test_client().get('/tasks') assert response.status_code == status.HTTP_200_OK assert any(t['id'] == wallet.id() and t['prefix'] in wallet.public() for t in response.json['tasks'] if t['type'] == 'wanted')
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_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_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_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_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_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_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'
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_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 __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_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_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_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_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
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']
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 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']
def test_return_score(self): ''' В ответе сервер указывает свой score ''' response = self.put_wallet(FakeWallet()) assert ScoreValid(JsonScore(response.json['score']), APP.config)
def test_put_wallet_again(self): ''' Повторная загрузка кошелька не должна приводить к ошибке ''' wallet = FakeWallet() self.put_wallet(wallet) response = self.put_wallet(wallet) assert response.status_code == status.HTTP_200_OK