This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
corbo/tests/test_manager.py

345 lines
13 KiB
Python

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 '<strong>Publication</strong> March 3, 2017, 9 a.m.' in resp.content
assert '<strong>Expiration</strong> Dec. 31, 2017, 11 p.m.' in resp.content
assert '<strong>Sent</strong> 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 '<strong>Sent</strong> 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()