345 lines
13 KiB
Python
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()
|