예제 #1
0
    def test_update_traffic_sign_real_3d_location(self):
        user = get_user()
        owner = get_owner()
        data = {
            "location": Point(5, 5, srid=settings.SRID),
            "z_coord": 20,
            "direction": 0,
            "created_by": user.id,
            "updated_by": user.id,
            "owner": owner.pk,
            "lifecycle": Lifecycle.ACTIVE,
            "device_type": get_traffic_control_device_type().pk,
        }
        user = get_user()
        traffic_sign_real = TrafficSignReal.objects.create(
            location=Point(10, 10, 5, srid=settings.SRID),
            direction=0,
            created_by=user,
            updated_by=user,
            owner=owner,
            lifecycle=Lifecycle.ACTIVE,
        )
        form = TrafficSignRealModelForm(data=data, instance=traffic_sign_real)
        self.assertEqual(form.fields["z_coord"].initial, 5)
        self.assertTrue(form.is_valid())

        instance = form.save()
        self.assertEqual(instance.location, Point(5, 5, 20, srid=settings.SRID))
예제 #2
0
 def setUp(self):
     self.user = get_user()
     self.admin = get_user(admin=True)
     self.traffic_sign_real = TrafficSignReal.objects.create(
         location=Point(10, 10, 5, srid=settings.SRID),
         legacy_code="100",
         direction=0,
         created_by=self.user,
         updated_by=self.user,
         owner=get_owner(),
         lifecycle=Lifecycle.ACTIVE,
     )
     self.site = AdminSite()
예제 #3
0
def test__api_operational_area_permission__partial_update(
        model, location, success):
    operational_area = get_operational_area()
    user = get_user()
    perms = Permission.objects.filter(codename__contains=model.lower())
    user.operational_areas.add(operational_area)
    user.user_permissions.add(*perms)
    instance = model_factory_map[model](location=location)

    data = {
        "location": location.ewkt,
    }
    api_client = get_api_client(user=user)
    response = api_client.patch(
        reverse(f"v1:{model.lower()}-detail", kwargs={"pk": instance.pk}),
        data,
        format="json",
    )

    instance.refresh_from_db()
    if success:
        assert response.status_code == status.HTTP_200_OK
        assert instance.updated_by == user
    else:
        assert response.status_code == status.HTTP_403_FORBIDDEN
        assert instance.updated_by != user
def test__device_type__target_model__invalid(target_model, factory):
    client = get_api_client(user=get_user(admin=True))
    related_model = factory()
    device_type = related_model.device_type
    data = {
        "target_model": target_model.value,
    }

    response = client.patch(
        reverse("v1:trafficcontroldevicetype-detail",
                kwargs={"pk": device_type.id}),
        data,
        format="json",
    )

    device_type.refresh_from_db()
    assert response.status_code == status.HTTP_400_BAD_REQUEST
    assert response.json() == {
        "target_model": [
            (f"Some traffic control devices related to this device type instance "
             f"will become invalid if target_model value is changed to "
             f"{target_model.value}. target_model can not be changed until this "
             f"is resolved."),
        ]
    }
    assert not device_type.target_model
def test__api_operational_area_permission__create(model, location, success):
    operational_area = get_operational_area()
    user = get_user()
    perms = Permission.objects.filter(codename__contains=model.lower())
    user.operational_areas.add(operational_area)
    user.user_permissions.add(*perms)
    device_type = get_traffic_control_device_type()

    location = location.ewkt if location else None

    if model == "Plan":
        data = {
            "name": "Test plan",
            "plan_number": "2020_1",
            "location": location,
            "planner": user.pk,
            "decision_maker": user.pk,
            "plans": {
                "barrier": [],
                "mount": [],
                "road_marking": [],
                "signpost": [],
                "traffic_light": [],
                "traffic_sign": [],
                "additional_sign": [],
            },
        }
    else:
        data = {
            "location": location,
            "device_type": device_type.pk,
            "decision_date": "2020-07-01",
            "lifecycle": Lifecycle.ACTIVE.value,
            "owner": get_owner().pk,
        }

        if model in ["BarrierPlan", "BarrierReal"]:
            data["road_name"] = "testroad"
        elif model in ["RoadMarkingPlan", "RoadMarkingReal"]:
            data["source_id"] = 1
            data["source_name"] = "test source"

    api_client = get_api_client(user=user)
    response = api_client.post(reverse(f"v1:{model.lower()}-list"),
                               data=data,
                               format="json")

    ModelClass = getattr(models, model)  # noqa: N806
    if success:
        assert response.status_code == status.HTTP_201_CREATED
        assert ModelClass.objects.count() == 1
    elif not location:
        assert response.status_code == status.HTTP_400_BAD_REQUEST
        assert response.json() == {
            "location": [_("This field may not be null.")]
        }
    else:
        assert response.status_code == status.HTTP_403_FORBIDDEN
        assert ModelClass.objects.count() == 0
예제 #6
0
def test__user_operational_area__contains_location(location, expected):
    user = get_user()
    oa = get_operational_area(area=area)
    user.operational_areas.add(oa)

    in_area = user.location_is_in_operational_area(location)

    assert in_area == expected
예제 #7
0
def test__superuser_operational_area(location):
    user = get_user(admin=True)
    oa = get_operational_area(area=area)
    user.operational_areas.add(oa)

    in_area = user.location_is_in_operational_area(location)

    assert in_area
예제 #8
0
 def setUp(self):
     self.user = get_user()
     self.main_sign = TrafficSignReal.objects.create(
         location=Point(0, 0, 10, srid=settings.SRID),
         legacy_code="100",
         direction=0,
         created_by=self.user,
         updated_by=self.user,
         owner=get_owner(),
     )
 def setUp(self):
     self.user = get_user()
     self.main_sign = TrafficSignPlan.objects.create(
         location=Point(0, 0, 10, srid=settings.SRID),
         direction=0,
         device_type=get_traffic_control_device_type(code="T123"),
         created_by=self.user,
         updated_by=self.user,
         owner=get_owner(),
     )
예제 #10
0
def test__user_operational_area__bypass_operational_area(location):
    user = get_user(admin=True)
    user.bypass_operational_area = True
    user.save(update_fields=["bypass_operational_area"])
    oa = get_operational_area(area=area)
    user.operational_areas.add(oa)

    in_area = user.location_is_in_operational_area(location)

    assert in_area
def test__api_operational_area_permission__update(model, location, success):
    operational_area = get_operational_area()
    user = get_user()
    perms = Permission.objects.filter(codename__contains=model.lower())
    user.operational_areas.add(operational_area)
    user.user_permissions.add(*perms)
    device_type = get_traffic_control_device_type()
    instance = model_factory_map[model](location=location)

    if model == "Plan":
        data = {
            "name": "Test plan",
            "plan_number": "2020_1",
            "location": location.ewkt,
            "planner": user.pk,
            "decision_maker": user.pk,
            "plans": {
                "barrier": [],
                "mount": [],
                "road_marking": [],
                "signpost": [],
                "traffic_light": [],
                "traffic_sign": [],
                "additional_sign": [],
            },
        }
    else:
        data = {
            "location": location.ewkt,
            "device_type": device_type.pk,
            "decision_date": "2020-07-01",
            "lifecycle": Lifecycle.ACTIVE.value,
            "owner": get_owner().pk,
        }

        if model in ["BarrierPlan", "BarrierReal"]:
            data["road_name"] = "testroad"
        elif model in ["RoadMarkingPlan", "RoadMarkingReal"]:
            data["source_id"] = 1
            data["source_name"] = "test source"

    api_client = get_api_client(user=user)
    response = api_client.put(
        reverse(f"v1:{model.lower()}-detail", kwargs={"pk": instance.pk}),
        data,
        format="json",
    )

    instance.refresh_from_db()
    if success:
        assert response.status_code == status.HTTP_200_OK
        assert instance.updated_by == user
    else:
        assert response.status_code == status.HTTP_403_FORBIDDEN
        assert instance.updated_by != user
def test__owner_api__list(is_admin):
    Owner.objects.all().delete()
    user = get_user(admin=is_admin)
    client = get_api_client(user)
    get_owner(name_fi="owner 1")
    get_owner(name_fi="owner 2")

    response = client.get(reverse("v1:owner-list"))

    assert response.status_code == status.HTTP_200_OK
    assert response.data["count"] == 2
예제 #13
0
 def setUp(self):
     self.user = get_user()
     self.mount_type = get_mount_type(code="LIGHTPOLE",
                                      description="Lightpole")
     self.mount_real = MountReal.objects.create(
         location=Point(1, 1, srid=settings.SRID),
         mount_type=self.mount_type,
         owner=get_owner(),
         created_by=self.user,
         updated_by=self.user,
     )
예제 #14
0
def test__user_group_operational_area__contains_location(location, expected):
    user = get_user()
    group = Group.objects.create(name="test group")
    user.groups.add(group)
    oa = get_operational_area(area)
    group_oa = GroupOperationalArea.objects.create(group=group)
    group_oa.areas.add(oa)

    in_area = user.location_is_in_operational_area(location)

    assert in_area == expected
def test__owner_api__retrieve(is_admin):
    Owner.objects.all().delete()
    user = get_user(admin=is_admin)
    client = get_api_client(user)
    owner_1 = get_owner(name_fi="owner 1")
    get_owner(name_fi="owner 2")

    response = client.get(reverse("v1:owner-detail", kwargs={"pk":
                                                             owner_1.pk}))

    assert response.status_code == status.HTTP_200_OK
    assert response.data["id"] == str(owner_1.pk)
    assert response.data["name_fi"] == owner_1.name_fi
def test__owner_api__destroy(is_admin):
    Owner.objects.all().delete()
    user = get_user(admin=is_admin)
    client = get_api_client(user)
    owner = get_owner(name_fi="foo", name_en="bar")

    response = client.delete(
        reverse("v1:owner-detail", kwargs={"pk": owner.pk}))

    if is_admin:
        assert response.status_code == status.HTTP_204_NO_CONTENT
        assert Owner.objects.count() == 0
    else:
        assert response.status_code == status.HTTP_403_FORBIDDEN
        assert Owner.objects.count() == 1
예제 #17
0
 def test_create_traffic_sign_real_3d_location(self):
     user = get_user()
     data = {
         "location": Point(10, 10, srid=settings.SRID),
         "z_coord": 20,
         "direction": 0,
         "created_by": user.id,
         "updated_by": user.id,
         "owner": get_owner().pk,
         "lifecycle": Lifecycle.ACTIVE,
         "device_type": get_traffic_control_device_type().pk,
     }
     form = TrafficSignRealModelForm(data=data)
     form.is_valid()
     self.assertTrue(form.is_valid())
     instance = form.save()
     self.assertEqual(instance.location, Point(10, 10, 20, srid=settings.SRID))
def test__api_operational_area_permission__create__geojson(location, success):
    operational_area = get_operational_area()
    user = get_user()
    perms = Permission.objects.filter(codename__contains="barrierplan")
    user.operational_areas.add(operational_area)
    user.user_permissions.add(*perms)
    device_type = get_traffic_control_device_type()

    if location:
        location = json.loads(location.geojson)
        location.update({
            "crs": {
                "type": "name",
                "properties": {
                    "name": f"EPSG:{settings.SRID}"
                }
            }
        })

    data = {
        "location": location,
        "device_type": device_type.pk,
        "decision_date": "2020-07-01",
        "lifecycle": Lifecycle.ACTIVE.value,
        "owner": get_owner().pk,
        "road_name": "testroad",
    }

    api_client = get_api_client(user=user)
    response = api_client.post(
        f"{reverse('v1:barrierplan-list')}?geo_format=geojson",
        data=data,
        format="json")

    if success:
        assert response.status_code == status.HTTP_201_CREATED
        assert BarrierPlan.objects.count() == 1
    elif not location:
        assert response.status_code == status.HTTP_400_BAD_REQUEST
        assert response.json() == {
            "location": [_("This field may not be null.")]
        }
    else:
        assert response.status_code == status.HTTP_403_FORBIDDEN
        assert BarrierPlan.objects.count() == 0
def test__device_type__target_model__valid(target_model, factory):
    client = get_api_client(user=get_user(admin=True))
    related_model = factory()
    device_type = related_model.device_type
    data = {
        "target_model": target_model.value,
    }

    response = client.patch(
        reverse("v1:trafficcontroldevicetype-detail",
                kwargs={"pk": device_type.id}),
        data,
        format="json",
    )

    device_type.refresh_from_db()
    assert response.status_code == status.HTTP_200_OK
    assert device_type.target_model == target_model
예제 #20
0
def test__api_operational_area_permission__delete(model, location, success):
    operational_area = get_operational_area()
    user = get_user()
    perms = Permission.objects.filter(codename__contains=model.lower())
    user.operational_areas.add(operational_area)
    user.user_permissions.add(*perms)
    instance = model_factory_map[model](location=location)

    api_client = get_api_client(user=user)
    response = api_client.delete(
        reverse(f"v1:{model.lower()}-detail", kwargs={"pk": instance.pk}))

    instance.refresh_from_db()
    if success:
        assert response.status_code == status.HTTP_204_NO_CONTENT
        assert not instance.is_active
    else:
        assert response.status_code == status.HTTP_403_FORBIDDEN
        assert instance.is_active
def test__owner_api__create(is_admin):
    Owner.objects.all().delete()
    user = get_user(admin=is_admin)
    client = get_api_client(user)
    data = {
        "name_fi": "Omistajan nimi",
        "name_en": "Owner name",
    }

    response = client.post(reverse("v1:owner-list"), data=data)

    if is_admin:
        owner = Owner.objects.first()
        assert response.status_code == status.HTTP_201_CREATED
        assert Owner.objects.count() == 1
        assert owner.name_fi == data["name_fi"]
        assert owner.name_en == data["name_en"]
    else:
        assert response.status_code == status.HTTP_403_FORBIDDEN
        assert Owner.objects.count() == 0
 def test_save_traverse_road_marking_without_road_name_raise_validation_error(
         self):
     device_type = TrafficControlDeviceType.objects.create(
         code="L11",
         target_model=DeviceTypeTargetModel.ROAD_MARKING,
         type=TrafficControlDeviceTypeType.TRANSVERSE,
     )
     user = get_user("test_user")
     with self.assertRaises(ValidationError) as e:
         RoadMarkingReal.objects.create(
             device_type=device_type,
             location=Point(1, 1, 0, srid=settings.SRID),
             road_name="",
             owner=get_owner(),
             created_by=user,
             updated_by=user,
         )
         self.assertEqual(
             str(e),
             f'Road name is required for "{TrafficControlDeviceTypeType.TRANSVERSE.value}" road marking',
         )
def test__owner_api__partial_update(is_admin):
    Owner.objects.all().delete()
    user = get_user(admin=is_admin)
    client = get_api_client(user)
    owner = get_owner(name_fi="foo", name_en="bar")
    data = {
        "name_fi": "Omistajan nimi",
    }

    response = client.patch(reverse("v1:owner-detail", kwargs={"pk":
                                                               owner.pk}),
                            data=data)
    owner.refresh_from_db()
    assert Owner.objects.count() == 1

    if is_admin:
        assert response.status_code == status.HTTP_200_OK
        assert owner.name_fi == data["name_fi"]
        assert owner.name_en == "bar"
    else:
        assert response.status_code == status.HTTP_403_FORBIDDEN
        assert owner.name_fi == "foo"
        assert owner.name_en == "bar"
예제 #24
0
 def setUp(self):
     self.user = get_user()
     self.mount_type = get_mount_type(code="LIGHTPOLE",
                                      description="Lightpole")
     self.mount_type_2 = get_mount_type(code="POLE", description="Pole")
예제 #25
0
 def setUp(self):
     self.user = get_user()
     self.admin_user = get_user(admin=True)
     self.barrier_real = get_barrier_real()
     self.site = AdminSite()
     self.model_admin = BarrierRealAdmin(BarrierReal, self.site)
예제 #26
0
 def test_redirected_for_non_staff_user(self):
     request = self.factory.get(reverse("map-view"))
     request.user = get_user()
     request.LANGUAGE_CODE = "en"
     response = map_view(request)
     self.assertEqual(response.status_code, 302)
 def setUp(self):
     self.operational_area = get_operational_area()
     self.user = get_user()
     self.admin = get_user(admin=True)
예제 #28
0
 def test_return_success_for_staff_user(self):
     request = self.factory.get(reverse("map-view"))
     request.user = get_user(admin=True)
     request.LANGUAGE_CODE = "en"
     response = map_view(request)
     self.assertEqual(response.status_code, 200)