combo/tests/test_dashboard.py

212 lines
8.1 KiB
Python

import json
import mock
import os
import pytest
from webtest import TestApp
from django.conf import settings
from django.contrib.auth.models import User
from django.core.management import call_command
from django.core.urlresolvers import reverse
from django.utils.six.moves.urllib import parse as urlparse
from django.test import override_settings
from combo.wsgi import application
from combo.data.models import Page, CellBase, TextCell, ConfigJsonCell
from combo.apps.dashboard.models import DashboardCell, Tile
pytestmark = pytest.mark.django_db
from .test_manager import admin_user, login
@pytest.fixture
def site(admin_user):
page = Page(title='One', slug='index')
page.save()
# order will be useful to get to the cell later on
for i in range(100, 110):
cell = TextCell(page=page, order=i, placeholder='content',
text='hello world (%s)' % i)
cell.save()
page = Page(title='Two', slug='two')
page.save()
dashboard_cell = DashboardCell(page=page, order=0, placeholder='content')
dashboard_cell.save()
def test_empty_dashboard(app, site):
resp = app.get('/', status=200)
assert 'hello world' in resp.text
resp = app.get('/two/', status=200)
assert not 'dashboardcell' in resp.text
app = login(app)
resp = app.get('/two/', status=200)
assert 'dashboardcell' in resp.text
def test_add_to_dashboard(app, site):
app = login(app)
cell = TextCell.objects.get(order=100)
dashboard = DashboardCell.objects.all()[0]
user = User.objects.all()[0]
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': cell.get_reference()}))
assert urlparse.urlparse(resp.location).path == dashboard.page.get_online_url()
assert Tile.objects.count() == 1
assert Tile.objects.all()[0].cell.id != cell.id
assert Tile.objects.all()[0].cell.text == cell.text
assert Tile.objects.all()[0].dashboard_id == dashboard.id
assert Tile.objects.all()[0].user_id == user.id
assert Tile.objects.all()[0].order == 0
app = login(app)
resp = app.get('/two/', status=200)
assert 'hello world' in resp.text
def test_add_to_dashboard_order(app, site):
test_add_to_dashboard(app, site)
cell = TextCell.objects.get(order=101)
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': cell.get_reference()}))
assert Tile.objects.count() == 2
assert Tile.objects.all()[0].cell.text == 'hello world (100)'
assert Tile.objects.all()[1].cell.text == 'hello world (101)'
cell = TextCell.objects.get(order=102)
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': cell.get_reference()}))
assert Tile.objects.count() == 3
assert Tile.objects.all()[0].cell.text == 'hello world (100)'
assert Tile.objects.all()[1].cell.text == 'hello world (101)'
assert Tile.objects.all()[2].cell.text == 'hello world (102)'
with override_settings(COMBO_DASHBOARD_NEW_TILE_POSITION='first'):
cell = TextCell.objects.get(order=103)
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': cell.get_reference()}))
assert Tile.objects.count() == 4
assert Tile.objects.all()[0].cell.text == 'hello world (103)'
assert Tile.objects.all()[1].cell.text == 'hello world (100)'
assert Tile.objects.all()[2].cell.text == 'hello world (101)'
assert Tile.objects.all()[3].cell.text == 'hello world (102)'
def test_ajax_add_to_dashboard(app, site):
cell = TextCell.objects.get(order=100)
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': cell.get_reference()}),
headers={'x-requested-with': 'XMLHttpRequest'},
status=403)
assert Tile.objects.count() == 0
app = login(app)
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': cell.get_reference()}),
headers={'x-requested-with': 'XMLHttpRequest'})
assert resp.json['err'] == 0
assert resp.json['url'] == 'http://testserver/two/'
assert Tile.objects.count() == 1
def test_ajax_render(app, site):
test_add_to_dashboard(app, site)
app.reset() # logout
tile = Tile.objects.all()[0]
page = Page.objects.get(slug='two')
resp = app.get(reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': tile.cell.get_reference()}),
status=403)
app = login(app)
resp = app.get(reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': tile.cell.get_reference()}),
status=200)
user = User.objects.create_user('plop', email=None, password='plop')
app = login(app, username='plop', password='plop')
resp = app.get(reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': tile.cell.get_reference()}),
status=403)
def test_remove_from_dashboard(app, site):
test_add_to_dashboard(app, site)
app.reset() # logout
tile = Tile.objects.all()[0]
resp = app.get(reverse('combo-dashboard-remove-tile',
kwargs={'cell_reference': tile.cell.get_reference()}), status=403)
app = login(app)
resp = app.get(reverse('combo-dashboard-remove-tile',
kwargs={'cell_reference': tile.cell.get_reference()}), status=302)
assert Tile.objects.count() == 0
assert TextCell.objects.count() == 11 # the cell itself is kept
def test_ajax_remove_from_dashboard(app, site):
test_add_to_dashboard(app, site)
tile = Tile.objects.all()[0]
app = login(app)
resp = app.get(reverse('combo-dashboard-remove-tile',
kwargs={'cell_reference': tile.cell.get_reference()}),
headers={'x-requested-with': 'XMLHttpRequest'},
status=200)
assert resp.json['err'] == 0
assert resp.json['url'] == 'http://testserver/two/'
assert Tile.objects.count() == 0
def test_reorder_dashboard(app, site):
user = User.objects.all()[0]
dashboard = DashboardCell.objects.all()[0]
# add cells to dashboard
app = login(app)
for i in range(103, 108):
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': TextCell.objects.get(order=i).get_reference()}))
assert Tile.objects.count() == 5
# check reordering
app.reset() # logout
tiles = Tile.objects.filter(user=user).order_by('?')
new_order = ','.join([str(x.id) for x in tiles])
resp = app.get(reverse('combo-dashboard-reorder-tiles',
kwargs={'dashboard_id': dashboard.id}), params={'order': new_order}, status=403)
app = login(app)
resp = app.get(reverse('combo-dashboard-reorder-tiles',
kwargs={'dashboard_id': dashboard.id}), params={'order': new_order})
tiles = Tile.objects.filter(user=user)
assert new_order == ','.join([str(x.id) for x in tiles])
def test_auto_tile(app, site):
templates_settings = [settings.TEMPLATES[0].copy()]
templates_settings[0]['DIRS'] = ['%s/templates-1' % os.path.abspath(os.path.dirname(__file__))]
with override_settings(JSON_CELL_TYPES={
'test-config-json-cell': {
'name': 'Foobar',
'url': 'http://test/',
'form': [
{
'varname': 'var1',
}
]
}},
TEMPLATES=templates_settings):
with mock.patch('combo.utils.requests.get') as requests_get:
# logged out
requests_get.return_value = mock.Mock(content='<div>HELLO</div>', status_code=200)
resp = app.post(reverse('combo-dashboard-auto-tile', kwargs={'key': 'test-config-json-cell'}),
params=json.dumps({'var1': 'one', 'var2': 'two'}),
content_type='application/json')
assert resp.text.strip() == '/var1=one/var2=/'
# and logged in
app = login(app)
resp = app.post(reverse('combo-dashboard-auto-tile', kwargs={'key': 'test-config-json-cell'}),
params=json.dumps({'var1': 'one', 'var2': 'two'}),
content_type='application/json')
assert resp.text.strip() == '/var1=one/var2=/'
def test_clean_autotiles(app, site):
call_command('clean_autotiles')