FileSystemDirectoryHandle-move.js (11524B)
1 // META: script=resources/test-helpers.js 2 3 'use strict'; 4 5 directory_test(async (t, root) => { 6 const dir = await root.getDirectoryHandle('dir-before', {create: true}); 7 await dir.move('dir-after'); 8 9 assert_array_equals(await getSortedDirectoryEntries(root), ['dir-after/']); 10 assert_array_equals(await getSortedDirectoryEntries(dir), []); 11 }, 'move(name) to rename an empty directory'); 12 13 directory_test(async (t, root) => { 14 const dir = await root.getDirectoryHandle('dir-before', {create: true}); 15 await promise_rejects_js(t, TypeError, dir.move('')); 16 17 assert_array_equals(await getSortedDirectoryEntries(root), ['dir-before/']); 18 assert_array_equals(await getSortedDirectoryEntries(dir), []); 19 }, 'move("") to rename an empty directory fails'); 20 21 directory_test(async (t, root) => { 22 const dir = await root.getDirectoryHandle('dir-before', {create: true}); 23 await createFileWithContents('file-in-dir', 'abc', dir); 24 await dir.move('dir-after'); 25 26 assert_array_equals(await getSortedDirectoryEntries(root), ['dir-after/']); 27 assert_array_equals(await getSortedDirectoryEntries(dir), ['file-in-dir']); 28 }, 'move(name) to rename a non-empty directory'); 29 30 directory_test(async (t, root) => { 31 const dir = await root.getDirectoryHandle('dir-before', {create: true}); 32 await dir.move(root, 'dir-after'); 33 34 assert_array_equals(await getSortedDirectoryEntries(root), ['dir-after/']); 35 assert_array_equals(await getSortedDirectoryEntries(dir), []); 36 }, 'move(dir, name) to rename an empty directory'); 37 38 directory_test(async (t, root) => { 39 const dir = await root.getDirectoryHandle('dir-before', {create: true}); 40 await createFileWithContents('file-in-dir', 'abc', dir); 41 await dir.move(root, 'dir-after'); 42 43 assert_array_equals(await getSortedDirectoryEntries(root), ['dir-after/']); 44 assert_array_equals(await getSortedDirectoryEntries(dir), ['file-in-dir']); 45 }, 'move(dir, name) to rename a non-empty directory'); 46 47 directory_test(async (t, root) => { 48 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 49 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 50 const dir_in_dir = 51 await dir_src.getDirectoryHandle('dir-in-dir', {create: true}); 52 await dir_in_dir.move(dir_dest); 53 54 assert_array_equals( 55 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 56 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 57 assert_array_equals( 58 await getSortedDirectoryEntries(dir_dest), ['dir-in-dir/']); 59 assert_array_equals(await getSortedDirectoryEntries(dir_in_dir), []); 60 }, 'move(dir) to move an empty directory to a new directory'); 61 62 directory_test(async (t, root) => { 63 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 64 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 65 const dir_in_dir = 66 await dir_src.getDirectoryHandle('dir-in-dir', {create: true}); 67 await dir_in_dir.move(dir_dest, 'dir-in-dir'); 68 69 assert_array_equals( 70 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 71 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 72 assert_array_equals( 73 await getSortedDirectoryEntries(dir_dest), ['dir-in-dir/']); 74 assert_array_equals(await getSortedDirectoryEntries(dir_in_dir), []); 75 }, 'move(dir, name) to move an empty directory to a new directory'); 76 77 directory_test(async (t, root) => { 78 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 79 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 80 const dir_in_dir = 81 await dir_src.getDirectoryHandle('dir-in-dir', {create: true}); 82 const file = await createFileWithContents('file-in-dir', 'abc', dir_in_dir); 83 await dir_in_dir.move(dir_dest); 84 85 assert_array_equals( 86 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 87 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 88 assert_array_equals( 89 await getSortedDirectoryEntries(dir_dest), ['dir-in-dir/']); 90 assert_array_equals( 91 await getSortedDirectoryEntries(dir_in_dir), ['file-in-dir']); 92 // `file` should be invalidated after moving directories. 93 await promise_rejects_dom(t, 'NotFoundError', getFileContents(file)); 94 }, 'move(dir) to move a non-empty directory to a new directory'); 95 96 directory_test(async (t, root) => { 97 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 98 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 99 const dir_in_dir = 100 await dir_src.getDirectoryHandle('dir-in-dir', {create: true}); 101 const file = await createFileWithContents('file-in-dir', 'abc', dir_in_dir); 102 await dir_in_dir.move(dir_dest, 'dir-in-dir'); 103 104 assert_array_equals( 105 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 106 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 107 assert_array_equals( 108 await getSortedDirectoryEntries(dir_dest), ['dir-in-dir/']); 109 assert_array_equals( 110 await getSortedDirectoryEntries(dir_in_dir), ['file-in-dir']); 111 // `file` should be invalidated after moving directories. 112 await promise_rejects_dom(t, 'NotFoundError', getFileContents(file)); 113 }, 'move(dir, name) to move a non-empty directory to a new directory'); 114 115 directory_test(async (t, root) => { 116 const dir1 = await root.getDirectoryHandle('dir1', {create: true}); 117 const dir2 = await root.getDirectoryHandle('dir2', {create: true}); 118 const handle = await createFileWithContents('file', 'foo', root); 119 120 await handle.move(dir1); 121 assert_array_equals( 122 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/']); 123 assert_array_equals(await getSortedDirectoryEntries(dir1), ['file']); 124 assert_array_equals(await getSortedDirectoryEntries(dir2), []); 125 assert_equals(await getFileContents(handle), 'foo'); 126 127 await handle.move(dir2); 128 assert_array_equals( 129 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/']); 130 assert_array_equals(await getSortedDirectoryEntries(dir1), []); 131 assert_array_equals(await getSortedDirectoryEntries(dir2), ['file']); 132 assert_equals(await getFileContents(handle), 'foo'); 133 134 await handle.move(root); 135 assert_array_equals( 136 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/', 'file']); 137 assert_array_equals(await getSortedDirectoryEntries(dir1), []); 138 assert_array_equals(await getSortedDirectoryEntries(dir2), []); 139 assert_equals(await getFileContents(handle), 'foo'); 140 }, 'move(dir) can be called multiple times'); 141 142 directory_test(async (t, root) => { 143 const dir1 = await root.getDirectoryHandle('dir1', {create: true}); 144 const dir2 = await root.getDirectoryHandle('dir2', {create: true}); 145 const handle = await createFileWithContents('file', 'foo', root); 146 147 await handle.move(dir1, 'file-1'); 148 assert_array_equals( 149 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/']); 150 assert_array_equals(await getSortedDirectoryEntries(dir1), ['file-1']); 151 assert_array_equals(await getSortedDirectoryEntries(dir2), []); 152 assert_equals(await getFileContents(handle), 'foo'); 153 154 await handle.move(dir2, 'file-2'); 155 assert_array_equals( 156 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/']); 157 assert_array_equals(await getSortedDirectoryEntries(dir1), []); 158 assert_array_equals(await getSortedDirectoryEntries(dir2), ['file-2']); 159 assert_equals(await getFileContents(handle), 'foo'); 160 161 await handle.move(root, 'file-3'); 162 assert_array_equals( 163 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/', 'file-3']); 164 assert_array_equals(await getSortedDirectoryEntries(dir1), []); 165 assert_array_equals(await getSortedDirectoryEntries(dir2), []); 166 assert_equals(await getFileContents(handle), 'foo'); 167 }, 'move(dir, name) can be called multiple times'); 168 169 directory_test(async (t, root) => { 170 const handle = await createFileWithContents('file-before', 'foo', root); 171 const valid_name = '#$23423@352^*3243'; 172 await handle.move(root, valid_name); 173 174 assert_array_equals(await getSortedDirectoryEntries(root), [valid_name]); 175 assert_equals(await getFileContents(handle), 'foo'); 176 assert_equals(await getFileSize(handle), 3); 177 178 const contains_invalid_characters = '/file\\'; 179 await promise_rejects_js( 180 t, TypeError, handle.move(root, contains_invalid_characters)); 181 182 assert_array_equals(await getSortedDirectoryEntries(root), [valid_name]); 183 assert_equals(await getFileContents(handle), 'foo'); 184 assert_equals(await getFileSize(handle), 3); 185 186 const empty_name = ''; 187 await promise_rejects_js(t, TypeError, handle.move(root, empty_name)); 188 189 assert_array_equals(await getSortedDirectoryEntries(root), [valid_name]); 190 assert_equals(await getFileContents(handle), 'foo'); 191 assert_equals(await getFileSize(handle), 3); 192 193 const banned_name = '..'; 194 await promise_rejects_js(t, TypeError, handle.move(root, banned_name)); 195 196 assert_array_equals(await getSortedDirectoryEntries(root), [valid_name]); 197 assert_equals(await getFileContents(handle), 'foo'); 198 assert_equals(await getFileSize(handle), 3); 199 }, 'move(dir, name) with a name with invalid characters should fail'); 200 201 directory_test(async (t, root) => { 202 const handle = await createFileWithContents('file-before', 'foo', root); 203 await promise_rejects_js(t, TypeError, handle.move(root, '')); 204 205 assert_array_equals(await getSortedDirectoryEntries(root), ['file-before']); 206 assert_equals(await getFileContents(handle), 'foo'); 207 assert_equals(await getFileSize(handle), 3); 208 }, 'move(dir, "") should fail'); 209 210 directory_test(async (t, root) => { 211 const dir = await root.getDirectoryHandle('dir', {create: true}); 212 await promise_rejects_dom( 213 t, 'InvalidModificationError', dir.move(dir)); 214 215 assert_array_equals(await getSortedDirectoryEntries(root), ['dir/']); 216 assert_array_equals(await getSortedDirectoryEntries(dir), []); 217 }, 'move(dir, name) to move a directory within itself fails'); 218 219 directory_test(async (t, root) => { 220 const dir = await root.getDirectoryHandle('dir', {create: true}); 221 await promise_rejects_dom( 222 t, 'InvalidModificationError', dir.move(dir, 'dir-fail')); 223 224 assert_array_equals(await getSortedDirectoryEntries(root), ['dir/']); 225 assert_array_equals(await getSortedDirectoryEntries(dir), []); 226 }, 'move(dir, name) to move a directory within itself and rename fails'); 227 228 directory_test(async (t, root) => { 229 const parent_dir = 230 await root.getDirectoryHandle('parent-dir', {create: true}); 231 const child_dir = 232 await parent_dir.getDirectoryHandle('child-dir', {create: true}); 233 await promise_rejects_dom( 234 t, 'InvalidModificationError', parent_dir.move(child_dir)); 235 236 assert_array_equals(await getSortedDirectoryEntries(root), ['parent-dir/']); 237 assert_array_equals( 238 await getSortedDirectoryEntries(parent_dir), ['child-dir/']); 239 assert_array_equals(await getSortedDirectoryEntries(child_dir), []); 240 }, 'move(dir) to move a directory within a descendent fails'); 241 242 directory_test(async (t, root) => { 243 const parent_dir = 244 await root.getDirectoryHandle('parent-dir', {create: true}); 245 const child_dir = 246 await parent_dir.getDirectoryHandle('child-dir', {create: true}); 247 await promise_rejects_dom( 248 t, 'InvalidModificationError', parent_dir.move(child_dir, 'dir')); 249 250 assert_array_equals(await getSortedDirectoryEntries(root), ['parent-dir/']); 251 assert_array_equals( 252 await getSortedDirectoryEntries(parent_dir), ['child-dir/']); 253 assert_array_equals(await getSortedDirectoryEntries(child_dir), []); 254 }, 'move(dir, name) to move a directory within a descendent fails');