lingo/tests/invoicing/manager/test_campaign.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

297 lines
11 KiB
Python
Raw Normal View History

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)