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