Beispiel #1
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
Beispiel #2
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
 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')
Beispiel #6
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']
Beispiel #7
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))
    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')
Beispiel #11
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'
 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
Beispiel #14
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)))))
Beispiel #15
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
Beispiel #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())
Beispiel #17
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'
Beispiel #18
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
Beispiel #19
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']
 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')
Beispiel #21
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']
Beispiel #22
0
 def test_return_score(self):
     ''' В ответе сервер указывает свой score '''
     response = self.put_wallet(FakeWallet())
     assert ScoreValid(JsonScore(response.json['score']), APP.config)
Beispiel #23
0
 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