-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_results_before.txt
More file actions
550 lines (548 loc) · 52.3 KB
/
test_results_before.txt
File metadata and controls
550 lines (548 loc) · 52.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
============================= test session starts ==============================
platform darwin -- Python 3.11.13, pytest-8.4.1, pluggy-1.6.0 -- /Users/ali/autorepro/.venv/bin/python
cachedir: .pytest_cache
rootdir: /Users/ali/autorepro
configfile: pyproject.toml
plugins: env-1.1.5, cov-6.2.1
collecting ... collected 540 items
tests/test_cli.py::TestCLIHelp::test_help_flag_short_returns_zero_exit_code PASSED [ 0%]
tests/test_cli.py::TestCLIHelp::test_help_flag_long_returns_zero_exit_code PASSED [ 0%]
tests/test_cli.py::TestCLIHelp::test_no_arguments_shows_help_and_returns_zero PASSED [ 0%]
tests/test_cli.py::TestCLIHelp::test_help_output_contains_program_info[-h] PASSED [ 0%]
tests/test_cli.py::TestCLIHelp::test_help_output_contains_program_info[--help] PASSED [ 0%]
tests/test_cli.py::TestCLIHelp::test_no_args_help_output_contains_program_info PASSED [ 1%]
tests/test_cli.py::TestCLIIntegration::test_cli_help_via_subprocess PASSED [ 1%]
tests/test_cli.py::TestCLIIntegration::test_cli_no_args_via_subprocess PASSED [ 1%]
tests/test_cli.py::TestCLIIntegration::test_cli_version_via_subprocess PASSED [ 1%]
tests/test_cli.py::TestCLIErrorHandling::test_unknown_option_returns_exit_code_2 PASSED [ 1%]
tests/test_cli.py::TestCLIErrorHandling::test_invalid_short_option_returns_exit_code_2 PASSED [ 2%]
tests/test_cli.py::TestCLIErrorHandling::test_multiple_unknown_args_returns_exit_code_2 PASSED [ 2%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_plan_default_verbosity_hides_filter_message PASSED [ 2%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_plan_verbose_shows_filter_message PASSED [ 2%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_plan_quiet_hides_filter_message PASSED [ 2%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_plan_strict_quiet_shows_error_only PASSED [ 2%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_plan_strict_verbose_shows_both_messages PASSED [ 3%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_quiet_overrides_verbose PASSED [ 3%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_scan_quiet_mode PASSED [ 3%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_scan_verbose_mode PASSED [ 3%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_double_verbose_debug_mode PASSED [ 3%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_verbose_count_incremental PASSED [ 4%]
tests/test_cli_verbosity.py::TestCLIVerbosity::test_io_error_shows_in_quiet_mode PASSED [ 4%]
tests/test_config.py::TestTimeoutConfig::test_default_values PASSED [ 4%]
tests/test_config.py::TestTimeoutConfig::test_from_env PASSED [ 4%]
tests/test_config.py::TestLimitsConfig::test_default_values PASSED [ 4%]
tests/test_config.py::TestLimitsConfig::test_from_env PASSED [ 5%]
tests/test_config.py::TestPathConfig::test_default_values PASSED [ 5%]
tests/test_config.py::TestPathConfig::test_from_env PASSED [ 5%]
tests/test_config.py::TestDetectionConfig::test_default_values PASSED [ 5%]
tests/test_config.py::TestDetectionConfig::test_from_env PASSED [ 5%]
tests/test_config.py::TestExitCodeConfig::test_default_values PASSED [ 5%]
tests/test_config.py::TestFileConfig::test_default_values PASSED [ 6%]
tests/test_config.py::TestExecutableConfig::test_default_values PASSED [ 6%]
tests/test_config.py::TestAutoReproConfig::test_default_values PASSED [ 6%]
tests/test_config.py::TestAutoReproConfig::test_validation_passes_with_defaults PASSED [ 6%]
tests/test_config.py::TestAutoReproConfig::test_validation_fails_with_invalid_timeout PASSED [ 6%]
tests/test_config.py::TestAutoReproConfig::test_validation_fails_with_invalid_max_suggestions PASSED [ 7%]
tests/test_config.py::TestAutoReproConfig::test_validation_fails_with_negative_min_score PASSED [ 7%]
tests/test_config.py::TestAutoReproConfig::test_validation_fails_with_invalid_format PASSED [ 7%]
tests/test_config.py::TestGlobalConfig::test_get_config_returns_same_instance PASSED [ 7%]
tests/test_config.py::TestGlobalConfig::test_get_config_creates_valid_config PASSED [ 7%]
tests/test_config.py::TestGlobalConfig::test_reset_config_clears_instance PASSED [ 7%]
tests/test_config.py::TestConfigurationReplacement::test_timeout_value_matches_original PASSED [ 8%]
tests/test_config.py::TestConfigurationReplacement::test_max_commands_matches_original PASSED [ 8%]
tests/test_config.py::TestConfigurationReplacement::test_min_score_matches_original PASSED [ 8%]
tests/test_config.py::TestConfigurationReplacement::test_detection_weights_match_original PASSED [ 8%]
tests/test_config.py::TestConfigurationReplacement::test_file_paths_match_original PASSED [ 8%]
tests/test_config.py::TestConfigurationReplacement::test_exit_codes_match_original PASSED [ 9%]
tests/test_config_behavioral.py::TestBehavioralValidation::test_cli_scan_output_identical PASSED [ 9%]
tests/test_config_behavioral.py::TestBehavioralValidation::test_cli_plan_dry_run_identical PASSED [ 9%]
tests/test_config_behavioral.py::TestBehavioralValidation::test_cli_init_dry_run_identical PASSED [ 9%]
tests/test_config_behavioral.py::TestEnvironmentOverrides::test_timeout_override_affects_behavior PASSED [ 9%]
tests/test_config_behavioral.py::TestEnvironmentOverrides::test_max_suggestions_override PASSED [ 10%]
tests/test_config_behavioral.py::TestEnvironmentOverrides::test_detection_weights_override PASSED [ 10%]
tests/test_config_behavioral.py::TestDetectionBehavior::test_detection_results_unchanged PASSED [ 10%]
tests/test_config_behavioral.py::TestDetectionBehavior::test_detection_weights_applied PASSED [ 10%]
tests/test_config_behavioral.py::TestPlanGeneration::test_plan_suggestions_use_config_limits PASSED [ 10%]
tests/test_config_behavioral.py::TestPlanGeneration::test_score_threshold_filtering PASSED [ 10%]
tests/test_config_behavioral.py::TestFileOperations::test_devcontainer_path_configuration PASSED [ 11%]
tests/test_config_behavioral.py::TestFileOperations::test_temp_file_suffix_configuration PASSED [ 11%]
tests/test_config_behavioral.py::TestPerformance::test_config_access_performance PASSED [ 11%]
tests/test_config_behavioral.py::TestPerformance::test_scan_performance_not_regressed PASSED [ 11%]
tests/test_decorators.py::TestDryRunAware::test_dry_run_mode_skips_execution PASSED [ 11%]
tests/test_decorators.py::TestDryRunAware::test_normal_mode_executes_function PASSED [ 12%]
tests/test_decorators.py::TestDryRunAware::test_custom_return_code PASSED [ 12%]
tests/test_decorators.py::TestDryRunAware::test_positional_dry_run_argument PASSED [ 12%]
tests/test_decorators.py::TestHandleErrors::test_successful_execution PASSED [ 12%]
tests/test_decorators.py::TestHandleErrors::test_mapped_exception_handling PASSED [ 12%]
tests/test_decorators.py::TestHandleErrors::test_unmapped_exception_handling PASSED [ 12%]
tests/test_decorators.py::TestHandleErrors::test_error_logging PASSED [ 13%]
tests/test_decorators.py::TestHandleErrors::test_no_error_logging PASSED [ 13%]
tests/test_decorators.py::TestValidateArgs::test_successful_validation PASSED [ 13%]
tests/test_decorators.py::TestValidateArgs::test_missing_required_argument PASSED [ 13%]
tests/test_decorators.py::TestValidateArgs::test_empty_string_argument PASSED [ 13%]
tests/test_decorators.py::TestValidateArgs::test_custom_validator PASSED [ 14%]
tests/test_decorators.py::TestLogOperation::test_basic_logging PASSED [ 14%]
tests/test_decorators.py::TestLogOperation::test_logging_with_exception PASSED [ 14%]
tests/test_decorators.py::TestLogOperation::test_argument_logging PASSED [ 14%]
tests/test_decorators.py::TestLogOperation::test_result_logging PASSED [ 14%]
tests/test_decorators.py::TestLogOperation::test_sensitive_argument_filtering PASSED [ 15%]
tests/test_decorators.py::TestTimeExecution::test_timing_below_threshold PASSED [ 15%]
tests/test_decorators.py::TestTimeExecution::test_timing_above_threshold PASSED [ 15%]
tests/test_decorators.py::TestTimeExecution::test_custom_operation_name PASSED [ 15%]
tests/test_decorators.py::TestTimeExecution::test_timing_with_exception PASSED [ 15%]
tests/test_decorators.py::TestFormatOutput::test_format_output_passthrough PASSED [ 15%]
tests/test_decorators.py::TestDecoratorStacking::test_multiple_decorators PASSED [ 16%]
tests/test_detect.py::TestDetectLanguages::test_empty_directory PASSED [ 16%]
tests/test_detect.py::TestDetectLanguages::test_python_detection_single_file PASSED [ 16%]
tests/test_detect.py::TestDetectLanguages::test_node_detection_multiple_files PASSED [ 16%]
tests/test_detect.py::TestDetectLanguages::test_csharp_glob_detection PASSED [ 16%]
tests/test_detect.py::TestDetectLanguages::test_multiple_languages_alphabetical_ordering PASSED [ 17%]
tests/test_detect.py::TestDetectLanguages::test_reasons_alphabetical_ordering PASSED [ 17%]
tests/test_detect.py::TestDetectLanguages::test_glob_pattern_with_multiple_matches PASSED [ 17%]
tests/test_detect.py::TestDetectLanguages::test_duplicate_matches_removed PASSED [ 17%]
tests/test_detect.py::TestDetectLanguages::test_subdirectories_ignored PASSED [ 17%]
tests/test_detect.py::TestDetectLanguages::test_mixed_exact_and_glob_patterns PASSED [ 17%]
tests/test_exec_cli.py::TestExecCLI::test_exec_dry_run_prints_command PASSED [ 18%]
tests/test_exec_cli.py::TestExecCLI::test_exec_timeout_kills_process PASSED [ 18%]
tests/test_exec_cli.py::TestExecCLI::test_exec_with_python_repo_executes_command PASSED [ 18%]
tests/test_exec_cli.py::TestExecCLI::test_exec_index_selects_command PASSED [ 18%]
tests/test_exec_cli.py::TestExecCLI::test_exec_strict_empty_exits_with_error PASSED [ 18%]
tests/test_exec_cli.py::TestExecCLI::test_exec_index_out_of_range_error PASSED [ 19%]
tests/test_exec_cli.py::TestExecCLI::test_exec_env_variables PASSED [ 19%]
tests/test_exec_cli.py::TestExecCLI::test_exec_env_file PASSED [ 19%]
tests/test_exec_cli.py::TestExecCLI::test_exec_tee_output PASSED [ 19%]
tests/test_exec_cli.py::TestExecCLI::test_exec_quiet_verbose_flags PASSED [ 19%]
tests/test_exec_cli.py::TestExecCLI::test_exec_missing_required_args PASSED [ 20%]
tests/test_exec_cli.py::TestExecCLI::test_exec_invalid_repo_path PASSED [ 20%]
tests/test_exec_cli.py::TestExecCLI::test_exec_file_input PASSED [ 20%]
tests/test_exit_codes_integration.py::TestSuccessExitCodes::test_scan_with_languages_returns_zero PASSED [ 20%]
tests/test_exit_codes_integration.py::TestSuccessExitCodes::test_scan_with_no_languages_returns_zero PASSED [ 20%]
tests/test_exit_codes_integration.py::TestSuccessExitCodes::test_init_first_time_returns_zero PASSED [ 20%]
tests/test_exit_codes_integration.py::TestSuccessExitCodes::test_init_already_exists_returns_zero PASSED [ 21%]
tests/test_exit_codes_integration.py::TestSuccessExitCodes::test_plan_success_returns_zero PASSED [ 21%]
tests/test_exit_codes_integration.py::TestSuccessExitCodes::test_plan_stdout_returns_zero PASSED [ 21%]
tests/test_exit_codes_integration.py::TestSuccessExitCodes::test_help_returns_zero PASSED [ 21%]
tests/test_exit_codes_integration.py::TestMisuseExitCodes::test_plan_missing_desc_returns_two PASSED [ 21%]
tests/test_exit_codes_integration.py::TestMisuseExitCodes::test_plan_desc_and_file_returns_two PASSED [ 22%]
tests/test_exit_codes_integration.py::TestMisuseExitCodes::test_invalid_command_returns_two PASSED [ 22%]
tests/test_exit_codes_integration.py::TestMisuseExitCodes::test_invalid_repo_path_returns_two PASSED [ 22%]
tests/test_exit_codes_integration.py::TestMisuseExitCodes::test_out_points_to_directory_returns_two PASSED [ 22%]
tests/test_exit_codes_integration.py::TestMisuseExitCodes::test_init_out_points_to_directory_returns_two PASSED [ 22%]
tests/test_exit_codes_integration.py::TestIOErrorExitCodes::test_plan_file_nonexistent_returns_one PASSED [ 22%]
tests/test_exit_codes_integration.py::TestIOErrorExitCodes::test_plan_file_permission_denied_returns_one PASSED [ 23%]
tests/test_exit_codes_integration.py::TestIOErrorExitCodes::test_write_permission_denied_returns_one PASSED [ 23%]
tests/test_file_path_resolution.py::TestFilePathResolution::test_file_relative_to_cwd_success PASSED [ 23%]
tests/test_file_path_resolution.py::TestFilePathResolution::test_file_fallback_to_repo_success PASSED [ 23%]
tests/test_file_path_resolution.py::TestFilePathResolution::test_file_cwd_takes_precedence_over_repo PASSED [ 23%]
tests/test_file_path_resolution.py::TestFilePathResolution::test_absolute_file_path_ignores_repo PASSED [ 24%]
tests/test_file_path_resolution.py::TestFilePathResolution::test_file_not_found_anywhere_returns_error PASSED [ 24%]
tests/test_file_path_resolution.py::TestFilePathResolution::test_file_without_repo_uses_cwd_only PASSED [ 24%]
tests/test_file_path_resolution.py::TestFilePathResolution::test_subdir_file_path_with_repo_fallback PASSED [ 24%]
tests/test_focused_implementation.py::TestStdoutIgnoresForce::test_init_stdout_ignores_force PASSED [ 24%]
tests/test_focused_implementation.py::TestStdoutIgnoresForce::test_plan_stdout_ignores_force PASSED [ 25%]
tests/test_focused_implementation.py::TestPlanMaxLimitsCommands::test_plan_max_limits_commands PASSED [ 25%]
tests/test_focused_implementation.py::TestInitForceMtimePreservation::test_init_force_no_changes_preserves_mtime PASSED [ 25%]
tests/test_focused_implementation.py::TestRepoPathStability::test_repo_relative_vs_absolute_identical_results PASSED [ 25%]
tests/test_focused_implementation.py::TestRepoPathStability::test_repo_no_cwd_leakage PASSED [ 25%]
tests/test_focused_implementation.py::TestOutputFilesEndWithNewline::test_plan_file_ends_with_newline PASSED [ 25%]
tests/test_focused_implementation.py::TestOutputFilesEndWithNewline::test_plan_json_file_ends_with_newline PASSED [ 26%]
tests/test_focused_implementation.py::TestOutputFilesEndWithNewline::test_init_file_ends_with_newline PASSED [ 26%]
tests/test_focused_implementation.py::TestOutputFilesEndWithNewline::test_plan_custom_out_ends_with_newline PASSED [ 26%]
tests/test_focused_implementation.py::TestOutputFilesEndWithNewline::test_init_custom_out_ends_with_newline PASSED [ 26%]
tests/test_focused_implementation.py::TestCommandFiltering::test_no_matches_shows_empty_list PASSED [ 26%]
tests/test_focused_implementation.py::TestCommandFiltering::test_keyword_match_shows_command PASSED [ 27%]
tests/test_focused_implementation.py::TestCommandFiltering::test_language_detection_shows_command PASSED [ 27%]
tests/test_focused_implementation.py::TestIntegrationExitCodes::test_success_commands_return_zero PASSED [ 27%]
tests/test_focused_implementation.py::TestIntegrationExitCodes::test_misuse_commands_return_two PASSED [ 27%]
tests/test_golden_plan.py::test_plan_golden[basic_pytest] PASSED [ 27%]
tests/test_golden_plan.py::test_plan_golden[jest_watch] PASSED [ 27%]
tests/test_golden_plan.py::test_plan_golden[ambiguous] PASSED [ 28%]
tests/test_golden_plan.py::test_plan_basic_pytest_assertions PASSED [ 28%]
tests/test_golden_plan.py::test_plan_jest_watch_assertions PASSED [ 28%]
tests/test_golden_plan.py::test_plan_ambiguous_assertions PASSED [ 28%]
tests/test_golden_scan.py::test_scan_golden[empty-True] PASSED [ 28%]
tests/test_golden_scan.py::test_scan_golden[python_pyproject-True] PASSED [ 29%]
tests/test_golden_scan.py::test_scan_golden[node_lock-True] PASSED [ 29%]
tests/test_golden_scan.py::test_scan_golden[mixed_py_node-True] PASSED [ 29%]
tests/test_golden_scan.py::test_scan_golden[glob_only-False] PASSED [ 29%]
tests/test_golden_scan.py::test_scan_empty_assertions PASSED [ 29%]
tests/test_golden_scan.py::test_scan_python_pyproject_assertions PASSED [ 30%]
tests/test_golden_scan.py::test_scan_node_lock_assertions PASSED [ 30%]
tests/test_golden_scan.py::test_scan_mixed_py_node_assertions PASSED [ 30%]
tests/test_golden_scan.py::test_scan_glob_only_assertions PASSED [ 30%]
tests/test_init.py::TestDefaultDevcontainer::test_default_devcontainer_structure PASSED [ 30%]
tests/test_init.py::TestDefaultDevcontainer::test_default_devcontainer_features PASSED [ 30%]
tests/test_init.py::TestDefaultDevcontainer::test_default_devcontainer_post_create PASSED [ 31%]
tests/test_init.py::TestWriteDevcontainer::test_write_devcontainer_success PASSED [ 31%]
tests/test_init.py::TestWriteDevcontainer::test_write_devcontainer_default_path PASSED [ 31%]
tests/test_init.py::TestWriteDevcontainer::test_write_devcontainer_idempotent_without_force PASSED [ 31%]
tests/test_init.py::TestWriteDevcontainer::test_write_devcontainer_force_overwrite PASSED [ 31%]
tests/test_init.py::TestWriteDevcontainer::test_write_devcontainer_creates_parent_directories PASSED [ 32%]
tests/test_init.py::TestWriteDevcontainer::test_write_devcontainer_invalid_path_error PASSED [ 32%]
tests/test_init.py::TestWriteDevcontainer::test_write_devcontainer_permission_denied_error PASSED [ 32%]
tests/test_init.py::TestWriteDevcontainer::test_write_devcontainer_json_formatting PASSED [ 32%]
tests/test_init.py::TestInitCommand::test_init_creates_default_devcontainer PASSED [ 32%]
tests/test_init.py::TestInitCommand::test_init_idempotent_behavior_without_force PASSED [ 32%]
tests/test_init.py::TestInitCommand::test_init_force_flag_overwrites_existing PASSED [ 33%]
tests/test_init.py::TestInitCommand::test_init_custom_output_path PASSED [ 33%]
tests/test_init.py::TestInitCommand::test_init_creates_parent_directories PASSED [ 33%]
tests/test_init.py::TestInitCommand::test_init_invalid_path_error PASSED [ 33%]
tests/test_init.py::TestInitCommand::test_init_out_points_to_directory_error PASSED [ 33%]
tests/test_init.py::TestInitCommand::test_init_devcontainer_content_validation PASSED [ 34%]
tests/test_init.py::TestInitIntegration::test_init_cli_success_via_subprocess PASSED [ 34%]
tests/test_init.py::TestInitIntegration::test_init_cli_force_flag_via_subprocess PASSED [ 34%]
tests/test_init.py::TestInitIntegration::test_init_cli_custom_out_via_subprocess PASSED [ 34%]
tests/test_init.py::TestInitIntegration::test_init_cli_error_handling_via_subprocess PASSED [ 34%]
tests/test_init.py::TestInitIntegration::test_init_out_dash_ignores_force_flag PASSED [ 35%]
tests/test_init.py::TestInitIntegration::test_init_force_no_changes_preserves_mtime PASSED [ 35%]
tests/test_init.py::TestInitIntegration::test_init_dry_run_ignores_force_flag PASSED [ 35%]
tests/test_init.py::TestInitIntegration::test_init_force_no_changes_preserves_mtime_alt PASSED [ 35%]
tests/test_init_diff.py::TestJsonDiff::test_json_diff_no_changes PASSED [ 35%]
tests/test_init_diff.py::TestJsonDiff::test_json_diff_value_change PASSED [ 35%]
tests/test_init_diff.py::TestJsonDiff::test_json_diff_key_added PASSED [ 36%]
tests/test_init_diff.py::TestJsonDiff::test_json_diff_key_removed PASSED [ 36%]
tests/test_init_diff.py::TestJsonDiff::test_json_diff_multiple_changes PASSED [ 36%]
tests/test_init_diff.py::TestJsonDiff::test_json_diff_nested_dict_change PASSED [ 36%]
tests/test_init_diff.py::TestJsonDiff::test_json_diff_list_as_scalar PASSED [ 36%]
tests/test_init_diff.py::TestJsonDiff::test_json_diff_sorting PASSED [ 37%]
tests/test_init_diff.py::TestJsonDiff::test_json_diff_different_types PASSED [ 37%]
tests/test_init_diff.py::TestWriteDevcontainerWithDiff::test_write_devcontainer_new_file_returns_none_diff PASSED [ 37%]
tests/test_init_diff.py::TestWriteDevcontainerWithDiff::test_write_devcontainer_overwrite_with_changes PASSED [ 37%]
tests/test_init_diff.py::TestWriteDevcontainerWithDiff::test_write_devcontainer_overwrite_no_changes PASSED [ 37%]
tests/test_init_diff.py::TestWriteDevcontainerWithDiff::test_write_devcontainer_invalid_json_existing_file PASSED [ 37%]
tests/test_init_diff.py::TestInitCommandDiff::test_init_first_time_create_no_diff PASSED [ 38%]
tests/test_init_diff.py::TestInitCommandDiff::test_init_force_with_changes_shows_diff PASSED [ 38%]
tests/test_init_diff.py::TestInitCommandDiff::test_init_force_no_changes PASSED [ 38%]
tests/test_init_diff.py::TestInitCommandDiff::test_init_single_value_change PASSED [ 38%]
tests/test_init_diff.py::TestInitCommandDiff::test_init_key_added_removed PASSED [ 38%]
tests/test_init_diff.py::TestInitDiffIntegration::test_init_diff_subprocess_first_create PASSED [ 39%]
tests/test_init_diff.py::TestInitDiffIntegration::test_init_diff_subprocess_force_with_changes PASSED [ 39%]
tests/test_init_diff.py::TestInitDiffIntegration::test_init_diff_subprocess_force_no_changes PASSED [ 39%]
tests/test_message_consistency.py::TestMessageConsistency::test_init_message_consistency PASSED [ 39%]
tests/test_message_consistency.py::TestMessageConsistency::test_plan_message_consistency PASSED [ 39%]
tests/test_message_consistency.py::TestMessageConsistency::test_custom_output_paths_in_messages PASSED [ 40%]
tests/test_message_consistency.py::TestStdoutIgnoresForce::test_init_stdout_ignores_force_no_write_messages PASSED [ 40%]
tests/test_message_consistency.py::TestStdoutIgnoresForce::test_plan_stdout_ignores_force_no_write_messages PASSED [ 40%]
tests/test_message_consistency.py::TestStdoutIgnoresForce::test_init_stdout_no_file_modification PASSED [ 40%]
tests/test_message_consistency.py::TestStdoutIgnoresForce::test_plan_stdout_no_file_modification PASSED [ 40%]
tests/test_message_consistency.py::TestStdoutIgnoresForce::test_dry_run_also_ignores_force PASSED [ 40%]
tests/test_newline_endings.py::TestNewlineEndings::test_init_json_ends_with_newline PASSED [ 41%]
tests/test_newline_endings.py::TestNewlineEndings::test_init_dry_run_ends_with_newline PASSED [ 41%]
tests/test_newline_endings.py::TestNewlineEndings::test_plan_markdown_ends_with_newline PASSED [ 41%]
tests/test_newline_endings.py::TestNewlineEndings::test_plan_dry_run_ends_with_newline PASSED [ 41%]
tests/test_newline_endings.py::TestNewlineEndings::test_plan_file_output_ends_with_newline PASSED [ 41%]
tests/test_newline_endings.py::TestNewlineEndings::test_init_file_output_ends_with_newline PASSED [ 42%]
tests/test_plan_cli.py::TestPlanCLIArgumentValidation::test_missing_desc_and_file_exit_2 PASSED [ 42%]
tests/test_plan_cli.py::TestPlanCLIArgumentValidation::test_both_desc_and_file_exit_2 PASSED [ 42%]
tests/test_plan_cli.py::TestPlanCLIArgumentValidation::test_invalid_file_exit_1 PASSED [ 42%]
tests/test_plan_cli.py::TestPlanCLIArgumentValidation::test_plan_requires_input PASSED [ 42%]
tests/test_plan_cli.py::TestPlanCLIArgumentValidation::test_plan_writes_md_default_path PASSED [ 42%]
tests/test_plan_cli.py::TestPlanCLIArgumentValidation::test_plan_respects_out_and_force PASSED [ 43%]
tests/test_plan_cli.py::TestPlanCLIArgumentValidation::test_plan_infers_env_presence PASSED [ 43%]
tests/test_plan_cli.py::TestPlanCLIArgumentValidation::test_plan_node_keywords PASSED [ 43%]
tests/test_plan_cli.py::TestPlanCLIBasicFunctionality::test_desc_generates_new_format PASSED [ 43%]
tests/test_plan_cli.py::TestPlanCLIBasicFunctionality::test_file_input_works PASSED [ 43%]
tests/test_plan_cli.py::TestPlanCLIBasicFunctionality::test_custom_output_path PASSED [ 44%]
tests/test_plan_cli.py::TestPlanCLIBasicFunctionality::test_title_truncation_in_output PASSED [ 44%]
tests/test_plan_cli.py::TestPlanCLIOverwriteBehavior::test_existing_file_without_force_no_overwrite PASSED [ 44%]
tests/test_plan_cli.py::TestPlanCLIOverwriteBehavior::test_existing_file_with_force_overwrites PASSED [ 44%]
tests/test_plan_cli.py::TestPlanCLILanguageDetection::test_python_project_in_assumptions_and_needs PASSED [ 44%]
tests/test_plan_cli.py::TestPlanCLILanguageDetection::test_node_project_detected PASSED [ 45%]
tests/test_plan_cli.py::TestPlanCLILanguageDetection::test_mixed_languages_detected PASSED [ 45%]
tests/test_plan_cli.py::TestPlanCLIDevcontainerDetection::test_devcontainer_dir_detected PASSED [ 45%]
tests/test_plan_cli.py::TestPlanCLIDevcontainerDetection::test_devcontainer_root_detected PASSED [ 45%]
tests/test_plan_cli.py::TestPlanCLIDevcontainerDetection::test_no_devcontainer_absent PASSED [ 45%]
tests/test_plan_cli.py::TestPlanCLIMaxCommands::test_max_limits_command_count PASSED [ 45%]
tests/test_plan_cli.py::TestPlanCLIMaxCommands::test_default_max_allows_more_commands PASSED [ 46%]
tests/test_plan_cli.py::TestPlanCLIMaxCommands::test_max_option_command_ordering_and_counting PASSED [ 46%]
tests/test_plan_cli.py::TestPlanCLIFormatFlag::test_json_format_output PASSED [ 46%]
tests/test_plan_cli.py::TestPlanCLIFormatFlag::test_json_format_stdout PASSED [ 46%]
tests/test_plan_cli.py::TestPlanCLIFormatFlag::test_md_format_explicit PASSED [ 46%]
tests/test_plan_cli.py::TestPlanCLISubprocessIntegration::test_plan_help_via_subprocess PASSED [ 47%]
tests/test_plan_cli.py::TestPlanCLISubprocessIntegration::test_plan_missing_args_via_subprocess PASSED [ 47%]
tests/test_plan_cli.py::TestPlanCLISubprocessIntegration::test_plan_success_via_subprocess PASSED [ 47%]
tests/test_plan_cli.py::TestPlanCLISubprocessIntegration::test_tmp_path_isolation PASSED [ 47%]
tests/test_plan_cli.py::TestPlanCLIForceIgnoring::test_plan_out_dash_ignores_force_flag PASSED [ 47%]
tests/test_plan_cli.py::TestPlanCLICommandFiltering::test_ambiguous_case_shows_relevant_commands PASSED [ 47%]
tests/test_plan_cli.py::TestPlanCLICommandFiltering::test_keyword_match_without_language_detection PASSED [ 48%]
tests/test_plan_cli.py::TestPlanCLICommandFiltering::test_no_matches_shows_no_commands PASSED [ 48%]
tests/test_plan_cli.py::TestPlanCLICommandFiltering::test_plan_dry_run_ignores_force_flag PASSED [ 48%]
tests/test_plan_cli.py::TestPlanCLICommandFilteringAlt::test_ambiguous_case_shows_relevant_commands PASSED [ 48%]
tests/test_plan_cli.py::TestPlanCLICommandFilteringAlt::test_keyword_match_without_language_detection PASSED [ 48%]
tests/test_plan_cli.py::TestPlanCLICommandFilteringAlt::test_no_matches_shows_no_commands PASSED [ 49%]
tests/test_plan_core.py::TestNormalize::test_normalize PASSED [ 49%]
tests/test_plan_core.py::TestNormalize::test_normalize_punctuation_removal PASSED [ 49%]
tests/test_plan_core.py::TestNormalize::test_normalize_empty_string PASSED [ 49%]
tests/test_plan_core.py::TestNormalize::test_normalize_whitespace_only PASSED [ 49%]
tests/test_plan_core.py::TestExtractKeywords::test_empty_string PASSED [ 50%]
tests/test_plan_core.py::TestExtractKeywords::test_extract_keywords_basic PASSED [ 50%]
tests/test_plan_core.py::TestExtractKeywords::test_python_keywords PASSED [ 50%]
tests/test_plan_core.py::TestExtractKeywords::test_node_keywords PASSED [ 50%]
tests/test_plan_core.py::TestExtractKeywords::test_go_keywords PASSED [ 50%]
tests/test_plan_core.py::TestExtractKeywords::test_electron_keywords PASSED [ 50%]
tests/test_plan_core.py::TestExtractKeywords::test_multiword_phrases PASSED [ 51%]
tests/test_plan_core.py::TestExtractKeywords::test_case_insensitive PASSED [ 51%]
tests/test_plan_core.py::TestExtractKeywords::test_word_boundaries PASSED [ 51%]
tests/test_plan_core.py::TestSuggestCommands::test_python_keyword_matching PASSED [ 51%]
tests/test_plan_core.py::TestSuggestCommands::test_node_keyword_matching PASSED [ 51%]
tests/test_plan_core.py::TestSuggestCommands::test_language_detection_bonus PASSED [ 52%]
tests/test_plan_core.py::TestSuggestCommands::test_specificity_bonus PASSED [ 52%]
tests/test_plan_core.py::TestSuggestCommands::test_alphabetical_tie_breaking PASSED [ 52%]
tests/test_plan_core.py::TestSuggestCommands::test_detailed_rationales PASSED [ 52%]
tests/test_plan_core.py::TestSuggestCommands::test_no_suggestions_when_no_matches PASSED [ 52%]
tests/test_plan_core.py::TestSuggestCommands::test_suggest_commands_weighting PASSED [ 52%]
tests/test_plan_core.py::TestSafeTruncate60::test_short_text_unchanged PASSED [ 53%]
tests/test_plan_core.py::TestSafeTruncate60::test_exactly_60_chars PASSED [ 53%]
tests/test_plan_core.py::TestSafeTruncate60::test_over_60_chars_truncated PASSED [ 53%]
tests/test_plan_core.py::TestSafeTruncate60::test_trailing_whitespace_trimmed PASSED [ 53%]
tests/test_plan_core.py::TestSafeTruncate60::test_empty_string PASSED [ 53%]
tests/test_plan_core.py::TestBuildReproMd::test_canonical_sections_present PASSED [ 54%]
tests/test_plan_core.py::TestBuildReproMd::test_title_truncation PASSED [ 54%]
tests/test_plan_core.py::TestBuildReproMd::test_default_assumptions PASSED [ 54%]
tests/test_plan_core.py::TestBuildReproMd::test_custom_assumptions PASSED [ 54%]
tests/test_plan_core.py::TestBuildReproMd::test_line_based_commands PASSED [ 54%]
tests/test_plan_core.py::TestBuildReproMd::test_command_sorting PASSED [ 55%]
tests/test_plan_core.py::TestBuildReproMd::test_default_next_steps PASSED [ 55%]
tests/test_plan_core.py::TestBuildReproMd::test_custom_next_steps PASSED [ 55%]
tests/test_plan_core.py::TestBuildReproMd::test_devcontainer_in_needs PASSED [ 55%]
tests/test_plan_core.py::TestBuildReproMd::test_stable_output_format PASSED [ 55%]
tests/test_plan_core.py::TestBuildReproMd::test_build_repro_md_structure PASSED [ 55%]
tests/test_plan_core.py::TestBuildReproJson::test_basic_structure PASSED [ 56%]
tests/test_plan_core.py::TestBuildReproJson::test_devcontainer_detection_present PASSED [ 56%]
tests/test_plan_core.py::TestBuildReproJson::test_devcontainer_detection_absent PASSED [ 56%]
tests/test_plan_core.py::TestBuildReproJson::test_command_parsing_matched_keywords PASSED [ 56%]
tests/test_plan_core.py::TestBuildReproJson::test_command_parsing_matched_langs PASSED [ 56%]
tests/test_plan_core.py::TestBuildReproJson::test_command_parsing_no_matches PASSED [ 57%]
tests/test_plan_core.py::TestBuildReproJson::test_command_parsing_multiple_keywords PASSED [ 57%]
tests/test_plan_core.py::TestBuildReproJson::test_command_parsing_special_characters PASSED [ 57%]
tests/test_plan_core.py::TestBuildReproJson::test_empty_inputs PASSED [ 57%]
tests/test_plan_core.py::TestBuildReproJson::test_deterministic_output PASSED [ 57%]
tests/test_plan_core.py::TestBuildReproJson::test_key_order_preservation PASSED [ 57%]
tests/test_plan_core.py::TestBuildReproJson::test_schema_versioning_fields PASSED [ 58%]
tests/test_plan_json_cli.py::TestPlanJSONFileOutput::test_json_file_output_basic PASSED [ 58%]
tests/test_plan_json_cli.py::TestPlanJSONFileOutput::test_json_file_output_with_force PASSED [ 58%]
tests/test_plan_json_cli.py::TestPlanJSONFileOutput::test_json_file_exists_no_force PASSED [ 58%]
tests/test_plan_json_cli.py::TestPlanJSONFileOutput::test_json_max_commands_limit PASSED [ 58%]
tests/test_plan_json_cli.py::TestPlanJSONStdoutOutput::test_json_stdout_output PASSED [ 59%]
tests/test_plan_json_cli.py::TestPlanJSONStdoutOutput::test_json_dry_run_output PASSED [ 59%]
tests/test_plan_json_cli.py::TestPlanJSONStdoutOutput::test_json_stdout_ignores_force PASSED [ 59%]
tests/test_plan_json_cli.py::TestPlanJSONWithRepo::test_json_with_absolute_repo_path PASSED [ 59%]
tests/test_plan_json_cli.py::TestPlanJSONWithRepo::test_json_with_relative_repo_path PASSED [ 59%]
tests/test_plan_json_cli.py::TestPlanJSONWithRepo::test_json_repo_nonexistent_path_error PASSED [ 60%]
tests/test_plan_json_cli.py::TestPlanJSONValidation::test_json_with_missing_args_error PASSED [ 60%]
tests/test_plan_json_cli.py::TestPlanJSONValidation::test_json_command_structure_validation PASSED [ 60%]
tests/test_plan_json_cli.py::TestPlanJSONValidation::test_json_needs_devcontainer_detection PASSED [ 60%]
tests/test_plan_json_cli.py::TestPlanJSONValidation::test_json_stable_command_order PASSED [ 60%]
tests/test_plan_json_core.py::TestBuildReproJsonStructure::test_returns_dict_with_exact_keys PASSED [ 60%]
tests/test_plan_json_core.py::TestBuildReproJsonStructure::test_key_order_is_stable PASSED [ 61%]
tests/test_plan_json_core.py::TestBuildReproJsonStructure::test_commands_have_correct_structure PASSED [ 61%]
tests/test_plan_json_core.py::TestBuildReproJsonDevcontainer::test_devcontainer_present_detection PASSED [ 61%]
tests/test_plan_json_core.py::TestBuildReproJsonDevcontainer::test_devcontainer_absent_when_not_mentioned PASSED [ 61%]
tests/test_plan_json_core.py::TestBuildReproJsonDevcontainer::test_devcontainer_case_insensitive_detection PASSED [ 61%]
tests/test_plan_json_core.py::TestBuildReproJsonCommandParsing::test_matched_keywords_parsing PASSED [ 62%]
tests/test_plan_json_core.py::TestBuildReproJsonCommandParsing::test_matched_langs_parsing PASSED [ 62%]
tests/test_plan_json_core.py::TestBuildReproJsonCommandParsing::test_no_matches_results_in_empty_lists PASSED [ 62%]
tests/test_plan_json_core.py::TestBuildReproJsonCommandParsing::test_special_characters_filtered_from_keywords PASSED [ 62%]
tests/test_plan_json_core.py::TestBuildReproJsonCommandOrder::test_commands_preserve_input_order PASSED [ 62%]
tests/test_plan_json_core.py::TestBuildReproJsonCommandOrder::test_empty_inputs_handled_correctly PASSED [ 62%]
tests/test_plan_json_core.py::TestBuildReproJsonCommandOrder::test_deterministic_output PASSED [ 63%]
tests/test_plan_strict_mode.py::TestPlanCoreFiltering::test_min_score_filters_low_weight_commands PASSED [ 63%]
tests/test_plan_strict_mode.py::TestPlanCoreFiltering::test_keyword_match_respects_min_score PASSED [ 63%]
tests/test_plan_strict_mode.py::TestPlanCoreFiltering::test_language_match_respects_min_score PASSED [ 63%]
tests/test_plan_strict_mode.py::TestPlanCLIStrictMode::test_strict_mode_exit_1_when_no_commands PASSED [ 63%]
tests/test_plan_strict_mode.py::TestPlanCLIStrictMode::test_strict_mode_exit_0_when_commands_exist PASSED [ 64%]
tests/test_plan_strict_mode.py::TestPlanCLIStrictMode::test_non_strict_mode_always_exit_0 PASSED [ 64%]
tests/test_plan_strict_mode.py::TestPlanCLIMinScore::test_min_score_default_2 PASSED [ 64%]
tests/test_plan_strict_mode.py::TestPlanCLIMinScore::test_min_score_filters_output PASSED [ 64%]
tests/test_plan_strict_mode.py::TestPlanCLIMinScore::test_filtering_warning_message PASSED [ 64%]
tests/test_plan_strict_mode.py::TestPlanCLIExitCodes::test_module_execution_strict_failure PASSED [ 65%]
tests/test_plan_strict_mode.py::TestPlanCLIExitCodes::test_module_execution_strict_success PASSED [ 65%]
tests/test_plan_strict_mode.py::TestPlanCLIJSONOutputFiltering::test_json_format_respects_min_score PASSED [ 65%]
tests/test_plan_strict_mode.py::TestPlanCLIJSONOutputFiltering::test_json_strict_mode PASSED [ 65%]
tests/test_plan_strict_mode.py::TestPlanCLIAssumptionsFiltering::test_filtering_note_in_assumptions PASSED [ 65%]
tests/test_plan_strict_mode.py::TestPlanCLIAssumptionsFiltering::test_no_filtering_note_when_no_filtering PASSED [ 65%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_comment_create_new PASSED [ 66%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_comment_update_existing PASSED [ 66%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_body_update_sync_block PASSED [ 66%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_body_update_existing_sync_block PASSED [ 66%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_add_labels PASSED [ 66%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_link_issue_cross_reference PASSED [ 67%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_attach_report_metadata PASSED [ 67%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_summary_context PASSED [ 67%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_no_details_flag PASSED [ 67%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_all_enrichment_features_combined PASSED [ 67%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_enrichment_dry_run_mode PASSED [ 67%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_enrichment_format_json PASSED [ 68%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_enrichment_error_handling PASSED [ 68%]
tests/test_pr_enrichment_integration.py::TestPREnrichmentCommand::test_pr_enrichment_mutual_exclusions PASSED [ 68%]
tests/test_repo_stability.py::TestRepoPathStability::test_plan_repo_path_resolved_consistently PASSED [ 68%]
tests/test_repo_stability.py::TestRepoPathStability::test_init_repo_path_resolved_consistently PASSED [ 68%]
tests/test_repo_stability.py::TestRepoPathStability::test_repo_nonexistent_path_exit_2 PASSED [ 69%]
tests/test_repo_stability.py::TestRepoPathStability::test_repo_cwd_not_changed PASSED [ 69%]
tests/test_rules_core.py::TestRulesCore::test_builtin_rules_structure PASSED [ 69%]
tests/test_rules_core.py::TestRulesCore::test_get_rules_without_plugins PASSED [ 69%]
tests/test_rules_core.py::TestRulesCore::test_plugin_loading_no_plugins PASSED [ 69%]
tests/test_rules_core.py::TestRulesCore::test_plugin_loading_with_demo_plugin PASSED [ 70%]
tests/test_rules_core.py::TestRulesCore::test_get_rules_with_plugins PASSED [ 70%]
tests/test_rules_core.py::TestRulesCore::test_suggest_commands_uses_rules PASSED [ 70%]
tests/test_rules_core.py::TestRulesCore::test_suggest_commands_with_plugins PASSED [ 70%]
tests/test_rules_core.py::TestRulesCore::test_plugin_loading_handles_import_errors PASSED [ 70%]
tests/test_rules_core.py::TestRulesCore::test_plugin_loading_multiple_plugins PASSED [ 70%]
tests/test_rules_core.py::TestRulesCore::test_ecosystem_filtering_still_works PASSED [ 71%]
tests/test_rules_core.py::TestRulesCore::test_plugin_loading_from_file_path PASSED [ 71%]
tests/test_rules_core.py::TestRulesCore::test_plugin_debug_flag PASSED [ 71%]
tests/test_rules_core.py::TestRulesCore::test_plugin_debug_flag_off_by_default PASSED [ 71%]
tests/test_scan_cli.py::TestScanCLI::test_scan_empty_directory PASSED [ 71%]
tests/test_scan_cli.py::TestScanCLI::test_scan_single_language PASSED [ 72%]
tests/test_scan_cli.py::TestScanCLI::test_scan_multiple_languages PASSED [ 72%]
tests/test_scan_cli.py::TestScanCLI::test_scan_with_multiple_reasons PASSED [ 72%]
tests/test_scan_cli.py::TestScanCLI::test_scan_help PASSED [ 72%]
tests/test_scan_cli.py::TestScanCLI::test_no_command_shows_help PASSED [ 72%]
tests/test_scan_cli.py::TestScanCLI::test_invalid_command_returns_exit_code_2 PASSED [ 72%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_json_mixed_indices PASSED [ 73%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_json_no_indices PASSED [ 73%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_show_scores_text_output PASSED [ 73%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_show_scores_ignored_with_json PASSED [ 73%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_json_preserves_alphabetical_order PASSED [ 73%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_json_java_detection PASSED [ 74%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_json_rust_lockfile_and_config PASSED [ 74%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_json_handles_io_errors PASSED [ 74%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_default_behavior_unchanged PASSED [ 74%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_json_multiple_node_files PASSED [ 74%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_json_source_files_only PASSED [ 75%]
tests/test_scan_json_cli.py::TestScanJsonCLI::test_scan_json_no_indicators_exit_zero PASSED [ 75%]
tests/test_scan_json_core.py::TestScanJsonCore::test_python_only_pyproject PASSED [ 75%]
tests/test_scan_json_core.py::TestScanJsonCore::test_node_lockfile_only PASSED [ 75%]
tests/test_scan_json_core.py::TestScanJsonCore::test_python_config_and_node_lock PASSED [ 75%]
tests/test_scan_json_core.py::TestScanJsonCore::test_glob_source_files_only PASSED [ 75%]
tests/test_scan_json_core.py::TestScanJsonCore::test_multiple_source_files_same_pattern_weight PASSED [ 76%]
tests/test_scan_json_core.py::TestScanJsonCore::test_mixed_weight_scoring PASSED [ 76%]
tests/test_scan_json_core.py::TestScanJsonCore::test_empty_directory PASSED [ 76%]
tests/test_scan_json_core.py::TestScanJsonCore::test_valid_json_schema_and_types PASSED [ 76%]
tests/test_scan_json_core.py::TestScanJsonCore::test_csharp_detection PASSED [ 76%]
tests/test_scan_json_core.py::TestScanJsonCore::test_go_detection PASSED [ 77%]
tests/test_scan_json_core.py::TestScanJsonCore::test_no_indicators_empty_result PASSED [ 77%]
tests/test_scan_json_core.py::TestScanJsonCore::test_multiple_causes_grouped_deterministic_order PASSED [ 77%]
tests/test_scan_json_core.py::TestScanJsonCore::test_scan_json_schema_versioning_fields PASSED [ 77%]
tests/test_sync_core.py::TestSyncBlockHandling::test_find_synced_block_exists PASSED [ 77%]
tests/test_sync_core.py::TestSyncBlockHandling::test_find_synced_block_not_exists PASSED [ 77%]
tests/test_sync_core.py::TestSyncBlockHandling::test_find_synced_block_incomplete PASSED [ 78%]
tests/test_sync_core.py::TestSyncBlockHandling::test_replace_synced_block_existing PASSED [ 78%]
tests/test_sync_core.py::TestSyncBlockHandling::test_replace_synced_block_no_existing PASSED [ 78%]
tests/test_sync_core.py::TestSyncCommentRendering::test_render_sync_comment_issue_basic PASSED [ 78%]
tests/test_sync_core.py::TestSyncCommentRendering::test_render_sync_comment_pr_basic PASSED [ 78%]
tests/test_sync_core.py::TestSyncCommentRendering::test_render_sync_comment_with_json PASSED [ 79%]
tests/test_sync_core.py::TestSyncCommentRendering::test_render_sync_comment_with_links PASSED [ 79%]
tests/test_sync_core.py::TestSyncCommentRendering::test_render_sync_comment_with_report PASSED [ 79%]
tests/test_sync_core.py::TestSyncCommentRendering::test_render_sync_comment_with_summary PASSED [ 79%]
tests/test_sync_core.py::TestSyncCommentRendering::test_render_sync_comment_with_details_long_content PASSED [ 79%]
tests/test_sync_core.py::TestSyncCommentRendering::test_render_sync_comment_no_details_when_disabled PASSED [ 80%]
tests/test_sync_core.py::TestSyncCommentRendering::test_render_sync_comment_invalid_json PASSED [ 80%]
tests/test_sync_core.py::TestCrossReferenceLinks::test_build_cross_reference_links_pr_to_issue PASSED [ 80%]
tests/test_sync_core.py::TestCrossReferenceLinks::test_build_cross_reference_links_issue_to_pr PASSED [ 80%]
tests/test_sync_core.py::TestCrossReferenceLinks::test_build_cross_reference_links_empty PASSED [ 80%]
tests/test_sync_core.py::TestCrossReferenceLinks::test_build_cross_reference_links_wrong_context PASSED [ 80%]
tests/test_sync_core.py::TestContentDetection::test_find_autorepro_content_exists PASSED [ 81%]
tests/test_sync_core.py::TestContentDetection::test_find_autorepro_content_not_exists PASSED [ 81%]
tests/test_sync_core.py::TestContentDetection::test_find_autorepro_content_empty_list PASSED [ 81%]
tests/test_sync_core.py::TestReportMeta::test_report_meta_creation PASSED [ 81%]
tests/test_sync_core.py::TestReportMeta::test_report_meta_fields PASSED [ 81%]
tests/test_sync_core.py::TestReportMeta::test_report_meta_immutable PASSED [ 82%]
tests/test_sync_core.py::TestTitleExtraction::test_extract_title_from_markdown PASSED [ 82%]
tests/test_sync_core.py::TestTitleExtraction::test_extract_title_from_json_valid PASSED [ 82%]
tests/test_sync_core.py::TestTitleExtraction::test_extract_title_from_json_missing_title PASSED [ 82%]
tests/test_sync_core.py::TestTitleExtraction::test_extract_title_no_markdown_heading PASSED [ 82%]
tests/test_validation_helpers.py::TestKeywordValidation::test_has_any_keyword_variant PASSED [ 82%]
tests/test_validation_helpers.py::TestKeywordValidation::test_has_test_keywords PASSED [ 83%]
tests/test_validation_helpers.py::TestKeywordValidation::test_has_installation_keywords PASSED [ 83%]
tests/test_validation_helpers.py::TestKeywordValidation::test_has_ci_keywords PASSED [ 83%]
tests/test_validation_helpers.py::TestRuleSourceDetermination::test_determine_rule_source_builtin PASSED [ 83%]
tests/test_validation_helpers.py::TestRuleSourceDetermination::test_determine_rule_source_plugin PASSED [ 83%]
tests/test_validation_helpers.py::TestRuleSourceDetermination::test_determine_rule_source_missing_ecosystem PASSED [ 84%]
tests/test_validation_helpers.py::TestPathLogic::test_should_apply_repo_relative_path PASSED [ 84%]
tests/test_validation_helpers.py::TestPROperations::test_needs_pr_update_operation_true_cases PASSED [ 84%]
tests/test_validation_helpers.py::TestPROperations::test_needs_pr_update_operation_false_case PASSED [ 84%]
tests/test_validation_helpers.py::TestFileSafety::test_is_safe_to_write_file_stdout PASSED [ 84%]
tests/test_validation_helpers.py::TestFileSafety::test_is_safe_to_write_file_no_path PASSED [ 85%]
tests/test_validation_helpers.py::TestFileSafety::test_is_safe_to_write_file_directory PASSED [ 85%]
tests/test_validation_helpers.py::TestFileSafety::test_is_safe_to_write_file_existing_no_force PASSED [ 85%]
tests/test_validation_helpers.py::TestFileSafety::test_is_safe_to_write_file_new_file PASSED [ 85%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_desc_file_exclusive_valid_desc_only PASSED [ 85%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_desc_file_exclusive_valid_file_only PASSED [ 85%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_desc_file_exclusive_missing_both PASSED [ 86%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_desc_file_exclusive_both_provided PASSED [ 86%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_desc_file_exclusive_empty_string_treated_as_none PASSED [ 86%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_output_path_none_value PASSED [ 86%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_output_path_nonexistent_file PASSED [ 86%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_output_path_existing_file PASSED [ 87%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_output_path_existing_directory_fails PASSED [ 87%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_output_path_path_object PASSED [ 87%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_output_path_invalid_path PASSED [ 87%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_repo_path_none_value PASSED [ 87%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_repo_path_existing_directory PASSED [ 87%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_repo_path_nonexistent_path PASSED [ 88%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_repo_path_existing_file_fails PASSED [ 88%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_repo_path_path_object PASSED [ 88%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_required_arg_valid_value PASSED [ 88%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_required_arg_none_value PASSED [ 88%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_required_arg_empty_string PASSED [ 89%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_file_exists_none_value PASSED [ 89%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_file_exists_existing_file PASSED [ 89%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_file_exists_nonexistent_file PASSED [ 89%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_file_exists_directory_fails PASSED [ 89%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_file_exists_unreadable_file PASSED [ 90%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_file_exists_path_object PASSED [ 90%]
tests/utils/test_cli_validation.py::TestArgumentValidator::test_validate_file_exists_default_arg_name PASSED [ 90%]
tests/utils/test_cli_validation.py::TestValidationError::test_validation_error_initialization PASSED [ 90%]
tests/utils/test_cli_validation.py::TestValidationError::test_validation_error_default_exit_code PASSED [ 90%]
tests/utils/test_cli_validation.py::TestValidationHelpers::test_validate_and_exit_no_error PASSED [ 90%]
tests/utils/test_cli_validation.py::TestValidationHelpers::test_validate_and_exit_with_error PASSED [ 91%]
tests/utils/test_cli_validation.py::TestValidationHelpers::test_validate_and_exit_custom_exit_code PASSED [ 91%]
tests/utils/test_cli_validation.py::TestValidationHelpers::test_validate_multiple_no_errors PASSED [ 91%]
tests/utils/test_cli_validation.py::TestValidationHelpers::test_validate_multiple_with_error PASSED [ 91%]
tests/utils/test_cli_validation.py::TestValidationHelpers::test_validate_multiple_custom_exit_code PASSED [ 91%]
tests/utils/test_cli_validation.py::TestArgumentValidatorIntegration::test_cli_args_integration_pattern PASSED [ 92%]
tests/utils/test_cli_validation.py::TestArgumentValidatorIntegration::test_cli_args_integration_with_errors PASSED [ 92%]
tests/utils/test_file_ops.py::TestFileOperations::test_ensure_directory_creates_new_directory PASSED [ 92%]
tests/utils/test_file_ops.py::TestFileOperations::test_ensure_directory_idempotent_with_existing PASSED [ 92%]
tests/utils/test_file_ops.py::TestFileOperations::test_ensure_directory_handles_permission_error PASSED [ 92%]
tests/utils/test_file_ops.py::TestFileOperations::test_atomic_write_creates_file_successfully PASSED [ 92%]
tests/utils/test_file_ops.py::TestFileOperations::test_atomic_write_creates_parent_directories PASSED [ 93%]
tests/utils/test_file_ops.py::TestFileOperations::test_atomic_write_overwrites_existing_file PASSED [ 93%]
tests/utils/test_file_ops.py::TestFileOperations::test_atomic_write_uses_custom_encoding PASSED [ 93%]
tests/utils/test_file_ops.py::TestFileOperations::test_atomic_write_cleans_up_temp_on_error PASSED [ 93%]
tests/utils/test_file_ops.py::TestFileOperations::test_safe_read_text_reads_existing_file PASSED [ 93%]
tests/utils/test_file_ops.py::TestFileOperations::test_safe_read_text_returns_default_on_missing_file PASSED [ 94%]
tests/utils/test_file_ops.py::TestFileOperations::test_safe_read_text_raises_on_missing_file_no_default PASSED [ 94%]
tests/utils/test_file_ops.py::TestFileOperations::test_safe_read_text_uses_custom_encoding PASSED [ 94%]
tests/utils/test_file_ops.py::TestFileOperations::test_safe_read_json_reads_valid_json PASSED [ 94%]
tests/utils/test_file_ops.py::TestFileOperations::test_safe_read_json_returns_default_on_invalid_json PASSED [ 94%]
tests/utils/test_file_ops.py::TestFileOperations::test_safe_read_json_returns_default_on_missing_file PASSED [ 95%]
tests/utils/test_file_ops.py::TestFileOperations::test_safe_read_json_raises_on_error_no_default PASSED [ 95%]
tests/utils/test_file_ops.py::TestFileOperations::test_atomic_write_json_writes_formatted_json PASSED [ 95%]
tests/utils/test_file_ops.py::TestFileOperations::test_atomic_write_json_custom_formatting PASSED [ 95%]
tests/utils/test_file_ops.py::TestFileOperations::test_atomic_write_json_handles_serialization_error PASSED [ 95%]
tests/utils/test_file_ops.py::TestCreateTempFile::test_create_temp_file_with_content PASSED [ 95%]
tests/utils/test_file_ops.py::TestCreateTempFile::test_create_temp_file_with_suffix PASSED [ 96%]
tests/utils/test_file_ops.py::TestCreateTempFile::test_create_temp_file_with_custom_encoding PASSED [ 96%]
tests/utils/test_file_ops.py::TestCreateTempFile::test_create_temp_file_caller_responsible_for_cleanup PASSED [ 96%]
tests/utils/test_process.py::TestProcessResult::test_process_result_initialization PASSED [ 96%]
tests/utils/test_process.py::TestProcessResult::test_success_property_true_for_zero_exit PASSED [ 96%]
tests/utils/test_process.py::TestProcessResult::test_success_property_false_for_nonzero_exit PASSED [ 97%]
tests/utils/test_process.py::TestProcessResult::test_cmd_str_property_joins_command PASSED [ 97%]
tests/utils/test_process.py::TestProcessRunner::test_run_with_capture_successful_command PASSED [ 97%]
tests/utils/test_process.py::TestProcessRunner::test_run_with_capture_failed_command PASSED [ 97%]
tests/utils/test_process.py::TestProcessRunner::test_run_with_capture_timeout_handling PASSED [ 97%]
tests/utils/test_process.py::TestProcessRunner::test_run_with_capture_command_not_found PASSED [ 97%]
tests/utils/test_process.py::TestProcessRunner::test_run_with_capture_os_error PASSED [ 98%]
tests/utils/test_process.py::TestProcessRunner::test_run_with_capture_string_command_conversion PASSED [ 98%]
tests/utils/test_process.py::TestProcessRunner::test_run_with_capture_passes_parameters_correctly PASSED [ 98%]
tests/utils/test_process.py::TestProcessRunner::test_run_git_command_prepends_git PASSED [ 98%]
tests/utils/test_process.py::TestProcessRunner::test_run_git_command_passes_parameters PASSED [ 98%]
tests/utils/test_process.py::TestProcessRunner::test_run_gh_command_uses_custom_gh_path PASSED [ 99%]
tests/utils/test_process.py::TestProcessRunner::test_run_python_command_uses_custom_executable PASSED [ 99%]
tests/utils/test_process.py::TestProcessRunner::test_run_with_capture_integration_real_command PASSED [ 99%]
tests/utils/test_process.py::TestSafeSubprocessRun::test_safe_subprocess_run_forwards_parameters PASSED [ 99%]
tests/utils/test_process.py::TestSafeSubprocessRun::test_safe_subprocess_run_string_command_conversion PASSED [ 99%]
tests/utils/test_process.py::TestSafeSubprocessRun::test_safe_subprocess_run_integration_real_command PASSED [100%]
============================= 540 passed in 18.50s =============================