Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 48985eb

Browse files
committed
feat(gql): add testSuites, flags to TestAnalytics
1 parent 7857053 commit 48985eb

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

graphql_api/tests/test_test_analytics.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,3 +1134,59 @@ def test_flake_aggregates_7_days(self) -> None:
11341134
"flakeCountPercentChange": -50.0,
11351135
"flakeRatePercentChange": -43.75,
11361136
}
1137+
1138+
def test_test_suites(self) -> None:
1139+
repo = RepositoryFactory(author=self.owner, active=True, private=True)
1140+
test = TestFactory(repository=repo, testsuite="test_suite_1")
1141+
test2 = TestFactory(repository=repo, testsuite="test_suite_2")
1142+
1143+
repo_flag = RepositoryFlagFactory(repository=repo, flag_name="hello_world")
1144+
1145+
_ = TestFlagBridgeFactory(flag=repo_flag, test=test)
1146+
_ = DailyTestRollupFactory(
1147+
test=test,
1148+
created_at=datetime.datetime.now(),
1149+
repoid=repo.repoid,
1150+
branch="main",
1151+
avg_duration_seconds=0.1,
1152+
)
1153+
_ = DailyTestRollupFactory(
1154+
test=test2,
1155+
created_at=datetime.datetime.now(),
1156+
repoid=repo.repoid,
1157+
branch="main",
1158+
avg_duration_seconds=20.0,
1159+
)
1160+
res = self.fetch_test_analytics(
1161+
repo.name,
1162+
"""testSuites""",
1163+
)
1164+
assert res["testSuites"] == ["test_suite_1", "test_suite_2"]
1165+
1166+
def test_flags(self) -> None:
1167+
repo = RepositoryFactory(author=self.owner, active=True, private=True)
1168+
test = TestFactory(repository=repo)
1169+
test2 = TestFactory(repository=repo)
1170+
1171+
repo_flag = RepositoryFlagFactory(repository=repo, flag_name="hello_world")
1172+
1173+
_ = TestFlagBridgeFactory(flag=repo_flag, test=test)
1174+
_ = DailyTestRollupFactory(
1175+
test=test,
1176+
created_at=datetime.datetime.now(),
1177+
repoid=repo.repoid,
1178+
branch="main",
1179+
avg_duration_seconds=0.1,
1180+
)
1181+
_ = DailyTestRollupFactory(
1182+
test=test2,
1183+
created_at=datetime.datetime.now(),
1184+
repoid=repo.repoid,
1185+
branch="main",
1186+
avg_duration_seconds=20.0,
1187+
)
1188+
res = self.fetch_test_analytics(
1189+
repo.name,
1190+
"""flags""",
1191+
)
1192+
assert res["flags"] == ["hello_world"]

graphql_api/types/test_analytics/test_analytics.graphql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ type TestAnalytics {
1717

1818
"Flake aggregates are flake totals across all tests"
1919
flakeAggregates(interval: MeasurementInterval): FlakeAggregates
20+
21+
testSuites: [String!]!
22+
23+
"Only flag names relevant to Test Analytics"
24+
flags: [String!]!
2025
}
2126

2227
type TestResultConnection {

graphql_api/types/test_analytics/test_analytics.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
generate_flake_aggregates,
1414
generate_test_results,
1515
generate_test_results_aggregates,
16+
get_flags,
17+
get_test_suites,
1618
)
1719

1820
log = logging.getLogger(__name__)
@@ -88,6 +90,16 @@ async def resolve_flake_aggregates(
8890
)
8991

9092

93+
@test_analytics_bindable.field("testSuites")
94+
async def resolve_test_suites(repository: Repository, info: GraphQLResolveInfo, **_):
95+
return await sync_to_async(get_test_suites)(repository.repoid)
96+
97+
98+
@test_analytics_bindable.field("flags")
99+
async def resolve_flags(repository: Repository, info: GraphQLResolveInfo, **_):
100+
return await sync_to_async(get_flags)(repository.repoid)
101+
102+
91103
def convert_interval_to_timedelta(interval: MeasurementInterval | None) -> timedelta:
92104
if interval is None:
93105
return timedelta(days=30)

utils/test_results.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from shared.django_apps.reports.models import (
1717
DailyTestRollup,
1818
Flake,
19+
Test,
1920
TestFlagBridge,
2021
)
2122

@@ -623,3 +624,20 @@ def generate_flake_aggregates(
623624
curr_numbers,
624625
past_numbers,
625626
)
627+
628+
629+
def get_test_suites(repoid: int) -> list[str]:
630+
return list(
631+
Test.objects.filter(repository_id=repoid)
632+
.values_list("testsuite", flat=True)
633+
.distinct()
634+
)
635+
636+
637+
def get_flags(repoid: int) -> list[str]:
638+
return list(
639+
TestFlagBridge.objects.filter(test__repository_id=repoid)
640+
.select_related("flag")
641+
.values_list("flag__flag_name", flat=True)
642+
.distinct()
643+
)

0 commit comments

Comments
 (0)