def test_create_transaction__proper_call__return_transaction(): # arrange user = create_user( email='*****@*****.**', password='******', ) wallet_1 = create_wallet( user=user, currency='USD', init_balance=Decimal(50), ) wallet_2 = create_wallet( user=user, currency='USD', init_balance=Decimal(0), ) # act transaction = create_transaction( sender=wallet_1, recipient=wallet_2, amount=Decimal(40), exchange_rate=Decimal(1), ) # assert assert transaction.exchange_rate == Decimal('1.00') assert transaction.sender is wallet_1 assert transaction.recipient is wallet_2 assert transaction.amount == Decimal('40.00')
def test_transfer_money_between_wallets__not_wallet_owner__raise_exception( mocker): # arrange user_1 = create_user( email='*****@*****.**', password='******', ) user_2 = create_user( email='*****@*****.**', password='******', ) wallet_1 = create_wallet( user=user_1, currency='USD', init_balance=Decimal(50), ) wallet_2 = create_wallet( user=user_2, currency='USD', init_balance=Decimal(50), ) # act & assert with pytest.raises(WalletOperationException): transfer_money_between_wallets( sender=user_1, sender_wallet_id=wallet_2.pk, recipient_wallet_id=wallet_1.pk, amount=Decimal(10.0), )
def test_create_wallet__wrong_currency__raise_exception(): # arrange user = create_user( email='*****@*****.**', password='******', ) # act & assert with pytest.raises(WalletCreationException): create_wallet( user=user, currency='SBM', init_balance=Decimal(1000.0), )
def test_create_wallet__negative_initial_balance__raise_exception(): # arrange user = create_user( email='*****@*****.**', password='******', ) # act & assert with pytest.raises(WalletCreationException): create_wallet( user=user, currency='USD', init_balance=Decimal(-10.0), )
def test_transfer_money__proper_call__return_200_and_message(mocker): # arrange user_1 = create_user( email='*****@*****.**', password='******', ) user_2 = create_user( email='*****@*****.**', password='******', ) wallet_1 = create_wallet( user=user_1, currency='USD', init_balance=Decimal(50), ) wallet_2 = create_wallet( user=user_2, currency='RUB', init_balance=Decimal(0), ) transfer_money_between_wallets_mocker = mocker.patch( 'api.views.transfer_money_between_wallets', ) client = APIRequestFactory() data = { 'sender': wallet_1.pk, 'recipient': wallet_2.pk, 'amount': Decimal(40.5) } view = TransmitMoneyView.as_view() request = client.post( '/api/v1/transmit_money/', data=data, format='json', ) force_authenticate(request, user=user_1) # act response = view(request) # assert assert response.status_code == 200 assert response.data['status'] == 200 transfer_money_between_wallets_mocker.assert_called_once_with( sender=user_1, sender_wallet_id=wallet_1.pk, recipient_wallet_id=wallet_2.pk, amount=Decimal(40.5), )
def test_retrieve_transactions_by_wallet_id__proper_call__return_transactions( ): # arrange user_1 = create_user( email='*****@*****.**', password='******', ) user_2 = create_user( email='*****@*****.**', password='******', ) wallet_1 = create_wallet( user=user_1, currency='USD', init_balance=Decimal(50), ) wallet_2 = create_wallet( user=user_2, currency='RUB', init_balance=Decimal(0), ) create_transaction( sender=wallet_1, recipient=wallet_2, amount=Decimal(10.0), exchange_rate=Decimal(63.54691), ) create_transaction( sender=wallet_1, recipient=wallet_2, amount=Decimal(30.0), exchange_rate=Decimal(61.33420), ) create_transaction( sender=wallet_2, recipient=wallet_1, amount=Decimal(300.0), exchange_rate=Decimal(0.01598), ) # act transactions = retrieve_transactions_by_wallet_id( user=user_1, wallet_id=wallet_1.pk, ) # assert assert len(transactions) == 3
def test_transfer_money_between_wallets__unable_to_increase__raise_excpetion( mocker): # arrange user_1 = create_user( email='*****@*****.**', password='******', ) user_2 = create_user( email='*****@*****.**', password='******', ) wallet_1 = create_wallet( user=user_1, currency='USD', init_balance=Decimal(50), ) wallet_2 = create_wallet( user=user_2, currency='RUB', init_balance=Decimal(0), ) mocker.patch( 'wallet.services.get_current_exchange_rate', return_value=Decimal('63.54563'), ) mocker.patch( 'wallet.services.increase_wallet_balance', side_effect=Exception, ) # act with pytest.raises(Exception): transfer_money_between_wallets( sender=user_1, sender_wallet_id=wallet_1.pk, recipient_wallet_id=wallet_2.pk, amount=Decimal(10.0), ) wallet_1 = Wallet.objects.get(pk=wallet_1.pk) wallet_2 = Wallet.objects.get(pk=wallet_2.pk) # assert assert wallet_1.balance == Decimal('50.00') assert wallet_2.balance == Decimal('0.00')
def test_transfer_money_between_wallets__multy_currency_transfer__return_transaction( mocker): # arrange user_1 = create_user( email='*****@*****.**', password='******', ) user_2 = create_user( email='*****@*****.**', password='******', ) wallet_1 = create_wallet( user=user_1, currency='USD', init_balance=Decimal(50), ) wallet_2 = create_wallet( user=user_2, currency='RUB', init_balance=Decimal(0), ) mocker.patch( 'wallet.services.get_current_exchange_rate', return_value=Decimal('63.54563'), ) # act transaction = transfer_money_between_wallets( sender=user_1, sender_wallet_id=wallet_1.pk, recipient_wallet_id=wallet_2.pk, amount=Decimal(10.0), ) wallet_1 = Wallet.objects.get(pk=wallet_1.pk) wallet_2 = Wallet.objects.get(pk=wallet_2.pk) # assert assert transaction.amount == Decimal('10.00') assert transaction.sender == wallet_1 assert transaction.recipient == wallet_2 assert transaction.exchange_rate == Decimal('63.54563') assert wallet_1.balance == Decimal('40.00') assert wallet_2.balance == Decimal('635.46')
def create_user_and_wallet( email: str, password: str, currency: str, init_balance: Decimal, ) -> None: # Предположим, что юзер может существовать без # кошелька, поэтому не оборачиваем в # transaction.atomic() user = create_user( email=email, password=password, ) try: create_wallet( user=user, currency=currency, init_balance=init_balance, ) except WalletCreationException: pass
def test_transfer_money_between_wallets__proper_call__return_transaction( mocker): # arrange user_1 = create_user( email='*****@*****.**', password='******', ) user_2 = create_user( email='*****@*****.**', password='******', ) wallet_1 = create_wallet( user=user_1, currency='USD', init_balance=Decimal(50), ) wallet_2 = create_wallet( user=user_2, currency='USD', init_balance=Decimal(0), ) # act transaction = transfer_money_between_wallets( sender=user_1, sender_wallet_id=wallet_1.pk, recipient_wallet_id=wallet_2.pk, amount=Decimal(10.0), ) wallet_1 = Wallet.objects.get(pk=wallet_1.pk) wallet_2 = Wallet.objects.get(pk=wallet_2.pk) # assert assert transaction.amount == Decimal('10.00') assert transaction.sender == wallet_1 assert transaction.recipient == wallet_2 assert transaction.exchange_rate == Decimal('1.0') assert wallet_1.balance == Decimal('40.00') assert wallet_2.balance == Decimal('10.00')
def test_increase_wallet_balance__negative_amount__raise_exception(): # arrange user = create_user( email='*****@*****.**', password='******', ) wallet = create_wallet( user=user, currency='USD', init_balance=Decimal(10.0), ) # act & assert with pytest.raises(WalletOperationException): increase_wallet_balance(wallet=wallet, amount=Decimal(-5.01))
def test_increase_wallet_balance__proper_call__increase_balance_properly(): # arrange user = create_user( email='*****@*****.**', password='******', ) wallet = create_wallet( user=user, currency='USD', init_balance=Decimal(10.0), ) # act increase_wallet_balance(wallet=wallet, amount=Decimal(5.01)) # assert assert wallet.balance == Decimal('15.01')
def test_create_wallet__proper_call__wallet_created(): # arrange user = create_user( email='*****@*****.**', password='******', ) # act wallet = create_wallet( user=user, currency='USD', init_balance=Decimal(1000.555), ) # assert assert wallet.balance == Decimal('1000.55') assert wallet.owner is user assert wallet.currency == 'USD'
def test_transfer_money_between_wallets__wallet_does_not_exist__raise_exception( mocker): # arrange user_1 = create_user( email='*****@*****.**', password='******', ) wallet_1 = create_wallet( user=user_1, currency='USD', init_balance=Decimal(50), ) # act & assert with pytest.raises(Wallet.DoesNotExist): transfer_money_between_wallets( sender=user_1, sender_wallet_id=wallet_1.pk, recipient_wallet_id=100, amount=Decimal(10.0), )
def test_transactions__proper_call__return_200_and_transactions(mocker): # arrange user_1 = create_user( email='*****@*****.**', password='******', ) user_2 = create_user( email='*****@*****.**', password='******', ) wallet_1 = create_wallet( user=user_1, currency='USD', init_balance=Decimal(50), ) wallet_2 = create_wallet( user=user_2, currency='RUB', init_balance=Decimal(0), ) transaction_1 = create_transaction( sender=wallet_1, recipient=wallet_2, amount=Decimal(10.0), exchange_rate=Decimal(63.54691), ) transaction_2 = create_transaction( sender=wallet_1, recipient=wallet_2, amount=Decimal(30.0), exchange_rate=Decimal(61.33420), ) transaction_3 = create_transaction( sender=wallet_2, recipient=wallet_1, amount=Decimal(300.0), exchange_rate=Decimal(0.01598), ) retrieve_transactions_by_wallet_id_mocker = mocker.patch( 'api.views.retrieve_transactions_by_wallet_id', return_value=[ transaction_1, transaction_2, transaction_3, ], ) client = APIRequestFactory() view = WalletTransactionsView.as_view() request = client.get( f'/api/v1/transactions/{wallet_1.pk}/', format='json', ) force_authenticate(request, user=user_1) # act response = view(request, wallet_1.pk) # assert assert response.status_code == 200 assert response.data['status'] == 200 assert len(response.data['transactions']) == 3 retrieve_transactions_by_wallet_id_mocker.assert_called_once_with( user=user_1, wallet_id=wallet_1.pk, )