import json import mock import pytest from django.urls import reverse from rest_framework import status from rest_framework.response import Response from yandex_money.models import Payment from finance import models from progress.models import Progress, ProgressLesson from finance.tests.fixtures import PRICE, METHOD_CASH, STATUS_WAIT, STATUS_PAID DUMMY_COMMENT = 'test comment' DUMMY_DESCRIPTION = 'test description' mock.patch('lms.global_decorators.transaction_decorator', lambda x: x).start() @pytest.mark.django_db def test_list_bills(api_client, student_client, student, manager, admin_client, manager_client, lead_manager_client, bill_cash): """ Test for get list of bills """ assert api_client.get( reverse('finance:bills'), status=status.HTTP_403_FORBIDDEN ) response = student_client.get( reverse('finance:bills'), status=status.HTTP_200_OK ) results_student = json.loads(response.content) assert len(results_student) is 1 assert results_student[0]['opener'] == manager.email assert results_student[0]['user'] == student.email response_admin = admin_client.get( reverse('finance:bills'), status=status.HTTP_200_OK ) results_admin = json.loads(response_admin.content) assert len(results_admin) is 0 response_manager = manager_client.get( reverse('finance:bills'), status=status.HTTP_200_OK ) results_manager = json.loads(response_manager.content) assert results_manager[0]['opener'] == manager.email assert results_manager[0]['user'] == student.email response_lead_manager = lead_manager_client.get( reverse('finance:bills'), status=status.HTTP_200_OK ) results_lead_manager = json.loads(response_lead_manager.content) assert len(results_lead_manager) is 0 @pytest.mark.django_db def test_create_bill(api_client, student_client, manager_client, manager, student, course): """ Test create bill """ data = { 'bill': { 'course_token': course.token.hex, 'opener': manager.email, 'user': student.email, 'comment': DUMMY_COMMENT, 'description': DUMMY_DESCRIPTION }, 'children': [{ 'status': STATUS_WAIT, 'method': METHOD_CASH, 'price': PRICE, 'real_price': PRICE, }] } response = manager_client.post( reverse('finance:bills'), data=data, status=status.HTTP_200_OK ) results = json.loads(response.content) assert models.Bill.objects.get(user=student).id == results['bill']['id'] assert models.Invoice.objects.get( bill=results['bill']['id']).id == results['children'][0]['id'] assert api_client.post( reverse('finance:bills'), data=data, status=status.HTTP_403_FORBIDDEN ) assert student_client.post( reverse('finance:bills'), data=data, status=status.HTTP_403_FORBIDDEN ) @pytest.mark.django_db @mock.patch('django.core.mail.EmailMessage.send') def test_confirm_pay_manager(mocked_email, manager_client, bill_cash, student): assert Progress.objects.count() is 0 assert ProgressLesson.objects.count() is 0 data = { 'bill': { 'course_token': bill_cash.course_token.hex, 'opener': bill_cash.opener.email, 'user': bill_cash.user.email, 'comment': bill_cash.comment, 'description': bill_cash.description }, 'children': [{ 'status': STATUS_PAID, 'method': METHOD_CASH, 'price': PRICE, 'real_price': PRICE, }] } response = manager_client.post( reverse('finance:bills'), data=data, status=status.HTTP_200_OK ) results = json.loads(response.content) assert models.Bill.objects.get(user=student).id == results['bill']['id'] assert Progress.objects.count() is 1 assert ProgressLesson.objects.count() is 1 progress = Progress.objects.filter(user=bill_cash.user).first() assert Progress.objects.filter(user=bill_cash.user).exists() is True assert ProgressLesson.objects.filter(progress=progress).exists() is True assert mocked_email.call_count == 2 def fake_post_success(view, request): pay = Payment.objects.get(order_number=request.data['orderNumber']) pay.status = Payment.STATUS.SUCCESS pay.save() return Response('ok', status=status.HTTP_200_OK) @pytest.mark.django_db @mock.patch('django.core.mail.EmailMessage.send') @mock.patch('finance.views.YandexCheckView.post', fake_post_success) def test_confirm_pay_auto_success(mocked_email, api_client, bill_yandex, student): assert Progress.objects.count() is 0 assert ProgressLesson.objects.count() is 0 invoice = bill_yandex.invoice_set.first() payment = invoice.yandex_pay data = { 'orderNumber': payment.order_number, 'shopSumAmount': str(payment.shop_amount) } api_client.post( reverse('yandex_money_check'), data=data, status=status.HTTP_200_OK ) assert Progress.objects.count() is 1 assert ProgressLesson.objects.count() is 1 progress = Progress.objects.filter(user=bill_yandex.user).first() assert Progress.objects.filter(user=bill_yandex.user).exists() is True assert ProgressLesson.objects.filter(progress=progress).exists() is True assert mocked_email.call_count == 1 def fake_post_fail(view, request): pay = Payment.objects.get(order_number=request.data['orderNumber']) pay.status = Payment.STATUS.FAIL pay.save() return Response('fail', status=status.HTTP_200_OK) @pytest.mark.django_db @mock.patch('django.core.mail.EmailMessage.send') @mock.patch('finance.views.YandexCheckView.post', fake_post_fail) def test_confirm_pay_auto_fail(mocked_email, api_client, bill_yandex, student): assert Progress.objects.count() is 0 assert ProgressLesson.objects.count() is 0 invoice = bill_yandex.invoice_set.first() payment = invoice.yandex_pay data = { 'orderNumber': payment.order_number, 'shopSumAmount': str(payment.shop_amount) } api_client.post( reverse('yandex_money_check'), data=data, status=status.HTTP_200_OK ) assert Progress.objects.count() is 0 assert ProgressLesson.objects.count() is 0 assert Progress.objects.filter(user=bill_yandex.user).exists() is False assert mocked_email.call_count == 1