# -*- coding: utf-8 -*- import datetime from django.contrib.auth.models import User from django.core.wsgi import get_wsgi_application from django.utils.timezone import now from webtest import TestApp import pytest import eopayment from combo.data.models import Page from combo.apps.lingo.models import (Regie, BasketItem, Transaction, ActiveItems, TipiPaymentFormCell, PaymentBackend) from decimal import Decimal pytestmark = pytest.mark.django_db @pytest.fixture def payment_backend(): return PaymentBackend.objects.create( label='test1', slug='test1', service='dummy', service_options={'siret': '1234'}) def login(app, username='admin', password='admin'): login_page = app.get('/login/') login_form = login_page.forms[0] login_form['username'] = username login_form['password'] = password resp = login_form.submit() assert resp.status_int == 302 return app def test_access(app, admin_user): app = login(app) resp = app.get('/manage/', status=200) assert '/manage/lingo/' in resp.text def test_add_regie(app, admin_user, payment_backend): Regie.objects.all().delete() app = login(app) resp = app.get('/manage/lingo/regies/', status=200) resp = resp.click('New') assert '/manage/lingo/regies/' in resp.text resp.forms[0]['label'] = 'Test' resp.forms[0]['slug'] = 'test' resp.forms[0]['description'] = 'description' resp.forms[0]['payment_backend'] = payment_backend.pk resp = resp.forms[0].submit() assert resp.location.endswith('/manage/lingo/regies/') assert Regie.objects.count() == 1 regie = Regie.objects.all()[0] assert regie.label == 'Test' assert regie.is_default is True def test_edit_regie(app, admin_user, payment_backend): test_add_regie(app, admin_user, payment_backend) app = login(app) resp = app.get('/manage/lingo/regies/', status=200) resp = resp.click('Test') assert '/manage/lingo/regies/' in resp.text resp.forms[0]['description'] = 'other description' resp = resp.forms[0].submit() assert resp.location.endswith('/manage/lingo/regies/') assert Regie.objects.count() == 1 regie = Regie.objects.all()[0] assert regie.description == 'other description' def test_edit_regie_dynamic_backend_fields(app, admin_user): payment_backend = PaymentBackend.objects.create( label='test1', slug='test1', service='systempayv2', service_options={'siret': '1234'}) regie = Regie.objects.create( label='test-regie', slug='test-regie', payment_backend=payment_backend) assert regie.transaction_options == {} app = login(app) resp = app.get('/manage/lingo/regies/%s/edit' % regie.pk, status=200) resp.forms[0]['label'] = 'test-regie' resp.forms[0]['slug'] = 'test-regie' resp.forms[0]['description'] = 'description' resp.forms[0]['payment_backend'] = payment_backend.pk assert resp.forms[0]['manual_validation'].checked is False resp.forms[0]['manual_validation'] = True resp = resp.forms[0].submit() assert Regie.objects.count() == 1 regie = Regie.objects.get(slug='test-regie') assert regie.transaction_options['manual_validation'] # No dynamic fields if no backend capabilities payment_backend_dummy = PaymentBackend.objects.create( label='test1', slug='test-dummy', service='dummy', service_options={'siret': '1234'}) regie_dummy = Regie.objects.create( label='test-regie-2', slug='test-regie-2', payment_backend=payment_backend_dummy) resp = app.get('/manage/lingo/regies/%s/edit' % regie_dummy.pk, status=200) assert 'manual_validation' not in resp.forms[0].fields resp.forms[0]['label'] = 'Test' resp.forms[0]['slug'] = 'test-regie-2' resp.forms[0]['description'] = 'description' resp.forms[0]['payment_backend'] = payment_backend_dummy.pk resp = resp.forms[0].submit() regie_dummy = Regie.objects.get(slug='test-regie-2') assert regie_dummy.transaction_options == {} # Change backend resp = app.get('/manage/lingo/regies/%s/edit' % regie.pk, status=200) resp.forms[0]['label'] = 'test-regie' resp.forms[0]['slug'] = 'test-regie' resp.forms[0]['description'] = 'description' resp.forms[0]['payment_backend'] = payment_backend_dummy.pk assert resp.forms[0]['manual_validation'].checked is True resp.forms[0]['manual_validation'] = True resp = resp.forms[0].submit() regie = Regie.objects.get(slug='test-regie') assert regie.transaction_options == {} def test_delete_regie(app, admin_user, payment_backend): test_add_regie(app, admin_user, payment_backend) app = login(app) resp = app.get('/manage/lingo/regies/', status=200) resp = resp.click('remove') assert 'Are you sure you want to delete this?' in resp.text resp = resp.forms[0].submit() assert Regie.objects.count() == 0 def test_add_second_regie(app, admin_user, payment_backend): test_add_regie(app, admin_user, payment_backend) regie = Regie.objects.all()[0] app = login(app) resp = app.get('/manage/lingo/regies/', status=200) resp = resp.click('New') resp.forms[0]['label'] = 'Test2' resp.forms[0]['slug'] = 'test2' resp.forms[0]['description'] = 'description' resp.forms[0]['payment_backend'] = payment_backend.pk resp = resp.forms[0].submit() assert resp.location.endswith('/manage/lingo/regies/') assert Regie.objects.count() == 2 assert Regie.objects.get(id=regie.id).is_default is True assert Regie.objects.exclude(id=regie.id)[0].is_default is False def test_download_transaction(app, admin_user, payment_backend): test_add_regie(app, admin_user, payment_backend) regie = Regie.objects.filter(slug='test')[0] user = User.objects.create_user('dimebag', 'dime@bag.pan', 'pwd') user.last_name = u'Darëll' user.first_name = 'Dimebag' user.save() b_item = BasketItem.objects.create(user=user, regie=regie, subject='it\'s a subject', source_url='http://example.net', amount=18.5) trans1 = Transaction.objects.create(regie=regie, remote_items='remote items lol', order_id='1', user=user, bank_transaction_id='567', status=eopayment.PAID) trans2 = Transaction.objects.create(regie=regie, remote_items='remote items omg', order_id='2', user=user, bank_transaction_id='136', status=eopayment.PAID) trans1.items = [b_item,] trans1.save() trans2.items = [b_item,] trans2.save() app = login(app) resp = app.get('/manage/lingo/transactions/download-csv/', status=200) content = [i for i in [item.split(',') for item in resp.text.split('\r\n')]] for row in content[:-1]: if row[0] == '2': assert row[1] == trans2.bank_transaction_id assert row[3] == '%s %s' % (user.first_name, user.last_name) assert Decimal(row[4]) == Decimal(trans2.amount) assert row[5] == b_item.subject assert Decimal(row[6]) == b_item.amount else: assert row[1] == trans1.bank_transaction_id assert row[3] == '%s %s' % (user.first_name, user.last_name) assert Decimal(row[4]) == Decimal(trans1.amount) assert row[5] == b_item.subject assert Decimal(row[6]) == b_item.amount def test_transactions_search(app, admin_user): for i in range(50): Transaction(status=eopayment.PAID, order_id='order id %s' % (i+1), bank_transaction_id='bank id %s' % (i+1), amount=1+i).save() app = login(app) resp = app.get('/manage/lingo/', status=200) assert resp.text.count('