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}
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") ]
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
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)]
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 == []
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"]