xref: /expo/apps/test-suite/tests/Battery.js (revision 19cbf4dc)
1import * as Battery from 'expo-battery';
2import * as Device from 'expo-device';
3import { Platform } from 'expo-modules-core';
4
5export const name = 'Battery';
6
7export async function test({ describe, it, expect, jasmine }) {
8  const isExpectedToSupport = Device.isDevice || Platform.OS === 'android';
9
10  describe('Battery', async () => {
11    describe(`isAvailableAsync`, () => {
12      it(
13        isExpectedToSupport
14          ? `should be true for Android or iOS devices`
15          : `should be false on iOS simulator`,
16        async () => {
17          expect(await Battery.isAvailableAsync()).toEqual(isExpectedToSupport);
18        }
19      );
20    });
21
22    const isAvailable = await Battery.isAvailableAsync();
23
24    if (isAvailable) {
25      describe(`getBatteryLevelAsync()`, () => {
26        it(`returns a number between 0 and 1`, async () => {
27          const batteryLevel = await Battery.getBatteryLevelAsync();
28          expect(batteryLevel).toEqual(jasmine.any(Number));
29          expect(batteryLevel).toBeLessThanOrEqual(1);
30          expect(batteryLevel).toBeGreaterThan(0);
31        });
32      });
33      describe(`getBatteryState()`, () => {
34        it(`returns a valid BatteryState enum value`, async () => {
35          const batteryState = await Battery.getBatteryStateAsync();
36          expect(
37            [
38              Battery.BatteryState.CHARGING,
39              Battery.BatteryState.FULL,
40              Battery.BatteryState.UNPLUGGED,
41            ].includes(batteryState)
42          ).toBe(true);
43        });
44      });
45      describe(`isLowPowerModeEnabledAsync()`, () => {
46        it(`returns a boolean low power mode`, async () => {
47          const lowPowerMode = await Battery.isLowPowerModeEnabledAsync();
48          expect(lowPowerMode).toEqual(jasmine.any(Boolean));
49        });
50      });
51      describe(`getPowerStateAsync()`, () => {
52        it(`returns a valid PowerState object`, async () => {
53          const powerState = await Battery.getPowerStateAsync();
54          expect(powerState).toEqual(
55            jasmine.objectContaining({
56              batteryLevel: jasmine.any(Number),
57              batteryState: jasmine.any(Number),
58              lowPowerMode: jasmine.any(Boolean),
59            })
60          );
61        });
62      });
63
64      describe(`Event listeners`, () => {
65        // TODO(Bacon) Add detox & spies
66        // TODO: check that events don't get fired after we unsubscribe
67        // but we currently don't have a way to programmatically set battery statuses
68
69        it(`addLowPowerModeListener() registers`, () => {
70          const listener = Battery.addLowPowerModeListener(({ lowPowerMode }) => {
71            console.log('powerMode changed!', lowPowerMode);
72          });
73          // TODO: Invoke callback somehow
74          expect(listener).toBeDefined();
75          listener.remove();
76        });
77        it(`addBatteryStateListener() registers`, () => {
78          const listener = Battery.addBatteryStateListener(({ batteryState }) => {
79            console.log('batteryState changed!', batteryState);
80          });
81          // TODO: Invoke callback somehow
82          expect(listener).toBeDefined();
83          listener.remove();
84        });
85        it(`addBatteryLevelListener() registers`, () => {
86          const listener = Battery.addBatteryLevelListener(({ batteryLevel }) => {
87            console.log('batteryLevel changed!', batteryLevel);
88          });
89          // TODO: Invoke callback somehow
90          expect(listener).toBeDefined();
91          listener.remove();
92        });
93      });
94    }
95  });
96}
97