Skip to content

Commit 2cad015

Browse files
Add unit tests for configuration management and file detection
- Introduced tests for updating language configurations based on detected tools, including scenarios for empty tools and unknown tools. - Added tests for detecting file extensions in both single files and directories, ensuring accurate recognition of supported file types. - Implemented tests for relevant tool detection based on file extensions, covering various programming languages and file types. - Enhanced error handling tests for non-existent paths and empty directories to ensure robustness in configuration management.
1 parent a51b46b commit 2cad015

File tree

2 files changed

+558
-0
lines changed

2 files changed

+558
-0
lines changed

cmd/config_test.go

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
package cmd
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
8+
"codacy/cli-v2/domain"
9+
"codacy/cli-v2/utils"
10+
11+
"github.com/stretchr/testify/assert"
12+
"gopkg.in/yaml.v3"
13+
)
14+
15+
func TestUpdateLanguagesConfigForTools(t *testing.T) {
16+
// Create temporary directory
17+
tempDir, err := os.MkdirTemp("", "codacy-config-test")
18+
assert.NoError(t, err)
19+
defer os.RemoveAll(tempDir)
20+
21+
// Create detected tools map
22+
detectedTools := map[string]struct{}{
23+
"pylint": {},
24+
"eslint": {},
25+
"lizard": {},
26+
}
27+
28+
// Create test tool language map
29+
defaultToolLangMap := map[string]domain.ToolLanguageInfo{
30+
"pylint": {
31+
Name: "pylint",
32+
Languages: []string{"Python"},
33+
Extensions: []string{".py"},
34+
},
35+
"eslint": {
36+
Name: "eslint",
37+
Languages: []string{"JavaScript", "TypeScript"},
38+
Extensions: []string{".js", ".jsx", ".ts", ".tsx"},
39+
},
40+
"lizard": {
41+
Name: "lizard",
42+
Languages: []string{"Python", "JavaScript", "Java", "C"},
43+
Extensions: []string{".py", ".js", ".java", ".c"},
44+
},
45+
"dartanalyzer": {
46+
Name: "dartanalyzer",
47+
Languages: []string{"Dart"},
48+
Extensions: []string{".dart"},
49+
},
50+
}
51+
52+
// Test updating languages config
53+
err = updateLanguagesConfigForTools(detectedTools, tempDir, defaultToolLangMap)
54+
assert.NoError(t, err)
55+
56+
// Verify the file was created
57+
configPath := filepath.Join(tempDir, "languages-config.yaml")
58+
assert.FileExists(t, configPath)
59+
60+
// Read and verify the content
61+
content, err := os.ReadFile(configPath)
62+
assert.NoError(t, err)
63+
64+
var langConfig domain.LanguagesConfig
65+
err = yaml.Unmarshal(content, &langConfig)
66+
assert.NoError(t, err)
67+
68+
// Should have 3 tools (pylint, eslint, lizard) - not dartanalyzer since it wasn't detected
69+
assert.Len(t, langConfig.Tools, 3)
70+
71+
// Verify tools are sorted by name
72+
expectedNames := []string{"eslint", "lizard", "pylint"}
73+
actualNames := make([]string, len(langConfig.Tools))
74+
for i, tool := range langConfig.Tools {
75+
actualNames[i] = tool.Name
76+
}
77+
assert.Equal(t, expectedNames, actualNames)
78+
79+
// Verify tool details
80+
toolMap := make(map[string]domain.ToolLanguageInfo)
81+
for _, tool := range langConfig.Tools {
82+
toolMap[tool.Name] = tool
83+
}
84+
85+
assert.Equal(t, []string{"Python"}, toolMap["pylint"].Languages)
86+
assert.Equal(t, []string{".py"}, toolMap["pylint"].Extensions)
87+
88+
assert.Equal(t, []string{"JavaScript", "TypeScript"}, toolMap["eslint"].Languages)
89+
assert.Equal(t, []string{".js", ".jsx", ".ts", ".tsx"}, toolMap["eslint"].Extensions)
90+
91+
assert.Equal(t, []string{"Python", "JavaScript", "Java", "C"}, toolMap["lizard"].Languages)
92+
assert.Equal(t, []string{".py", ".js", ".java", ".c"}, toolMap["lizard"].Extensions)
93+
}
94+
95+
func TestUpdateLanguagesConfigForTools_EmptyTools(t *testing.T) {
96+
// Create temporary directory
97+
tempDir, err := os.MkdirTemp("", "codacy-config-test")
98+
assert.NoError(t, err)
99+
defer os.RemoveAll(tempDir)
100+
101+
// Empty detected tools
102+
detectedTools := map[string]struct{}{}
103+
defaultToolLangMap := map[string]domain.ToolLanguageInfo{}
104+
105+
// Test updating languages config
106+
err = updateLanguagesConfigForTools(detectedTools, tempDir, defaultToolLangMap)
107+
assert.NoError(t, err)
108+
109+
// Verify the file was created but with empty tools
110+
configPath := filepath.Join(tempDir, "languages-config.yaml")
111+
assert.FileExists(t, configPath)
112+
113+
content, err := os.ReadFile(configPath)
114+
assert.NoError(t, err)
115+
116+
var langConfig domain.LanguagesConfig
117+
err = yaml.Unmarshal(content, &langConfig)
118+
assert.NoError(t, err)
119+
120+
assert.Empty(t, langConfig.Tools)
121+
}
122+
123+
func TestUpdateCodacyYAMLForTools_NewFile(t *testing.T) {
124+
// Create temporary directory
125+
tempDir, err := os.MkdirTemp("", "codacy-config-test")
126+
assert.NoError(t, err)
127+
defer os.RemoveAll(tempDir)
128+
129+
codacyYAMLPath := filepath.Join(tempDir, "codacy.yaml")
130+
131+
// Create a minimal codacy.yaml
132+
initialConfig := map[string]interface{}{
133+
"version": "2",
134+
"tools": []interface{}{},
135+
}
136+
yamlData, err := yaml.Marshal(initialConfig)
137+
assert.NoError(t, err)
138+
err = os.WriteFile(codacyYAMLPath, yamlData, utils.DefaultFilePerms)
139+
assert.NoError(t, err)
140+
141+
// Mock detected tools
142+
detectedTools := map[string]struct{}{
143+
"pylint": {},
144+
"eslint": {},
145+
}
146+
147+
// Mock plugins - we'll need to set up mock default tool versions
148+
// For this test, we'll create a simple test that doesn't require actual plugins
149+
// In a real scenario, you'd need to mock the plugins.GetToolVersions() function
150+
151+
// Test updating codacy.yaml - this test is more complex due to dependencies
152+
// For now, let's test the basic structure
153+
initFlags := domain.InitFlags{}
154+
cliMode := "local"
155+
156+
// This test would need more setup to work properly with the actual function
157+
// due to dependencies on plugins.GetToolVersions() and other external dependencies
158+
_ = detectedTools
159+
_ = initFlags
160+
_ = cliMode
161+
162+
// For now, just verify the file exists
163+
assert.FileExists(t, codacyYAMLPath)
164+
}
165+
166+
func TestUpdateLanguagesConfigForTools_UnknownTool(t *testing.T) {
167+
// Create temporary directory
168+
tempDir, err := os.MkdirTemp("", "codacy-config-test")
169+
assert.NoError(t, err)
170+
defer os.RemoveAll(tempDir)
171+
172+
// Detected tools include unknown tool
173+
detectedTools := map[string]struct{}{
174+
"pylint": {},
175+
"unknown-tool": {}, // Not in defaultToolLangMap
176+
}
177+
178+
// Create test tool language map (missing unknown-tool)
179+
defaultToolLangMap := map[string]domain.ToolLanguageInfo{
180+
"pylint": {
181+
Name: "pylint",
182+
Languages: []string{"Python"},
183+
Extensions: []string{".py"},
184+
},
185+
}
186+
187+
// Test updating languages config
188+
err = updateLanguagesConfigForTools(detectedTools, tempDir, defaultToolLangMap)
189+
assert.NoError(t, err)
190+
191+
// Verify the file was created
192+
configPath := filepath.Join(tempDir, "languages-config.yaml")
193+
assert.FileExists(t, configPath)
194+
195+
// Read and verify the content
196+
content, err := os.ReadFile(configPath)
197+
assert.NoError(t, err)
198+
199+
var langConfig domain.LanguagesConfig
200+
err = yaml.Unmarshal(content, &langConfig)
201+
assert.NoError(t, err)
202+
203+
// Should only have 1 tool (pylint) - unknown-tool should be skipped
204+
assert.Len(t, langConfig.Tools, 1)
205+
assert.Equal(t, "pylint", langConfig.Tools[0].Name)
206+
}
207+
208+
func TestUpdateLanguagesConfigForTools_DirectoryCreation(t *testing.T) {
209+
// Create temporary directory
210+
tempDir, err := os.MkdirTemp("", "codacy-config-test")
211+
assert.NoError(t, err)
212+
defer os.RemoveAll(tempDir)
213+
214+
// Use a nested directory that doesn't exist yet
215+
toolsConfigDir := filepath.Join(tempDir, "nested", "tools-configs")
216+
217+
detectedTools := map[string]struct{}{
218+
"pylint": {},
219+
}
220+
221+
defaultToolLangMap := map[string]domain.ToolLanguageInfo{
222+
"pylint": {
223+
Name: "pylint",
224+
Languages: []string{"Python"},
225+
Extensions: []string{".py"},
226+
},
227+
}
228+
229+
// Test updating languages config - should create the directory
230+
err = updateLanguagesConfigForTools(detectedTools, toolsConfigDir, defaultToolLangMap)
231+
assert.NoError(t, err)
232+
233+
// Verify the directory and file were created
234+
assert.DirExists(t, toolsConfigDir)
235+
configPath := filepath.Join(toolsConfigDir, "languages-config.yaml")
236+
assert.FileExists(t, configPath)
237+
}

0 commit comments

Comments
 (0)