From c87c651ff0779b3ae033fa679453656250918655 Mon Sep 17 00:00:00 2001 From: TwiN Date: Fri, 19 Sep 2025 12:43:43 -0400 Subject: [PATCH] fix(suite): Display condition results when user clicks step in execution flow (#1278) --- storage/store/sql/sql.go | 55 +++++++++++-- web/app/src/components/StepDetailsModal.vue | 88 ++++++++++++++++++++- web/app/src/views/SuiteDetails.vue | 12 +-- web/static/css/app.css | 2 +- web/static/js/app.js | 2 +- web/static/js/chunk-vendors.js | 24 +++--- 6 files changed, 155 insertions(+), 28 deletions(-) diff --git a/storage/store/sql/sql.go b/storage/store/sql/sql.go index cdd67dac..27a274f7 100644 --- a/storage/store/sql/sql.go +++ b/storage/store/sql/sql.go @@ -1499,7 +1499,8 @@ func (s *Store) getSuiteResults(tx *sql.Tx, suiteID int64, page, pageSize int) ( resultID := data.id // Query endpoint results for this suite result epRows, err := tx.Query(` - SELECT + SELECT + er.endpoint_result_id, e.endpoint_name, er.success, er.errors, @@ -1514,31 +1515,73 @@ func (s *Store) getSuiteResults(tx *sql.Tx, suiteID int64, page, pageSize int) ( logr.Errorf("[sql.getSuiteResults] Failed to get endpoint results for suite_result_id=%d: %s", resultID, err.Error()) continue } + // Map to store endpoint results by their ID for condition lookup + epResultMap := make(map[int64]*endpoint.Result) epCount := 0 for epRows.Next() { epCount++ + var epResultID int64 var name string var success bool var joinedErrors string var duration int64 var timestamp time.Time - err = epRows.Scan(&name, &success, &joinedErrors, &duration, ×tamp) + err = epRows.Scan(&epResultID, &name, &success, &joinedErrors, &duration, ×tamp) if err != nil { logr.Errorf("[sql.getSuiteResults] Failed to scan endpoint result: %s", err.Error()) continue } epResult := &endpoint.Result{ - Name: name, - Success: success, - Duration: time.Duration(duration), - Timestamp: timestamp, + Name: name, + Success: success, + Duration: time.Duration(duration), + Timestamp: timestamp, + ConditionResults: []*endpoint.ConditionResult{}, // Initialize empty slice } if len(joinedErrors) > 0 { epResult.Errors = strings.Split(joinedErrors, arraySeparator) } + epResultMap[epResultID] = epResult result.EndpointResults = append(result.EndpointResults, epResult) } epRows.Close() + // Fetch condition results for all endpoint results in this suite result + if len(epResultMap) > 0 { + args := make([]interface{}, 0, len(epResultMap)) + condQuery := `SELECT endpoint_result_id, condition, success + FROM endpoint_result_conditions + WHERE endpoint_result_id IN (` + index := 1 + for epResultID := range epResultMap { + condQuery += "$" + strconv.Itoa(index) + "," + args = append(args, epResultID) + index++ + } + condQuery = condQuery[:len(condQuery)-1] + ")" + + condRows, err := tx.Query(condQuery, args...) + if err != nil { + logr.Errorf("[sql.getSuiteResults] Failed to get condition results for suite_result_id=%d: %s", resultID, err.Error()) + } else { + condCount := 0 + for condRows.Next() { + condCount++ + conditionResult := &endpoint.ConditionResult{} + var epResultID int64 + if err = condRows.Scan(&epResultID, &conditionResult.Condition, &conditionResult.Success); err != nil { + logr.Errorf("[sql.getSuiteResults] Failed to scan condition result: %s", err.Error()) + continue + } + if epResult, exists := epResultMap[epResultID]; exists { + epResult.ConditionResults = append(epResult.ConditionResults, conditionResult) + } + } + condRows.Close() + if condCount > 0 { + logr.Debugf("[sql.getSuiteResults] Found %d condition results for suite_result_id=%d", condCount, resultID) + } + } + } if epCount > 0 { logr.Debugf("[sql.getSuiteResults] Found %d endpoint results for suite_result_id=%d", epCount, resultID) } diff --git a/web/app/src/components/StepDetailsModal.vue b/web/app/src/components/StepDetailsModal.vue index c9fe554b..1037bb07 100644 --- a/web/app/src/components/StepDetailsModal.vue +++ b/web/app/src/components/StepDetailsModal.vue @@ -74,6 +74,92 @@ + + +
+

+ + Condition Results ({{ step.result.conditionResults.length }}) +

+
+
+ +
+ + +
+ + +
+

+ {{ conditionResult.condition }} +

+ + {{ conditionResult.success ? 'Passed' : 'Failed' }} + +
+
+
+
+ + +
+

+ + Endpoint Configuration +

+
+
+ URL: +

{{ step.endpoint.url }}

+
+
+ Method: +

{{ step.endpoint.method }}

+
+
+ Interval: +

{{ step.endpoint.interval }}

+
+
+ Timeout: +

{{ step.endpoint.timeout }}

+
+
+
+ + +
+

+ + Result Errors ({{ step.result.errors.length }}) +

+
+
+ {{ error }} +
+
+
@@ -81,7 +167,7 @@