|
| 1 | +import logging |
| 2 | +from pathlib import Path |
| 3 | + |
| 4 | +import pytest |
| 5 | + |
| 6 | +from nc_py_api import ( |
| 7 | + fs_file_data, |
| 8 | + fs_list_directory, |
| 9 | + fs_node_info, |
| 10 | + get_mimetype_id, |
| 11 | + mimetype, |
| 12 | +) |
| 13 | + |
| 14 | + |
| 15 | +@pytest.mark.parametrize("test_path", ["", "/"]) |
| 16 | +@pytest.mark.parametrize("user_id", ["admin"]) |
| 17 | +def test_node_info_root(test_path, user_id): |
| 18 | + root_dir_info = fs_node_info(test_path, user_id=user_id) |
| 19 | + assert root_dir_info |
| 20 | + assert root_dir_info["mimetype"] == mimetype.DIR |
| 21 | + assert root_dir_info["is_dir"] |
| 22 | + assert root_dir_info["name"] == "files" |
| 23 | + |
| 24 | + |
| 25 | +@pytest.mark.parametrize("test_path", ["Documents", "Photos", "Templates", "test_dir"]) |
| 26 | +def test_node_info_path_dirs(test_path): |
| 27 | + dir_info = fs_node_info(test_path, user_id="admin") |
| 28 | + assert dir_info |
| 29 | + assert dir_info["mimetype"] == mimetype.DIR |
| 30 | + assert dir_info["is_dir"] |
| 31 | + assert dir_info["name"] == test_path |
| 32 | + |
| 33 | + |
| 34 | +@pytest.mark.parametrize("test_path", ["test_dir/hopper.png", "/test_dir/复杂 目录 Í/empty_file.bin"]) |
| 35 | +def test_node_info_path_files(test_path): |
| 36 | + file_info = fs_node_info(test_path, user_id="admin") |
| 37 | + assert file_info |
| 38 | + assert not file_info["is_dir"] |
| 39 | + assert file_info["name"] == Path(test_path).parts[-1:][0] |
| 40 | + |
| 41 | + |
| 42 | +@pytest.mark.parametrize("test_path", ["/test_dir/empty_dir/", "test_dir/empty_dir/", "/test_dir/empty_dir"]) |
| 43 | +def test_node_info_path_slashes(test_path): |
| 44 | + dir_info = fs_node_info(test_path, user_id="admin") |
| 45 | + assert dir_info |
| 46 | + assert dir_info["mimetype"] == mimetype.DIR |
| 47 | + assert dir_info["is_dir"] |
| 48 | + assert dir_info["name"] == "empty_dir" |
| 49 | + |
| 50 | + |
| 51 | +@pytest.mark.parametrize("test_path", ["/test_dir/复杂 目录 Í/", "test_dir/复杂 目录 Í/", "/test_dir/复杂 目录 Í"]) |
| 52 | +def test_node_info_path_diff_symbols(test_path): |
| 53 | + dir_info = fs_node_info(test_path, user_id="admin") |
| 54 | + assert dir_info |
| 55 | + assert dir_info["mimetype"] == mimetype.DIR |
| 56 | + assert dir_info["is_dir"] |
| 57 | + assert dir_info["name"] == "复杂 目录 Í" |
| 58 | + |
| 59 | + |
| 60 | +@pytest.mark.parametrize("test_path", ["*-1", "no path", "/no path", "no path/"]) |
| 61 | +@pytest.mark.parametrize("user_id", ["", None, "non_exist"]) |
| 62 | +def test_node_info_invalid_input(test_path, user_id): |
| 63 | + logging.disable(logging.CRITICAL) |
| 64 | + path_info = fs_node_info(test_path, user_id=user_id) |
| 65 | + logging.disable(logging.NOTSET) |
| 66 | + assert path_info is None |
| 67 | + |
| 68 | + |
| 69 | +@pytest.mark.parametrize("user_id", ["admin"]) |
| 70 | +def test_list_directory_root(user_id): |
| 71 | + root_dir_listing = fs_list_directory(user_id=user_id) |
| 72 | + # `Documents`, `Photos`, `Templates`, `test_files` folders |
| 73 | + assert len(root_dir_listing) >= 4 |
| 74 | + assert any(fs_obj["name"] == "Documents" for fs_obj in root_dir_listing) |
| 75 | + assert any(fs_obj["name"] == "Photos" for fs_obj in root_dir_listing) |
| 76 | + assert any(fs_obj["name"] == "Templates" for fs_obj in root_dir_listing) |
| 77 | + assert any(fs_obj["name"] == "test_dir" for fs_obj in root_dir_listing) |
| 78 | + |
| 79 | + |
| 80 | +@pytest.mark.parametrize("file_id", [None, 0, 18446744073709551610]) |
| 81 | +@pytest.mark.parametrize("user_id", ["", None, "non_exist"]) |
| 82 | +def test_list_directory_invalid_input(file_id, user_id): |
| 83 | + logging.disable(logging.CRITICAL) |
| 84 | + root_dir_listing = fs_list_directory(file_id=file_id, user_id=user_id) |
| 85 | + logging.disable(logging.NOTSET) |
| 86 | + assert isinstance(root_dir_listing, list) |
| 87 | + assert not root_dir_listing |
| 88 | + |
| 89 | + |
| 90 | +def test_list_directory_test_dir(): |
| 91 | + test_dir_listing = fs_list_directory(fs_node_info("test_dir", user_id="admin"), user_id="admin") |
| 92 | + assert len(test_dir_listing) == 4 |
| 93 | + assert any(fs_obj["name"] == "empty_dir" for fs_obj in test_dir_listing) |
| 94 | + assert any(fs_obj["name"] == "复杂 目录 Í" for fs_obj in test_dir_listing) |
| 95 | + assert any(fs_obj["name"] == "hopper.png" for fs_obj in test_dir_listing) |
| 96 | + assert any(fs_obj["name"] == "test.txt" for fs_obj in test_dir_listing) |
| 97 | + |
| 98 | + |
| 99 | +@pytest.mark.parametrize("test_path", ["test_dir", "test_dir/hopper.png", "/test_dir/复杂 目录 Í/empty_file.bin"]) |
| 100 | +def test_node_info_id(test_path): |
| 101 | + file_info1 = fs_node_info(test_path, user_id="admin") |
| 102 | + file_info2 = fs_node_info(file_info1["id"]) |
| 103 | + assert isinstance(file_info1, dict) |
| 104 | + assert file_info1 == file_info2 |
| 105 | + |
| 106 | + |
| 107 | +def test_node_info_ids(): |
| 108 | + test_dir_listing = fs_list_directory(fs_node_info("test_dir", user_id="admin"), user_id="admin") |
| 109 | + ids = [i["id"] for i in test_dir_listing] |
| 110 | + objs_info = fs_node_info(ids) |
| 111 | + assert isinstance(objs_info, list) |
| 112 | + assert len(objs_info) == 4 |
| 113 | + assert all(obj["id"] for obj in objs_info) |
| 114 | + |
| 115 | + |
| 116 | +def test_parent_field(): |
| 117 | + dir_info = fs_node_info("test_dir/empty_dir", user_id="admin") |
| 118 | + parent_info = fs_node_info(dir_info["parent_id"]) |
| 119 | + assert parent_info["name"] == "test_dir" |
| 120 | + dir_info = fs_node_info("test_dir/hopper.png", user_id="admin") |
| 121 | + parent_info = fs_node_info(dir_info["parent_id"]) |
| 122 | + assert parent_info["name"] == "test_dir" |
| 123 | + dir_info = fs_node_info("test_dir/empty_dir/empty_file.bin", user_id="admin") |
| 124 | + parent_info = fs_node_info(dir_info["parent_id"]) |
| 125 | + assert parent_info["name"] == "empty_dir" |
| 126 | + |
| 127 | + |
| 128 | +def test_node_dir_fields(): |
| 129 | + dir_info = fs_node_info("test_dir/empty_dir", user_id="admin") |
| 130 | + _ = fs_list_directory(fs_node_info("test_dir", user_id="admin"), user_id="admin") |
| 131 | + dir_info2 = [i for i in _ if i["name"] == "empty_dir"][0] |
| 132 | + assert dir_info == dir_info2 |
| 133 | + assert dir_info["is_dir"] |
| 134 | + assert dir_info["is_local"] |
| 135 | + assert dir_info["mimetype"] == mimetype.DIR |
| 136 | + assert dir_info["mimepart"] == get_mimetype_id("httpd") |
| 137 | + assert dir_info["internal_path"] == "files/test_dir/empty_dir" |
| 138 | + assert dir_info["permissions"] == 31 |
| 139 | + assert dir_info["ownerName"] == "admin" |
| 140 | + assert dir_info["size"] == 0 |
| 141 | + |
| 142 | + |
| 143 | +def test_node_file_fields(): |
| 144 | + file_info = fs_node_info("test_dir/hopper.png", user_id="admin") |
| 145 | + _ = fs_list_directory(fs_node_info("test_dir", user_id="admin"), user_id="admin") |
| 146 | + file_info2 = [i for i in _ if i["name"] == "hopper.png"][0] |
| 147 | + assert file_info == file_info2 |
| 148 | + assert not file_info["is_dir"] |
| 149 | + assert file_info["is_local"] |
| 150 | + assert file_info["mimetype"] == get_mimetype_id("image/png") |
| 151 | + assert file_info["mimepart"] == mimetype.IMAGE |
| 152 | + assert file_info["internal_path"] == "files/test_dir/hopper.png" |
| 153 | + assert file_info["permissions"] == 27 |
| 154 | + assert file_info["ownerName"] == "admin" |
| 155 | + assert file_info["size"] == 30605 |
| 156 | + |
| 157 | + |
| 158 | +@pytest.mark.parametrize("file", ["test_dir/hopper.png", "test_dir/test.txt", "/test_dir/复杂 目录 Í/empty_file.bin"]) |
| 159 | +def test_fs_file_data(file): |
| 160 | + node_info = fs_node_info(file, user_id="admin") |
| 161 | + file_data = fs_file_data(node_info) |
| 162 | + assert isinstance(file_data, bytes) |
| 163 | + if file.find("empty") == -1: |
| 164 | + assert file_data |
| 165 | + else: |
| 166 | + assert not len(file_data) |
0 commit comments