Skip to content

Commit

Permalink
WIP: Add test for environments N+1
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewelwell committed Nov 27, 2023
1 parent 6aadec1 commit ca17054
Showing 1 changed file with 84 additions and 2 deletions.
86 changes: 84 additions & 2 deletions api/environments/identities/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from unittest.case import TestCase

import pytest
from core.constants import FLAGSMITH_UPDATED_AT_HEADER
from core.constants import FLAGSMITH_UPDATED_AT_HEADER, STRING
from django.test import override_settings
from django.urls import reverse
from rest_framework import status
Expand All @@ -16,12 +16,14 @@
from environments.identities.models import Identity
from environments.identities.traits.models import Trait
from environments.models import Environment, EnvironmentAPIKey
from features.feature_types import MULTIVARIATE
from features.models import Feature, FeatureSegment, FeatureState
from features.multivariate.models import MultivariateFeatureOption
from integrations.amplitude.models import AmplitudeConfiguration
from organisations.models import Organisation, OrganisationRole
from projects.models import Project
from segments import models
from segments.models import Condition, Segment, SegmentRule
from segments.models import EQUAL, Condition, Segment, SegmentRule
from util.tests import Helper


Expand Down Expand Up @@ -849,6 +851,86 @@ def test_get_identities_request_includes_updated_at_header(self):
self.environment.updated_at.timestamp()
)

def test_get_identities_nplus1(self) -> None:
# Given
url = "%s?identifier=%s" % (
reverse("api-v1:sdk-identities"),
self.identity.identifier,
)

# create an extra regular feature
Feature.objects.create(name="another_feature", project=self.project)

# create some features with segment overrides
# each for new segments
for i in range(5):
feature = Feature.objects.create(
name=f"overridden feature {i}", project=self.project
)
segment = Segment.objects.create(name=f"segment {i}", project=self.project)
parent_rule = SegmentRule.objects.create(
segment=segment, type=SegmentRule.ALL_RULE
)
child_rule = SegmentRule.objects.create(
segment=segment, rule=parent_rule, type=SegmentRule.ANY_RULE
)
trait_key = f"foo_{i}"
Condition.objects.create(
rule=child_rule, property=trait_key, operator=EQUAL, value="bar"
)
# create some other unnecessary conditions
for j in range(10):
Condition.objects.create(
rule=child_rule,
property=trait_key,
operator=EQUAL,
value=f"bar_{j}",
)
Trait.objects.create(
identity=self.identity,
trait_key=trait_key,
value_type=STRING,
string_value="bar",
)
feature_segment = FeatureSegment.objects.create(
feature=feature, segment=segment, environment=self.environment
)
FeatureState.objects.create(
feature=feature,
feature_segment=feature_segment,
environment=self.environment,
)

for k in range(3):
multivariate_feature = Feature.objects.create(
name=f"mv_feature_{k}", project=self.project, type=MULTIVARIATE
)
for m in range(3): # noqa
MultivariateFeatureOption.objects.create(
feature=multivariate_feature,
type=STRING,
string_value=f"foo_{m}",
)

for n in range(3):
identity_override_feature = Feature.objects.create(
name=f"identity_override_{n}", project=self.project
)
FeatureState.objects.create(
identity=self.identity,
environment=self.environment,
feature=identity_override_feature,
)

# When
with self.assertNumQueries(11):
response = self.client.get(url)

# Then
assert response.status_code == status.HTTP_200_OK
response_json = response.json()
assert response_json


def test_get_identities_with_hide_sensitive_data_with_feature_name(
environment, feature, identity, api_client
Expand Down

0 comments on commit ca17054

Please sign in to comment.