Пример #1
0
def test_policy_active():
    now = timezone.now()
    yesterday = timezone.now() - datetime.timedelta(1)
    tomorrow = timezone.now() + datetime.timedelta(1)

    unpublished_policy = factories.Policy(published_date=None)  # noqa: F841
    old_policy = factories.Policy(start_date=yesterday,
                                  end_date=yesterday,
                                  published_date=yesterday)
    obsolete_policy = factories.Policy(  # noqa: F841
        start_date=yesterday,
        end_date=tomorrow + datetime.timedelta(seconds=1),  # Not included
        published_date=yesterday,
        prev_policies=[old_policy],
    )

    # None of these policies should show up
    assert set(models.Policy.objects.active()) == set()

    ongoing_policy = factories.Policy(name="ongoing",
                                      start_date=now,
                                      published_date=now)
    bound_policy = factories.Policy(name="bound",
                                    start_date=now,
                                    end_date=tomorrow,
                                    published_date=now)
    assert set(
        models.Policy.objects.active(now)) == {ongoing_policy, bound_policy}
    assert set(models.Policy.objects.active(yesterday)) == set()
    assert set(models.Policy.objects.active(tomorrow)) == {ongoing_policy}
Пример #2
0
def test_policy_publish():
    policy = factories.Policy(published_date=None, rules=[])

    try:
        policy.publish()
    except ValidationError:
        pass
    else:
        assert False, "Policy not prevented from being published."

    # Rebuild with a rule
    # but the fake area ID in the factory doesn't exist
    policy = factories.Policy(published_date=None)

    try:
        policy.publish()
    except ValidationError:
        pass
    else:
        assert False, "Policy not prevented from being published."

    # The ID from the Policy factory
    factories.Area(label="Venice Beach",
                   id=uuid.UUID("e0e4a085-7a50-43e0-afa4-6792ca897c5a"))

    with unittest.mock.patch(
            "uuid.uuid4",
            lambda: uuid.UUID("fe363c54-011b-4840-a909-0fd4ef6d168e")):
        policy.publish()

    assert policy.geographies == {
        "fe363c54-011b-4840-a909-0fd4ef6d168e": {
            "type": "Feature",
            "geometry": {
                "type":
                "GeometryCollection",
                "geometries": [{
                    "type":
                    "MultiPolygon",
                    "coordinates": [[[
                        [0.0, 0.0],
                        [0.0, 50.0],
                        [50.0, 50.0],
                        [50.0, 0.0],
                        [0.0, 0.0],
                    ]]],
                }],
            },
            "id": uuid.UUID("fe363c54-011b-4840-a909-0fd4ef6d168e"),
            "properties": {
                "name": "Venice Beach",
                "label": "Venice Beach",
                "area": "e0e4a085-7a50-43e0-afa4-6792ca897c5a",
            },
        }
    }
    assert policy.rules[0]["geographies"] == [
        uuid.UUID("fe363c54-011b-4840-a909-0fd4ef6d168e")
    ]
Пример #3
0
def test_geography_detail(client):
    policy = factories.Policy(published=True)
    response = client.get(
        reverse("agency-0.3:geography-detail", args=[policy.id]))
    assert response.status_code == 200
    # The whole structure is tested in test_models
    assert response.json()["type"] == "FeatureCollection"
    assert len(response.json()["features"]) == 1
Пример #4
0
def test_policy_list_basic(client, django_assert_num_queries):
    provider = factories.Provider(name="Test provider")
    other_provider = factories.Provider(name="Other provider")

    # One provider-specific policy
    provider_policy = factories.Policy(providers=[provider], published=True)
    # And one general-purpose policy
    general_policy = factories.Policy(published=True)

    # Test without auth
    n = BASE_NUM_QUERIES
    n += 1  # query on policies
    n += 1  # query on related providers
    n += 1  # query on related previous policies
    with django_assert_num_queries(n - 1):  # No token check
        response = client.get(reverse("agency-0.3:policy-list"))
    assert response.status_code == 200
    assert [p["policy_id"] for p in response.data] == [str(general_policy.id)]

    # Test with provider auth
    with django_assert_num_queries(n):
        response = client.get(
            reverse("agency-0.3:policy-list"),
            **auth_header(SCOPE_AGENCY_API, provider_id=provider.id),
        )
    assert response.status_code == 200
    assert [p["policy_id"] for p in response.data] == [
        str(provider_policy.id),
        str(general_policy.id),
    ]
    # We made this mistake before, don't serve a UUID object
    assert response.data[0]["provider_ids"] == [str(provider.id)]

    # Test with other provider auth
    with django_assert_num_queries(n):
        response = client.get(
            reverse("agency-0.3:policy-list"),
            **auth_header(SCOPE_AGENCY_API, provider_id=other_provider.id),
        )
    assert response.status_code == 200
    assert [p["policy_id"] for p in response.data] == [str(general_policy.id)]
Пример #5
0
def test_compliance_list_basic(client, django_assert_num_queries):
    device = factories.Device()
    policy = factories.Policy(published=True)

    # One provider-specific policy
    # provider_policy = factories.ComplianceFactory()
    # And one general-purpose policy
    compliance = factories.ComplianceFactory(
        rule=uuid.UUID("81b1bc92-65b7-4434-8ada-2feeb0b7b223"),
        geography=uuid.UUID("e0e4a085-7a50-43e0-afa4-6792ca897c5a"),
        policy_id=policy.id,
        vehicle_id=device.id,
        start_date=datetime.datetime(2007,
                                     12,
                                     6,
                                     16,
                                     29,
                                     43,
                                     79043,
                                     tzinfo=pytz.UTC),
        end_date=datetime.datetime(2007,
                                   12,
                                   7,
                                   16,
                                   29,
                                   43,
                                   79043,
                                   tzinfo=pytz.UTC),
    )

    compliance_ongoing = factories.ComplianceFactory(
        rule=uuid.UUID("89b5bbb5-ba98-4498-9649-787eb8ddbb8e"),
        geography=uuid.UUID("2cfbdd7f-8ba2-4b48-9826-951fe3249981"),
        policy_id=factories.Policy().id,
        vehicle_id=factories.Device().id,
        start_date=datetime.datetime(2009,
                                     12,
                                     6,
                                     16,
                                     29,
                                     43,
                                     79043,
                                     tzinfo=pytz.UTC),
        end_date=None,
    )

    # Test without auth
    n = 2  # Savepoint and release
    n += 1  # query on policy
    n += 1  # query on related compliances
    n += 1  # query on device
    n += 1  # query on other device
    # query Last compliance
    with django_assert_num_queries(n):
        response = client.get(reverse("agency-0.3:compliance-list"))
    assert response.status_code == 200

    # Check why there is policy more (??? what does it mean?)
    assert response.data[0]["id"] == str(compliance.policy.id)

    # Now test with a provider ID

    response = client.get(reverse("agency-0.3:compliance-list"),
                          {"provider_id": str(device.provider.id)})

    # The provider can fetch a policy that applies to them
    # (to all providers in this case)
    assert response.status_code == 200
    assert response.data[0]["id"] == str(compliance.policy_id)

    response = client.get(
        reverse("agency-0.3:compliance-list"),
        {
            "provider_id":
            str(device.provider.id),
            "end_date":
            utils.to_mds_timestamp(
                datetime.datetime(
                    2009, 12, 7, 16, 29, 43, 79043, tzinfo=pytz.UTC)),
        },
    )

    # provider is OK but timestamp is too high
    assert response.status_code == 200
    assert response.data == []

    response = client.get(
        reverse("agency-0.3:compliance-list"),
        {
            "provider_id":
            str(device.provider.id),
            "end_date":
            utils.to_mds_timestamp(
                datetime.datetime(
                    2007, 12, 7, 16, 29, 43, 79043, tzinfo=pytz.UTC)) -
            60000,  # XXX ?!
        },
    )

    # provider is OK and timestamp is OK
    assert response.status_code == 200
    assert response.data[0]["id"] == str(compliance.policy_id)

    response = client.get(
        reverse("agency-0.3:compliance-list"),
        {
            "end_date":
            utils.to_mds_timestamp(
                datetime.datetime(1970,
                                  1,
                                  14,
                                  0,
                                  47,
                                  3,
                                  900000,
                                  tzinfo=datetime.timezone.utc))
        },
    )

    # too low
    assert response.status_code == 200 and response.data == []

    response = client.get(
        reverse("agency-0.3:compliance-list"),
        {
            "end_date":
            utils.to_mds_timestamp(
                datetime.datetime(2070,
                                  1,
                                  21,
                                  3,
                                  45,
                                  56,
                                  700000,
                                  tzinfo=datetime.timezone.utc))
        },
    )

    # too high but compliance_ongoing is not finished
    assert response.status_code == 200
    assert response.data[0]["id"] == str(compliance_ongoing.policy_id)

    response = client.get(
        reverse("agency-0.3:compliance-list"),
        {"provider_id": "89b5bbb5-ba98-4498-9649-787eb8ddbb8e"},
    )  # this provider don't exist

    assert response.status_code == 200 and response.data == []
Пример #6
0
def test_policy_list_range(client):
    # Policy from last year
    past = factories.Policy(  # noqa: F841
        name="past",
        start_date=timezone.now() - datetime.timedelta(days=365),
        end_date=timezone.now() - datetime.timedelta(days=350),
        published=True,
    )
    # Policy with lower and upper bounds (half of the lifespan)
    bound = factories.Policy(  # noqa: F841
        name="bound",
        start_date=timezone.now() - datetime.timedelta(days=15),
        end_date=timezone.now() + datetime.timedelta(days=15),
        published=True,
    )
    # Same but no upper bound
    ongoing = factories.Policy(  # noqa: F841
        name="ongoing",
        start_date=timezone.now() - datetime.timedelta(days=15),
        published=True,
    )
    # Policy for next year
    future = factories.Policy(  # noqa: F841
        name="future",
        start_date=timezone.now() + datetime.timedelta(days=365),
        published=True,
    )

    # Current and future policies by default
    response = client.get(reverse("agency-0.3:policy-list"))
    assert [p["name"] for p in response.data] == ["bound", "ongoing", "future"]

    # Current only
    response = client.get(
        reverse("agency-0.3:policy-list"),
        {
            "start_time": utils.to_mds_timestamp(timezone.now()),
            "end_time": utils.to_mds_timestamp(timezone.now()),
        },
    )
    assert [p["name"] for p in response.data] == ["bound", "ongoing"]

    # Ongoing is still.. ongoing, and future
    response = client.get(
        reverse("agency-0.3:policy-list"),
        {
            "start_time":
            utils.to_mds_timestamp(timezone.now() +
                                   datetime.timedelta(days=30))
        },
    )
    assert [p["name"] for p in response.data] == ["ongoing", "future"]

    # Past only
    response = client.get(
        reverse("agency-0.3:policy-list"),
        {
            "start_time":
            utils.to_mds_timestamp(timezone.now() -
                                   datetime.timedelta(days=365)),
            "end_time":
            utils.to_mds_timestamp(timezone.now() -
                                   datetime.timedelta(days=30)),
        },
    )
    assert [p["name"] for p in response.data] == ["past"]

    # All
    response = client.get(
        reverse("agency-0.3:policy-list"),
        {
            "start_time":
            utils.to_mds_timestamp(timezone.now() -
                                   datetime.timedelta(days=365)),
            "end_time":
            utils.to_mds_timestamp(timezone.now() +
                                   datetime.timedelta(days=365)),
        },
    )
    assert [p["name"]
            for p in response.data] == ["past", "bound", "ongoing", "future"]