combo/tests/test_lingo_manager.py

333 lines
13 KiB
Python

# -*- 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('<tr') == 11
resp.form['q'] = 'order id 16'
resp = resp.form.submit()
assert resp.text.count('<tr') == 2
resp.form['q'] = now().strftime('%d/%m/%Y')
resp = resp.form.submit()
assert resp.text.count('<tr') == 11
resp.form['q'] = (now() + datetime.timedelta(days=2)).strftime('%d/%m%/Y')
resp = resp.form.submit()
assert resp.text.count('<tr') == 0
assert 'No transactions found matching' in resp.text
def test_configure_tipi_cell(app, admin_user):
page = Page(title='tipi', slug='tipi', template_name='standard')
page.save()
app = login(app)
resp = app.get('/manage/pages/%s/' % page.id, status=200)
cell = TipiPaymentFormCell(title='Test payment', page=page, placeholder='content', order=0)
cell.save()
resp = app.get('/manage/pages/%s/' % page.id, status=200)
assert resp.text.count('Exer:') == 1
assert resp.text.count('IDPCE:') == 1
assert resp.text.count('IDLIGNE:') == 1
assert resp.text.count('ROLREC:') == 1
assert resp.text.count('ROLDEB:') == 1
assert resp.text.count('ROLDET:') == 1
def test_configure_invoices_cell(app, admin_user, payment_backend):
page = Page(title='xxx', slug='test', template_name='standard')
page.save()
app = login(app)
resp = app.get('/manage/pages/%s/' % page.id, status=200)
# 2 occurences of tipi payment form should be present, and no other cells
assert resp.text.count('lingo') == 2
assert resp.text.count('lingo_tipipaymentformcell') == 2
regie = Regie()
regie.label = 'Test'
regie.slug = 'test'
regie.description = 'test'
regie.payment_backend = payment_backend
regie.save()
resp = app.get('/manage/pages/%s/' % page.id, status=200)
assert 'lingorecenttransactionscell' in resp.text # because there's a regie
assert not 'lingo_activeitems' in resp.text # because there's no webservice
regie.webservice_url = 'http://example.net/'
regie.save()
resp = app.get('/manage/pages/%s/' % page.id, status=200)
assert 'lingo_activeitems' in resp.text
cell = ActiveItems(regie='remote', page=page, placeholder='content', order=0)
cell.save()
resp = app.get('/manage/pages/%s/' % page.id, status=200)
assert 'clingo_activeitems-%s-regie' % cell.id not in resp.form.fields
assert 'clingo_activeitems-%s-title' % cell.id in resp.form.fields
regie2 = Regie()
regie2.label = 'Test2'
regie2.slug = 'test2'
regie2.description = 'test2'
regie2.webservice_url = 'http://example.net/'
regie2.payment_backend = payment_backend
regie2.save()
resp = app.get('/manage/pages/%s/' % page.id, status=200)
assert 'clingo_activeitems-%s-regie' % cell.id in resp.form.fields
assert 'clingo_activeitems-%s-title' % cell.id in resp.form.fields
options = [x[2] for x in resp.form['clingo_activeitems-%s-regie' % cell.id].options]
assert 'All' in options
assert regie.label in options
assert regie2.label in options
resp.form['clingo_activeitems-%s-regie' % cell.id].value = 'test2'
resp.form.submit()
assert ActiveItems.objects.get(id=cell.id).regie == regie2.slug
def test_payment_backend_list(app, admin_user):
PaymentBackend.objects.create(label='label1', slug='slug1')
PaymentBackend.objects.create(label='label2', slug='slug2')
app = login(app)
resp = app.get('/manage/lingo/paymentbackends/', status=200)
assert '/manage/lingo/paymentbackends/add' in resp.text
assert 'label1' in resp.content
assert 'label2' in resp.content
for payment_backend in PaymentBackend.objects.all():
assert '/manage/lingo/paymentbackends/%s' % payment_backend.pk in resp.text
assert '/manage/lingo/paymentbackends/%s/delete' % payment_backend.pk in resp.text
def test_add_payment_backend(app, admin_user):
assert not PaymentBackend.objects.count()
app = login(app)
resp = app.get('/manage/lingo/paymentbackends/add/', status=200)
assert '/manage/lingo/paymentbackends/' in resp.text
resp.forms[0]['label'] = 'Test'
resp.forms[0]['slug'] = 'test-add'
resp.forms[0]['service'] = 'dummy'
resp.forms[0]['service_options'] = '{"siret": "1234"}'
resp = resp.forms[0].submit()
assert PaymentBackend.objects.count() == 1
payment_backend = PaymentBackend.objects.get(slug='test-add')
assert payment_backend.label == 'Test'
assert payment_backend.service_options == {'siret': '1234'}
assert resp.location.endswith('/manage/lingo/paymentbackends/')
def test_edit_payment_backend(app, admin_user):
payment_backend = PaymentBackend.objects.create(label='label1', slug='slug1')
app = login(app)
resp = app.get('/manage/lingo/paymentbackends/%s/edit' % payment_backend.pk, status=200)
assert '/manage/lingo/paymentbackends/' in resp.text
resp.forms[0]['label'] = 'label1-modified'
resp.forms[0]['slug'] = 'slug1'
resp.forms[0]['service'] = 'dummy'
resp.forms[0]['service_options'] = '{"siret": "1234"}'
resp = resp.forms[0].submit()
assert resp.location.endswith('/manage/lingo/paymentbackends/')
payment_backend = PaymentBackend.objects.get(slug='slug1')
assert payment_backend.label == 'label1-modified'