1import ExpoScreenCapture from '../ExpoScreenCapture';
2import * as ScreenCapture from '../ScreenCapture';
3
4describe('ScreenCapture methods are defined', () => {
5  it('isAvailableAsync is defined', async () => {
6    expect(ScreenCapture.isAvailableAsync).toBeDefined();
7  });
8
9  it('preventScreenCapture is defined', async () => {
10    expect(ScreenCapture.preventScreenCaptureAsync).toBeDefined();
11  });
12
13  it('allowScreenCapture is defined', async () => {
14    expect(ScreenCapture.allowScreenCaptureAsync).toBeDefined();
15  });
16
17  it('usePreventScreenCapture hook is defined', async () => {
18    expect(ScreenCapture.usePreventScreenCapture).toBeDefined();
19  });
20
21  it('addScreenshotListener is defined', async () => {
22    expect(ScreenCapture.addScreenshotListener).toBeDefined();
23  });
24
25  it('removeScreenshotListener is defined', async () => {
26    expect(ScreenCapture.removeScreenshotListener).toBeDefined();
27  });
28});
29
30describe('Test key functionality', () => {
31  afterEach(async () => {
32    await cleanUpTags();
33  });
34
35  it('resolves true for isAvailableAsync on native platforms', async () => {
36    await expect(ScreenCapture.isAvailableAsync()).resolves.toBeTruthy();
37  });
38
39  it('Will not call the native method if default key already active', async () => {
40    await ScreenCapture.preventScreenCaptureAsync();
41    await ScreenCapture.preventScreenCaptureAsync();
42
43    await ScreenCapture.allowScreenCaptureAsync();
44
45    expect(ExpoScreenCapture.preventScreenCapture).toHaveBeenCalledTimes(1);
46    expect(ExpoScreenCapture.allowScreenCapture).toHaveBeenCalledTimes(1);
47  });
48
49  it('Passing a different key to allowScreenCaptureAsync does not re-enable screen capture', async () => {
50    await ScreenCapture.preventScreenCaptureAsync('foo');
51    await ScreenCapture.allowScreenCaptureAsync('bar');
52
53    expect(ExpoScreenCapture.preventScreenCapture).toHaveBeenCalledTimes(1);
54    expect(ExpoScreenCapture.allowScreenCapture).toHaveBeenCalledTimes(0);
55  });
56
57  it('Passing a key that is already active does not call the preventScreenCapture native method', async () => {
58    await ScreenCapture.preventScreenCaptureAsync('foo');
59    await ScreenCapture.preventScreenCaptureAsync('foo');
60
61    expect(ExpoScreenCapture.preventScreenCapture).toHaveBeenCalledTimes(1);
62  });
63
64  it('enabling two keys but only removing one results in the allowScreenCapture native method not being called', async () => {
65    await ScreenCapture.preventScreenCaptureAsync('foo');
66    await ScreenCapture.preventScreenCaptureAsync('bar');
67
68    await ScreenCapture.allowScreenCaptureAsync('bar');
69    expect(ExpoScreenCapture.allowScreenCapture).toHaveBeenCalledTimes(0);
70  });
71});
72
73async function cleanUpTags() {
74  // Otherwise, these tags would persist between tests
75  await ScreenCapture.allowScreenCaptureAsync();
76  await ScreenCapture.allowScreenCaptureAsync('foo');
77  await ScreenCapture.allowScreenCaptureAsync('bar');
78}
79