combo/tests/test_maps_cells.py

228 lines
8.2 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.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": {
"name": "Foo"
},
"geometry": {
"type": "Point",
"coordinates": [
2.548828125,
48.83579746243093
]
}
},
{
"type": "Feature",
"properties": {
"name": "Bar"
},
"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 = {'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
assert 'data-group-markers="1"' not 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
cell.group_markers = True
cell.save()
rendered = cell.render(context)
assert 'data-group-markers="1"' in rendered
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.requests_wrapper.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.requests_wrapper.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 len(json.loads(resp.content)['features']) == 2
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.requests_wrapper.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.requests_wrapper.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.requests_wrapper.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]
# check query on geojson
layer.geojson_url = 'http://example.org/geojson?t5'
layer.include_user_identifier = False
layer.save()
with mock.patch('combo.utils.requests_wrapper.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}) + '?q=bar')
assert len(json.loads(resp.content)['features']) == 1
assert 'orig=combo' in requests_get.call_args[0][1]
assert not 'email=admin%40localhost&' in requests_get.call_args[0][1]