Skip to content

Commit 1991fa8

Browse files
committed
test: add edge cases for unicode and forbidden filesystem characters
1 parent 89e579c commit 1991fa8

2 files changed

Lines changed: 47 additions & 8 deletions

File tree

openedx_learning/apps/authoring/backup_restore/zipper.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ def slugify_hashed_filename(identifier: str) -> str:
3838
- Append a short hash for uniqueness.
3939
- Result: human-readable but still unique and filesystem-safe filename.
4040
"""
41-
slug = slugify(identifier)
41+
slug = slugify(identifier, allow_unicode=True)
4242
# Short digest ensures uniqueness without overly long filenames
4343
short_hash = hashlib.blake2b(
4444
identifier.encode("utf-8"),
45-
digest_size=3
45+
digest_size=3,
4646
).hexdigest()
4747
return f"{slug}_{short_hash}"
4848

tests/openedx_learning/apps/authoring/backup_restore/test_slug_hash.py

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,55 @@ def test_slugify_hashed_filename_special_chars(self):
2222
# Test the slugify_hashed_filename function with special characters
2323
self.assertEqual(slugify_hashed_filename("my@ex#ample!"), "myexample_3366b5")
2424

25+
def test_slugify_hashed_filename_invalid_characters_common_filesystems(self):
26+
# Test the slugify_hashed_filename function with invalid characters for common filesystems
27+
self.assertEqual(
28+
slugify_hashed_filename("xblock.v1:problem:my_component"), "xblockv1problemmy_component_d346b1"
29+
)
30+
self.assertEqual(
31+
slugify_hashed_filename("xblock.v1/problem/my_component"), "xblockv1problemmy_component_2648c6"
32+
)
33+
self.assertEqual(
34+
slugify_hashed_filename("xblock.v1?problem?my_component"), "xblockv1problemmy_component_12a86d"
35+
)
36+
self.assertEqual(
37+
slugify_hashed_filename("xblock.v1\\problem_[my_component]"), "xblockv1problem_my_component_a59bb3"
38+
)
39+
self.assertEqual(
40+
slugify_hashed_filename("xblock.v1>problem_>my_component"), "xblockv1problem_my_component_8497eb"
41+
)
42+
self.assertEqual(
43+
slugify_hashed_filename("xblock.v1*problem*EndsWith|"), "xblockv1problemendswith_b88aab"
44+
)
45+
self.assertEqual(
46+
slugify_hashed_filename("xblock.v1*problem*EndsWith."), "xblockv1problemendswith_7fa0cf"
47+
)
48+
49+
def test_slugify_hashed_filename_unicode(self):
50+
# Test the slugify_hashed_filename function with unicode characters
51+
52+
# Example with accents
53+
self.assertEqual(slugify_hashed_filename("café"), "café_07f4df")
54+
self.assertEqual(slugify_hashed_filename("naïve"), "naïve_308c7e")
55+
56+
# Example with non-latin (e.g., Japanese)
57+
identifier = "テスト用"
58+
result = slugify_hashed_filename(identifier)
59+
self.assertEqual(result, "テスト用_be48ab")
60+
61+
# Example with mixed characters
62+
identifier = "café_テスト用"
63+
result = slugify_hashed_filename(identifier)
64+
self.assertEqual(result, "café_テスト用_3cf9ef")
65+
2566
def test_slugify_hashed_filename_long_string(self):
2667
# Test the slugify_hashed_filename function with a long string
2768
long_string = "a" * 100
2869
self.assertEqual(slugify_hashed_filename(long_string), f"{long_string}_4e84b3")
2970

3071
def test_slugify_hashed_filename_case_insensitivity(self):
3172
# Test the slugify_hashed_filename function for case insensitivity
32-
self.assertEqual(slugify_hashed_filename("My_Example"), "my_example_4f859c")
33-
self.assertEqual(slugify_hashed_filename("MY_EXAMPLE"), "my_example_49be65")
34-
self.assertEqual(slugify_hashed_filename("my_example"), "my_example_880989")
35-
self.assertEqual(slugify_hashed_filename("mY_eXamPle"), "my_example_d28c02")
36-
self.assertEqual(slugify_hashed_filename("My_ExAmPlE"), "my_example_79232e")
37-
self.assertEqual(slugify_hashed_filename("mY_EXAMPLE"), "my_example_b91dc0")
73+
upper_case_value = slugify_hashed_filename("MY_EXAMPLE")
74+
lower_case_value = slugify_hashed_filename("my_example")
75+
# The values should be different even though they are the same but with different cases
76+
self.assertNotEqual(upper_case_value, lower_case_value)

0 commit comments

Comments
 (0)