Commit 6d63da22 authored by Max Orefice's avatar Max Orefice Committed by Kerri Miller

Expose artifacts_expired to TestSuiteEntity

This commit exposes a new attribute to our TestSuiteEntity
which will be used to determine when junit artifacts have
expired when displaying TestCases.
parent 816aa6fa
......@@ -23,9 +23,13 @@ module Projects
def show
respond_to do |format|
format.json do
render json: TestSuiteSerializer
.new(project: project, current_user: @current_user)
.represent(test_suite, details: true)
if Feature.enabled?(:ci_test_report_artifacts_expired, project, default_enabled: :yaml) && pipeline.has_expired_test_reports?
render json: { errors: 'Test report artifacts have expired' }, status: :not_found
else
render json: TestSuiteSerializer
.new(project: project, current_user: @current_user)
.represent(test_suite, details: true)
end
end
end
end
......
......@@ -1285,6 +1285,12 @@ module Ci
end
end
def has_expired_test_reports?
strong_memoize(:artifacts_expired) do
!has_reports?(::Ci::JobArtifact.test_reports.not_expired)
end
end
private
def add_message(severity, content)
......
---
name: ci_test_report_artifacts_expired
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83113
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356773
milestone: '14.10'
type: development
group: group::pipeline insights
default_enabled: false
......@@ -40,28 +40,56 @@ RSpec.describe Projects::Pipelines::TestsController do
let(:suite_name) { 'test' }
let(:build_ids) { pipeline.latest_builds.pluck(:id) }
before do
build = main_pipeline.builds.last
build.update_column(:finished_at, 1.day.ago) # Just to be sure we are included in the report window
# The JUnit fixture for the given build has 3 failures.
# This service will create 1 test case failure record for each.
Ci::TestFailureHistoryService.new(main_pipeline).execute
context 'when artifacts are expired' do
before do
pipeline.job_artifacts.first.update!(expire_at: Date.yesterday)
end
it 'renders not_found errors', :aggregate_failures do
get_tests_show_json(build_ids)
expect(response).to have_gitlab_http_status(:not_found)
expect(json_response['errors']).to eq('Test report artifacts have expired')
end
context 'when ci_test_report_artifacts_expired is disabled' do
before do
stub_feature_flags(ci_test_report_artifacts_expired: false)
end
it 'renders test suite', :aggregate_failures do
get_tests_show_json(build_ids)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['name']).to eq('test')
end
end
end
it 'renders test suite data' do
get_tests_show_json(build_ids)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['name']).to eq('test')
# Each test failure in this pipeline has a matching failure in the default branch
recent_failures = json_response['test_cases'].map { |tc| tc['recent_failures'] }
expect(recent_failures).to eq([
{ 'count' => 1, 'base_branch' => 'master' },
{ 'count' => 1, 'base_branch' => 'master' },
{ 'count' => 1, 'base_branch' => 'master' }
])
context 'when artifacts are not expired' do
before do
build = main_pipeline.builds.last
build.update_column(:finished_at, 1.day.ago) # Just to be sure we are included in the report window
# The JUnit fixture for the given build has 3 failures.
# This service will create 1 test case failure record for each.
Ci::TestFailureHistoryService.new(main_pipeline).execute
end
it 'renders test suite data', :aggregate_failures do
get_tests_show_json(build_ids)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['name']).to eq('test')
expect(json_response['artifacts_expired']).to be_falsey
# Each test failure in this pipeline has a matching failure in the default branch
recent_failures = json_response['test_cases'].map { |tc| tc['recent_failures'] }
expect(recent_failures).to eq([
{ 'count' => 1, 'base_branch' => 'master' },
{ 'count' => 1, 'base_branch' => 'master' },
{ 'count' => 1, 'base_branch' => 'master' }
])
end
end
end
......
......@@ -4713,6 +4713,24 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
describe '#has_expired_test_reports?' do
subject { pipeline_with_test_report.has_expired_test_reports? }
let(:pipeline_with_test_report) { create(:ci_pipeline, :with_test_reports) }
context 'when artifacts are not expired' do
it { is_expected.to be_falsey }
end
context 'when artifacts are expired' do
before do
pipeline_with_test_report.job_artifacts.first.update!(expire_at: Date.yesterday)
end
it { is_expected.to be_truthy }
end
end
it_behaves_like 'it has loose foreign keys' do
let(:factory_name) { :ci_pipeline }
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment