import logging import mock import os import pytest from django.core.urlresolvers import reverse from django.contrib.auth.models import User from django.test import override_settings from corbo.models import Broadcast pytestmark = pytest.mark.django_db @pytest.fixture def admin_user(): try: user = User.objects.get(username='admin') except User.DoesNotExist: user = User.objects.create_superuser('admin', email='admin@example.com', password='admin') return user 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_unlogged_access(app): # connect while not being logged in assert app.get('/', status=302).location == 'http://testserver/manage/' assert app.get('/manage/', status=302).location == 'http://testserver/login/?next=/manage/' def test_access(app, admin_user): app = login(app) resp = app.get('/manage/', status=200) assert 'New category' in resp.body def test_logout(app, admin_user): app = login(app) app.get('/logout/') assert app.get('/', status=302).location == 'http://testserver/manage/' def test_create_category(app, admin_user): app = login(app) resp = app.get(reverse('manage')) assert 'New category' in resp.content category_page = resp.click('New category') category_form = category_page.forms[0] category_form['name'] = 'Alerts' resp = category_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/' resp = app.get('http://testserver/manage/') assert 'Alerts' in resp.content def test_edit_category(app, admin_user): app = login(app) resp = app.get('/manage/') assert 'New category' in resp.content category_page = resp.click('New category') category_form = category_page.forms[0] category_form['name'] = 'Alerts' resp = category_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/' resp = app.get('http://testserver/manage/') assert 'Alerts' in resp.content assert '0 announces' in resp.content assert '0 subscriptions' in resp.content resp = resp.click('Alerts') assert 'Edit' in resp.content edit_page = resp.click('Edit') edit_form = edit_page.forms[0] edit_form['name'] = 'New Alerts' resp = edit_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/category/alerts/' def test_delete_category(app, admin_user): app = login(app) resp = app.get('/manage/') assert 'New category' in resp.content category_page = resp.click('New category') category_form = category_page.forms[0] category_form['name'] = 'Alerts' resp = category_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/' resp = app.get('http://testserver/manage/') assert 'Alerts' in resp.content assert '0 announces' in resp.content assert '0 subscriptions' in resp.content resp = resp.click('Alerts') assert 'Delete' in resp.content delete_page = resp.click('Delete') delete_form = delete_page.forms[0] resp = delete_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/' def test_create_announce(app, admin_user): app = login(app) resp = app.get('/manage/') assert 'New category' in resp.content category_page = resp.click('New category') category_form = category_page.forms[0] category_form['name'] = 'Alerts' resp = category_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/' resp = app.get('http://testserver/manage/') assert 'Alerts' in resp.content resp = resp.click('Alerts') assert 'New announce' in resp.content announce_page = resp.click('New announce') announce_form = announce_page.forms[0] announce_form['title'] = 'First announce' announce_form['text'] = 'announce content' resp = announce_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/category/alerts/' resp = app.get('http://testserver/manage/category/alerts/') assert 'First announce' in resp.content def test_edit_announce(app, admin_user): app = login(app) resp = app.get('/manage/') assert 'New category' in resp.content category_page = resp.click('New category') category_form = category_page.forms[0] category_form['name'] = 'Alerts' resp = category_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/' resp = app.get(resp.location) resp = resp.click('Alerts') assert 'New announce' in resp.content announce_page = resp.click('New announce') announce_form = announce_page.forms[0] announce_form['title'] = 'First announce' announce_form['text'] = 'announce content' resp = announce_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/category/alerts/' resp = app.get(resp.location) assert 'First announce' in resp.content announce_page = resp.click('First announce') assert 'First announce' in announce_page.content assert 'Edit' in announce_page.content assert 'Send test email' in announce_page.content assert 'Delete' in announce_page.content announce_edit_page = announce_page.click('Edit') edit_form = announce_edit_page.forms[0] edit_form['publication_time'] = '2017-03-03 09:00:00' edit_form['expiration_time'] = '2017-12-31 23:00:00' resp = edit_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/announce/1/' # simulate announce deliver broadcast = Broadcast.objects.get(announce__pk=1) broadcast.deliver_time = '2017-03-30 20:00:00' broadcast.delivery_count = 1 broadcast.save() resp = app.get(resp.location) assert 'Publication March 3, 2017, 9 a.m.' in resp.content assert 'Expiration Dec. 31, 2017, 11 p.m.' in resp.content assert 'Sent March 30, 2017, 8 p.m.' in resp.content assert 'to 1 destination' in resp.content broadcast.delivery_count = 2 broadcast.save() resp = app.get('http://testserver/manage/announce/1/') assert 'Sent March 30, 2017, 8 p.m.' in resp.content assert 'to 2 destinations' in resp.content def test_delete_announce(app, admin_user): app = login(app) resp = app.get('/manage/') assert 'New category' in resp.content category_page = resp.click('New category') category_form = category_page.forms[0] category_form['name'] = 'Alerts' resp = category_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/' resp = app.get('http://testserver/manage/') resp = resp.click('Alerts') assert 'New announce' in resp.content announce_page = resp.click('New announce') announce_form = announce_page.forms[0] announce_form['title'] = 'First announce' announce_form['text'] = 'announce content' resp = announce_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/category/alerts/' resp = app.get('http://testserver/manage/category/alerts/') assert 'First announce' in resp.content resp = resp.click('First announce') assert 'Delete' in resp.content assert 'Send test email' in resp.content announce_delete_page = resp.click('Delete') announce_delete_form = announce_delete_page.forms[0] resp = announce_delete_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/category/alerts/' def test_email_announce(app, admin_user): app = login(app) resp = app.get('/manage/') assert 'New category' in resp.content category_page = resp.click('New category') category_form = category_page.forms[0] category_form['name'] = 'Alerts' resp = category_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/' resp = app.get('http://testserver/manage/') resp = resp.click('Alerts') assert 'New announce' in resp.content announce_page = resp.click('New announce') announce_form = announce_page.forms[0] announce_form['title'] = 'First announce' announce_form['text'] = 'announce content' resp = announce_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/category/alerts/' resp = app.get(resp.location) assert 'First announce' in resp.content resp = resp.click('First announce') assert 'Send test email' in resp.content assert 'Send test SMS' not in resp.content resp = resp.click('Send test email') send_form = resp.forms[0] assert send_form.method == 'post' assert 'email' in send_form.fields assert send_form.fields['email'][0].value == admin_user.email assert 'Send' in resp.content assert 'Cancel' in resp.content resp = send_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/announce/1/' @mock.patch('corbo.utils.requests.post') def test_sms_announce(mocked_post, app, admin_user, settings): app = login(app) resp = app.get('/manage/') assert 'New category' in resp.content category_page = resp.click('New category') category_form = category_page.forms[0] category_form['name'] = 'Alerts' resp = category_form.submit() assert resp.status_int == 302 assert resp.location.endswith(reverse('manage')) resp = resp.follow() resp = resp.click('Alerts') # create new announce assert 'New announce' in resp.content announce_page = resp.click('New announce') announce_form = announce_page.forms[0] announce_form['title'] = 'First announce' announce_form['text'] = 'announce content' resp = announce_form.submit() assert resp.status_int == 302 assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'})) resp = resp.follow() # view announce assert 'First announce' in resp.content settings.SMS_GATEWAY_URL = 'http:/passerelle.com' resp = resp.click('First announce') assert 'Send test SMS' in resp.content # open send sms form resp = resp.click('Send test SMS') send_form = resp.forms[0] assert 'mobile' in send_form.fields assert send_form.fields['mobile'][0].value == '' # submit with no mobile resp = send_form.submit() assert resp.status_int == 200 form = resp.forms[0] form['mobile'] = '0607080900' # simulate response from passerelle mocked_response = mock.Mock() mocked_response.json.return_value = {'err': 0, 'data': True} mocked_post.return_value = mocked_response resp = form.submit() assert resp.location.endswith(reverse('view_announce', kwargs={'pk': 1})) resp = resp.follow() # make sure the form informs about the success assert 'SMS successfully sent' in resp.content resp = resp.click('Send test SMS') form = resp.forms[0] form['mobile'] = '0607080900' # simulate error from passerelle mocked_response.json.return_value = {'err': 1, 'data': None, 'err_desc': 'Destination error'} resp = form.submit() resp = resp.follow() assert 'Error occured while sending SMS' in resp.content def test_sms_announce_with_invalid_gateway_url(app, admin_user, settings, caplog): app = login(app) resp = app.get('/manage/') assert 'New category' in resp.content category_page = resp.click('New category') category_form = category_page.forms[0] category_form['name'] = 'Alerts' resp = category_form.submit() resp = resp.follow() resp = resp.click('Alerts') assert 'New announce' in resp.content announce_page = resp.click('New announce') announce_form = announce_page.forms[0] announce_form['title'] = 'First announce' announce_form['text'] = 'announce content' resp = announce_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/category/alerts/' resp = resp.follow() assert 'First announce' in resp.content settings.SMS_GATEWAY_URL='invalid_url' resp = resp.click('First announce') assert 'Send test SMS' in resp.content resp = resp.click('Send test SMS') form = resp.forms[0] form['mobile'] = '0607080900' resp = form.submit() records = caplog.records assert len(records) == 1 for record in records: assert record.name == 'corbo.utils' assert record.levelno == logging.WARNING assert 'Invalid URL' in record.getMessage()