Skip to content
Merged
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
22 changes: 22 additions & 0 deletions flag_engine/segments/evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@

import semver

from flag_engine.context.mappers import map_environment_identity_to_context
from flag_engine.context.types import EvaluationContext
from flag_engine.environments.models import EnvironmentModel
from flag_engine.identities.models import IdentityModel
from flag_engine.identities.traits.types import ContextValue
from flag_engine.segments import constants
from flag_engine.segments.models import (
Expand All @@ -20,6 +23,25 @@
from flag_engine.utils.types import SupportsStr, get_casting_function


def get_identity_segments(
identity: IdentityModel,
environment: EnvironmentModel,
) -> typing.List[SegmentModel]:
"""
Get a list of segments for a given identity in a given environment.

:param identity: the identity model object to get the segments for
:param environment: the environment model object the identity belongs to
:return: list of segments that the identity belongs to in the environment
"""
context = map_environment_identity_to_context(
environment=environment,
identity=identity,
override_traits=None,
)
return get_context_segments(context, environment.project.segments)


def get_context_segments(
context: EvaluationContext,
segments: typing.List[SegmentModel],
Expand Down
24 changes: 24 additions & 0 deletions tests/unit/segments/test_segments_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
from pytest_lazyfixture import lazy_fixture
from pytest_mock import MockerFixture

from flag_engine.context.mappers import map_environment_identity_to_context
from flag_engine.context.types import EvaluationContext
from flag_engine.environments.models import EnvironmentModel
from flag_engine.identities.models import IdentityModel
from flag_engine.segments import constants
from flag_engine.segments.evaluator import (
_matches_context_value,
context_matches_condition,
get_identity_segments,
is_context_in_segment,
)
from flag_engine.segments.models import (
Expand Down Expand Up @@ -254,6 +258,26 @@ def test_context_in_segment_percentage_split(
assert result == expected_result


def test_get_identity_segments_calls_get_context_segments(
mocker: MockerFixture,
environment: EnvironmentModel,
identity: IdentityModel,
) -> None:
# Given
mock_get_context_segments = mocker.patch(
"flag_engine.segments.evaluator.get_context_segments"
)

context = map_environment_identity_to_context(environment, identity, None)
# When
get_identity_segments(identity, environment)

# Then
mock_get_context_segments.assert_called_once_with(
context, environment.project.segments
)


def test_context_in_segment_percentage_split__trait_value__calls_expected(
mocker: MockerFixture,
context: EvaluationContext,
Expand Down