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_to_wanted(self): ''' Кошельки получатели помещаются в список tasks ''' root = RootWallet() wallet = FullWallet(root, 1000, APP.test_client()) response = APP.test_client().get('/tasks') assert any( all((t['id'] == wallet.id(), t['prefix'] in wallet.public(), t.get('who', None) == root.id())) for t in response.json['tasks'] if t['type'] == 'wanted')
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_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_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_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_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_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_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_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_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')