xref: /expo/apps/test-suite/tests/Device.js (revision e9cb279d)
1'use strict';
2
3import * as Device from 'expo-device';
4import { Platform } from 'react-native';
5
6export const name = 'Device';
7export async function test(t) {
8  t.describe(`Device.getDeviceType()`, () => {
9    t.it(`returns enum values`, async () => {
10      const deviceType = await Device.getDeviceTypeAsync();
11      t.expect(Object.values(Device.DeviceType).includes(deviceType)).toBeTruthy();
12    });
13  });
14
15  t.describe(`Device.getUptimeAsync()`, () => {
16    t.it(`calls getUptimeAsync() and returns number`, async () => {
17      const uptime = await Device.getUptimeAsync();
18      t.expect(uptime).toBeDefined();
19      t.expect(typeof uptime).toEqual('number');
20    });
21  });
22
23  if (Platform.OS === 'ios') {
24    t.describe(`Device on iOS`, () => {
25      t.it(`gets most constants and correct types`, async () => {
26        const brand = Device.brand;
27        const manufacturer = Device.manufacturer;
28        const modelName = Device.modelName;
29        const osName = Device.osName;
30        const totalMemory = Device.totalMemory;
31        const isDevice = Device.isDevice;
32        const osBuildId = Device.osBuildId;
33        const osInternalBuildId = Device.osInternalBuildId;
34        const osVersion = Device.osVersion;
35        const deviceName = Device.deviceName;
36        const deviceType = Device.deviceType;
37        const deviceYearClass = Device.deviceYearClass;
38        t.expect(brand).toBeDefined();
39        t.expect(typeof brand).toEqual('string');
40        t.expect(manufacturer).toBeDefined();
41        t.expect(typeof manufacturer).toEqual('string');
42        t.expect(modelName).toBeDefined();
43        t.expect(typeof modelName).toEqual('string');
44        t.expect(osName).toBeDefined();
45        t.expect(typeof osName).toEqual('string');
46        t.expect(totalMemory).toBeDefined();
47        t.expect(typeof totalMemory).toEqual('number');
48        t.expect(isDevice).toBeDefined();
49        t.expect(typeof isDevice).toEqual('boolean');
50        t.expect(osBuildId).toBeDefined();
51        t.expect(typeof osBuildId).toEqual('string');
52        t.expect(osInternalBuildId).toBeDefined();
53        t.expect(typeof osInternalBuildId).toEqual('string');
54        t.expect(osVersion).toBeDefined();
55        t.expect(typeof osVersion).toEqual('string');
56        t.expect(deviceYearClass).toBeDefined();
57        t.expect(typeof deviceYearClass).toEqual('number');
58        t.expect(deviceName).toBeDefined();
59        t.expect(typeof deviceName).toEqual('string');
60        t.expect(deviceType).toBeDefined();
61        t.expect(typeof deviceType).toEqual('number');
62      });
63
64      t.it(`doesn't get Android-only constants`, async () => {
65        const osBuildFingerprint = Device.osBuildFingerprint;
66        const designName = Device.designName;
67        const productName = Device.productName;
68        const platformApiLevel = Device.platformApiLevel;
69        t.expect(designName).toBeNull();
70        t.expect(productName).toBeNull();
71        t.expect(platformApiLevel).toBeNull();
72        t.expect(osBuildFingerprint).toBeNull();
73      });
74
75      t.it(`getPlatformFeaturesAsync() returns empty array on iOS`, async () => {
76        const allFeatures = await Device.getPlatformFeaturesAsync();
77        t.expect(allFeatures).toEqual([]);
78      });
79
80      t.it(`hasPlatformFeatureAsync() returns false on iOS`, async () => {
81        const hasFeature = await Device.hasPlatformFeatureAsync('amazon_fire_tv');
82        t.expect(hasFeature).toEqual(false);
83      });
84
85      t.it(`doesn't call getMaxMemoryAsync()`, async () => {
86        let error;
87        let maxMemory;
88        try {
89          maxMemory = await Device.getMaxMemoryAsync();
90        } catch (e) {
91          error = e;
92        }
93        t.expect(error).toBeDefined();
94        t.expect(typeof maxMemory).toEqual('undefined');
95      });
96
97      t.it(`doesn't call sideLoadingAsync()`, async () => {
98        let error;
99        let isSideLoading;
100        try {
101          isSideLoading = await Device.isSideLoadingEnabledAsync();
102        } catch (e) {
103          error = e;
104        }
105        t.expect(error).toBeDefined();
106        t.expect(typeof isSideLoading).toEqual('undefined');
107      });
108
109      t.it(`gets osBuildId same as osInternalBuildId`, async () => {
110        const osBuildId = await Device.osBuildId;
111        const osInternalBuildId = await Device.osInternalBuildId;
112        t.expect(Device.osBuildId).toBeTruthy();
113        t.expect(Device.osInternalBuildId).toBeTruthy();
114        t.expect(osBuildId).toEqual(osInternalBuildId);
115      });
116    });
117  } else if (Platform.OS === 'android') {
118    t.describe(`Device on Android`, () => {
119      t.it(`gets constants and correct types`, async () => {
120        const designName = await Device.designName;
121        const productName = await Device.productName;
122        const brand = await Device.brand;
123        const manufacturer = await Device.manufacturer;
124        const modelName = await Device.modelName;
125        const osName = await Device.osName;
126        const totalMemory = await Device.totalMemory;
127        const isDevice = await Device.isDevice;
128        const osBuildId = await Device.osBuildId;
129        const osBuildFingerprint = await Device.osBuildFingerprint;
130        const osInternalBuildId = await Device.osInternalBuildId;
131        const platformApiLevel = await Device.platformApiLevel;
132        const osVersion = await Device.osVersion;
133        const deviceName = await Device.deviceName;
134        const deviceYearClass = await Device.deviceYearClass;
135        t.expect(designName).toBeDefined();
136        t.expect(typeof designName).toEqual('string');
137        t.expect(productName).toBeDefined();
138        t.expect(typeof productName).toEqual('string');
139        t.expect(brand).toBeDefined();
140        t.expect(typeof brand).toEqual('string');
141        t.expect(manufacturer).toBeDefined();
142        t.expect(typeof manufacturer).toEqual('string');
143        t.expect(modelName).toBeDefined();
144        t.expect(typeof modelName).toEqual('string');
145        t.expect(osName).toBeDefined();
146        t.expect(typeof osName).toEqual('string');
147        t.expect(totalMemory).toBeDefined();
148        t.expect(typeof totalMemory).toEqual('number');
149        t.expect(isDevice).toBeDefined();
150        t.expect(typeof isDevice).toEqual('boolean');
151        t.expect(osBuildId).toBeDefined();
152        t.expect(typeof osBuildId).toEqual('string');
153        t.expect(osBuildFingerprint).toBeDefined();
154        t.expect(typeof osBuildFingerprint).toEqual('string');
155        t.expect(osInternalBuildId).toBeDefined();
156        t.expect(typeof osInternalBuildId).toEqual('string');
157        t.expect(platformApiLevel).toBeDefined();
158        t.expect(typeof platformApiLevel).toEqual('number');
159        t.expect(osVersion).toBeDefined();
160        t.expect(typeof osVersion).toEqual('string');
161        t.expect(deviceYearClass).toBeDefined();
162        t.expect(typeof deviceYearClass).toEqual('number');
163        if (isDevice) {
164          t.expect(deviceName).toBeDefined();
165          t.expect(typeof deviceName).toEqual('string');
166        } else {
167          t.expect(deviceName).toBeNull();
168        }
169      });
170
171      t.it(`doesn't get modelId`, async () => {
172        await Device.modelId;
173        t.expect(Device.modelId).toBeNull();
174      });
175
176      t.it(`calls hasPlatformFeatureAsync() with valid string and returns boolean`, async () => {
177        let error;
178        let hasFeature;
179        try {
180          hasFeature = await Device.hasPlatformFeatureAsync('amazon_fire_tv');
181        } catch (e) {
182          error = e;
183        }
184        t.expect(hasFeature).toEqual(t.jasmine.any(Boolean));
185        t.expect(error).toBeUndefined();
186      });
187
188      t.it(
189        `calls hasPlatformFeatureAsync() with invalid string format and returns false`,
190        async () => {
191          let error;
192          let hasFeature;
193          try {
194            hasFeature = await Device.hasPlatformFeatureAsync('camera');
195          } catch (e) {
196            error = e;
197          }
198          t.expect(hasFeature).toEqual(t.jasmine.any(Boolean));
199          t.expect(hasFeature).toEqual(false);
200          t.expect(error).toBeUndefined();
201        }
202      );
203
204      t.it(`calls getMaxMemoryAsync() and returns a number under integer limit`, async () => {
205        const maxMemory = await Device.getMaxMemoryAsync();
206        t.expect(maxMemory).toBeLessThanOrEqual(Number.MAX_SAFE_INTEGER);
207      });
208
209      t.it(`calls getPlatformFeaturesAsync()`, async () => {
210        const allFeatures = await Device.getPlatformFeaturesAsync();
211        t.expect(allFeatures).toBeDefined();
212      });
213    });
214  }
215}
216