333 lines
13 KiB
Python
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'
|