1740b3867SJames Ide'use strict'; 2740b3867SJames Ide 32bd74c95SEvan Baconimport { FileSystem as FS, Asset } from 'expo'; 467f55e2bSStanisław Chmiela 567f55e2bSStanisław Chmielaexport const name = 'FileSystem'; 6740b3867SJames Ide 7*fec220cbSSergei Chestakovexport async function test(t) { 8740b3867SJames Ide t.describe('FileSystem', () => { 9740b3867SJames Ide const throws = async run => { 10740b3867SJames Ide let error = null; 11740b3867SJames Ide try { 12740b3867SJames Ide await run(); 13740b3867SJames Ide } catch (e) { 14740b3867SJames Ide error = e; 15740b3867SJames Ide } 16740b3867SJames Ide t.expect(error).toBeTruthy(); 17740b3867SJames Ide }; 18740b3867SJames Ide 19*fec220cbSSergei Chestakov t.it( 20740b3867SJames Ide 'delete(idempotent) -> !exists -> download(md5, uri) -> exists ' + '-> delete -> !exists', 21740b3867SJames Ide async () => { 22740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.png'; 23740b3867SJames Ide 24740b3867SJames Ide const assertExists = async expectedToExist => { 25740b3867SJames Ide let { exists } = await FS.getInfoAsync(localUri); 26740b3867SJames Ide if (expectedToExist) { 27740b3867SJames Ide t.expect(exists).toBeTruthy(); 28740b3867SJames Ide } else { 29740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 30740b3867SJames Ide } 31740b3867SJames Ide }; 32740b3867SJames Ide 33740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 34740b3867SJames Ide await assertExists(false); 35740b3867SJames Ide 36*fec220cbSSergei Chestakov const { md5, headers } = await FS.downloadAsync( 37740b3867SJames Ide 'https://s3-us-west-1.amazonaws.com/test-suite-data/avatar2.png', 38740b3867SJames Ide localUri, 39740b3867SJames Ide { md5: true } 40740b3867SJames Ide ); 41740b3867SJames Ide t.expect(md5).toBe('1e02045c10b8f1145edc7c8375998f87'); 42740b3867SJames Ide await assertExists(true); 43740b3867SJames Ide t.expect(headers['Content-Type']).toBe('image/png'); 44740b3867SJames Ide 45740b3867SJames Ide await FS.deleteAsync(localUri); 46740b3867SJames Ide await assertExists(false); 47740b3867SJames Ide }, 48740b3867SJames Ide 9000 49*fec220cbSSergei Chestakov ); 50740b3867SJames Ide 512bd74c95SEvan Bacon t.it('Can read/write Base64', async () => { 522bd74c95SEvan Bacon const asset = await Asset.fromModule(require('../assets/icons/app.png')); 532bd74c95SEvan Bacon await asset.downloadAsync(); 542bd74c95SEvan Bacon 5567f55e2bSStanisław Chmiela for (let startingPosition = 0; startingPosition < 3; startingPosition++) { 562bd74c95SEvan Bacon const options = { 57*fec220cbSSergei Chestakov encoding: FS.EncodingType.Base64, 5867f55e2bSStanisław Chmiela position: startingPosition, 5967f55e2bSStanisław Chmiela length: startingPosition + 1, 602bd74c95SEvan Bacon }; 612bd74c95SEvan Bacon 622bd74c95SEvan Bacon const b64 = await FS.readAsStringAsync(asset.localUri, options); 632bd74c95SEvan Bacon t.expect(b64).toBeDefined(); 642bd74c95SEvan Bacon t.expect(typeof b64).toBe('string'); 6567f55e2bSStanisław Chmiela t.expect(b64.length % 4).toBe(0); 662bd74c95SEvan Bacon 672bd74c95SEvan Bacon const localUri = FS.documentDirectory + 'b64.png'; 682bd74c95SEvan Bacon 69*fec220cbSSergei Chestakov await FS.writeAsStringAsync(localUri, b64, { encoding: FS.EncodingType.Base64 }); 702bd74c95SEvan Bacon 71*fec220cbSSergei Chestakov t.expect(await FS.readAsStringAsync(localUri, { encoding: FS.EncodingType.Base64 })).toBe( 7267f55e2bSStanisław Chmiela b64 7367f55e2bSStanisław Chmiela ); 742bd74c95SEvan Bacon } 752bd74c95SEvan Bacon }); 762bd74c95SEvan Bacon 77740b3867SJames Ide t.it('delete(idempotent) -> delete[error]', async () => { 78740b3867SJames Ide const localUri = FS.documentDirectory + 'willDelete.png'; 79740b3867SJames Ide 80740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 81740b3867SJames Ide 82740b3867SJames Ide let error; 83740b3867SJames Ide try { 84740b3867SJames Ide await FS.deleteAsync(localUri); 85740b3867SJames Ide } catch (e) { 86740b3867SJames Ide error = e; 87740b3867SJames Ide } 88740b3867SJames Ide t.expect(error.message).toMatch(/not.*found/); 89740b3867SJames Ide }); 90740b3867SJames Ide 91*fec220cbSSergei Chestakov t.it( 92740b3867SJames Ide 'download(md5, uri) -> read -> delete -> !exists -> read[error]', 93740b3867SJames Ide async () => { 94740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.txt'; 95740b3867SJames Ide 96*fec220cbSSergei Chestakov const { md5 } = await FS.downloadAsync( 97740b3867SJames Ide 'https://s3-us-west-1.amazonaws.com/test-suite-data/text-file.txt', 98740b3867SJames Ide localUri, 99740b3867SJames Ide { md5: true } 100740b3867SJames Ide ); 101740b3867SJames Ide t.expect(md5).toBe('86d73d2f11e507365f7ea8e7ec3cc4cb'); 102740b3867SJames Ide 103740b3867SJames Ide const string = await FS.readAsStringAsync(localUri); 104740b3867SJames Ide t.expect(string).toBe('hello, world\nthis is a test file\n'); 105740b3867SJames Ide 106740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 107740b3867SJames Ide 108740b3867SJames Ide let error; 109740b3867SJames Ide try { 110740b3867SJames Ide await FS.readAsStringAsync(localUri); 111740b3867SJames Ide } catch (e) { 112740b3867SJames Ide error = e; 113740b3867SJames Ide } 114740b3867SJames Ide t.expect(error).toBeTruthy(); 115740b3867SJames Ide }, 116740b3867SJames Ide 9000 117*fec220cbSSergei Chestakov ); 118740b3867SJames Ide 119740b3867SJames Ide t.it('delete(idempotent) -> !exists -> write -> read -> write -> read', async () => { 120740b3867SJames Ide const localUri = FS.documentDirectory + 'write1.txt'; 121740b3867SJames Ide 122740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 123740b3867SJames Ide 124740b3867SJames Ide const { exists } = await FS.getInfoAsync(localUri); 125740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 126740b3867SJames Ide 127740b3867SJames Ide const writeAndVerify = async expected => { 128740b3867SJames Ide await FS.writeAsStringAsync(localUri, expected); 129740b3867SJames Ide const string = await FS.readAsStringAsync(localUri); 130740b3867SJames Ide t.expect(string).toBe(expected); 131740b3867SJames Ide }; 132740b3867SJames Ide 133740b3867SJames Ide await writeAndVerify('hello, world'); 134740b3867SJames Ide await writeAndVerify('hello, world!!!!!!'); 135740b3867SJames Ide }); 136740b3867SJames Ide 137740b3867SJames Ide t.it('delete(new) -> 2 * [write -> move -> !exists(orig) -> read(new)]', async () => { 138740b3867SJames Ide const from = FS.documentDirectory + 'from.txt'; 139740b3867SJames Ide const to = FS.documentDirectory + 'to.txt'; 140740b3867SJames Ide const contents = ['contents 1', 'contents 2']; 141740b3867SJames Ide 142740b3867SJames Ide await FS.deleteAsync(to, { idempotent: true }); 143740b3867SJames Ide 144740b3867SJames Ide // Move twice to make sure we can overwrite 145740b3867SJames Ide for (let i = 0; i < 2; ++i) { 146740b3867SJames Ide await FS.writeAsStringAsync(from, contents[i]); 147740b3867SJames Ide 148740b3867SJames Ide await FS.moveAsync({ from, to }); 149740b3867SJames Ide 150740b3867SJames Ide const { exists } = await FS.getInfoAsync(from); 151740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 152740b3867SJames Ide 153740b3867SJames Ide t.expect(await FS.readAsStringAsync(to)).toBe(contents[i]); 154740b3867SJames Ide } 155740b3867SJames Ide }); 156740b3867SJames Ide 157740b3867SJames Ide t.it('delete(new) -> 2 * [write -> copy -> exists(orig) -> read(new)]', async () => { 158740b3867SJames Ide const from = FS.documentDirectory + 'from.txt'; 159740b3867SJames Ide const to = FS.documentDirectory + 'to.txt'; 160740b3867SJames Ide const contents = ['contents 1', 'contents 2']; 161740b3867SJames Ide 162740b3867SJames Ide await FS.deleteAsync(to, { idempotent: true }); 163740b3867SJames Ide 164740b3867SJames Ide // Copy twice to make sure we can overwrite 165740b3867SJames Ide for (let i = 0; i < 2; ++i) { 166740b3867SJames Ide await FS.writeAsStringAsync(from, contents[i]); 167740b3867SJames Ide 168740b3867SJames Ide await FS.copyAsync({ from, to }); 169740b3867SJames Ide 170740b3867SJames Ide const { exists } = await FS.getInfoAsync(from); 171740b3867SJames Ide t.expect(exists).toBeTruthy(); 172740b3867SJames Ide 173740b3867SJames Ide t.expect(await FS.readAsStringAsync(to)).toBe(contents[i]); 174740b3867SJames Ide } 175740b3867SJames Ide }); 176740b3867SJames Ide 177740b3867SJames Ide t.it( 178740b3867SJames Ide 'delete(dir) -> write(dir/file)[error] -> mkdir(dir) ->' + 179740b3867SJames Ide 'mkdir(dir)[error] -> write(dir/file) -> read', 180740b3867SJames Ide async () => { 181740b3867SJames Ide let error; 182740b3867SJames Ide const path = FS.documentDirectory + 'dir/file'; 183740b3867SJames Ide const dir = FS.documentDirectory + 'dir'; 184740b3867SJames Ide const contents = 'hello, world'; 185740b3867SJames Ide 186740b3867SJames Ide await FS.deleteAsync(dir, { idempotent: true }); 187740b3867SJames Ide 188740b3867SJames Ide error = null; 189740b3867SJames Ide try { 190740b3867SJames Ide await FS.writeAsStringAsync(path, contents); 191740b3867SJames Ide } catch (e) { 192740b3867SJames Ide error = e; 193740b3867SJames Ide } 194740b3867SJames Ide t.expect(error).toBeTruthy(); 195740b3867SJames Ide 196740b3867SJames Ide await FS.makeDirectoryAsync(dir); 197740b3867SJames Ide 198740b3867SJames Ide error = null; 199740b3867SJames Ide try { 200740b3867SJames Ide await FS.makeDirectoryAsync(dir); 201740b3867SJames Ide } catch (e) { 202740b3867SJames Ide error = e; 203740b3867SJames Ide } 204740b3867SJames Ide t.expect(error).toBeTruthy(); 205740b3867SJames Ide 206740b3867SJames Ide await FS.writeAsStringAsync(path, contents); 207740b3867SJames Ide 208740b3867SJames Ide t.expect(await FS.readAsStringAsync(path)).toBe(contents); 209740b3867SJames Ide } 210740b3867SJames Ide ); 211740b3867SJames Ide 212740b3867SJames Ide t.it( 213740b3867SJames Ide 'delete(dir) -> write(dir/dir2/file)[error] -> ' + 214740b3867SJames Ide 'mkdir(dir/dir2, intermediates) -> ' + 215740b3867SJames Ide 'mkdir(dir/dir2, intermediates) -> write(dir/dir2/file) -> read', 216740b3867SJames Ide async () => { 217740b3867SJames Ide let error; 218740b3867SJames Ide const path = FS.documentDirectory + 'dir/dir2/file'; 219740b3867SJames Ide const dir = FS.documentDirectory + 'dir/dir2'; 220740b3867SJames Ide const contents = 'hello, world'; 221740b3867SJames Ide 222740b3867SJames Ide await FS.deleteAsync(dir, { idempotent: true }); 223740b3867SJames Ide 224740b3867SJames Ide error = null; 225740b3867SJames Ide try { 226740b3867SJames Ide await FS.writeAsStringAsync(path, contents); 227740b3867SJames Ide } catch (e) { 228740b3867SJames Ide error = e; 229740b3867SJames Ide } 230740b3867SJames Ide t.expect(error).toBeTruthy(); 231740b3867SJames Ide 232740b3867SJames Ide await FS.makeDirectoryAsync(dir, { 233740b3867SJames Ide intermediates: true, 234740b3867SJames Ide }); 235740b3867SJames Ide 236740b3867SJames Ide error = null; 237740b3867SJames Ide try { 238740b3867SJames Ide await FS.makeDirectoryAsync(dir); 239740b3867SJames Ide } catch (e) { 240740b3867SJames Ide error = e; 241740b3867SJames Ide } 242740b3867SJames Ide t.expect(error).toBeTruthy(); 243740b3867SJames Ide 2446cfa9c5fSSergei Chestakov error = null; 2456cfa9c5fSSergei Chestakov try { 2466cfa9c5fSSergei Chestakov await FS.makeDirectoryAsync(dir, { 2476cfa9c5fSSergei Chestakov intermediates: true, 2486cfa9c5fSSergei Chestakov }); 2496cfa9c5fSSergei Chestakov } catch (e) { 2506cfa9c5fSSergei Chestakov error = e; 2516cfa9c5fSSergei Chestakov } 2526cfa9c5fSSergei Chestakov t.expect(error).toBe(null); 2536cfa9c5fSSergei Chestakov 254740b3867SJames Ide await FS.writeAsStringAsync(path, contents); 255740b3867SJames Ide 256740b3867SJames Ide t.expect(await FS.readAsStringAsync(path)).toBe(contents); 257740b3867SJames Ide } 258740b3867SJames Ide ); 259740b3867SJames Ide 260*fec220cbSSergei Chestakov /* 261*fec220cbSSergei Chestakov This test fails in CI because of an exception being thrown by deleteAsync in the nativeModule. 262*fec220cbSSergei Chestakov I traced it down to the FileUtils.forceDelete call here: 263*fec220cbSSergei Chestakov https://github.com/expo/expo/blob/bcd136b096df84e0b0f72a15acbda45491de8201/packages/expo-file-system/android/src/main/java/expo/modules/filesystem/FileSystemModule.java#L294 264740b3867SJames Ide t.it( 265740b3867SJames Ide 'delete(dir, idempotent) -> make tree -> check contents ' + 266740b3867SJames Ide '-> check directory listings' + 267740b3867SJames Ide '-> move -> check directory listings' + 268740b3867SJames Ide '-> copy -> check directory listings', 269740b3867SJames Ide async () => { 270740b3867SJames Ide let error; 271740b3867SJames Ide const dir = FS.documentDirectory + 'dir'; 272740b3867SJames Ide 273740b3867SJames Ide await FS.deleteAsync(dir, { idempotent: true }); 274740b3867SJames Ide 275740b3867SJames Ide await FS.makeDirectoryAsync(dir + '/child1', { 276740b3867SJames Ide intermediates: true, 277740b3867SJames Ide }); 278740b3867SJames Ide await FS.makeDirectoryAsync(dir + '/child2', { 279740b3867SJames Ide intermediates: true, 280740b3867SJames Ide }); 281740b3867SJames Ide 282740b3867SJames Ide await FS.writeAsStringAsync(dir + '/file1', 'contents1'); 283740b3867SJames Ide await FS.writeAsStringAsync(dir + '/file2', 'contents2'); 284740b3867SJames Ide 285740b3867SJames Ide await FS.writeAsStringAsync(dir + '/child1/file3', 'contents3'); 286740b3867SJames Ide 287740b3867SJames Ide await FS.writeAsStringAsync(dir + '/child2/file4', 'contents4'); 288740b3867SJames Ide await FS.writeAsStringAsync(dir + '/child2/file5', 'contents5'); 289740b3867SJames Ide 290740b3867SJames Ide const checkContents = async (path, contents) => 291740b3867SJames Ide t.expect(await FS.readAsStringAsync(path)).toBe(contents); 292740b3867SJames Ide 293740b3867SJames Ide await checkContents(dir + '/file1', 'contents1'); 294740b3867SJames Ide await checkContents(dir + '/file2', 'contents2'); 295740b3867SJames Ide await checkContents(dir + '/child1/file3', 'contents3'); 296740b3867SJames Ide await checkContents(dir + '/child2/file4', 'contents4'); 297740b3867SJames Ide await checkContents(dir + '/child2/file5', 'contents5'); 298740b3867SJames Ide 299740b3867SJames Ide const checkDirectory = async (path, expected) => { 300740b3867SJames Ide const list = await FS.readDirectoryAsync(path); 301740b3867SJames Ide t.expect(list.sort()).toEqual(expected.sort()); 302740b3867SJames Ide }; 303740b3867SJames Ide 304740b3867SJames Ide const checkRoot = async root => { 305740b3867SJames Ide await checkDirectory(root, ['file1', 'file2', 'child1', 'child2']); 306740b3867SJames Ide await checkDirectory(root + '/child1', ['file3']); 307740b3867SJames Ide await checkDirectory(root + '/child2', ['file4', 'file5']); 308740b3867SJames Ide 309740b3867SJames Ide error = null; 310740b3867SJames Ide try { 311740b3867SJames Ide await checkDirectory(root + '/file1', ['nope']); 312740b3867SJames Ide } catch (e) { 313740b3867SJames Ide error = e; 314740b3867SJames Ide } 315740b3867SJames Ide t.expect(error).toBeTruthy(); 316740b3867SJames Ide }; 317740b3867SJames Ide 318740b3867SJames Ide await checkRoot(dir); 319740b3867SJames Ide 320740b3867SJames Ide await FS.deleteAsync(FS.documentDirectory + 'moved', { 321740b3867SJames Ide idempotent: true, 322740b3867SJames Ide }); 323740b3867SJames Ide await FS.moveAsync({ from: dir, to: FS.documentDirectory + 'moved' }); 324740b3867SJames Ide await checkRoot(FS.documentDirectory + 'moved'); 325740b3867SJames Ide await FS.copyAsync({ 326740b3867SJames Ide from: FS.documentDirectory + 'moved', 327740b3867SJames Ide to: FS.documentDirectory + 'copied', 328740b3867SJames Ide }); 329740b3867SJames Ide await checkRoot(FS.documentDirectory + 'copied'); 330740b3867SJames Ide } 331740b3867SJames Ide ); 332*fec220cbSSergei Chestakov */ 333740b3867SJames Ide 334740b3867SJames Ide t.it( 335740b3867SJames Ide 'delete(idempotent) -> download(md5) -> getInfo(size)', 336740b3867SJames Ide async () => { 337740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.png'; 338740b3867SJames Ide 339740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 340740b3867SJames Ide 34167f55e2bSStanisław Chmiela const { md5 } = await FS.downloadAsync( 342740b3867SJames Ide 'https://s3-us-west-1.amazonaws.com/test-suite-data/avatar2.png', 343740b3867SJames Ide localUri, 344740b3867SJames Ide { md5: true } 345740b3867SJames Ide ); 346740b3867SJames Ide t.expect(md5).toBe('1e02045c10b8f1145edc7c8375998f87'); 347740b3867SJames Ide 348740b3867SJames Ide const { size, modificationTime } = await FS.getInfoAsync(localUri); 349740b3867SJames Ide t.expect(size).toBe(3230); 350740b3867SJames Ide const nowTime = 0.001 * new Date().getTime(); 351740b3867SJames Ide t.expect(nowTime - modificationTime).toBeLessThan(3600); 352740b3867SJames Ide 353740b3867SJames Ide await FS.deleteAsync(localUri); 354740b3867SJames Ide }, 35567f55e2bSStanisław Chmiela 30000 356740b3867SJames Ide ); 357740b3867SJames Ide 358740b3867SJames Ide t.it('throws out-of-scope exceptions', async () => { 359740b3867SJames Ide const p = FS.documentDirectory; 360740b3867SJames Ide 361740b3867SJames Ide await throws(() => FS.getInfoAsync(p + '../hello/world')); 362740b3867SJames Ide await throws(() => FS.readAsStringAsync(p + '../hello/world')); 363740b3867SJames Ide await throws(() => FS.writeAsStringAsync(p + '../hello/world', '')); 364740b3867SJames Ide await throws(() => FS.deleteAsync(p + '../hello/world')); 365740b3867SJames Ide await throws(() => FS.deleteAsync(p)); 366740b3867SJames Ide await throws(() => FS.deleteAsync(FS.cacheDirectory)); 367740b3867SJames Ide await throws(() => FS.moveAsync({ from: p + '../a/b', to: 'c' })); 368740b3867SJames Ide await throws(() => FS.moveAsync({ from: 'c', to: p + '../a/b' })); 369740b3867SJames Ide await throws(() => FS.copyAsync({ from: p + '../a/b', to: 'c' })); 370740b3867SJames Ide await throws(() => FS.copyAsync({ from: 'c', to: p + '../a/b' })); 371740b3867SJames Ide await throws(() => FS.makeDirectoryAsync(p + '../hello/world')); 372740b3867SJames Ide await throws(() => FS.readDirectoryAsync(p + '../hello/world')); 373740b3867SJames Ide await throws(() => FS.downloadAsync('http://www.google.com', p + '../hello/world')); 374740b3867SJames Ide await throws(() => FS.readDirectoryAsync(p + '../')); 375740b3867SJames Ide await throws(() => FS.downloadAsync('http://www.google.com', p + '../hello/world')); 376740b3867SJames Ide }); 377740b3867SJames Ide 378740b3867SJames Ide t.it('missing parameters', async () => { 379740b3867SJames Ide const p = FS.documentDirectory + 'test'; 380740b3867SJames Ide 381740b3867SJames Ide await throws(() => FS.moveAsync({ from: p })); 382740b3867SJames Ide await throws(() => FS.moveAsync({ to: p })); 383740b3867SJames Ide await throws(() => FS.copyAsync({ from: p })); 384740b3867SJames Ide await throws(() => FS.copyAsync({ to: p })); 385740b3867SJames Ide }); 386740b3867SJames Ide 387740b3867SJames Ide t.it('can read root directories', async () => { 388740b3867SJames Ide await FS.readDirectoryAsync(FS.documentDirectory); 389740b3867SJames Ide await FS.readDirectoryAsync(FS.cacheDirectory); 390740b3867SJames Ide }); 391740b3867SJames Ide 392740b3867SJames Ide t.it( 393740b3867SJames Ide 'download(network failure)', 394740b3867SJames Ide async () => { 395740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.png'; 396740b3867SJames Ide 397740b3867SJames Ide const assertExists = async expectedToExist => { 398740b3867SJames Ide let { exists } = await FS.getInfoAsync(localUri); 399740b3867SJames Ide if (expectedToExist) { 400740b3867SJames Ide t.expect(exists).toBeTruthy(); 401740b3867SJames Ide } else { 402740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 403740b3867SJames Ide } 404740b3867SJames Ide }; 405740b3867SJames Ide 406740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 407740b3867SJames Ide await assertExists(false); 408740b3867SJames Ide 409740b3867SJames Ide let error; 410740b3867SJames Ide try { 411*fec220cbSSergei Chestakov await FS.downloadAsync('https://nonexistent-subdomain.expo.io', localUri, { md5: true }); 412740b3867SJames Ide } catch (e) { 413740b3867SJames Ide error = e; 414740b3867SJames Ide } 415740b3867SJames Ide t.expect(error).toBeTruthy(); 416740b3867SJames Ide await assertExists(false); 417740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 418740b3867SJames Ide }, 41967f55e2bSStanisław Chmiela 30000 420740b3867SJames Ide ); 421740b3867SJames Ide 422740b3867SJames Ide t.it( 423740b3867SJames Ide 'download(404)', 424740b3867SJames Ide async () => { 425740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.png'; 426740b3867SJames Ide 427740b3867SJames Ide const assertExists = async expectedToExist => { 428740b3867SJames Ide let { exists } = await FS.getInfoAsync(localUri); 429740b3867SJames Ide if (expectedToExist) { 430740b3867SJames Ide t.expect(exists).toBeTruthy(); 431740b3867SJames Ide } else { 432740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 433740b3867SJames Ide } 434740b3867SJames Ide }; 435740b3867SJames Ide 436740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 437740b3867SJames Ide await assertExists(false); 438740b3867SJames Ide 439*fec220cbSSergei Chestakov const { status } = await FS.downloadAsync('https://expo.io/404', localUri, { 440740b3867SJames Ide md5: true, 441740b3867SJames Ide }); 442740b3867SJames Ide await assertExists(true); 443740b3867SJames Ide t.expect(status).toBe(404); 444740b3867SJames Ide 445740b3867SJames Ide await FS.deleteAsync(localUri); 446740b3867SJames Ide await assertExists(false); 447740b3867SJames Ide }, 44867f55e2bSStanisław Chmiela 30000 449740b3867SJames Ide ); 450740b3867SJames Ide }); 451740b3867SJames Ide} 452