1740b3867SJames Ide'use strict'; 2740b3867SJames Ide 3740b3867SJames Ideexport const name = 'FileSystem'; 4740b3867SJames Ide 5*2bd74c95SEvan Baconimport { FileSystem as FS, Asset } from 'expo'; 6740b3867SJames Ideimport { CameraRoll } from 'react-native'; 7740b3867SJames Ide 8740b3867SJames Ideexport function test(t) { 9740b3867SJames Ide t.describe('FileSystem', () => { 10740b3867SJames Ide const throws = async run => { 11740b3867SJames Ide let error = null; 12740b3867SJames Ide try { 13740b3867SJames Ide await run(); 14740b3867SJames Ide } catch (e) { 15740b3867SJames Ide // Uncomment to log error message. 16740b3867SJames Ide // const func = run.toString().match(/[A-Za-z]+\(/)[0].slice(0, -1); 17740b3867SJames Ide // console.log(`${func}: ${e.message}`); 18740b3867SJames Ide error = e; 19740b3867SJames Ide } 20740b3867SJames Ide t.expect(error).toBeTruthy(); 21740b3867SJames Ide }; 22740b3867SJames Ide 23740b3867SJames Ide /*t.it( 24740b3867SJames Ide 'delete(idempotent) -> !exists -> download(md5, uri) -> exists ' + '-> delete -> !exists', 25740b3867SJames Ide async () => { 26740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.png'; 27740b3867SJames Ide 28740b3867SJames Ide const assertExists = async expectedToExist => { 29740b3867SJames Ide let { exists } = await FS.getInfoAsync(localUri); 30740b3867SJames Ide if (expectedToExist) { 31740b3867SJames Ide t.expect(exists).toBeTruthy(); 32740b3867SJames Ide } else { 33740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 34740b3867SJames Ide } 35740b3867SJames Ide }; 36740b3867SJames Ide 37740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 38740b3867SJames Ide await assertExists(false); 39740b3867SJames Ide 40740b3867SJames Ide const { 41740b3867SJames Ide md5, 42740b3867SJames Ide uri, 43740b3867SJames Ide headers, 44740b3867SJames Ide } = await FS.downloadAsync( 45740b3867SJames Ide 'https://s3-us-west-1.amazonaws.com/test-suite-data/avatar2.png', 46740b3867SJames Ide localUri, 47740b3867SJames Ide { md5: true } 48740b3867SJames Ide ); 49740b3867SJames Ide t.expect(md5).toBe('1e02045c10b8f1145edc7c8375998f87'); 50740b3867SJames Ide await assertExists(true); 51740b3867SJames Ide t.expect(headers['Content-Type']).toBe('image/png'); 52740b3867SJames Ide 53740b3867SJames Ide await FS.deleteAsync(localUri); 54740b3867SJames Ide await assertExists(false); 55740b3867SJames Ide }, 56740b3867SJames Ide 9000 57740b3867SJames Ide );*/ 58740b3867SJames Ide 59*2bd74c95SEvan Bacon t.it('Can read/write Base64', async () => { 60*2bd74c95SEvan Bacon const asset = await Asset.fromModule(require('../assets/icons/app.png')); 61*2bd74c95SEvan Bacon await asset.downloadAsync(); 62*2bd74c95SEvan Bacon 63*2bd74c95SEvan Bacon let startingPosition = 0; 64*2bd74c95SEvan Bacon 65*2bd74c95SEvan Bacon for (let i = 0; i < 3; i++) { 66*2bd74c95SEvan Bacon const options = { 67*2bd74c95SEvan Bacon encoding: FS.EncodingTypes.Base64, 68*2bd74c95SEvan Bacon position: i, 69*2bd74c95SEvan Bacon length: i + 1, 70*2bd74c95SEvan Bacon }; 71*2bd74c95SEvan Bacon 72*2bd74c95SEvan Bacon const b64 = await FS.readAsStringAsync(asset.localUri, options); 73*2bd74c95SEvan Bacon t.expect(b64).toBeDefined(); 74*2bd74c95SEvan Bacon t.expect(typeof b64).toBe('string'); 75*2bd74c95SEvan Bacon t.expect(b64.split('') % 4).toBe(0); 76*2bd74c95SEvan Bacon 77*2bd74c95SEvan Bacon const localUri = FS.documentDirectory + 'b64.png'; 78*2bd74c95SEvan Bacon 79*2bd74c95SEvan Bacon await FS.writeAsStringAsync(localUri, b64, options); 80*2bd74c95SEvan Bacon 81*2bd74c95SEvan Bacon t.expect(await FS.readAsStringAsync(localUri, options)).toBe(b64); 82*2bd74c95SEvan Bacon } 83*2bd74c95SEvan Bacon }); 84*2bd74c95SEvan Bacon 85740b3867SJames Ide t.it('delete(idempotent) -> delete[error]', async () => { 86740b3867SJames Ide const localUri = FS.documentDirectory + 'willDelete.png'; 87740b3867SJames Ide 88740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 89740b3867SJames Ide 90740b3867SJames Ide let error; 91740b3867SJames Ide try { 92740b3867SJames Ide await FS.deleteAsync(localUri); 93740b3867SJames Ide } catch (e) { 94740b3867SJames Ide error = e; 95740b3867SJames Ide } 96740b3867SJames Ide t.expect(error.message).toMatch(/not.*found/); 97740b3867SJames Ide }); 98740b3867SJames Ide 99740b3867SJames Ide /*t.it( 100740b3867SJames Ide 'download(md5, uri) -> read -> delete -> !exists -> read[error]', 101740b3867SJames Ide async () => { 102740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.txt'; 103740b3867SJames Ide 104740b3867SJames Ide const { 105740b3867SJames Ide md5, 106740b3867SJames Ide uri, 107740b3867SJames Ide } = await FS.downloadAsync( 108740b3867SJames Ide 'https://s3-us-west-1.amazonaws.com/test-suite-data/text-file.txt', 109740b3867SJames Ide localUri, 110740b3867SJames Ide { md5: true } 111740b3867SJames Ide ); 112740b3867SJames Ide t.expect(md5).toBe('86d73d2f11e507365f7ea8e7ec3cc4cb'); 113740b3867SJames Ide 114740b3867SJames Ide const string = await FS.readAsStringAsync(localUri); 115740b3867SJames Ide t.expect(string).toBe('hello, world\nthis is a test file\n'); 116740b3867SJames Ide 117740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 118740b3867SJames Ide 119740b3867SJames Ide let error; 120740b3867SJames Ide try { 121740b3867SJames Ide await FS.readAsStringAsync(localUri); 122740b3867SJames Ide } catch (e) { 123740b3867SJames Ide error = e; 124740b3867SJames Ide } 125740b3867SJames Ide t.expect(error).toBeTruthy(); 126740b3867SJames Ide }, 127740b3867SJames Ide 9000 128740b3867SJames Ide );*/ 129740b3867SJames Ide 130740b3867SJames Ide t.it('delete(idempotent) -> !exists -> write -> read -> write -> read', async () => { 131740b3867SJames Ide const localUri = FS.documentDirectory + 'write1.txt'; 132740b3867SJames Ide 133740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 134740b3867SJames Ide 135740b3867SJames Ide const { exists } = await FS.getInfoAsync(localUri); 136740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 137740b3867SJames Ide 138740b3867SJames Ide const writeAndVerify = async expected => { 139740b3867SJames Ide await FS.writeAsStringAsync(localUri, expected); 140740b3867SJames Ide const string = await FS.readAsStringAsync(localUri); 141740b3867SJames Ide t.expect(string).toBe(expected); 142740b3867SJames Ide }; 143740b3867SJames Ide 144740b3867SJames Ide await writeAndVerify('hello, world'); 145740b3867SJames Ide await writeAndVerify('hello, world!!!!!!'); 146740b3867SJames Ide }); 147740b3867SJames Ide 148740b3867SJames Ide t.it('delete(new) -> 2 * [write -> move -> !exists(orig) -> read(new)]', async () => { 149740b3867SJames Ide const from = FS.documentDirectory + 'from.txt'; 150740b3867SJames Ide const to = FS.documentDirectory + 'to.txt'; 151740b3867SJames Ide const contents = ['contents 1', 'contents 2']; 152740b3867SJames Ide 153740b3867SJames Ide await FS.deleteAsync(to, { idempotent: true }); 154740b3867SJames Ide 155740b3867SJames Ide // Move twice to make sure we can overwrite 156740b3867SJames Ide for (let i = 0; i < 2; ++i) { 157740b3867SJames Ide await FS.writeAsStringAsync(from, contents[i]); 158740b3867SJames Ide 159740b3867SJames Ide await FS.moveAsync({ from, to }); 160740b3867SJames Ide 161740b3867SJames Ide const { exists } = await FS.getInfoAsync(from); 162740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 163740b3867SJames Ide 164740b3867SJames Ide t.expect(await FS.readAsStringAsync(to)).toBe(contents[i]); 165740b3867SJames Ide } 166740b3867SJames Ide }); 167740b3867SJames Ide 168740b3867SJames Ide t.it('delete(new) -> 2 * [write -> copy -> exists(orig) -> read(new)]', async () => { 169740b3867SJames Ide const from = FS.documentDirectory + 'from.txt'; 170740b3867SJames Ide const to = FS.documentDirectory + 'to.txt'; 171740b3867SJames Ide const contents = ['contents 1', 'contents 2']; 172740b3867SJames Ide 173740b3867SJames Ide await FS.deleteAsync(to, { idempotent: true }); 174740b3867SJames Ide 175740b3867SJames Ide // Copy twice to make sure we can overwrite 176740b3867SJames Ide for (let i = 0; i < 2; ++i) { 177740b3867SJames Ide await FS.writeAsStringAsync(from, contents[i]); 178740b3867SJames Ide 179740b3867SJames Ide await FS.copyAsync({ from, to }); 180740b3867SJames Ide 181740b3867SJames Ide const { exists } = await FS.getInfoAsync(from); 182740b3867SJames Ide t.expect(exists).toBeTruthy(); 183740b3867SJames Ide 184740b3867SJames Ide t.expect(await FS.readAsStringAsync(to)).toBe(contents[i]); 185740b3867SJames Ide } 186740b3867SJames Ide }); 187740b3867SJames Ide 188740b3867SJames Ide t.it( 189740b3867SJames Ide 'delete(dir) -> write(dir/file)[error] -> mkdir(dir) ->' + 190740b3867SJames Ide 'mkdir(dir)[error] -> write(dir/file) -> read', 191740b3867SJames Ide async () => { 192740b3867SJames Ide let error; 193740b3867SJames Ide const path = FS.documentDirectory + 'dir/file'; 194740b3867SJames Ide const dir = FS.documentDirectory + 'dir'; 195740b3867SJames Ide const contents = 'hello, world'; 196740b3867SJames Ide 197740b3867SJames Ide await FS.deleteAsync(dir, { idempotent: true }); 198740b3867SJames Ide 199740b3867SJames Ide error = null; 200740b3867SJames Ide try { 201740b3867SJames Ide await FS.writeAsStringAsync(path, contents); 202740b3867SJames Ide } catch (e) { 203740b3867SJames Ide error = e; 204740b3867SJames Ide } 205740b3867SJames Ide t.expect(error).toBeTruthy(); 206740b3867SJames Ide 207740b3867SJames Ide await FS.makeDirectoryAsync(dir); 208740b3867SJames Ide 209740b3867SJames Ide error = null; 210740b3867SJames Ide try { 211740b3867SJames Ide await FS.makeDirectoryAsync(dir); 212740b3867SJames Ide } catch (e) { 213740b3867SJames Ide error = e; 214740b3867SJames Ide } 215740b3867SJames Ide t.expect(error).toBeTruthy(); 216740b3867SJames Ide 217740b3867SJames Ide await FS.writeAsStringAsync(path, contents); 218740b3867SJames Ide 219740b3867SJames Ide t.expect(await FS.readAsStringAsync(path)).toBe(contents); 220740b3867SJames Ide } 221740b3867SJames Ide ); 222740b3867SJames Ide 223740b3867SJames Ide t.it( 224740b3867SJames Ide 'delete(dir) -> write(dir/dir2/file)[error] -> ' + 225740b3867SJames Ide 'mkdir(dir/dir2, intermediates) -> ' + 226740b3867SJames Ide 'mkdir(dir/dir2, intermediates) -> write(dir/dir2/file) -> read', 227740b3867SJames Ide async () => { 228740b3867SJames Ide let error; 229740b3867SJames Ide const path = FS.documentDirectory + 'dir/dir2/file'; 230740b3867SJames Ide const dir = FS.documentDirectory + 'dir/dir2'; 231740b3867SJames Ide const contents = 'hello, world'; 232740b3867SJames Ide 233740b3867SJames Ide await FS.deleteAsync(dir, { idempotent: true }); 234740b3867SJames Ide 235740b3867SJames Ide error = null; 236740b3867SJames Ide try { 237740b3867SJames Ide await FS.writeAsStringAsync(path, contents); 238740b3867SJames Ide } catch (e) { 239740b3867SJames Ide error = e; 240740b3867SJames Ide } 241740b3867SJames Ide t.expect(error).toBeTruthy(); 242740b3867SJames Ide 243740b3867SJames Ide await FS.makeDirectoryAsync(dir, { 244740b3867SJames Ide intermediates: true, 245740b3867SJames Ide }); 246740b3867SJames Ide 247740b3867SJames Ide error = null; 248740b3867SJames Ide try { 249740b3867SJames Ide await FS.makeDirectoryAsync(dir); 250740b3867SJames Ide } catch (e) { 251740b3867SJames Ide error = e; 252740b3867SJames Ide } 253740b3867SJames Ide t.expect(error).toBeTruthy(); 254740b3867SJames Ide 255740b3867SJames Ide await FS.writeAsStringAsync(path, contents); 256740b3867SJames Ide 257740b3867SJames Ide t.expect(await FS.readAsStringAsync(path)).toBe(contents); 258740b3867SJames Ide } 259740b3867SJames Ide ); 260740b3867SJames Ide 261740b3867SJames Ide t.it( 262740b3867SJames Ide 'delete(dir, idempotent) -> make tree -> check contents ' + 263740b3867SJames Ide '-> check directory listings' + 264740b3867SJames Ide '-> move -> check directory listings' + 265740b3867SJames Ide '-> copy -> check directory listings', 266740b3867SJames Ide async () => { 267740b3867SJames Ide let error; 268740b3867SJames Ide const dir = FS.documentDirectory + 'dir'; 269740b3867SJames Ide 270740b3867SJames Ide await FS.deleteAsync(dir, { idempotent: true }); 271740b3867SJames Ide 272740b3867SJames Ide await FS.makeDirectoryAsync(dir + '/child1', { 273740b3867SJames Ide intermediates: true, 274740b3867SJames Ide }); 275740b3867SJames Ide await FS.makeDirectoryAsync(dir + '/child2', { 276740b3867SJames Ide intermediates: true, 277740b3867SJames Ide }); 278740b3867SJames Ide 279740b3867SJames Ide await FS.writeAsStringAsync(dir + '/file1', 'contents1'); 280740b3867SJames Ide await FS.writeAsStringAsync(dir + '/file2', 'contents2'); 281740b3867SJames Ide 282740b3867SJames Ide await FS.writeAsStringAsync(dir + '/child1/file3', 'contents3'); 283740b3867SJames Ide 284740b3867SJames Ide await FS.writeAsStringAsync(dir + '/child2/file4', 'contents4'); 285740b3867SJames Ide await FS.writeAsStringAsync(dir + '/child2/file5', 'contents5'); 286740b3867SJames Ide 287740b3867SJames Ide const checkContents = async (path, contents) => 288740b3867SJames Ide t.expect(await FS.readAsStringAsync(path)).toBe(contents); 289740b3867SJames Ide 290740b3867SJames Ide await checkContents(dir + '/file1', 'contents1'); 291740b3867SJames Ide await checkContents(dir + '/file2', 'contents2'); 292740b3867SJames Ide await checkContents(dir + '/child1/file3', 'contents3'); 293740b3867SJames Ide await checkContents(dir + '/child2/file4', 'contents4'); 294740b3867SJames Ide await checkContents(dir + '/child2/file5', 'contents5'); 295740b3867SJames Ide 296740b3867SJames Ide const checkDirectory = async (path, expected) => { 297740b3867SJames Ide const list = await FS.readDirectoryAsync(path); 298740b3867SJames Ide t.expect(list.sort()).toEqual(expected.sort()); 299740b3867SJames Ide }; 300740b3867SJames Ide 301740b3867SJames Ide const checkRoot = async root => { 302740b3867SJames Ide await checkDirectory(root, ['file1', 'file2', 'child1', 'child2']); 303740b3867SJames Ide await checkDirectory(root + '/child1', ['file3']); 304740b3867SJames Ide await checkDirectory(root + '/child2', ['file4', 'file5']); 305740b3867SJames Ide 306740b3867SJames Ide error = null; 307740b3867SJames Ide try { 308740b3867SJames Ide await checkDirectory(root + '/file1', ['nope']); 309740b3867SJames Ide } catch (e) { 310740b3867SJames Ide error = e; 311740b3867SJames Ide } 312740b3867SJames Ide t.expect(error).toBeTruthy(); 313740b3867SJames Ide }; 314740b3867SJames Ide 315740b3867SJames Ide await checkRoot(dir); 316740b3867SJames Ide 317740b3867SJames Ide await FS.deleteAsync(FS.documentDirectory + 'moved', { 318740b3867SJames Ide idempotent: true, 319740b3867SJames Ide }); 320740b3867SJames Ide await FS.moveAsync({ from: dir, to: FS.documentDirectory + 'moved' }); 321740b3867SJames Ide await checkRoot(FS.documentDirectory + 'moved'); 322740b3867SJames Ide await FS.copyAsync({ 323740b3867SJames Ide from: FS.documentDirectory + 'moved', 324740b3867SJames Ide to: FS.documentDirectory + 'copied', 325740b3867SJames Ide }); 326740b3867SJames Ide await checkRoot(FS.documentDirectory + 'copied'); 327740b3867SJames Ide } 328740b3867SJames Ide ); 329740b3867SJames Ide 330740b3867SJames Ide t.it( 331740b3867SJames Ide 'delete(idempotent) -> download(md5) -> getInfo(size)', 332740b3867SJames Ide async () => { 333740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.png'; 334740b3867SJames Ide 335740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 336740b3867SJames Ide 337740b3867SJames Ide const { 338740b3867SJames Ide md5, 339740b3867SJames Ide } = await FS.downloadAsync( 340740b3867SJames Ide 'https://s3-us-west-1.amazonaws.com/test-suite-data/avatar2.png', 341740b3867SJames Ide localUri, 342740b3867SJames Ide { md5: true } 343740b3867SJames Ide ); 344740b3867SJames Ide t.expect(md5).toBe('1e02045c10b8f1145edc7c8375998f87'); 345740b3867SJames Ide 346740b3867SJames Ide const { size, modificationTime } = await FS.getInfoAsync(localUri); 347740b3867SJames Ide t.expect(size).toBe(3230); 348740b3867SJames Ide const nowTime = 0.001 * new Date().getTime(); 349740b3867SJames Ide t.expect(nowTime - modificationTime).toBeLessThan(3600); 350740b3867SJames Ide 351740b3867SJames Ide await FS.deleteAsync(localUri); 352740b3867SJames Ide }, 353740b3867SJames Ide 9000 354740b3867SJames Ide ); 355740b3867SJames Ide 356740b3867SJames Ide t.it('throws out-of-scope exceptions', async () => { 357740b3867SJames Ide const p = FS.documentDirectory; 358740b3867SJames Ide 359740b3867SJames Ide await throws(() => FS.getInfoAsync(p + '../hello/world')); 360740b3867SJames Ide await throws(() => FS.readAsStringAsync(p + '../hello/world')); 361740b3867SJames Ide await throws(() => FS.writeAsStringAsync(p + '../hello/world', '')); 362740b3867SJames Ide await throws(() => FS.deleteAsync(p + '../hello/world')); 363740b3867SJames Ide await throws(() => FS.deleteAsync(p)); 364740b3867SJames Ide await throws(() => FS.deleteAsync(FS.cacheDirectory)); 365740b3867SJames Ide await throws(() => FS.moveAsync({ from: p + '../a/b', to: 'c' })); 366740b3867SJames Ide await throws(() => FS.moveAsync({ from: 'c', to: p + '../a/b' })); 367740b3867SJames Ide await throws(() => FS.copyAsync({ from: p + '../a/b', to: 'c' })); 368740b3867SJames Ide await throws(() => FS.copyAsync({ from: 'c', to: p + '../a/b' })); 369740b3867SJames Ide await throws(() => FS.makeDirectoryAsync(p + '../hello/world')); 370740b3867SJames Ide await throws(() => FS.readDirectoryAsync(p + '../hello/world')); 371740b3867SJames Ide await throws(() => FS.downloadAsync('http://www.google.com', p + '../hello/world')); 372740b3867SJames Ide await throws(() => FS.readDirectoryAsync(p + '../')); 373740b3867SJames Ide await throws(() => FS.downloadAsync('http://www.google.com', p + '../hello/world')); 374740b3867SJames Ide }); 375740b3867SJames Ide 376740b3867SJames Ide t.it('missing parameters', async () => { 377740b3867SJames Ide const p = FS.documentDirectory + 'test'; 378740b3867SJames Ide 379740b3867SJames Ide await throws(() => FS.moveAsync({ from: p })); 380740b3867SJames Ide await throws(() => FS.moveAsync({ to: p })); 381740b3867SJames Ide await throws(() => FS.copyAsync({ from: p })); 382740b3867SJames Ide await throws(() => FS.copyAsync({ to: p })); 383740b3867SJames Ide }); 384740b3867SJames Ide 385740b3867SJames Ide t.it('can read root directories', async () => { 386740b3867SJames Ide await FS.readDirectoryAsync(FS.documentDirectory); 387740b3867SJames Ide await FS.readDirectoryAsync(FS.cacheDirectory); 388740b3867SJames Ide }); 389740b3867SJames Ide 390740b3867SJames Ide /*t.it('can copy from `CameraRoll`, verify hash, other methods restricted', async () => { 391740b3867SJames Ide await Promise.all( 392740b3867SJames Ide (await CameraRoll.getPhotos({ 393740b3867SJames Ide first: 1, 394740b3867SJames Ide })).edges.map(async ({ node: { image: { uri: cameraRollUri } } }) => { 395740b3867SJames Ide const destinationUri = FS.documentDirectory + 'photo.jpg'; 396740b3867SJames Ide 397740b3867SJames Ide await throws(() => FS.readAsStringAsync(cameraRollUri)); 398740b3867SJames Ide await throws(() => FS.writeAsStringAsync(cameraRollUri)); 399740b3867SJames Ide await throws(() => FS.deleteAsync(cameraRollUri)); 400740b3867SJames Ide await throws(() => FS.moveAsync({ from: cameraRollUri, to: destinationUri })); 401740b3867SJames Ide await throws(() => FS.copyAsync({ from: destinationUri, to: cameraRollUri })); 402740b3867SJames Ide await throws(() => FS.makeDirectoryAsync(cameraRollUri)); 403740b3867SJames Ide await throws(() => FS.readDirectoryAsync(cameraRollUri)); 404740b3867SJames Ide await throws(() => FS.downloadAsync('http://www.google.com', cameraRollUri)); 405740b3867SJames Ide 406740b3867SJames Ide await FS.copyAsync({ from: cameraRollUri, to: destinationUri }); 407740b3867SJames Ide 408740b3867SJames Ide const origInfo = await FS.getInfoAsync(cameraRollUri, { 409740b3867SJames Ide size: true, 410740b3867SJames Ide md5: true, 411740b3867SJames Ide }); 412740b3867SJames Ide const copyInfo = await FS.getInfoAsync(destinationUri, { 413740b3867SJames Ide size: true, 414740b3867SJames Ide md5: true, 415740b3867SJames Ide }); 416740b3867SJames Ide 417740b3867SJames Ide t.expect(origInfo.md5).toEqual(copyInfo.md5); 418740b3867SJames Ide t.expect(origInfo.size).toEqual(copyInfo.size); 419740b3867SJames Ide }) 420740b3867SJames Ide ); 421740b3867SJames Ide });*/ 422740b3867SJames Ide 423740b3867SJames Ide t.it( 424740b3867SJames Ide 'download(network failure)', 425740b3867SJames Ide async () => { 426740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.png'; 427740b3867SJames Ide 428740b3867SJames Ide const assertExists = async expectedToExist => { 429740b3867SJames Ide let { exists } = await FS.getInfoAsync(localUri); 430740b3867SJames Ide if (expectedToExist) { 431740b3867SJames Ide t.expect(exists).toBeTruthy(); 432740b3867SJames Ide } else { 433740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 434740b3867SJames Ide } 435740b3867SJames Ide }; 436740b3867SJames Ide 437740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 438740b3867SJames Ide await assertExists(false); 439740b3867SJames Ide 440740b3867SJames Ide let error; 441740b3867SJames Ide try { 442740b3867SJames Ide const { md5, uri } = await FS.downloadAsync( 443740b3867SJames Ide 'https://nonexistent-subdomain.expo.io', 444740b3867SJames Ide localUri, 445740b3867SJames Ide { md5: true } 446740b3867SJames Ide ); 447740b3867SJames Ide } catch (e) { 448740b3867SJames Ide error = e; 449740b3867SJames Ide } 450740b3867SJames Ide t.expect(error).toBeTruthy(); 451740b3867SJames Ide await assertExists(false); 452740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 453740b3867SJames Ide }, 454740b3867SJames Ide 9000 455740b3867SJames Ide ); 456740b3867SJames Ide 457740b3867SJames Ide t.it( 458740b3867SJames Ide 'download(404)', 459740b3867SJames Ide async () => { 460740b3867SJames Ide const localUri = FS.documentDirectory + 'download1.png'; 461740b3867SJames Ide 462740b3867SJames Ide const assertExists = async expectedToExist => { 463740b3867SJames Ide let { exists } = await FS.getInfoAsync(localUri); 464740b3867SJames Ide if (expectedToExist) { 465740b3867SJames Ide t.expect(exists).toBeTruthy(); 466740b3867SJames Ide } else { 467740b3867SJames Ide t.expect(exists).not.toBeTruthy(); 468740b3867SJames Ide } 469740b3867SJames Ide }; 470740b3867SJames Ide 471740b3867SJames Ide await FS.deleteAsync(localUri, { idempotent: true }); 472740b3867SJames Ide await assertExists(false); 473740b3867SJames Ide 474740b3867SJames Ide const { md5, uri, status } = await FS.downloadAsync('https://expo.io/404', localUri, { 475740b3867SJames Ide md5: true, 476740b3867SJames Ide }); 477740b3867SJames Ide await assertExists(true); 478740b3867SJames Ide t.expect(status).toBe(404); 479740b3867SJames Ide 480740b3867SJames Ide await FS.deleteAsync(localUri); 481740b3867SJames Ide await assertExists(false); 482740b3867SJames Ide }, 483740b3867SJames Ide 9000 484740b3867SJames Ide ); 485740b3867SJames Ide }); 486740b3867SJames Ide} 487