193 lines
6.9 KiB
Python
193 lines
6.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
import json
|
|
import mock
|
|
import pytest
|
|
|
|
from django.contrib.auth.models import User
|
|
from django.test.client import RequestFactory
|
|
from django.template import Context
|
|
from django.test import Client
|
|
from django.core.urlresolvers import reverse
|
|
from django.contrib.auth.models import Group
|
|
|
|
from combo.data.models import Page
|
|
from combo.apps.maps.models import MapLayer, Map
|
|
|
|
pytestmark = pytest.mark.django_db
|
|
|
|
client = Client()
|
|
|
|
SAMPLE_GEOJSON_CONTENT = '''{
|
|
"type": "FeatureCollection",
|
|
"features": [
|
|
{
|
|
"type": "Feature",
|
|
"properties": {},
|
|
"geometry": {
|
|
"type": "Point",
|
|
"coordinates": [
|
|
2.548828125,
|
|
48.83579746243093
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}'''
|
|
|
|
@pytest.fixture
|
|
def user():
|
|
try:
|
|
user = User.objects.get(username='admin')
|
|
except User.DoesNotExist:
|
|
user = User.objects.create_user('admin', email='admin@localhost', password='admin')
|
|
return user
|
|
|
|
@pytest.fixture
|
|
def layer():
|
|
try:
|
|
layer = MapLayer.objects.get()
|
|
except MapLayer.DoesNotExist:
|
|
layer = MapLayer()
|
|
layer.geojson_url = 'http://example.org/geojson'
|
|
layer.marker_colour = 'FF0000'
|
|
layer.icon = 'fa-bicycle'
|
|
layer.icon_colour = '0000FF'
|
|
layer.save()
|
|
return layer
|
|
|
|
def login(username='admin', password='admin'):
|
|
resp = client.post('/login/', {'username': username, 'password': password})
|
|
assert resp.status_code == 302
|
|
|
|
def test_cell_disabled():
|
|
MapLayer.objects.all().delete()
|
|
assert Map.is_enabled() is False
|
|
|
|
def test_cell_enabled(layer):
|
|
assert Map.is_enabled() is True
|
|
|
|
def test_cell_rendering(layer):
|
|
page = Page(title='xxx', slug='test_map_cell', template_name='standard')
|
|
page.save()
|
|
cell = Map(page=page, placeholder='content', order=0, title='Map with points')
|
|
cell.save()
|
|
cell.layers.add(layer)
|
|
context = Context({'request': RequestFactory().get('/')})
|
|
rendered = cell.render(context)
|
|
assert 'data-init-zoom="13"' in rendered
|
|
assert 'data-min-zoom="0"' in rendered
|
|
assert 'data-max-zoom="19"' in rendered
|
|
assert 'data-init-lat="48.83369263315934"' in rendered
|
|
assert 'data-init-lng="2.3233688436448574"' in rendered
|
|
assert 'data-geojson-url="/ajax/mapcell/geojson/1/"' in rendered
|
|
resp = client.get('/test_map_cell/')
|
|
assert 'xstatic/leaflet.js' in resp.content
|
|
assert 'js/combo.map.js' in resp.content
|
|
assert 'xstatic/leaflet.css' in resp.content
|
|
assert 'css/combo.map.css' in resp.content
|
|
|
|
|
|
def test_get_geojson_on_non_public_page(layer):
|
|
page = Page(title='xxx', slug='new', template_name='standard',
|
|
public=False)
|
|
page.save()
|
|
cell = Map(page=page, placeholder='content', order=0,
|
|
title='Map with points')
|
|
cell.save()
|
|
cell.layers.add(layer)
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
assert resp.status_code == 403
|
|
|
|
def test_get_geojson_on_non_publik_cell(layer):
|
|
page = Page(title='xxx', slug='new', template_name='standard')
|
|
page.save()
|
|
cell = Map(page=page, placeholder='content', order=0, public=False,
|
|
title='Map with points')
|
|
cell.save()
|
|
cell.layers.add(layer)
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
assert resp.status_code == 403
|
|
|
|
def test_geojson_on_restricted_cell(layer, user):
|
|
page = Page(title='xxx', slug='new', template_name='standard')
|
|
page.save()
|
|
group = Group.objects.create(name='map tester')
|
|
cell = Map(page=page, placeholder='content', order=0, public=False)
|
|
cell.title = 'Map with points'
|
|
cell.save()
|
|
cell.layers.add(layer)
|
|
cell.groups.add(group)
|
|
login()
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
assert resp.status_code == 403
|
|
user.groups.add(group)
|
|
user.save()
|
|
|
|
with mock.patch('combo.utils.RequestsSession.request') as requests_get:
|
|
requests_get.return_value = mock.Mock(
|
|
content=SAMPLE_GEOJSON_CONTENT,
|
|
json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
|
|
status_code=200)
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
|
|
def test_get_geojson(layer, user):
|
|
page = Page(title='xxx', slug='new', template_name='standard')
|
|
page.save()
|
|
cell = Map(page=page, placeholder='content', order=0, public=True)
|
|
cell.title = 'Map'
|
|
cell.save()
|
|
layer.geojson_url = 'http://example.org/geojson?t1'
|
|
layer.save()
|
|
cell.layers.add(layer)
|
|
|
|
# check cache duration
|
|
with mock.patch('combo.utils.RequestsSession.request') as requests_get:
|
|
requests_get.return_value = mock.Mock(
|
|
content=SAMPLE_GEOJSON_CONTENT,
|
|
json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
|
|
status_code=200)
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
assert requests_get.call_count == 1
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
assert requests_get.call_count == 1 # cache was used
|
|
layer.cache_duration = 0
|
|
layer.save()
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
assert requests_get.call_count == 2 # cache was not used
|
|
|
|
# check user params
|
|
layer.geojson_url = 'http://example.org/geojson?t2'
|
|
layer.save()
|
|
with mock.patch('combo.utils.RequestsSession.request') as requests_get:
|
|
requests_get.return_value = mock.Mock(
|
|
content=SAMPLE_GEOJSON_CONTENT,
|
|
json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
|
|
status_code=200)
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
assert 'orig=combo' in requests_get.call_args[0][1]
|
|
assert 'email=&' in requests_get.call_args[0][1]
|
|
|
|
login()
|
|
layer.geojson_url = 'http://example.org/geojson?t3'
|
|
layer.save()
|
|
with mock.patch('combo.utils.RequestsSession.request') as requests_get:
|
|
requests_get.return_value = mock.Mock(
|
|
content=SAMPLE_GEOJSON_CONTENT,
|
|
json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
|
|
status_code=200)
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
assert 'orig=combo' in requests_get.call_args[0][1]
|
|
assert 'email=admin%40localhost&' in requests_get.call_args[0][1]
|
|
|
|
layer.geojson_url = 'http://example.org/geojson?t4'
|
|
layer.include_user_identifier = False
|
|
layer.save()
|
|
with mock.patch('combo.utils.RequestsSession.request') as requests_get:
|
|
requests_get.return_value = mock.Mock(
|
|
content=SAMPLE_GEOJSON_CONTENT,
|
|
json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
|
|
status_code=200)
|
|
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
|
assert 'orig=combo' in requests_get.call_args[0][1]
|
|
assert not 'email=admin%40localhost&' in requests_get.call_args[0][1]
|