88#include "../src/foundation/compat_fs.h"
99#include "../src/foundation/platform.h"
1010#include "test_framework.h"
11+ #include "test_helpers.h"
1112#include "discover/discover.h"
1213#include "discover/userconfig.h"
1314
1718
1819/* ── Helpers ─────────────────────────────────────────────────────── */
1920
21+ static char userconfig_tmpdir [512 ];
22+
2023/* Write a JSON file to path. Returns 0 on success. */
2124static int write_json (const char * path , const char * json ) {
2225 FILE * f = fopen (path , "w" );
@@ -33,7 +36,7 @@ static int write_json(const char *path, const char *json) {
3336TEST (userconfig_project_basic ) {
3437 /* Write a .codebase-memory.json in a temp dir */
3538 char dir [256 ];
36- snprintf (dir , sizeof (dir ), "%s/uctest_proj_basic" , cbm_tmpdir () );
39+ snprintf (dir , sizeof (dir ), "%s/uctest_proj_basic" , userconfig_tmpdir );
3740 cbm_mkdir_p (dir , 0755 ); /* from compat_fs.h via compat.h */
3841
3942 char proj [512 ];
@@ -60,7 +63,7 @@ TEST(userconfig_global_via_env) {
6063 /* Point config dir to a temp dir via the platform-appropriate env var:
6164 * XDG_CONFIG_HOME on Linux/macOS, APPDATA on Windows. */
6265 char cfg_dir [256 ];
63- snprintf (cfg_dir , sizeof (cfg_dir ), "%s/uctest_global_xdg" , cbm_tmpdir () );
66+ snprintf (cfg_dir , sizeof (cfg_dir ), "%s/uctest_global_xdg" , userconfig_tmpdir );
6467
6568 char app_dir [512 ];
6669 snprintf (app_dir , sizeof (app_dir ), "%s/codebase-memory-mcp" , cfg_dir );
@@ -103,7 +106,7 @@ TEST(userconfig_global_via_env) {
103106TEST (userconfig_project_wins_over_global ) {
104107 /* Global says .xyz → python; project says .xyz → rust */
105108 char xdg_dir [256 ];
106- snprintf (xdg_dir , sizeof (xdg_dir ), "%s/uctest_priority_xdg" , cbm_tmpdir () );
109+ snprintf (xdg_dir , sizeof (xdg_dir ), "%s/uctest_priority_xdg" , userconfig_tmpdir );
107110
108111 char app_dir [512 ];
109112 snprintf (app_dir , sizeof (app_dir ), "%s/codebase-memory-mcp" , xdg_dir );
@@ -116,7 +119,7 @@ TEST(userconfig_project_wins_over_global) {
116119 0 );
117120
118121 char proj_dir [256 ];
119- snprintf (proj_dir , sizeof (proj_dir ), "%s/uctest_priority_proj" , cbm_tmpdir () );
122+ snprintf (proj_dir , sizeof (proj_dir ), "%s/uctest_priority_proj" , userconfig_tmpdir );
120123 cbm_mkdir_p (proj_dir , 0755 );
121124
122125 char proj_path [512 ];
@@ -143,7 +146,7 @@ TEST(userconfig_project_wins_over_global) {
143146
144147TEST (userconfig_unknown_lang_skipped ) {
145148 char dir [256 ];
146- snprintf (dir , sizeof (dir ), "%s/uctest_unknown_lang" , cbm_tmpdir () );
149+ snprintf (dir , sizeof (dir ), "%s/uctest_unknown_lang" , userconfig_tmpdir );
147150 cbm_mkdir_p (dir , 0755 );
148151
149152 char proj [512 ];
@@ -185,7 +188,7 @@ TEST(userconfig_integration_override) {
185188 * respect the override. We map ".blade.php" → PHP, which is not in the
186189 * built-in table. */
187190 char dir [256 ];
188- snprintf (dir , sizeof (dir ), "%s/uctest_integ" , cbm_tmpdir () );
191+ snprintf (dir , sizeof (dir ), "%s/uctest_integ" , userconfig_tmpdir );
189192 cbm_mkdir_p (dir , 0755 );
190193
191194 char proj [512 ];
@@ -223,11 +226,23 @@ TEST(userconfig_free_null) {
223226/* ── Suite ──────────────────────────────────────────────────────── */
224227
225228SUITE (userconfig ) {
229+ snprintf (userconfig_tmpdir , sizeof (userconfig_tmpdir ), "%s/cbm-userconfig-XXXXXX" ,
230+ cbm_tmpdir ());
231+ if (!cbm_mkdtemp (userconfig_tmpdir )) {
232+ printf (" FAIL: could not create userconfig fixture root\n" );
233+ return ;
234+ }
235+
226236 RUN_TEST (userconfig_project_basic );
227237 RUN_TEST (userconfig_global_via_env );
228238 RUN_TEST (userconfig_project_wins_over_global );
229239 RUN_TEST (userconfig_unknown_lang_skipped );
230240 RUN_TEST (userconfig_missing_files_ok );
231241 RUN_TEST (userconfig_integration_override );
232242 RUN_TEST (userconfig_free_null );
243+
244+ if (th_rmtree (userconfig_tmpdir ) != 0 ) {
245+ printf (" FAIL: could not remove userconfig fixture root\n" );
246+ }
247+ userconfig_tmpdir [0 ] = '\0' ;
233248}
0 commit comments