1import { getUserTerminal } from '../terminal';
2
3const platform = process.platform;
4
5const mockPlatform = (value: typeof process.platform) =>
6  Object.defineProperty(process, 'platform', {
7    value,
8  });
9
10afterEach(() => {
11  mockPlatform(platform);
12});
13
14describe(getUserTerminal, () => {
15  // We go hard on testing environment variables because they're global, untyped, unversioned territory.
16  const originalValues = {
17    REACT_TERMINAL: process.env.REACT_TERMINAL,
18    TERM_PROGRAM: process.env.TERM_PROGRAM,
19    TERM: process.env.TERM,
20  };
21  afterEach(() => {
22    Object.keys(originalValues).forEach((key) => {
23      process.env[key] = originalValues[key];
24    });
25  });
26  beforeEach(() => {
27    mockPlatform('darwin');
28    Object.keys(originalValues).forEach((key) => {
29      delete process.env[key];
30    });
31  });
32  it('defaults to $TERM on non-darwin', () => {
33    mockPlatform('win32');
34    process.env.TERM_PROGRAM = 'TERM_PROGRAM';
35    process.env.TERM = 'TERM';
36    expect(getUserTerminal()).toEqual('TERM');
37  });
38  it('defaults to $TERM_PROGRAM on darwin', () => {
39    mockPlatform('darwin');
40    process.env.TERM_PROGRAM = 'TERM_PROGRAM';
41    process.env.TERM = 'TERM';
42    expect(getUserTerminal()).toEqual('TERM_PROGRAM');
43  });
44  it('uses $REACT_TERMINAL if defined', () => {
45    process.env.REACT_TERMINAL = 'REACT_TERMINAL';
46    process.env.TERM_PROGRAM = 'TERM_PROGRAM';
47    process.env.TERM = 'TERM';
48    for (const platform of ['darwin', 'win32'] as const) {
49      mockPlatform(platform);
50      expect(getUserTerminal()).toEqual('REACT_TERMINAL');
51    }
52  });
53  it('returns undefined when no terminals are defined', () => {
54    for (const platform of ['darwin', 'win32'] as const) {
55      mockPlatform(platform);
56      expect(getUserTerminal()).toEqual(undefined);
57    }
58  });
59});
60