1import * as BackgroundFetch from 'expo-background-fetch'; 2import * as TaskManager from 'expo-task-manager'; 3 4const DEFINED_TASK_NAME = 'defined task'; 5const UNDEFINED_TASK_NAME = 'undefined task'; 6 7export const name = 'TaskManager'; 8 9export async function test(t) { 10 const backgroundFetchOptions = { 11 minimumInterval: 15 * 60, // 15min in sec 12 stopOnTerminate: false, 13 startOnBoot: true, 14 }; 15 16 t.describe('TaskManager', () => { 17 t.describe('isTaskDefined()', () => { 18 t.it('returns true if task is defined', () => { 19 t.expect(TaskManager.isTaskDefined(DEFINED_TASK_NAME)).toBe(true); 20 }); 21 t.it('returns false if task is not defined', () => { 22 t.expect(TaskManager.isTaskDefined(UNDEFINED_TASK_NAME)).toBe(false); 23 }); 24 }); 25 26 t.describe('isTaskRegisteredAsync()', async () => { 27 t.beforeAll(async () => { 28 await BackgroundFetch.registerTaskAsync(DEFINED_TASK_NAME); 29 }); 30 31 t.it('returns true for registered tasks', async () => { 32 t.expect(await TaskManager.isTaskRegisteredAsync(DEFINED_TASK_NAME)).toBe(true); 33 }); 34 35 t.it('returns false for unregistered tasks', async () => { 36 t.expect(await TaskManager.isTaskRegisteredAsync(UNDEFINED_TASK_NAME)).toBe(false); 37 }); 38 39 t.afterAll(async () => { 40 await BackgroundFetch.unregisterTaskAsync(DEFINED_TASK_NAME); 41 }); 42 }); 43 44 t.describe('getTaskOptionsAsync()', async () => { 45 let taskOptions; 46 47 t.it('returns null for unregistered tasks', async () => { 48 taskOptions = await TaskManager.getTaskOptionsAsync(DEFINED_TASK_NAME); 49 t.expect(taskOptions).toBe(null); 50 }); 51 52 t.it('returns correct options after register', async () => { 53 await BackgroundFetch.registerTaskAsync(DEFINED_TASK_NAME, backgroundFetchOptions); 54 taskOptions = await TaskManager.getTaskOptionsAsync(DEFINED_TASK_NAME); 55 t.expect(taskOptions).toEqual(t.jasmine.objectContaining(backgroundFetchOptions)); 56 }); 57 58 t.it('returns null when unregistered', async () => { 59 await BackgroundFetch.unregisterTaskAsync(DEFINED_TASK_NAME); 60 taskOptions = await TaskManager.getTaskOptionsAsync(DEFINED_TASK_NAME); 61 t.expect(taskOptions).toBe(null); 62 }); 63 }); 64 65 t.describe('getRegisteredTasksAsync()', async () => { 66 let registeredTasks; 67 68 t.it('returns empty array if there are no tasks', async () => { 69 registeredTasks = await TaskManager.getRegisteredTasksAsync(); 70 t.expect(registeredTasks).toBeDefined(); 71 t.expect(registeredTasks.length).toBe(0); 72 }); 73 74 t.it('returns correct array after registering the task', async () => { 75 await BackgroundFetch.registerTaskAsync(DEFINED_TASK_NAME, backgroundFetchOptions); 76 77 registeredTasks = await TaskManager.getRegisteredTasksAsync(); 78 79 t.expect(registeredTasks).toBeDefined(); 80 t.expect(registeredTasks.length).toBe(1); 81 t.expect(registeredTasks.find((task) => task.taskName === DEFINED_TASK_NAME)).toEqual( 82 t.jasmine.objectContaining({ 83 taskName: DEFINED_TASK_NAME, 84 taskType: 'backgroundFetch', 85 options: backgroundFetchOptions, 86 }) 87 ); 88 }); 89 90 t.afterAll(async () => { 91 await BackgroundFetch.unregisterTaskAsync(DEFINED_TASK_NAME); 92 }); 93 }); 94 95 t.describe('unregisterAllTasksAsync()', () => { 96 t.it('unregisters tasks correctly', async () => { 97 await BackgroundFetch.registerTaskAsync(DEFINED_TASK_NAME, backgroundFetchOptions); 98 await TaskManager.unregisterAllTasksAsync(); 99 100 t.expect(await TaskManager.isTaskRegisteredAsync(DEFINED_TASK_NAME)).toBe(false); 101 t.expect((await TaskManager.getRegisteredTasksAsync()).length).toBe(0); 102 }); 103 }); 104 105 t.describe('rejections', () => { 106 t.it('should reject when trying to unregister non-existing tasks', async () => { 107 await BackgroundFetch.registerTaskAsync(DEFINED_TASK_NAME, backgroundFetchOptions); 108 109 let error; 110 try { 111 await BackgroundFetch.unregisterTaskAsync(UNDEFINED_TASK_NAME); 112 } catch (e) { 113 error = e; 114 } 115 t.expect(error).toBeDefined(); 116 t.expect(error.message).toMatch(/not found/); 117 118 await BackgroundFetch.unregisterTaskAsync(DEFINED_TASK_NAME); 119 }); 120 }); 121 }); 122} 123 124// Empty task so we can properly test some methods. 125// We are telling iOS that we successfully fetched new data, to prevent possible throttle from iOS 126TaskManager.defineTask(DEFINED_TASK_NAME, () => BackgroundFetch.BackgroundFetchResult.NewData); 127