def test_colon_handling_windows(self): assert filesystem.sanitize_filename("test:aftertest") == "test-aftertest" assert filesystem.sanitize_filename(":") == "-" assert filesystem.sanitize_filename("test:") == "test-" assert filesystem.sanitize_filename("test: ") == "test-" # They should act the same assert filesystem.sanitize_filename("test:aftertest") == filesystem.sanitize_foldername("test:aftertest")
def test_win_devices_not_win(self): # Linux and Darwin are the same for this assert filesystem.sanitize_filename(None) is None assert filesystem.sanitize_filename("aux.txt") == "aux.txt" assert filesystem.sanitize_filename("txt.aux") == "txt.aux" assert filesystem.sanitize_filename("$mft") == "$mft" assert filesystem.sanitize_filename("a$mft") == "a$mft"
def test_legal_chars_linux(self): # Illegal on Windows but not on Linux, unless sanitize_safe is active. # Don't bother with '/' which is illegal in filenames on all platforms. char_ill = filesystem.CH_ILLEGAL_WIN.replace("/", "") assert filesystem.sanitize_filename("test" + char_ill + "aftertest") == ("test" + char_ill + "aftertest") for char in char_ill: # Try at start, middle, and end of a filename. assert filesystem.sanitize_filename("test" + char * 2 + "aftertest") == ("test" + char * 2 + "aftertest") assert filesystem.sanitize_filename("test" + char * 2) == ("test" + char * 2).strip() assert filesystem.sanitize_filename(char * 2 + "test") == (char * 2 + "test").strip()
def test_filename_too_long(self): # Note: some filesystem can handle up to 255 UTF chars (which is more than 255 bytes) in the filename, # but we stay on the safe side: max DEF_FILE_MAX bytes # PART 1: Base cases: Nothing should happen: # normal filename name = "a" * 200 + ".ext" sanitizedname = filesystem.sanitize_filename(name) assert sanitizedname == name # Unicode / UTF8 is OK ... as total filename length is not too long name = "BASE" + "你" * 50 + "blabla.ext" sanitizedname = filesystem.sanitize_filename(name) assert sanitizedname == name # filename with very long extension, but total filename is no problem, so no change name = "hello.ext" + "e" * 200 sanitizedname = filesystem.sanitize_filename(name) assert sanitizedname == name # no change # PART 2: base truncating name = "BASE" + "a" * 300 + ".mylongext" sanitizedname = filesystem.sanitize_filename(name) assert len(sanitizedname) <= DEF_FILE_MAX assert sanitizedname.startswith("BASEaaaaaaaaaaaaaaa") assert sanitizedname.endswith(".mylongext") # too long filename, so truncate keeping the start of name and ext should stay the same name = "BASE" + "a" * 200 + ".EXT" + "e" * 200 sanitizedname = filesystem.sanitize_filename(name) assert len(sanitizedname) <= DEF_FILE_MAX newname, newext = os.path.splitext(sanitizedname) assert newname.startswith("BASEaaaaa") assert newext.startswith(".EXTeeeee") # PART 3: more exotic cases # insert NON-ASCII chars, which should stay in place because overall length is no problem name = "aaaa" + 10 * chr(188) + 10 * chr(222) + "bbbb.ext" sanitizedname = filesystem.sanitize_filename(name) assert sanitizedname == name # insert NON-ASCII chars, which should get removed because overall length is too long name = "aaaa" + 200 * chr(188) + 200 * chr(222) + "bbbb.ext" sanitizedname = filesystem.sanitize_filename(name) assert sanitizedname == "aaaabbbb.ext" # Unicode / UTF8 ... total filename length might be too long for certain filesystems name = "BASE" + "你" * 200 + ".ext" sanitizedname = filesystem.sanitize_filename(name) assert sanitizedname.startswith("BASE") assert sanitizedname.endswith(".ext") # Linux / POSIX: a hidden file (no extension), with size 200, so do not truncate at all name = "." + "a" * 200 sanitizedname = filesystem.sanitize_filename(name) assert sanitizedname == name # no change
def test_file_illegal_chars_linux(self): assert filesystem.sanitize_filename("test/aftertest") == "test+aftertest" assert filesystem.sanitize_filename("/test") == "+test" assert filesystem.sanitize_filename("test/") == "test+" assert filesystem.sanitize_filename(r"/test\/aftertest/") == r"+test\+aftertest+" assert filesystem.sanitize_filename("/") == "+" assert filesystem.sanitize_filename("///") == "+++" assert filesystem.sanitize_filename("../") == "..+" assert filesystem.sanitize_filename("../test") == "..+test"
def test_sanitize_safe_linux(self): # Set sanitize_safe to on, simulating Windows-style restrictions. assert filesystem.sanitize_filename("test" + filesystem.CH_ILLEGAL_WIN + "aftertest") == ( "test" + filesystem.CH_LEGAL_WIN + "aftertest" ) for index in range(0, len(filesystem.CH_ILLEGAL_WIN)): char_leg = filesystem.CH_LEGAL_WIN[index] char_ill = filesystem.CH_ILLEGAL_WIN[index] assert filesystem.sanitize_filename("test" + char_ill * 2 + "aftertest") == ( "test" + char_leg * 2 + "aftertest" ) # Illegal chars that also get caught by strip() never make it far # enough to be replaced by their legal equivalents if they appear # on either end of the filename. if char_ill.strip(): assert filesystem.sanitize_filename("test" + char_ill * 2) == ("test" + char_leg * 2) assert filesystem.sanitize_filename(char_ill * 2 + "test") == (char_leg * 2 + "test")
def test_filename_dot(self): # All dots should survive in filenames assert filesystem.sanitize_filename(".test") == ".test" assert filesystem.sanitize_filename("..test") == "..test" assert filesystem.sanitize_filename("test.") == "test." assert filesystem.sanitize_filename("test..") == "test.." assert filesystem.sanitize_filename("test.aftertest") == "test.aftertest" assert filesystem.sanitize_filename("test..aftertest") == "test..aftertest" assert filesystem.sanitize_filename("test.aftertest.") == "test.aftertest." assert filesystem.sanitize_filename("test.aftertest..") == "test.aftertest.."
def test_colon_handling_darwin(self): assert filesystem.sanitize_filename("test:aftertest") == "aftertest" assert filesystem.sanitize_filename(":aftertest") == "aftertest" assert filesystem.sanitize_filename("::aftertest") == "aftertest" assert filesystem.sanitize_filename(":after:test") == "test" # Empty after sanitising with darwin colon handling assert filesystem.sanitize_filename(":") == "unknown" assert filesystem.sanitize_filename("test:") == "unknown" assert filesystem.sanitize_filename("test: ") == "unknown"
def test_filename_empty_result(self): # Nothing remains after sanitizing the filename assert filesystem.sanitize_filename("\n") == "unknown" assert filesystem.sanitize_filename("\r\n") == "unknown" assert filesystem.sanitize_filename("\n\r") == "unknown" assert filesystem.sanitize_filename("\t\t\t") == "unknown" assert filesystem.sanitize_filename(" ") == "unknown" assert filesystem.sanitize_filename(" ") == "unknown"
def test_win_devices_on_win(self): assert filesystem.sanitize_filename(None) is None assert filesystem.sanitize_filename("aux.txt") == "_aux.txt" assert filesystem.sanitize_filename("txt.aux") == "txt.aux" assert filesystem.sanitize_filename("$mft") == "Smft" assert filesystem.sanitize_filename("a$mft") == "a$mft"
def test_colon_handling_other(self): assert filesystem.sanitize_filename("test:aftertest") == "test:aftertest" assert filesystem.sanitize_filename(":") == ":" assert filesystem.sanitize_filename("test:") == "test:" assert filesystem.sanitize_filename("test: ") == "test:"
def test_empty(self): assert filesystem.sanitize_filename(None) is None assert filesystem.sanitize_foldername(None) is None