Skip to content

Commit

Permalink
Fix false-positive flash tests; fix page address uniqueness validation
Browse files Browse the repository at this point in the history
  • Loading branch information
krassowski committed Jun 19, 2017
1 parent 1c32882 commit 717608f
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 41 deletions.
2 changes: 2 additions & 0 deletions website/models/cms.py
Expand Up @@ -194,6 +194,8 @@ class Page(CMSModel):
def validate_address(self, key, address):
if '//' in address or address.endswith('/') or address.startswith('/'):
raise ValidationError('Address cannot contain neither consecutive nor trailing slashes')
if Page.query.filter_by(address=address).count():
raise ValidationError('Page with address: "' + address + '" already exists.')
return address

@property
Expand Down
5 changes: 5 additions & 0 deletions website/tests/miscellaneous.py
@@ -1,5 +1,7 @@
from tempfile import NamedTemporaryFile

import pytest


def make_named_temp_file(data=None, mode='w', opener=open):
"""Create temporary file and return path to it.
Expand All @@ -18,3 +20,6 @@ def make_named_temp_file(data=None, mode='w', opener=open):
f.write(data)

return name


use_fixture = pytest.fixture(autouse=True)
9 changes: 3 additions & 6 deletions website/tests/test_manage.py
@@ -1,15 +1,12 @@
import pytest

import manage
from argparse import Namespace

from database_testing import DatabaseTest
from flask import current_app

import manage
from database import db
from models import User, Gene, Cancer, Page
from tests.miscellaneous import make_named_temp_file

use_fixture = pytest.fixture(autouse=True)
from tests.miscellaneous import make_named_temp_file, use_fixture


class ManageTest(DatabaseTest):
Expand Down
71 changes: 42 additions & 29 deletions website/tests/views/test_cms.py
@@ -1,3 +1,4 @@
from contextlib import contextmanager
from urllib.parse import quote

from view_testing import ViewTest
Expand Down Expand Up @@ -33,19 +34,32 @@ def is_only_for_admins(self, address):
return False
return True

def get_flashes(self):
with self.client.session_transaction() as session:
return [
Flash(content, category)
for category, content in session.get('_flashes', [])
]
@contextmanager
def collect_flashes(self):
flashes = []
from website.views import cms

def assert_flashes(self, content, category=None):
flashes = self.get_flashes()
for flash in flashes:
original_flash = cms.flash

def flash_collector(*args):
collected_flash = Flash(*args)
flashes.append(collected_flash)
original_flash(*args)

cms.flash = flash_collector

self.recent_flashes = flashes

yield flashes

cms.flash = original_flash

def assert_flashed(self, content, category=None):
for flash in self.recent_flashes:
if flash.content == content and (not category or flash.category == category):
return True
return False
print('Recent flashes: %s' % self.recent_flashes)
raise AssertionError('No flash: %s, %s' % (content, category))

def test_admin_only_protection(self):
from views.cms import admin_only
Expand Down Expand Up @@ -94,22 +108,20 @@ def add_page(**data):
assert page and page.title == 'Test'

# no address given
add_page(title='Test', address='')
self.assert_flashes('Address cannot be empty')
with self.collect_flashes():
add_page(title='Test', address='')
self.assert_flashed('Address cannot be empty')

# existing address
add_page(title='Test', address='test')
from views.cms import html_link
self.assert_flashes(
'Page with address: ' + html_link('test', '/test') +
' already exists. Please, change the address and try again.',
'danger'
)
with self.collect_flashes():
add_page(title='Test', address='test')
self.assert_flashed('Page with address: "test" already exists.')

# invalid address
for invalid_address in self.invalid_addresses:
add_page(address=invalid_address)
self.assert_flashes('Address cannot contain neither consecutive nor trailing slashes')
with self.collect_flashes():
add_page(address=invalid_address)
self.assert_flashed('Address cannot contain neither consecutive nor trailing slashes')

# valid but unusual
for weird_address in self.weird_addresses:
Expand All @@ -125,19 +137,21 @@ def test_show_page(self):
# normal page
page = Page(title='My page', content='My text', address='my-page')
db.session.add(page)
response = self.client.get('my-page/')
assert b'My page' in response.data
assert b'My text' in response.data
assert not self.get_flashes()
with self.collect_flashes() as flashes:
response = self.client.get('my-page/')
assert b'My page' in response.data
assert b'My text' in response.data
assert not flashes

# routing - valid but unusual addresses
for weird_address in self.weird_addresses:
page = Page(address=weird_address)
db.session.add(page)

response = self.client.get(weird_address + '/')
assert response.status_code == 200
assert not self.get_flashes()
with self.collect_flashes() as flashes:
response = self.client.get(weird_address + '/')
assert response.status_code == 200
assert not flashes

def test_edit_page(self):
page = Page(title='test title', address='test_page', content='test content')
Expand Down Expand Up @@ -199,4 +213,3 @@ def test_add_menu_entry(self):

def test_modify_menu(self):
assert self.is_only_for_admins('/list_menus/')

8 changes: 2 additions & 6 deletions website/views/cms.py
Expand Up @@ -406,7 +406,7 @@ def add_page_menu_entry(self, menu_id):
db.session.commit()
except IntegrityError:
db.session.rollback()
flash('Something went wrong :(', 'danger')
flash('Something went wrong.', 'danger')
return redirect(url_for('ContentManagementSystem:list_menus'))

@route('/menu/<menu_id>/add_custom_menu_entry', methods=['POST'])
Expand Down Expand Up @@ -466,11 +466,7 @@ def add_page(self):

except IntegrityError:
db.session.rollback()
flash(
'Page with address: ' + html_link(address, '/' + address) +
' already exists. Please, change the address and try again.',
'danger'
)
flash('Something went wrong.', 'danger')

return self._template(
'admin/add_page',
Expand Down

0 comments on commit 717608f

Please sign in to comment.