lingo/tests/invoicing/manager/test_campaign.py

297 lines
11 KiB
Python

import datetime
from unittest import mock
import pytest
from lingo.invoicing.models import Campaign, DraftInvoice, DraftInvoiceLine, Pool, Regie
from tests.utils import login
pytestmark = pytest.mark.django_db
def test_campaign_home(app, admin_user):
app = login(app)
resp = app.get('/manage/invoicing/campaigns/')
h2 = resp.pyquery('div#appbar h2')
assert h2.text() == 'Campaigns'
def test_add_campaign(app, admin_user):
app = login(app)
resp = app.get('/manage/')
resp = resp.click('Invoicing')
resp = resp.click(href='/manage/invoicing/campaigns/')
resp = resp.click('New campaign')
resp.form['date_start'] = '2022-09-01'
resp.form['date_end'] = '2022-10-01'
resp.form['date_issue'] = '2022-10-31'
resp = resp.form.submit()
campaign = Campaign.objects.latest('pk')
assert resp.location.endswith('/manage/invoicing/campaign/%s/' % campaign.pk)
assert campaign.date_start == datetime.date(2022, 9, 1)
assert campaign.date_end == datetime.date(2022, 10, 1)
assert campaign.date_issue == datetime.date(2022, 10, 31)
resp = app.get('/manage/invoicing/campaign/add/')
resp.form['date_start'] = '2022-08-31'
resp.form['date_end'] = '2022-09-02'
resp.form['date_issue'] = '2022-10-31'
resp = resp.form.submit()
assert resp.context['form'].errors['__all__'] == [
'Another campaign overlapping this period already exists.'
]
resp.form['date_end'] = '2022-09-01'
resp = resp.form.submit()
campaign = Campaign.objects.latest('pk')
assert campaign.date_start == datetime.date(2022, 8, 31)
assert campaign.date_end == datetime.date(2022, 9, 1)
assert campaign.date_issue == datetime.date(2022, 10, 31)
resp = app.get('/manage/invoicing/campaign/add/')
resp.form['date_start'] = '2022-09-30'
resp.form['date_end'] = '2022-10-02'
resp.form['date_issue'] = '2022-10-31'
resp = resp.form.submit()
assert resp.context['form'].errors['__all__'] == [
'Another campaign overlapping this period already exists.'
]
resp.form['date_start'] = '2022-10-01'
resp = resp.form.submit()
campaign = Campaign.objects.latest('pk')
assert campaign.date_start == datetime.date(2022, 10, 1)
assert campaign.date_end == datetime.date(2022, 10, 2)
assert campaign.date_issue == datetime.date(2022, 10, 31)
def test_detail_campaign(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
pool1 = Pool.objects.create(
campaign=campaign,
draft=True,
)
pool2 = Pool.objects.create(
campaign=campaign,
draft=True,
)
app = login(app)
resp = app.get('/manage/invoicing/campaigns/')
resp = resp.click(href='/manage/invoicing/campaign/%s/' % campaign.pk)
assert '/manage/invoicing/campaign/%s/edit/' % campaign.pk in resp
assert '/manage/invoicing/campaign/%s/delete/' % campaign.pk in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool1.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool2.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/add/' % (campaign.pk) in resp
pool3 = Pool.objects.create(
campaign=campaign,
draft=False,
)
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert '/manage/invoicing/campaign/%s/edit/' % campaign.pk not in resp
assert '/manage/invoicing/campaign/%s/delete/' % campaign.pk not in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool1.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool2.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool3.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/add/' % (campaign.pk) not in resp
def test_edit_campaign(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
Campaign.objects.create(
date_start=datetime.date(2022, 10, 1),
date_end=datetime.date(2022, 11, 1),
date_issue=datetime.date(2022, 11, 30),
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk)
resp.form['date_start'] = '2022-09-30'
resp.form['date_end'] = '2022-10-02'
resp.form['date_issue'] = '2022-12-31'
resp = resp.form.submit()
assert resp.context['form'].errors['__all__'] == [
'Another campaign overlapping this period already exists.'
]
resp.form['date_end'] = '2022-10-01'
resp = resp.form.submit()
assert resp.location.endswith('/manage/invoicing/campaign/%s/' % campaign.pk)
campaign.refresh_from_db()
assert campaign.date_start == datetime.date(2022, 9, 30)
assert campaign.date_end == datetime.date(2022, 10, 1)
assert campaign.date_issue == datetime.date(2022, 12, 31)
resp = app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk)
resp.form['date_start'] = '2022-10-31'
resp.form['date_end'] = '2022-11-02'
resp.form['date_issue'] = '2022-12-31'
resp = resp.form.submit()
assert resp.context['form'].errors['__all__'] == [
'Another campaign overlapping this period already exists.'
]
resp.form['date_start'] = '2022-11-01'
resp = resp.form.submit()
campaign.refresh_from_db()
assert campaign.date_start == datetime.date(2022, 11, 1)
assert campaign.date_end == datetime.date(2022, 11, 2)
assert campaign.date_issue == datetime.date(2022, 12, 31)
pool = Pool.objects.create(
campaign=campaign,
draft=True,
)
app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk)
pool.draft = False
pool.save()
app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk, status=404)
def test_delete_campaign(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/delete/' % campaign.pk)
resp = resp.form.submit()
assert Campaign.objects.count() == 0
assert resp.location.endswith('/manage/invoicing/campaigns/')
campaign.save()
pool = Pool.objects.create(
campaign=campaign,
draft=True,
)
regie = Regie.objects.create(label='Foo')
invoice = DraftInvoice.objects.create(date_issue=datetime.date.today(), regie=regie, pool=pool)
DraftInvoiceLine.objects.create(
invoice=invoice,
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
)
resp = app.get('/manage/invoicing/campaign/%s/delete/' % campaign.pk)
resp = resp.form.submit()
assert Campaign.objects.count() == 0
campaign.save()
pool.draft = False
pool.save()
app.get('/manage/invoicing/campaign/%s/delete/' % campaign.pk, status=404)
def test_add_pool(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/add/' % campaign.pk)
assert resp.form['draft'].value == 'on'
with mock.patch('lingo.invoicing.views.generate_invoices') as mock_generate:
resp = resp.form.submit()
assert resp.location.endswith('/manage/invoicing/campaign/%s/#open:pools' % campaign.pk)
assert mock_generate.call_args_list == [mock.call(campaign=campaign, draft=True)]
pool = Pool.objects.create(
campaign=campaign,
draft=True,
)
resp = app.get('/manage/invoicing/campaign/%s/pool/add/' % campaign.pk)
resp.form['draft'] = False
with mock.patch('lingo.invoicing.views.generate_invoices') as mock_generate:
resp = resp.form.submit()
assert resp.location.endswith('/manage/invoicing/campaign/%s/#open:pools' % campaign.pk)
assert mock_generate.call_args_list == [mock.call(campaign=campaign, draft=False)]
pool.draft = False
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/add/' % campaign.pk, status=404)
def test_detail_pool(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
campaign2 = Campaign.objects.create(
date_start=datetime.date(2022, 10, 1),
date_end=datetime.date(2022, 11, 1),
date_issue=datetime.date(2022, 11, 30),
)
pool = Pool.objects.create(
campaign=campaign,
draft=True,
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) in resp
app.get('/manage/invoicing/campaign/%s/pool/%s/' % (0, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign2.pk, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, 0), status=404)
pool.draft = False
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) not in resp
def test_delete_pool(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
campaign2 = Campaign.objects.create(
date_start=datetime.date(2022, 10, 1),
date_end=datetime.date(2022, 11, 1),
date_issue=datetime.date(2022, 11, 30),
)
pool = Pool.objects.create(
campaign=campaign,
draft=True,
)
regie = Regie.objects.create(label='Foo')
invoice = DraftInvoice.objects.create(date_issue=datetime.date.today(), regie=regie, pool=pool)
DraftInvoiceLine.objects.create(
invoice=invoice,
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk))
resp = resp.form.submit()
assert Pool.objects.count() == 0
assert resp.location.endswith('/manage/invoicing/campaign/%s/#open:pools' % campaign.pk)
pool.draft = True
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (0, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign2.pk, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, 0), status=404)
pool.draft = False
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk), status=404)