diff --git a/lib/devhub/coverbot/test_reports/actions/get_flaky_tests.ex b/lib/devhub/coverbot/test_reports/actions/get_flaky_tests.ex index 38db61a..2569f56 100644 --- a/lib/devhub/coverbot/test_reports/actions/get_flaky_tests.ex +++ b/lib/devhub/coverbot/test_reports/actions/get_flaky_tests.ex @@ -16,6 +16,7 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTests do class_name: String.t(), failure_count: non_neg_integer(), first_failure_at: DateTime.t(), + last_failure_at: DateTime.t(), commit_sha: String.t(), info: map() } @@ -41,6 +42,7 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTests do class_name: tr3.class_name, test_name: tr3.test_name, first_failure_at: min(tr3.inserted_at), + last_failure_at: max(tr3.inserted_at), commit_sha: fragment("(array_agg(? ORDER BY ? ASC))[1]", c.sha, tr3.inserted_at) } @@ -53,12 +55,13 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTests do where: tsr.test_suite_id == ^test_suite_id, where: tr.status == ^:failed, where: tsr.id in subquery(recent_runs_query), - group_by: [tr.test_name, tr.class_name, ff.first_failure_at, ff.commit_sha], + group_by: [tr.test_name, tr.class_name, ff.first_failure_at, ff.last_failure_at, ff.commit_sha], select: %{ test_name: tr.test_name, class_name: tr.class_name, failure_count: count(tr.id), first_failure_at: ff.first_failure_at, + last_failure_at: ff.last_failure_at, commit_sha: ff.commit_sha, # use aggregate function to get most recent info since tr.info is not in GROUP BY info: fragment("(array_agg(? ORDER BY ? DESC))[1]", tr.info, tr.inserted_at) diff --git a/lib/devhub/coverbot/test_reports/actions/get_flaky_tests_test.exs b/lib/devhub/coverbot/test_reports/actions/get_flaky_tests_test.exs index cce9da9..6e4b3b3 100644 --- a/lib/devhub/coverbot/test_reports/actions/get_flaky_tests_test.exs +++ b/lib/devhub/coverbot/test_reports/actions/get_flaky_tests_test.exs @@ -174,6 +174,7 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTestsTest do class_name: "TestModule", failure_count: 3, first_failure_at: always_failing_first_failure_datetime, + last_failure_at: always_failing_last_failure_datetime, test_name: "always_failing", # first (ever) failure was in commit1, but count is only from last 3 runs commit_sha: "commit1", @@ -183,6 +184,7 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTestsTest do class_name: "TestModule", failure_count: 2, first_failure_at: flaky_first_failure_datetime, + last_failure_at: flaky_last_failure_datetime, test_name: "flaky", # first (ever) failure was in commit2 commit_sha: "commit2", @@ -193,6 +195,9 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTestsTest do Coverbot.get_flaky_tests(test_suite.id, 3) assert Timex.equal?(flaky_first_failure_datetime, ~U[2024-01-02 10:00:00Z]) + assert Timex.equal?(flaky_last_failure_datetime, ~U[2024-01-03 10:00:00Z]) + assert Timex.equal?(always_failing_first_failure_datetime, ~U[2024-01-01 10:00:00Z]) + assert Timex.equal?(always_failing_last_failure_datetime, ~U[2024-01-04 10:00:00Z]) end end diff --git a/lib/devhub_web/live/coverbot/test_reports/test_suite.ex b/lib/devhub_web/live/coverbot/test_reports/test_suite.ex index 6a79ee6..29cc20f 100644 --- a/lib/devhub_web/live/coverbot/test_reports/test_suite.ex +++ b/lib/devhub_web/live/coverbot/test_reports/test_suite.ex @@ -7,11 +7,13 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do def mount(%{"test_suite_id" => test_suite_id}, _session, socket) do {:ok, test_suite} = Coverbot.get_test_suite(test_suite_id) + number_of_past_runs = 10 socket |> assign( test_suite: test_suite, page_title: "Test Suite", + number_of_past_runs: number_of_past_runs, breadcrumbs: [ %{title: "Test Suites", path: "/coverbot/test-reports"}, %{ @@ -26,7 +28,7 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do skipped_tests: AsyncResult.loading() ) |> assign_async([:flaky_tests], fn -> - {:ok, %{flaky_tests: Coverbot.get_flaky_tests(test_suite_id, 10)}} + {:ok, %{flaky_tests: Coverbot.get_flaky_tests(test_suite_id, number_of_past_runs)}} end) |> assign_async([:skipped_tests], fn -> {:ok, %{skipped_tests: Coverbot.get_skipped_tests(test_suite_id)}} @@ -41,13 +43,19 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do <.page_header title="Flaky tests" /> <.async_result :let={flaky_tests} assign={@flaky_tests}> <:loading> -
Loading flaky tests
+
+
+ <.spinner /> +
+
<:failed :let={_failure}>
There was an error loading flaky tests
<%= if Enum.empty?(flaky_tests) do %> -
No flaky tests in the past 10 days
+
+ No flaky tests in the past {@number_of_past_runs} test runs +
<% else %> <.table id="flaky-tests-data" @@ -63,7 +71,12 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do {test_run.failure_count} - <:col :let={test_run} label="First time failed" class="w-1/5"> + <:col :let={test_run} label="Last time failed" class="w-1/5"> +
+ +
+ + <:col :let={test_run} label="First time failed" class="w-1/4">
@@ -88,7 +101,11 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do <.page_header title="Skipped tests" /> <.async_result :let={skipped_tests} assign={@skipped_tests}> <:loading> -
Loading skipped tests
+
+
+ <.spinner /> +
+
<:failed :let={_failure}>
@@ -96,7 +113,9 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do
<%= if Enum.empty?(skipped_tests) do %> -
No skipped tests in the past 10 days
+
+ No skipped tests in the most recent test run +
<% else %> <.table id="skipped-tests-data" @@ -107,10 +126,9 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do

{test_run.test_name}

{test_run.class_name}

- <:col label="" class="w-1/12"> -
- - <:col :let={test_run} label="First time skipped" class="w-1/5"> + <:col label="" class="w-1/12"> + <:col label="" class="w-1/5"> + <:col :let={test_run} label="First time skipped" class="w-1/4">
diff --git a/lib/devhub_web/live/coverbot/test_reports/test_suite_test.exs b/lib/devhub_web/live/coverbot/test_reports/test_suite_test.exs index a14a33e..0d2926f 100644 --- a/lib/devhub_web/live/coverbot/test_reports/test_suite_test.exs +++ b/lib/devhub_web/live/coverbot/test_reports/test_suite_test.exs @@ -36,6 +36,7 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuiteTest do class_name: "TestModule", failure_count: 3, first_failure_at: ~U[2024-01-01 10:00:00Z], + last_failure_at: ~U[2024-01-10 10:00:00Z], commit_sha: "abc123", info: %{ "message" => "Test failed randomly", @@ -148,8 +149,8 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuiteTest do # Wait for async assigns to resolve current_html = render_async(view, 1000) - assert current_html =~ "No flaky tests in the past 10 days" - assert current_html =~ "No skipped tests in the past 10 days" + assert current_html =~ "No flaky tests in the past 10 test runs" + assert current_html =~ "No skipped tests in the most recent test run" refute has_element?(view, "#flaky-tests-data") refute has_element?(view, "#skipped-tests-data") @@ -183,8 +184,15 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuiteTest do {:ok, _view, html} = live(conn, ~p"/coverbot/test-reports/#{test_suite_id}") - assert html =~ "Loading flaky tests" - assert html =~ "Loading skipped tests" + refute html + |> Floki.parse_document!() + |> Floki.get_by_id("flaky-tests-spinner") + |> is_nil() + + refute html + |> Floki.parse_document!() + |> Floki.get_by_id("skipped-tests-spinner") + |> is_nil() end test "shows failed state when flaky loading fails", %{conn: conn, organization: organization} do