1624497a6SCedric van Puttenimport chalk from 'chalk';
2624497a6SCedric van Putten
3624497a6SCedric van Puttenimport * as Log from '../../log';
48d307f52SEvan Baconimport { isModuleSymlinked } from '../../utils/isModuleSymlinked';
54149568cSEvan Baconimport { hashForDependencyMap, updatePkgDependencies } from '../updatePackageJson';
68d307f52SEvan Bacon
78d307f52SEvan Baconjest.mock('../../utils/isModuleSymlinked');
8624497a6SCedric van Puttenjest.mock('../../log');
98d307f52SEvan Bacon
108d307f52SEvan Bacondescribe(hashForDependencyMap, () => {
118d307f52SEvan Bacon  it(`dependencies in any order hash to the same value`, () => {
128d307f52SEvan Bacon    expect(hashForDependencyMap({ a: '1.0.0', b: 2, c: '~3.0' })).toBe(
138d307f52SEvan Bacon      hashForDependencyMap({ c: '~3.0', b: 2, a: '1.0.0' })
148d307f52SEvan Bacon    );
158d307f52SEvan Bacon  });
168d307f52SEvan Bacon});
178d307f52SEvan Bacon
188d307f52SEvan Bacondescribe(updatePkgDependencies, () => {
198d307f52SEvan Bacon  beforeAll(() => {
208d307f52SEvan Bacon    (isModuleSymlinked as any).mockImplementation(() => false);
218d307f52SEvan Bacon  });
228d307f52SEvan Bacon  const requiredPackages = {
238d307f52SEvan Bacon    react: 'version-from-template-required-1',
248d307f52SEvan Bacon    'react-native': 'version-from-template-required-1',
258d307f52SEvan Bacon    'react-native-unimodules': 'version-from-template-required-1',
268d307f52SEvan Bacon    'expo-updates': 'version-from-template-required-1',
278d307f52SEvan Bacon  };
288d307f52SEvan Bacon
298d307f52SEvan Bacon  test('default bahaviour', () => {
308d307f52SEvan Bacon    const pkg = {
318d307f52SEvan Bacon      dependencies: {
328d307f52SEvan Bacon        'react-native': 'version-from-project',
338d307f52SEvan Bacon        'optional-package': 'version-from-project-1',
348d307f52SEvan Bacon        'optional-package-3': 'version-from-project-3',
358d307f52SEvan Bacon      },
368d307f52SEvan Bacon      devDependencies: {},
378d307f52SEvan Bacon    };
388d307f52SEvan Bacon    updatePkgDependencies('fake path', {
398d307f52SEvan Bacon      templatePkg: {
408d307f52SEvan Bacon        dependencies: {
418d307f52SEvan Bacon          ...requiredPackages,
428d307f52SEvan Bacon          'optional-package': 'version-from-template-1',
438d307f52SEvan Bacon          'optional-package-2': 'version-from-template-2',
448d307f52SEvan Bacon        },
458d307f52SEvan Bacon        devDependencies: {},
468d307f52SEvan Bacon      },
478d307f52SEvan Bacon      pkg,
488d307f52SEvan Bacon    });
498d307f52SEvan Bacon    expect(pkg.dependencies).toStrictEqual({
508d307f52SEvan Bacon      ...requiredPackages,
51624497a6SCedric van Putten      'react-native': 'version-from-project', // add-only package, do not overwrite
528d307f52SEvan Bacon      'optional-package': 'version-from-project-1',
538d307f52SEvan Bacon      'optional-package-2': 'version-from-template-2',
548d307f52SEvan Bacon      'optional-package-3': 'version-from-project-3',
558d307f52SEvan Bacon    });
568d307f52SEvan Bacon  });
578d307f52SEvan Bacon  test('with skipDependencyUpdate', () => {
588d307f52SEvan Bacon    const pkg = {
598d307f52SEvan Bacon      dependencies: {
608d307f52SEvan Bacon        'react-native': 'version-from-project',
618d307f52SEvan Bacon        'optional-package': 'version-from-project-1',
628d307f52SEvan Bacon        'optional-package-3': 'version-from-project-3',
638d307f52SEvan Bacon      },
648d307f52SEvan Bacon      devDependencies: {},
658d307f52SEvan Bacon    };
668d307f52SEvan Bacon    updatePkgDependencies('fake path', {
678d307f52SEvan Bacon      pkg,
688d307f52SEvan Bacon      templatePkg: {
698d307f52SEvan Bacon        dependencies: {
708d307f52SEvan Bacon          ...requiredPackages,
718d307f52SEvan Bacon          'react-native': 'version-from-project',
728d307f52SEvan Bacon          'optional-package': 'version-from-template-1',
738d307f52SEvan Bacon          'optional-package-2': 'version-from-template-2',
748d307f52SEvan Bacon        },
758d307f52SEvan Bacon        devDependencies: {},
768d307f52SEvan Bacon      },
778d307f52SEvan Bacon      skipDependencyUpdate: ['react-native'],
788d307f52SEvan Bacon    });
798d307f52SEvan Bacon    expect(pkg.dependencies).toStrictEqual({
808d307f52SEvan Bacon      ...requiredPackages,
818d307f52SEvan Bacon      'react-native': 'version-from-project',
828d307f52SEvan Bacon      'optional-package': 'version-from-project-1',
838d307f52SEvan Bacon      'optional-package-2': 'version-from-template-2',
848d307f52SEvan Bacon      'optional-package-3': 'version-from-project-3',
858d307f52SEvan Bacon    });
868d307f52SEvan Bacon  });
878d307f52SEvan Bacon  test('test expo-updates not required by default in sdk 44', () => {
888d307f52SEvan Bacon    const sdk44RequiredPackages = {
898d307f52SEvan Bacon      react: 'version-from-template-required-1',
908d307f52SEvan Bacon      'react-native': 'version-from-template-required-1',
918d307f52SEvan Bacon    };
928d307f52SEvan Bacon    const pkg = {
938d307f52SEvan Bacon      dependencies: {
948d307f52SEvan Bacon        'react-native': 'version-from-project',
958d307f52SEvan Bacon        'optional-package': 'version-from-project-1',
968d307f52SEvan Bacon        'optional-package-3': 'version-from-project-3',
978d307f52SEvan Bacon      },
988d307f52SEvan Bacon      devDependencies: {},
998d307f52SEvan Bacon    };
1008d307f52SEvan Bacon    updatePkgDependencies('fake path', {
1018d307f52SEvan Bacon      templatePkg: {
1028d307f52SEvan Bacon        dependencies: {
1038d307f52SEvan Bacon          ...sdk44RequiredPackages,
1048d307f52SEvan Bacon          'optional-package': 'version-from-template-1',
1058d307f52SEvan Bacon          'optional-package-2': 'version-from-template-2',
1068d307f52SEvan Bacon        },
1078d307f52SEvan Bacon        devDependencies: {},
1088d307f52SEvan Bacon      },
1098d307f52SEvan Bacon      pkg,
1108d307f52SEvan Bacon    });
1118d307f52SEvan Bacon    expect(pkg.dependencies).toStrictEqual({
1128d307f52SEvan Bacon      ...sdk44RequiredPackages,
113624497a6SCedric van Putten      'react-native': 'version-from-project', // add-only package, do not overwrite
1148d307f52SEvan Bacon      'optional-package': 'version-from-project-1',
1158d307f52SEvan Bacon      'optional-package-2': 'version-from-template-2',
1168d307f52SEvan Bacon      'optional-package-3': 'version-from-project-3',
1178d307f52SEvan Bacon    });
1188d307f52SEvan Bacon  });
119624497a6SCedric van Putten  test('does not overwrite add-only packages when defined', () => {
120624497a6SCedric van Putten    const pkg = {
121624497a6SCedric van Putten      dependencies: {
122624497a6SCedric van Putten        expo: 'version-from-project',
123624497a6SCedric van Putten        'react-native': 'version-from-project',
124624497a6SCedric van Putten      },
125624497a6SCedric van Putten      devDependencies: {},
126624497a6SCedric van Putten    };
127624497a6SCedric van Putten    updatePkgDependencies('fake path', {
128624497a6SCedric van Putten      templatePkg: {
129624497a6SCedric van Putten        dependencies: {
130624497a6SCedric van Putten          ...requiredPackages,
131624497a6SCedric van Putten          expo: 'version-from-template',
132624497a6SCedric van Putten        },
133624497a6SCedric van Putten        devDependencies: {},
134624497a6SCedric van Putten      },
135624497a6SCedric van Putten      pkg,
136624497a6SCedric van Putten    });
137624497a6SCedric van Putten    expect(pkg.dependencies).toStrictEqual({
138624497a6SCedric van Putten      ...requiredPackages,
139624497a6SCedric van Putten      'react-native': 'version-from-project', // add-only package, do not overwrite
140*7e91778dSCedric van Putten      expo: 'version-from-project',
141624497a6SCedric van Putten    });
142624497a6SCedric van Putten    expect(Log.warn).toBeCalledWith(
143624497a6SCedric van Putten      expect.stringContaining(
144*7e91778dSCedric van Putten        `instead of recommended ${[
145*7e91778dSCedric van Putten          `expo@version-from-template`,
146*7e91778dSCedric van Putten          `react-native@version-from-template-required-1`,
147*7e91778dSCedric van Putten        ]
148*7e91778dSCedric van Putten          .map((dep) => chalk.bold(dep))
149*7e91778dSCedric van Putten          .join(', ')}`
150624497a6SCedric van Putten      )
151624497a6SCedric van Putten    );
152624497a6SCedric van Putten  });
1538d307f52SEvan Bacon});
154