1import { isModuleSymlinked } from '../../utils/isModuleSymlinked';
2import { hashForDependencyMap, updatePkgDependencies } from '../updatePackageJson';
3
4jest.mock('../../utils/isModuleSymlinked');
5
6describe(hashForDependencyMap, () => {
7  it(`dependencies in any order hash to the same value`, () => {
8    expect(hashForDependencyMap({ a: '1.0.0', b: 2, c: '~3.0' })).toBe(
9      hashForDependencyMap({ c: '~3.0', b: 2, a: '1.0.0' })
10    );
11  });
12});
13
14describe(updatePkgDependencies, () => {
15  beforeAll(() => {
16    (isModuleSymlinked as any).mockImplementation(() => false);
17  });
18  const requiredPackages = {
19    react: 'version-from-template-required-1',
20    'react-native': 'version-from-template-required-1',
21    'react-native-unimodules': 'version-from-template-required-1',
22    'expo-updates': 'version-from-template-required-1',
23  };
24
25  test('default bahaviour', () => {
26    const pkg = {
27      dependencies: {
28        'react-native': 'version-from-project',
29        'optional-package': 'version-from-project-1',
30        'optional-package-3': 'version-from-project-3',
31      },
32      devDependencies: {},
33    };
34    updatePkgDependencies('fake path', {
35      templatePkg: {
36        dependencies: {
37          ...requiredPackages,
38          'optional-package': 'version-from-template-1',
39          'optional-package-2': 'version-from-template-2',
40        },
41        devDependencies: {},
42      },
43      pkg,
44    });
45    expect(pkg.dependencies).toStrictEqual({
46      ...requiredPackages,
47      'optional-package': 'version-from-project-1',
48      'optional-package-2': 'version-from-template-2',
49      'optional-package-3': 'version-from-project-3',
50    });
51  });
52  test('with skipDependencyUpdate', () => {
53    const pkg = {
54      dependencies: {
55        'react-native': 'version-from-project',
56        'optional-package': 'version-from-project-1',
57        'optional-package-3': 'version-from-project-3',
58      },
59      devDependencies: {},
60    };
61    updatePkgDependencies('fake path', {
62      pkg,
63      templatePkg: {
64        dependencies: {
65          ...requiredPackages,
66          'react-native': 'version-from-project',
67          'optional-package': 'version-from-template-1',
68          'optional-package-2': 'version-from-template-2',
69        },
70        devDependencies: {},
71      },
72      skipDependencyUpdate: ['react-native'],
73    });
74    expect(pkg.dependencies).toStrictEqual({
75      ...requiredPackages,
76      'react-native': 'version-from-project',
77      'optional-package': 'version-from-project-1',
78      'optional-package-2': 'version-from-template-2',
79      'optional-package-3': 'version-from-project-3',
80    });
81  });
82  test('test expo-updates not required by default in sdk 44', () => {
83    const sdk44RequiredPackages = {
84      react: 'version-from-template-required-1',
85      'react-native': 'version-from-template-required-1',
86    };
87    const pkg = {
88      dependencies: {
89        'react-native': 'version-from-project',
90        'optional-package': 'version-from-project-1',
91        'optional-package-3': 'version-from-project-3',
92      },
93      devDependencies: {},
94    };
95    updatePkgDependencies('fake path', {
96      templatePkg: {
97        dependencies: {
98          ...sdk44RequiredPackages,
99          'optional-package': 'version-from-template-1',
100          'optional-package-2': 'version-from-template-2',
101        },
102        devDependencies: {},
103      },
104      pkg,
105    });
106    expect(pkg.dependencies).toStrictEqual({
107      ...sdk44RequiredPackages,
108      'optional-package': 'version-from-project-1',
109      'optional-package-2': 'version-from-template-2',
110      'optional-package-3': 'version-from-project-3',
111    });
112  });
113});
114