pkg/degradation-detector/fetchTestNames.go (81 lines of code) (raw):
package degradation_detector
import (
"context"
"encoding/json"
"errors"
"fmt"
"log/slog"
"net/http"
"strings"
"time"
dataQuery "github.com/JetBrains/ij-perf-report-aggregator/pkg/data-query"
)
func ExpandTestsByPattern(backendUrl string, client *http.Client, tests []string, baseSettings PerformanceSettings) []string {
testsExpanded := make([]string, 0, len(tests)*5)
for _, test := range tests {
if strings.Contains(test, "%") {
matchingTests, err := fetchTestsByPattern(backendUrl, client, baseSettings, test)
if err != nil {
slog.Error("error while fetching tests by pattern", "error", err, "pattern", test)
continue
}
testsExpanded = append(testsExpanded, matchingTests...)
} else {
testsExpanded = append(testsExpanded, test)
}
}
return testsExpanded
}
func fetchTestsByPattern(backendUrl string, client *http.Client, settings PerformanceSettings, pattern string) ([]string, error) {
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
filters := []dataQuery.QueryFilter{
{Field: "branch", Value: settings.Branch},
{Field: "generated_time", Sql: ">subtractDays(now(),30)"},
{Field: "triggeredBy", Value: ""},
}
if settings.Machine != "" {
filters = append(filters, dataQuery.QueryFilter{Field: "machine", Value: settings.Machine, Operator: "like"})
}
if pattern != "" {
filters = append(filters, dataQuery.QueryFilter{Field: "project", Value: pattern, Operator: "like"})
}
query := dataQuery.Query{
Database: settings.Db,
Table: settings.Table,
Fields: []dataQuery.QueryDimension{{Name: "project", Sql: "distinct project"}},
Flat: true,
Filters: filters,
Order: []string{"project"},
}
response, err := getValuesFromServer(ctx, client, backendUrl, query)
if err != nil {
return nil, err
}
tests, err := extractValuesFromRequest(response)
if err != nil {
return nil, err
}
return tests, nil
}
func FetchAllTests(backendUrl string, client *http.Client, settings PerformanceSettings) ([]string, error) {
return fetchTestsByPattern(backendUrl, client, settings, "")
}
func extractValuesFromRequest(response []byte) ([]string, error) {
var data [][]any
err := json.Unmarshal(response, &data)
if err != nil {
return nil, fmt.Errorf("failed to decode JSON: %w", err)
}
if len(data) == 0 {
return nil, errors.New("no data")
}
if len(data[0]) < 1 {
return nil, errors.New("not enough data")
}
tests, err := SliceToSliceOfString(data[0])
if err != nil {
return nil, fmt.Errorf("failed to convert values: %w", err)
}
return tests, nil
}