Ejemplo n.º 1
0
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')
Ejemplo n.º 2
0
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),
        )
Ejemplo n.º 3
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),
        )
Ejemplo n.º 4
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),
        )
Ejemplo n.º 5
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),
    )
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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')
Ejemplo n.º 8
0
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')
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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')
Ejemplo n.º 11
0
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))
Ejemplo n.º 12
0
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')
Ejemplo n.º 13
0
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'
Ejemplo n.º 14
0
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),
        )
Ejemplo n.º 15
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,
    )