예제 #1
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']
예제 #2
0
 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')
예제 #3
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())
예제 #4
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']
예제 #5
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
예제 #6
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')
예제 #7
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'
예제 #8
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'
예제 #9
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
예제 #10
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']
예제 #11
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')
예제 #12
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')
예제 #13
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']
예제 #14
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')