From c560f657b1acec642e773eebef795321671e329d Mon Sep 17 00:00:00 2001 From: Jurre Tanja Date: Tue, 15 Sep 2026 17:08:57 +0200 Subject: [PATCH 1/2] Update Testcase to expose Classname to be visible in Gitlab as per (https://docs.gitlab.com/ee/ci/testing/unit_test_reports.html\)) --- lint/lint.go | 6 +++++ lint/lint_test.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++ lint/types.go | 11 +++++---- 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/lint/lint.go b/lint/lint.go index 455dd42..073874b 100644 --- a/lint/lint.go +++ b/lint/lint.go @@ -327,6 +327,12 @@ func evalTestsuite(rule Rule, modelSourcePath string, ignoreNoqa bool, useCache testcases = append(testcases, *testcase) } + // Set classname on all testcases for GitLab Suite column display + suiteName := fmt.Sprintf("%s - %s", rule.RuleNumber, rule.Title) + for i := range testcases { + testcases[i].Classname = suiteName + } + testsuite := &Testsuite{ Name: rule.Path, Tests: len(testcases), diff --git a/lint/lint_test.go b/lint/lint_test.go index d3e8087..26f5c92 100644 --- a/lint/lint_test.go +++ b/lint/lint_test.go @@ -662,6 +662,67 @@ function rule(input) { } } +func TestEvalTestsuite_Classname(t *testing.T) { + tempDir := t.TempDir() + + jsContent := ` +const metadata = { + title: "Test Classname Field", + custom: { rulenumber: "099_0007", input: ".*\\.yaml" } +}; + +function rule(input) { + return { allow: true, errors: [] }; +} +` + jsPath := filepath.Join(tempDir, "classname_test.js") + err := os.WriteFile(jsPath, []byte(jsContent), 0644) + if err != nil { + t.Fatalf("Failed to write js file: %v", err) + } + + // Create multiple test files + err = os.WriteFile(filepath.Join(tempDir, "input1.yaml"), []byte(`Name: "Test1"`), 0644) + if err != nil { + t.Fatalf("Failed to write yaml file: %v", err) + } + err = os.WriteFile(filepath.Join(tempDir, "input2.yaml"), []byte(`Name: "Test2"`), 0644) + if err != nil { + t.Fatalf("Failed to write yaml file: %v", err) + } + + rule := Rule{ + Path: jsPath, + Title: "Test Classname Field", + RuleNumber: "099_0007", + Pattern: ".*\\.yaml", + PackageName: jsPath, + Language: LanguageJavascript, + } + + result, err := evalTestsuite(rule, tempDir, false, false) + if err != nil { + t.Fatalf("Failed to evaluate testsuite: %v", err) + } + + expectedClassname := "099_0007 - Test Classname Field" + + // Verify all testcases have the classname field set correctly + if len(result.Testcases) == 0 { + t.Fatal("Expected at least one testcase") + } + + for i, tc := range result.Testcases { + if tc.Classname == "" { + t.Errorf("Testcase %d (%s) has empty Classname field", i, tc.Name) + } + if tc.Classname != expectedClassname { + t.Errorf("Testcase %d (%s) has incorrect Classname: got %q, want %q", + i, tc.Name, tc.Classname, expectedClassname) + } + } +} + func TestParseRuleMetadata_JavascriptValidation(t *testing.T) { tempDir := t.TempDir() diff --git a/lint/types.go b/lint/types.go index a102067..df8e2c0 100644 --- a/lint/types.go +++ b/lint/types.go @@ -19,11 +19,12 @@ type Testsuite struct { } type Testcase struct { - XMLName xml.Name `xml:"testcase" json:"-"` - Name string `xml:"name,attr" json:"name"` - Time float64 `xml:"time,attr" json:"time"` - Failure *Failure `xml:"failure,omitempty" json:"failure,omitempty"` - Skipped *Skipped `xml:"skipped,omitempty" json:"skipped,omitempty"` + XMLName xml.Name `xml:"testcase" json:"-"` + Name string `xml:"name,attr" json:"name"` + Classname string `xml:"classname,attr,omitempty" json:"classname,omitempty"` + Time float64 `xml:"time,attr" json:"time"` + Failure *Failure `xml:"failure,omitempty" json:"failure,omitempty"` + Skipped *Skipped `xml:"skipped,omitempty" json:"skipped,omitempty"` } type Failure struct { From 357b1ecdff3a56978bd28c69bd991b4ab31de613 Mon Sep 17 00:00:00 2001 From: Jurre Tanja Date: Wed, 16 Sep 2026 09:17:52 +0200 Subject: [PATCH 2/2] fixes failing tests --- lint/lint_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint/lint_test.go b/lint/lint_test.go index 39f03bc..56eb64d 100644 --- a/lint/lint_test.go +++ b/lint/lint_test.go @@ -751,7 +751,7 @@ function rule(input) { Language: LanguageJavascript, } - result, err := evalTestsuite(rule, tempDir, false, false) + result, err := evalTestsuite(rule, tempDir, false, false, nil, nil) if err != nil { t.Fatalf("Failed to evaluate testsuite: %v", err) }