290 lines
8.7 KiB
Python
290 lines
8.7 KiB
Python
from StringIO import StringIO
|
|
import datetime
|
|
import os
|
|
import pytest
|
|
import sys
|
|
|
|
from django.conf import settings
|
|
from django.contrib.auth.models import User, Group
|
|
from django.test import override_settings
|
|
from django.test.client import RequestFactory
|
|
from django.utils.timezone import now
|
|
from combo.data.models import Page, CellBase, TextCell, LinkCell
|
|
from combo.data.management.commands.import_site import Command as ImportSiteCommand
|
|
from combo.data.management.commands.export_site import Command as ExportSiteCommand
|
|
|
|
pytestmark = pytest.mark.django_db
|
|
|
|
def test_page_order():
|
|
page = Page()
|
|
page.title = u'foo'
|
|
page.save()
|
|
page2 = Page()
|
|
page2.title = u'bar'
|
|
page2.save()
|
|
|
|
assert Page.objects.get(id=page.id).order < Page.objects.get(id=page2.id)
|
|
|
|
def test_page_url():
|
|
page = Page()
|
|
page.slug = u'foo'
|
|
page.save()
|
|
assert page.get_online_url() == '/foo/'
|
|
page2 = Page()
|
|
page2.slug = 'bar'
|
|
page2.parent = page
|
|
assert page2.get_online_url() == '/foo/bar/'
|
|
|
|
def test_page_of_level():
|
|
parent_page = None
|
|
for i in range(10):
|
|
page = Page()
|
|
page.slug = 'level%d' % i
|
|
if parent_page:
|
|
page.parent = parent_page
|
|
page.save()
|
|
parent_page = page
|
|
|
|
assert page.get_page_of_level(2).slug == 'level2'
|
|
assert page.get_page_of_level(4).slug == 'level4'
|
|
assert page.get_page_of_level(14) is None
|
|
|
|
def test_page_siblings():
|
|
Page.objects.all().delete()
|
|
page = Page()
|
|
page.slug = 'foo'
|
|
page.save()
|
|
page2 = Page()
|
|
page2.slug = 'bar'
|
|
page2.parent = page
|
|
page2.save()
|
|
page3 = Page()
|
|
page3.slug = 'baz'
|
|
page3.parent = page
|
|
page3.save()
|
|
assert [x.slug for x in page3.get_siblings()] == ['bar', 'baz']
|
|
|
|
assert page.has_children()
|
|
assert not page2.has_children()
|
|
|
|
def test_flat_hierarchy():
|
|
Page.objects.all().delete()
|
|
page = Page()
|
|
page.slug = 'foo'
|
|
page.save()
|
|
page2 = Page()
|
|
page2.slug = 'bar'
|
|
page2.parent = page
|
|
page2.save()
|
|
page3 = Page()
|
|
page3.slug = 'baz'
|
|
page3.parent = page
|
|
page3.save()
|
|
|
|
pages = Page.get_as_reordered_flat_hierarchy(Page.objects.all())
|
|
assert [x.slug for x in pages] == ['foo', 'bar', 'baz']
|
|
|
|
page.order = 17
|
|
page.save()
|
|
pages = Page.get_as_reordered_flat_hierarchy(Page.objects.all())
|
|
assert [x.slug for x in pages] == ['foo', 'bar', 'baz']
|
|
|
|
page2.parent = None
|
|
page2.save()
|
|
pages = Page.get_as_reordered_flat_hierarchy(Page.objects.all())
|
|
assert [x.slug for x in pages] == ['bar', 'foo', 'baz']
|
|
|
|
page.parent = page2
|
|
page.save()
|
|
pages = Page.get_as_reordered_flat_hierarchy(Page.objects.all())
|
|
assert [x.slug for x in pages] == ['bar', 'foo', 'baz']
|
|
|
|
def test_page_visibility():
|
|
page = Page()
|
|
assert page.is_visible()
|
|
|
|
page.public = False
|
|
page.save()
|
|
assert not page.is_visible()
|
|
|
|
group = Group(name='foobar')
|
|
group.save()
|
|
user1 = User(username='foo')
|
|
user1.save()
|
|
user1.groups = [group]
|
|
user2 = User(username='bar')
|
|
user2.save()
|
|
|
|
assert page.is_visible(user1)
|
|
assert page.is_visible(user2)
|
|
|
|
page.groups = [group]
|
|
assert not page.is_visible()
|
|
assert page.is_visible(user1)
|
|
assert not page.is_visible(user2)
|
|
|
|
def test_import_export_pages():
|
|
page = Page(title=u'foo', slug='foo', order=0)
|
|
page.save()
|
|
|
|
cell = TextCell(page=page, text='foo', order=0, placeholder='content')
|
|
cell.save()
|
|
|
|
page2 = Page(title=u'bar', slug='bar', order=1, parent=page)
|
|
page2.save()
|
|
|
|
cell = TextCell(page=page2, text='bar', order=0, placeholder='content')
|
|
cell.save()
|
|
|
|
site_export = [x.get_serialized_page() for x in Page.objects.all()]
|
|
Page.objects.all().delete()
|
|
|
|
Page.load_serialized_pages(site_export)
|
|
|
|
new_page_1 = Page.objects.all().order_by('order')[0]
|
|
new_page_2 = Page.objects.all().order_by('order')[1]
|
|
assert new_page_1.title == 'foo'
|
|
assert new_page_2.title == 'bar'
|
|
assert len(CellBase.get_cells(page_id=new_page_1.id)) == 1
|
|
assert isinstance(CellBase.get_cells(page_id=new_page_1.id)[0], TextCell)
|
|
assert CellBase.get_cells(page_id=new_page_1.id)[0].text == 'foo'
|
|
|
|
def test_import_export_pages_with_links():
|
|
page = Page(title=u'foo', slug='foo', order=0)
|
|
page.save()
|
|
|
|
page2 = Page(title=u'bar', slug='bar', order=1)
|
|
page2.save()
|
|
|
|
cell = LinkCell(page=page, title='bar', placeholder='content', link_page=page2, order=1)
|
|
cell.save()
|
|
|
|
cell2 = LinkCell(page=page2, title='foo', placeholder='content', link_page=page, order=1)
|
|
cell2.save()
|
|
|
|
site_export = [x.get_serialized_page() for x in Page.objects.all()]
|
|
Page.objects.all().delete()
|
|
|
|
Page.load_serialized_pages(site_export)
|
|
|
|
new_page_1 = Page.objects.all().order_by('order')[0]
|
|
new_page_2 = Page.objects.all().order_by('order')[1]
|
|
assert CellBase.get_cells(page_id=new_page_1.id)[0].link_page_id == new_page_2.id
|
|
assert CellBase.get_cells(page_id=new_page_2.id)[0].link_page_id == new_page_1.id
|
|
|
|
def test_next_previous():
|
|
Page.objects.all().delete()
|
|
page = Page()
|
|
page.slug = 'foo'
|
|
page.save()
|
|
page2 = Page()
|
|
page2.slug = 'bar'
|
|
page2.parent = page
|
|
page2.order = 1
|
|
page2.save()
|
|
page3 = Page()
|
|
page3.slug = 'baz'
|
|
page3.parent = page
|
|
page3.order = 2
|
|
page3.save()
|
|
|
|
assert page.get_next_page(None).id == page2.id
|
|
assert page.get_previous_page(None) is None
|
|
|
|
assert page2.get_next_page(None).id == page3.id
|
|
assert page2.get_previous_page(None).id == page.id
|
|
|
|
page2.public = False
|
|
page2.save()
|
|
assert page.get_next_page(None).id == page3.id
|
|
assert page3.get_previous_page(None).id == page.id
|
|
|
|
user1 = User(username='foo')
|
|
user1.save()
|
|
assert page.get_next_page(user1).id == page2.id
|
|
assert page3.get_previous_page(user1).id == page2.id
|
|
|
|
page3.public = False
|
|
page3.save()
|
|
assert page.get_next_page(None) is None
|
|
|
|
def test_import_export_management_commands():
|
|
page = Page(title=u'foo', slug='foo', order=0)
|
|
page.save()
|
|
|
|
cell = TextCell(page=page, text='foo', order=0, placeholder='content')
|
|
cell.save()
|
|
|
|
page2 = Page(title=u'bar', slug='bar', order=1, parent=page)
|
|
page2.save()
|
|
|
|
cell = TextCell(page=page2, text='bar', order=0, placeholder='content')
|
|
cell.save()
|
|
|
|
export_filename = os.path.join(settings.MEDIA_ROOT, 'site-export.json')
|
|
if os.path.exists(export_filename):
|
|
os.unlink(export_filename)
|
|
|
|
cmd = ExportSiteCommand()
|
|
cmd.handle(output=export_filename)
|
|
assert os.path.exists(export_filename)
|
|
|
|
stdout = sys.stdout
|
|
try:
|
|
sys.stdout = StringIO()
|
|
cmd.handle(output='-')
|
|
assert sys.stdout.getvalue() == open(export_filename).read()
|
|
finally:
|
|
sys.stdout = stdout
|
|
|
|
Page.objects.all().delete()
|
|
|
|
cmd = ImportSiteCommand()
|
|
cmd.handle(filename=export_filename, if_empty=False, clean=False)
|
|
|
|
new_page_1 = Page.objects.all().order_by('order')[0]
|
|
new_page_2 = Page.objects.all().order_by('order')[1]
|
|
assert new_page_1.title == 'foo'
|
|
assert new_page_2.title == 'bar'
|
|
assert len(CellBase.get_cells(page_id=new_page_1.id)) == 1
|
|
assert isinstance(CellBase.get_cells(page_id=new_page_1.id)[0], TextCell)
|
|
assert CellBase.get_cells(page_id=new_page_1.id)[0].text == 'foo'
|
|
|
|
def test_last_update_time():
|
|
page = Page(title=u'foo', slug='foo', order=0)
|
|
page.save()
|
|
|
|
cell = TextCell(page=page, text='foo', order=0)
|
|
cell.save()
|
|
|
|
cell = TextCell(page=page, text='bar', order=0)
|
|
cell.save()
|
|
|
|
future_time = now() + datetime.timedelta(days=2)
|
|
TextCell.objects.filter(pk=cell.id).update(last_update_timestamp=future_time)
|
|
|
|
assert page.get_last_update_time() == future_time
|
|
|
|
def test_get_placeholders():
|
|
page = Page(title=u'foo', slug='foo', template_name='standard-sidebar', order=0)
|
|
request = RequestFactory().get('/')
|
|
placeholders = page.get_placeholders(request=request)
|
|
assert [x.key for x in placeholders] == ['content', 'sidebar', 'footer']
|
|
assert placeholders[0].acquired is False
|
|
assert placeholders[-1].acquired is True
|
|
|
|
with override_settings(COMBO_PUBLIC_TEMPLATES={
|
|
'standard-sidebar': {
|
|
'name': 'Test',
|
|
'template': 'combo/page_template_sidebar.html',
|
|
'placeholders': {
|
|
'content': {'name': 'Content'},
|
|
'content2': {'name': 'Second Content'},
|
|
'sidebar': {'name': 'Sidebar'},
|
|
'footer': {'name': 'Footer', 'acquired': False},
|
|
}}}):
|
|
placeholders = page.get_placeholders(request=request)
|
|
assert set([x.key for x in placeholders]) == set(['content', 'content2', 'sidebar', 'footer'])
|
|
footer_placeholder = [x for x in placeholders if x.key == 'footer'][0]
|
|
assert footer_placeholder.acquired is False
|