|
1 | 1 | import time |
2 | 2 | from typing import TYPE_CHECKING |
| 3 | +from unittest.mock import ANY |
3 | 4 |
|
4 | 5 | import pytest |
5 | 6 | from django.urls import reverse |
6 | 7 | from django.utils import timezone |
7 | 8 | from django.utils.http import http_date |
| 9 | +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] |
8 | 10 | from rest_framework import status |
9 | 11 | from rest_framework.test import APIClient |
10 | 12 |
|
@@ -121,6 +123,105 @@ def test_get_environment_document( |
121 | 123 | ) |
122 | 124 |
|
123 | 125 |
|
| 126 | +@pytest.mark.parametrize( |
| 127 | + "environment_", |
| 128 | + ( |
| 129 | + lazy_fixture("environment"), |
| 130 | + lazy_fixture("environment_v2_versioning"), |
| 131 | + ), |
| 132 | +) |
| 133 | +def test_get_environment_document__identity_overrides( |
| 134 | + project: Project, |
| 135 | + environment_: Environment, |
| 136 | +) -> None: |
| 137 | + # Given |
| 138 | + api_key = EnvironmentAPIKey.objects.create(environment=environment_) |
| 139 | + client = APIClient() |
| 140 | + client.credentials(HTTP_X_ENVIRONMENT_KEY=api_key.key) |
| 141 | + |
| 142 | + feature = Feature.objects.create(name="test_feature", project=project) |
| 143 | + for i in range(2): |
| 144 | + identity = Identity.objects.create( |
| 145 | + environment=environment_, |
| 146 | + identifier=f"identity_{i}", |
| 147 | + ) |
| 148 | + identity_feature_state = FeatureState.objects.create( |
| 149 | + identity=identity, |
| 150 | + feature=feature, |
| 151 | + environment=environment_, |
| 152 | + ) |
| 153 | + FeatureStateValue.objects.filter(feature_state=identity_feature_state).update( |
| 154 | + string_value="overridden", |
| 155 | + type=STRING, |
| 156 | + ) |
| 157 | + |
| 158 | + url = reverse("api-v1:environment-document") |
| 159 | + |
| 160 | + # When |
| 161 | + response = client.get(url) |
| 162 | + |
| 163 | + # Then |
| 164 | + assert response.status_code == status.HTTP_200_OK |
| 165 | + assert sorted( |
| 166 | + response.data["identity_overrides"], |
| 167 | + key=lambda x: x["identifier"], |
| 168 | + ) == [ |
| 169 | + { |
| 170 | + "composite_key": ANY, |
| 171 | + "created_date": ANY, |
| 172 | + "django_id": ANY, |
| 173 | + "environment_api_key": environment_.api_key, |
| 174 | + "identifier": "identity_0", |
| 175 | + "dashboard_alias": None, |
| 176 | + "identity_features": [ |
| 177 | + { |
| 178 | + "django_id": ANY, |
| 179 | + "enabled": False, |
| 180 | + "feature": { |
| 181 | + "id": feature.id, |
| 182 | + "name": "test_feature", |
| 183 | + "type": "STANDARD", |
| 184 | + }, |
| 185 | + "feature_segment": None, |
| 186 | + "feature_state_value": "overridden", |
| 187 | + "featurestate_uuid": ANY, |
| 188 | + "multivariate_feature_state_values": [], |
| 189 | + } |
| 190 | + ], |
| 191 | + "identity_traits": [], |
| 192 | + "identity_uuid": ANY, |
| 193 | + }, |
| 194 | + { |
| 195 | + "composite_key": ANY, |
| 196 | + "created_date": ANY, |
| 197 | + "django_id": ANY, |
| 198 | + "environment_api_key": environment_.api_key, |
| 199 | + "identifier": "identity_1", |
| 200 | + "dashboard_alias": None, |
| 201 | + "identity_features": [ |
| 202 | + { |
| 203 | + "django_id": ANY, |
| 204 | + "enabled": False, |
| 205 | + "feature": { |
| 206 | + "id": feature.id, |
| 207 | + "name": "test_feature", |
| 208 | + "type": "STANDARD", |
| 209 | + }, |
| 210 | + "feature_segment": None, |
| 211 | + "feature_state_value": "overridden", |
| 212 | + "featurestate_uuid": ANY, |
| 213 | + "multivariate_feature_state_values": [], |
| 214 | + } |
| 215 | + ], |
| 216 | + "identity_traits": [], |
| 217 | + "identity_uuid": ANY, |
| 218 | + }, |
| 219 | + ] |
| 220 | + assert response.headers[FLAGSMITH_UPDATED_AT_HEADER] == str( |
| 221 | + environment_.updated_at.timestamp() |
| 222 | + ) |
| 223 | + |
| 224 | + |
124 | 225 | def test_get_environment_document_fails_with_invalid_key( |
125 | 226 | organisation_one: "Organisation", |
126 | 227 | organisation_one_project_one: "Project", |
|
0 commit comments