120 lines
4.6 KiB
Python
120 lines
4.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import pytest
|
|
import mock
|
|
|
|
from django.contrib.auth.models import User
|
|
|
|
from combo.apps.maps.models import MapLayer
|
|
|
|
pytestmark = pytest.mark.django_db
|
|
|
|
@pytest.fixture
|
|
def admin_user():
|
|
try:
|
|
user = User.objects.get(username='admin')
|
|
except User.DoesNotExist:
|
|
user = User.objects.create_superuser('admin', email=None, password='admin')
|
|
return user
|
|
|
|
def login(app, username='admin', password='admin'):
|
|
login_page = app.get('/login/')
|
|
login_form = login_page.forms[0]
|
|
login_form['username'] = username
|
|
login_form['password'] = password
|
|
resp = login_form.submit()
|
|
assert resp.status_int == 302
|
|
return app
|
|
|
|
def test_access(app, admin_user):
|
|
app = login(app)
|
|
resp = app.get('/manage/', status=200)
|
|
assert '/manage/maps/' in resp.body
|
|
|
|
def test_add_layer(app, admin_user):
|
|
MapLayer.objects.all().delete()
|
|
app = login(app)
|
|
resp = app.get('/manage/maps/', status=200)
|
|
resp = resp.click('New')
|
|
resp.forms[0]['label'] = 'Test'
|
|
resp.forms[0]['geojson_url'] = 'http://example.net/geojson'
|
|
assert resp.form['marker_colour'].value == '#0000FF'
|
|
resp.forms[0]['marker_colour'] = '#FFFFFF'
|
|
resp.forms[0]['icon'] = 'bicycle'
|
|
assert resp.form['icon_colour'].value == '#000000'
|
|
resp.form['icon_colour'] = '#FFFFFF'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location.endswith('/manage/maps/')
|
|
assert MapLayer.objects.count() == 1
|
|
layer = MapLayer.objects.get()
|
|
assert layer.label == 'Test'
|
|
assert layer.slug == 'test'
|
|
|
|
def test_edit_layer(app, admin_user):
|
|
test_add_layer(app, admin_user)
|
|
app = login(app)
|
|
resp = app.get('/manage/maps/', status=200)
|
|
resp = resp.click('Test')
|
|
assert '<li><span class="icon-ambulance"><label' in resp.body
|
|
resp.forms[0]['geojson_url'] = 'http://example.net/new_geojson'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location.endswith('/manage/maps/')
|
|
assert MapLayer.objects.count() == 1
|
|
layer = MapLayer.objects.get()
|
|
assert layer.geojson_url == 'http://example.net/new_geojson'
|
|
|
|
def test_delete_layer(app, admin_user):
|
|
test_add_layer(app, admin_user)
|
|
app = login(app)
|
|
resp = app.get('/manage/maps/', status=200)
|
|
resp = resp.click('Test')
|
|
resp = resp.click('Delete')
|
|
assert 'Are you sure you want to delete this?' in resp.body
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location.endswith('/manage/maps/')
|
|
assert MapLayer.objects.count() == 0
|
|
|
|
@mock.patch('combo.apps.maps.models.requests.get')
|
|
def test_download_geojson(mock_request, app, admin_user):
|
|
test_add_layer(app, admin_user)
|
|
layer = MapLayer.objects.get()
|
|
mocked_response = mock.Mock()
|
|
mock_request.GET = {}
|
|
mocked_response.json.return_value = [{'type': 'Feature',
|
|
'geometry': {'type': 'Point',
|
|
'coordinates': [2.3233688436448574, 48.83369263315934]},
|
|
'properties': {'property': 'property value'}}]
|
|
mocked_response.ok.return_value = True
|
|
mock_request.return_value = mocked_response
|
|
geojson = layer.get_geojson(mock_request)
|
|
assert len(geojson) > 0
|
|
for item in geojson:
|
|
assert item['type'] == 'Feature'
|
|
assert item['geometry']['type'] == 'Point'
|
|
assert item['geometry']['coordinates'] == [2.3233688436448574, 48.83369263315934]
|
|
assert item['properties']['layer']['identifier'] == layer.slug
|
|
assert item['properties']['layer']['icon'] == 'bicycle'
|
|
assert item['properties']['layer']['label'] == 'Test'
|
|
assert item['properties']['layer']['colour'] == '#FFFFFF'
|
|
assert item['properties']['layer']['icon_colour'] == '#FFFFFF'
|
|
|
|
mocked_response.json.return_value = {'type': 'FeatureCollection',
|
|
'features': [{'geometry': {'type': 'Point',
|
|
'coordinates': [2.3233688436448574, 48.83369263315934]},
|
|
'properties': {'property': 'a random value',
|
|
'display_fields': [('foo', 'bar')]}}
|
|
]
|
|
}
|
|
mocked_response.ok.return_value = True
|
|
mock_request.return_value = mocked_response
|
|
geojson = layer.get_geojson(mock_request)
|
|
assert len(geojson) > 0
|
|
for item in geojson:
|
|
assert item['geometry']['type'] == 'Point'
|
|
assert item['geometry']['coordinates'] == [2.3233688436448574, 48.83369263315934]
|
|
assert item['properties']['layer']['identifier'] == layer.slug
|
|
assert item['properties']['layer']['icon'] == 'bicycle'
|
|
assert item['properties']['layer']['label'] == 'Test'
|
|
assert item['properties']['layer']['colour'] == '#FFFFFF'
|
|
assert item['properties']['layer']['icon_colour'] == '#FFFFFF'
|