Files
notifications-admin/tests/app/models/test_broadcast_message.py
Chris Hill-Scott 6cb326f153 Update utils to do linear transformation of polygons
Brings in https://github.com/alphagov/notifications-utils/pull/889/files

At the moment, we are not doing any transformation of features before
applying geometric algorithms to them. This is, in effect, assuming that
the earth is flat.

This new version of utils implements the transformation of our polygons
to a Cartesian plane. In other words, it converts them from being
defined in spherical degrees to metres.

For the admin app this means we need to convert places where the code
expects things to be measured in degrees to work in metres instead.
2021-12-01 14:10:54 +00:00

94 lines
2.6 KiB
Python

import pytest
from app.broadcast_areas.models import CustomBroadcastAreas
from app.models.broadcast_message import BroadcastMessage
from tests import broadcast_message_json
@pytest.mark.parametrize('areas, expected_area_ids', [
({'simple_polygons': []}, []),
({'ids': ['123'], 'simple_polygons': []}, ['123'])
])
def test_area_ids(
areas,
expected_area_ids,
):
broadcast_message = BroadcastMessage(broadcast_message_json(
areas=areas
))
assert broadcast_message.area_ids == expected_area_ids
def test_simple_polygons():
broadcast_message = BroadcastMessage(broadcast_message_json(
area_ids=[
# Hackney Central
'wd20-E05009372',
# Hackney Wick
'wd20-E05009374',
],
))
assert [
[
len(polygon)
for polygon in broadcast_message.polygons.as_coordinate_pairs_lat_long
],
[
len(polygon)
for polygon in broadcast_message.simple_polygons.as_coordinate_pairs_lat_long
],
] == [
# One polygon for each area
[27, 31],
# Because the areas are close to each other, the simplification
# and unioning process results in a single polygon with fewer
# total coordinates
[57],
]
def test_content_comes_from_attribute_not_template():
broadcast_message = BroadcastMessage(broadcast_message_json())
assert broadcast_message.content == 'This is a test'
@pytest.mark.parametrize(('areas', 'expected_length'), [
({'ids': []}, 0),
({'ids': ['wd20-E05009372']}, 1),
({'no data': 'just created'}, 0),
({'names': ['somewhere'], 'simple_polygons': [[[3.5, 1.5]]]}, 1)
])
def test_areas(
areas,
expected_length
):
broadcast_message = BroadcastMessage(broadcast_message_json(
areas=areas
))
assert len(list(broadcast_message.areas)) == expected_length
def test_areas_treats_missing_ids_as_custom_broadcast(notify_admin):
broadcast_message = BroadcastMessage(broadcast_message_json(
areas={
'ids': [
'wd20-E05009372',
'something else',
],
# although the IDs may no longer be usable, we can
# expect the broadcast to have names and polygons,
# which is enough to show the user something
'names': [
'wd20 name',
'something else name'
],
'simple_polygons': [[[1, 2]]]
}
))
assert len(list(broadcast_message.areas)) == 2
assert type(broadcast_message.areas) == CustomBroadcastAreas