Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lint/lint.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,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),
Expand Down
61 changes: 61 additions & 0 deletions lint/lint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,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, nil, nil)
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()

Expand Down
13 changes: 7 additions & 6 deletions lint/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ type Testsuite struct {
}

type Testcase struct {
XMLName xml.Name `xml:"testcase" json:"-"`
Name string `xml:"name,attr" json:"name"`
OriginalPath string `xml:"originalPath,attr,omitempty" json:"originalPath,omitempty"`
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"`
OriginalPath string `xml:"originalPath,attr,omitempty" json:"originalPath,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 {
Expand Down
Loading