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)