combo/tests/test_dashboard.py

205 lines
7.8 KiB
Python

import json
import mock
import os
import pytest
import urlparse
from webtest import TestApp
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
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.body
resp = app.get('/two/', status=200)
assert not 'dashboardcell' in resp.body
app = login(app)
resp = app.get('/two/', status=200)
assert 'dashboardcell' in resp.body
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.body
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):
with override_settings(JSON_CELL_TYPES={
'test-config-json-cell': {
'name': 'Foobar',
'url': 'http://test/',
'form': [
{
'varname': 'var1',
}
]
}},
TEMPLATE_DIRS=['%s/templates-1' % os.path.abspath(os.path.dirname(__file__))]):
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.body.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.body.strip() == '/var1=one/var2=/'