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

Commit b228ce3

Browse files
committed
feat(gql): add testSuites, flags to TestAnalytics
1 parent de9265f commit b228ce3

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
@@ -993,3 +993,59 @@ def test_flake_aggregates_7_days(self) -> None:
993993
"flakeCountPercentChange": -50.0,
994994
"flakeRatePercentChange": -43.75,
995995
}
996+
997+
def test_test_suites(self) -> None:
998+
repo = RepositoryFactory(author=self.owner, active=True, private=True)
999+
test = TestFactory(repository=repo, testsuite="test_suite_1")
1000+
test2 = TestFactory(repository=repo, testsuite="test_suite_2")
1001+
1002+
repo_flag = RepositoryFlagFactory(repository=repo, flag_name="hello_world")
1003+
1004+
_ = TestFlagBridgeFactory(flag=repo_flag, test=test)
1005+
_ = DailyTestRollupFactory(
1006+
test=test,
1007+
created_at=datetime.datetime.now(),
1008+
repoid=repo.repoid,
1009+
branch="main",
1010+
avg_duration_seconds=0.1,
1011+
)
1012+
_ = DailyTestRollupFactory(
1013+
test=test2,
1014+
created_at=datetime.datetime.now(),
1015+
repoid=repo.repoid,
1016+
branch="main",
1017+
avg_duration_seconds=20.0,
1018+
)
1019+
res = self.fetch_test_analytics(
1020+
repo.name,
1021+
"""testSuites""",
1022+
)
1023+
assert res["testSuites"] == ["test_suite_1", "test_suite_2"]
1024+
1025+
def test_flags(self) -> None:
1026+
repo = RepositoryFactory(author=self.owner, active=True, private=True)
1027+
test = TestFactory(repository=repo)
1028+
test2 = TestFactory(repository=repo)
1029+
1030+
repo_flag = RepositoryFlagFactory(repository=repo, flag_name="hello_world")
1031+
1032+
_ = TestFlagBridgeFactory(flag=repo_flag, test=test)
1033+
_ = DailyTestRollupFactory(
1034+
test=test,
1035+
created_at=datetime.datetime.now(),
1036+
repoid=repo.repoid,
1037+
branch="main",
1038+
avg_duration_seconds=0.1,
1039+
)
1040+
_ = DailyTestRollupFactory(
1041+
test=test2,
1042+
created_at=datetime.datetime.now(),
1043+
repoid=repo.repoid,
1044+
branch="main",
1045+
avg_duration_seconds=20.0,
1046+
)
1047+
res = self.fetch_test_analytics(
1048+
repo.name,
1049+
"""flags""",
1050+
)
1051+
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__)
@@ -92,6 +94,16 @@ async def resolve_flake_aggregates(
9294
)
9395

9496

97+
@test_analytics_bindable.field("testSuites")
98+
async def resolve_test_suites(repository: Repository, info: GraphQLResolveInfo, **_):
99+
return await sync_to_async(get_test_suites)(repository.repoid)
100+
101+
102+
@test_analytics_bindable.field("flags")
103+
async def resolve_flags(repository: Repository, info: GraphQLResolveInfo, **_):
104+
return await sync_to_async(get_flags)(repository.repoid)
105+
106+
95107
def convert_interval_to_timedelta(interval: MeasurementInterval | None) -> timedelta:
96108
if interval is None:
97109
return timedelta(days=30)

utils/test_results.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from shared.django_apps.reports.models import (
1919
DailyTestRollup,
2020
Flake,
21+
Test,
2122
TestFlagBridge,
2223
)
2324

@@ -560,3 +561,20 @@ def generate_flake_aggregates(
560561
curr_numbers,
561562
past_numbers,
562563
)
564+
565+
566+
def get_test_suites(repoid: int) -> list[str]:
567+
return list(
568+
Test.objects.filter(repository_id=repoid)
569+
.values_list("testsuite", flat=True)
570+
.distinct()
571+
)
572+
573+
574+
def get_flags(repoid: int) -> list[str]:
575+
return list(
576+
TestFlagBridge.objects.filter(test__repository_id=repoid)
577+
.select_related("flag")
578+
.values_list("flag__flag_name", flat=True)
579+
.distinct()
580+
)

0 commit comments

Comments
 (0)