From fc3322a2017b1d0d6b73061c1f028ebacceb57a8 Mon Sep 17 00:00:00 2001 From: Chai Bot Date: Wed, 10 Jun 2026 16:46:58 +0000 Subject: [PATCH] Fix null Explanations causing regressed tests modal crash Initialize Explanations slice to []string{} instead of nil at both TestComparison creation sites (component_report.go, test_details.go). Go serializes nil slices as JSON null, which crashes the CompSeverityIcon component when it tries to access explanations.length. Also add a defensive != null check in CompSeverityIcon.js to guard against any future nil serialization. Closes: TRT-2660 --- pkg/api/componentreadiness/component_report.go | 2 +- pkg/api/componentreadiness/test_details.go | 1 + sippy-ng/src/component_readiness/CompSeverityIcon.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/api/componentreadiness/component_report.go b/pkg/api/componentreadiness/component_report.go index 6c09bacd6c..b0340e36ba 100644 --- a/pkg/api/componentreadiness/component_report.go +++ b/pkg/api/componentreadiness/component_report.go @@ -613,7 +613,7 @@ func (c *ComponentReportGenerator) generateComponentTestReport(basisStatusMap, s keySet := sets.NewString(slices.Collect(maps.Keys(basisStatusMap))...) keySet.Insert(slices.Collect(maps.Keys(sampleStatusMap))...) for testKeyStr := range keySet { - var cellReport testdetails.TestComparison // The actual stats we return over the API + cellReport := testdetails.TestComparison{Explanations: []string{}} // The actual stats we return over the API sampleStatus, sampleThere := sampleStatusMap[testKeyStr] basisStatus, basisThere := basisStatusMap[testKeyStr] diff --git a/pkg/api/componentreadiness/test_details.go b/pkg/api/componentreadiness/test_details.go index 26c900c534..16eded289a 100644 --- a/pkg/api/componentreadiness/test_details.go +++ b/pkg/api/componentreadiness/test_details.go @@ -442,6 +442,7 @@ func (c *ComponentReportGenerator) internalGenerateTestDetailsReport( totalBase, totalSample, report, result, lastFailure := c.summarizeRecordedTestStats(baseStatus, sampleStatus, testKey) testStats := testdetails.TestComparison{ + Explanations: []string{}, RequiredConfidence: c.ReqOptions.AdvancedOption.Confidence, SampleStats: testdetails.ReleaseStats{ Release: c.ReqOptions.SampleRelease.Name, diff --git a/sippy-ng/src/component_readiness/CompSeverityIcon.js b/sippy-ng/src/component_readiness/CompSeverityIcon.js index d6193d3212..22ca929a6d 100644 --- a/sippy-ng/src/component_readiness/CompSeverityIcon.js +++ b/sippy-ng/src/component_readiness/CompSeverityIcon.js @@ -19,7 +19,7 @@ export default function CompSeverityIcon(props) { ) let toolTip = statusStr - if (explanations !== undefined && explanations.length > 0) { + if (explanations != null && explanations.length > 0) { toolTip = explanations.join(' ') }