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
2 changes: 0 additions & 2 deletions src/sentry/features/temporary.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,6 @@ def register_temporary_features(manager: FeatureManager) -> None:
manager.add("organizations:auto-link-repos-by-name", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=False)
# Enabled for orgs that participated in the code review beta
manager.add("organizations:code-review-beta", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
# Enable A/B testing experiments for code review (org eligibility)
manager.add("organizations:code-review-experiments-enabled", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=False)
# Enable continuous profiling
manager.add("organizations:continuous-profiling", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
# Enable the ingestion of profile functions metrics into EAP
Expand Down
17 changes: 1 addition & 16 deletions src/sentry/seer/code_review/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from django.conf import settings
from urllib3.exceptions import HTTPError

from sentry import features
from sentry.integrations.github.client import GitHubReaction
from sentry.integrations.github.utils import is_github_rate_limit_sensitive
from sentry.integrations.github.webhook_types import GithubWebhookType
Expand Down Expand Up @@ -274,9 +273,8 @@ def _common_codegen_request_payload(
},
}

# Add experiment_enabled flag ONLY for pr-review requests (not for pr-closed / pr-reopened)
if add_experiment_enabled:
data["experiment_enabled"] = is_org_enabled_for_code_review_experiments(organization)
data["experiment_enabled"] = True

return {
"external_owner_id": repo.external_id,
Expand Down Expand Up @@ -624,16 +622,3 @@ def delete_existing_reactions_and_add_reaction(
CodeReviewErrorType.REACTION_FAILED,
)
logger.warning(Log.REACTION_FAILED.value, exc_info=True)


def is_org_enabled_for_code_review_experiments(organization: Organization) -> bool:
"""
Checks if an org is eligible to code review experiments via Flagpole.

If True the exact experiment is decided by Seer.
If False no experiment will be applied to the PR, and it'll use the default behavior.
"""
return features.has(
"organizations:code-review-experiments-enabled",
organization,
)
40 changes: 1 addition & 39 deletions tests/sentry/seer/code_review/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,10 @@
_get_trigger_metadata_for_pull_request,
convert_enum_keys_to_strings,
get_tags,
is_org_enabled_for_code_review_experiments,
transform_webhook_to_codegen_request,
)
from sentry.testutils.cases import TestCase
from sentry.testutils.factories import Factories
from sentry.testutils.helpers.features import with_feature
from sentry.users.models.user import User
from sentry.utils import json

Expand Down Expand Up @@ -414,7 +412,6 @@ def test_issue_comment_payload_is_json_serializable(
# This would fail if trigger_at is a datetime object instead of string
json.dumps(result) # Should not raise TypeError

@with_feature("organizations:code-review-experiments-enabled")
def test_pr_closed_does_not_include_experiment_enabled(
self,
setup_entities: tuple[User, Organization, Project, Repository],
Expand All @@ -437,7 +434,6 @@ def test_pr_closed_does_not_include_experiment_enabled(
assert result is not None
assert "experiment_enabled" not in result["data"]

@with_feature("organizations:code-review-experiments-enabled")
def test_issue_comment_includes_experiment_enabled(
self,
setup_entities: tuple[User, Organization, Project, Repository],
Expand All @@ -463,8 +459,7 @@ def test_issue_comment_includes_experiment_enabled(
assert result is not None
assert result["data"]["experiment_enabled"] is True

@with_feature("organizations:code-review-experiments-enabled")
def test_pr_review_includes_experiment_enabled_when_feature_enabled(
def test_pr_review_includes_experiment_enabled_always_true(
self,
setup_entities: tuple[User, Organization, Project, Repository],
) -> None:
Expand All @@ -486,28 +481,6 @@ def test_pr_review_includes_experiment_enabled_when_feature_enabled(
assert result is not None
assert result["data"]["experiment_enabled"] is True

def test_pr_review_includes_experiment_enabled_false_when_feature_disabled(
self,
setup_entities: tuple[User, Organization, Project, Repository],
) -> None:
_, organization, _, repo = setup_entities

event_payload = {
"pull_request": {"number": 42},
"sender": {"login": "test-user"},
}
result = transform_webhook_to_codegen_request(
GithubWebhookType.PULL_REQUEST,
"opened",
event_payload,
organization,
repo,
"abc123sha",
)

assert result is not None
assert result["data"]["experiment_enabled"] is False


class TestExtractGithubInfo(TestCase):
def setUp(self) -> None:
Expand Down Expand Up @@ -882,17 +855,6 @@ def test_handles_seer_code_review_feature_enum(self) -> None:
assert isinstance(list(result.keys())[0], str)


class CodeReviewExperimentAssignmentTest(TestCase):
def test_enabled(self) -> None:
org = self.create_organization(slug="test-org")
with self.feature("organizations:code-review-experiments-enabled"):
assert is_org_enabled_for_code_review_experiments(org)

def test_disabled(self) -> None:
org = self.create_organization(slug="test-org")
assert not is_org_enabled_for_code_review_experiments(org)


class TestBuildRepoDefinition:
def _make_repo(self, provider: str = "integrations:github") -> MagicMock:
repo = MagicMock()
Expand Down
Loading