11"""Test that Codeflash Vitest config properly overrides coverage settings."""
22
3- import tempfile
43from pathlib import Path
54
65import pytest
76
87from codeflash .languages .javascript .vitest_runner import _ensure_codeflash_vitest_config
98
109
11- def test_codeflash_vitest_config_overrides_coverage () :
12- """Test that generated config overrides coverage reporter to json.
10+ def test_codeflash_vitest_config_overrides_coverage (tmp_path : Path ) -> None :
11+ project_root = tmp_path . resolve ()
1312
14- This is a regression test for the bug where Codeflash would pass
15- --coverage.reporter=json on command line, but if the project's
16- vitest.config.ts had coverage.reporter set (e.g., ["text", "lcov"]),
17- Vitest's mergeConfig wouldn't properly handle the nested coverage
18- object merge, resulting in coverage files not being written.
19-
20- The fix is to explicitly override coverage settings in the generated
21- codeflash.vitest.config.mjs file.
22- """
23- with tempfile .TemporaryDirectory () as tmpdir :
24- project_root = Path (tmpdir )
25-
26- # Create a vitest.config.ts with coverage settings like openclaw project
27- vitest_config = project_root / "vitest.config.ts"
28- vitest_config .write_text ("""
13+ vitest_config = project_root / "vitest.config.ts"
14+ vitest_config .write_text (
15+ """
2916import { defineConfig } from 'vitest/config';
3017
3118export default defineConfig({
@@ -42,64 +29,51 @@ def test_codeflash_vitest_config_overrides_coverage():
4229 },
4330 },
4431});
45- """ )
46-
47- # Generate the codeflash config
48- config_path = _ensure_codeflash_vitest_config (project_root )
49-
50- assert config_path is not None , "Config should be created"
51- assert config_path .exists (), "Config file should exist"
52-
53- # Read and verify the generated config
54- config_content = config_path .read_text ()
55-
56- # Check that it merges with original config
57- assert "mergeConfig" in config_content , "Should use mergeConfig"
58- assert "import originalConfig from './vitest.config.ts'" in config_content
59-
60- # CRITICAL: Check that coverage settings are explicitly overridden
61- # This is the fix for the bug - without this, coverage files aren't written
62- assert "coverage:" in config_content , (
63- "Config must explicitly override coverage settings to ensure "
64- "json reporter is used regardless of project config"
65- )
66- assert "reporter:" in config_content , (
67- "Config must override coverage.reporter to ['json']"
68- )
69- # The config should set reporter to json (as array or string)
70- # Note: We're checking the config override, not the command-line flag
71- assert "['json']" in config_content or '["json"]' in config_content , (
72- "Coverage reporter must be set to ['json'] to ensure coverage "
73- "files are written in the expected format"
74- )
75-
76-
77- def test_codeflash_vitest_config_without_original_coverage ():
78- """Test generated config when original has no coverage settings."""
79- with tempfile .TemporaryDirectory () as tmpdir :
80- project_root = Path (tmpdir )
81-
82- # Create a minimal vitest.config.ts without coverage settings
83- vitest_config = project_root / "vitest.config.ts"
84- vitest_config .write_text ("""
32+ """ ,
33+ encoding = "utf-8" ,
34+ )
35+
36+ config_path = _ensure_codeflash_vitest_config (project_root )
37+
38+ assert config_path is not None , "Config should be created"
39+ assert config_path .exists (), "Config file should exist"
40+
41+ config_content = config_path .read_text (encoding = "utf-8" )
42+
43+ assert "mergeConfig" in config_content , "Should use mergeConfig"
44+ assert "import originalConfig from './vitest.config.ts'" in config_content
45+ assert "coverage:" in config_content , (
46+ "Config must explicitly override coverage settings to ensure "
47+ "json reporter is used regardless of project config"
48+ )
49+ assert "reporter:" in config_content , "Config must override coverage.reporter to ['json']"
50+ assert "['json']" in config_content or '["json"]' in config_content , (
51+ "Coverage reporter must be set to ['json'] to ensure coverage files are written in the expected format"
52+ )
53+
54+
55+ def test_codeflash_vitest_config_without_original_coverage (tmp_path : Path ) -> None :
56+ project_root = tmp_path .resolve ()
57+
58+ vitest_config = project_root / "vitest.config.ts"
59+ vitest_config .write_text (
60+ """
8561import { defineConfig } from 'vitest/config';
8662
8763export default defineConfig({
8864 test: {
8965 include: ['test/**/*.test.ts'],
9066 },
9167});
92- """ )
68+ """ ,
69+ encoding = "utf-8" ,
70+ )
9371
94- # Generate the codeflash config
95- config_path = _ensure_codeflash_vitest_config (project_root )
72+ config_path = _ensure_codeflash_vitest_config (project_root )
9673
97- assert config_path is not None
98- assert config_path .exists ()
74+ assert config_path is not None
75+ assert config_path .exists ()
9976
100- config_content = config_path .read_text ()
77+ config_content = config_path .read_text (encoding = "utf-8" )
10178
102- # Should still override coverage settings explicitly
103- assert "coverage:" in config_content , (
104- "Config must explicitly set coverage even when original doesn't have it"
105- )
79+ assert "coverage:" in config_content , "Config must explicitly set coverage even when original doesn't have it"
0 commit comments