@@ -62,10 +62,50 @@ def test_absolute_path_stripped(self):
6262 result = OutputProcessor .sanitize_filename ("/absolute/path/file.txt" )
6363 assert result == "file.txt"
6464
65- def test_unicode_characters_replaced (self ):
66- """Test that non-ASCII characters are replaced ."""
65+ def test_unicode_characters_preserved (self ):
66+ """Test that Unicode letters are preserved ."""
6767 result = OutputProcessor .sanitize_filename ("résumé.docx" )
68- assert result == "r_sum_.docx"
68+ assert result == "résumé.docx"
69+
70+ def test_cjk_characters_preserved (self ):
71+ """Test that CJK characters are preserved."""
72+ result = OutputProcessor .sanitize_filename ("日本語レポート.xlsx" )
73+ assert result == "日本語レポート.xlsx"
74+
75+ def test_cyrillic_characters_preserved (self ):
76+ """Test that Cyrillic characters are preserved."""
77+ result = OutputProcessor .sanitize_filename ("файл.txt" )
78+ assert result == "файл.txt"
79+
80+ def test_korean_characters_preserved (self ):
81+ """Test that Korean characters are preserved."""
82+ result = OutputProcessor .sanitize_filename ("보고서.xlsx" )
83+ assert result == "보고서.xlsx"
84+
85+ def test_arabic_characters_preserved (self ):
86+ """Test that Arabic characters are preserved."""
87+ result = OutputProcessor .sanitize_filename ("تقرير.pdf" )
88+ assert result == "تقرير.pdf"
89+
90+ def test_mixed_unicode_and_ascii (self ):
91+ """Test mixed Unicode and ASCII filename."""
92+ result = OutputProcessor .sanitize_filename ("report_2024_報告.pdf" )
93+ assert result == "report_2024_報告.pdf"
94+
95+ def test_unicode_with_spaces_sanitized (self ):
96+ """Test that spaces in Unicode filenames are still replaced."""
97+ result = OutputProcessor .sanitize_filename ("日本語 レポート.xlsx" )
98+ assert result == "日本語_レポート.xlsx"
99+
100+ def test_dangerous_chars_still_blocked (self ):
101+ """Test that shell metacharacters are still replaced."""
102+ result = OutputProcessor .sanitize_filename ("file<>|&;$().txt" )
103+ assert result == "file________.txt"
104+
105+ def test_underscores_preserved (self ):
106+ """Test that underscores are preserved."""
107+ result = OutputProcessor .sanitize_filename ("my_file_name.txt" )
108+ assert result == "my_file_name.txt"
69109
70110 def test_brackets_replaced (self ):
71111 """Test that brackets are replaced with underscores."""
@@ -169,6 +209,13 @@ def test_librechat_skill_bundle_pattern(self):
169209 == "skills/foo/SKILL.md"
170210 )
171211
212+ def test_unicode_segments_preserved (self ):
213+ """Test that Unicode directory and file names are preserved."""
214+ assert (
215+ OutputProcessor .sanitize_relative_path ("報告/2024年/レポート.xlsx" )
216+ == "報告/2024年/レポート.xlsx"
217+ )
218+
172219 def test_sanitize_filename_unchanged_for_basename_callers (self ):
173220 """Regression: sanitize_filename still flattens (legacy upload behavior)."""
174221 # Existing single-call sites rely on this.
0 commit comments