combo/tests/test_dashboard.py

255 lines
9.7 KiB
Python

import datetime
import json
import mock
import os
import pytest
from webtest import TestApp
from django.apps import apps
from django.conf import settings
from django.contrib.auth.models import User
from django.core.management import call_command
from django.urls 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 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=/'
# with missing data
resp = app.post(reverse('combo-dashboard-auto-tile', kwargs={'key': 'test-config-json-cell'}),
params=json.dumps({'var2': 'two'}),
content_type='application/json', status=400)
# and with a GET instead of POST
resp = app.get(reverse('combo-dashboard-auto-tile', kwargs={'key': 'test-config-json-cell'}),
status=405)
def test_clean_autotiles(app, site):
appconfig = apps.get_app_config('dashboard')
appconfig.clean_autotiles()
def test_dashboard_invalid_cells(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 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
cell = Tile.objects.all()[0].cell
cell.mark_as_invalid(reason_code='plop')
resp = app.get('/two/', status=200)
assert 'hello world' in resp.text
validity_info = cell.get_validity_info()
validity_info.invalid_since = validity_info.invalid_since - datetime.timedelta(days=3)
validity_info.save()
resp = app.get('/two/', status=200)
assert 'hello world' not in resp.text