Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion api/environments/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ def filter_for_document_builder(
Prefetch(
"project__segments__feature_segments__feature_states",
queryset=FeatureState.objects.select_related(
"feature", "feature_state_value", "environment"
"feature",
"feature_state_value",
"environment",
"environment_feature_version",
),
),
Prefetch(
Expand Down
1 change: 1 addition & 0 deletions api/environments/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@ def _get_environment_document_from_db(
"feature",
"feature_state_value",
"identity",
"environment_feature_version",
"identity__environment",
).prefetch_related(
Prefetch(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from typing import TYPE_CHECKING

import pytest
from core.constants import FLAGSMITH_UPDATED_AT_HEADER
from django.urls import reverse
from flag_engine.segments.constants import EQUAL
Expand All @@ -9,33 +10,44 @@
from environments.identities.models import Identity
from environments.models import Environment, EnvironmentAPIKey
from features.feature_types import MULTIVARIATE
from features.models import (
from features.models import ( # type: ignore[attr-defined]
STRING,
Feature,
FeatureSegment,
FeatureState,
FeatureStateValue,
)
from features.multivariate.models import MultivariateFeatureOption
from features.versioning.models import EnvironmentFeatureVersion
from features.versioning.tasks import enable_v2_versioning
from projects.models import Project
from segments.models import Condition, Segment, SegmentRule

if TYPE_CHECKING:
from pytest_django import DjangoAssertNumQueries

from organisations.models import Organisation
from projects.models import Project


@pytest.mark.parametrize(
"use_v2_feature_versioning, total_queries", [(True, 16), (False, 15)]
)
def test_get_environment_document(
organisation_one: "Organisation",
organisation_two: "Organisation",
organisation_one_project_one: "Project",
django_assert_num_queries: "DjangoAssertNumQueries",
use_v2_feature_versioning: bool,
total_queries: int,
) -> None:
# Given
project = organisation_one_project_one

# an environment
environment = Environment.objects.create(name="Test Environment", project=project)
environment = Environment.objects.create(
name="Test Environment",
project=project,
)

api_key = EnvironmentAPIKey.objects.create(environment=environment)
client = APIClient()
client.credentials(HTTP_X_ENVIRONMENT_KEY=api_key.key)
Expand Down Expand Up @@ -89,7 +101,7 @@ def test_get_environment_document(
type=STRING,
)

for i in range(10):
# Add a multivariate feature
mv_feature = Feature.objects.create(
name=f"mv_feature_{i}", project=project, type=MULTIVARIATE
)
Expand All @@ -104,16 +116,31 @@ def test_get_environment_document(
string_value="option-2",
)

if use_v2_feature_versioning:
enable_v2_versioning(environment.id)

# create new versions of a given featurestate
for _ in range(2):
efv = EnvironmentFeatureVersion.objects.create(
environment=environment,
feature=feature,
)
efv.publish()

# and the relevant URL to get an environment document
url = reverse("api-v1:environment-document")

# When
with django_assert_num_queries(15):
with django_assert_num_queries(total_queries):
response = client.get(url)

# Then
assert response.status_code == status.HTTP_200_OK
assert response.json()
assert len(response.data["project"]["segments"]) == 10
assert len(response.data["feature_states"]) == 11
assert len(response.data["identity_overrides"]) == 10

environment.refresh_from_db()
assert response.headers[FLAGSMITH_UPDATED_AT_HEADER] == str(
environment.updated_at.timestamp()
)
Expand Down
Loading