18d307f52SEvan Bacon/* eslint-env jest */
2e1bb5bdfSKudo Chienimport { ExecaError } from 'execa';
38d307f52SEvan Baconimport fs from 'fs/promises';
48d307f52SEvan Bacon
58d307f52SEvan Baconimport { execute, getLoadedModulesAsync, projectRoot } from './utils';
68d307f52SEvan Bacon
78d307f52SEvan Baconconst originalForceColor = process.env.FORCE_COLOR;
88d307f52SEvan Baconconst originalCI = process.env.CI;
98d307f52SEvan BaconbeforeAll(async () => {
108d307f52SEvan Bacon  await fs.mkdir(projectRoot, { recursive: true });
118d307f52SEvan Bacon  process.env.FORCE_COLOR = '0';
128d307f52SEvan Bacon  process.env.CI = '1';
138d307f52SEvan Bacon});
148d307f52SEvan BaconafterAll(() => {
158d307f52SEvan Bacon  process.env.FORCE_COLOR = originalForceColor;
168d307f52SEvan Bacon  process.env.CI = originalCI;
178d307f52SEvan Bacon});
188d307f52SEvan Bacon
198d307f52SEvan Baconit('loads expected modules by default', async () => {
208d307f52SEvan Bacon  const modules = await getLoadedModulesAsync(`require('../../build/src/login');`);
218d307f52SEvan Bacon  expect(modules).toStrictEqual([
22*4067174dSWill Schurman    '../node_modules/ansi-styles/index.js',
238d307f52SEvan Bacon    '../node_modules/arg/index.js',
248d307f52SEvan Bacon    '../node_modules/chalk/source/index.js',
258d307f52SEvan Bacon    '../node_modules/chalk/source/util.js',
268d307f52SEvan Bacon    '../node_modules/has-flag/index.js',
278d307f52SEvan Bacon    '../node_modules/supports-color/index.js',
288d307f52SEvan Bacon    '@expo/cli/build/src/log.js',
298d307f52SEvan Bacon    '@expo/cli/build/src/login/index.js',
308d307f52SEvan Bacon    '@expo/cli/build/src/utils/args.js',
318d307f52SEvan Bacon    '@expo/cli/build/src/utils/errors.js',
328d307f52SEvan Bacon  ]);
338d307f52SEvan Bacon});
348d307f52SEvan Bacon
358d307f52SEvan Baconit('runs `npx expo login --help`', async () => {
368d307f52SEvan Bacon  const results = await execute('login', '--help');
378d307f52SEvan Bacon  expect(results.stdout).toMatchInlineSnapshot(`
388d307f52SEvan Bacon    "
3983d464dcSEvan Bacon      Info
408d307f52SEvan Bacon        Log in to an Expo account
418d307f52SEvan Bacon
428d307f52SEvan Bacon      Usage
438d307f52SEvan Bacon        $ npx expo login
448d307f52SEvan Bacon
458d307f52SEvan Bacon      Options
468d307f52SEvan Bacon        -u, --username <string>  Username
478d307f52SEvan Bacon        -p, --password <string>  Password
488d307f52SEvan Bacon        --otp <string>           One-time password from your 2FA device
4983d464dcSEvan Bacon        -h, --help               Usage info
508d307f52SEvan Bacon    "
518d307f52SEvan Bacon  `);
528d307f52SEvan Bacon});
538d307f52SEvan Bacon
548d307f52SEvan Baconit('throws on invalid project root', async () => {
558d307f52SEvan Bacon  expect.assertions(1);
568d307f52SEvan Bacon  try {
578d307f52SEvan Bacon    await execute('very---invalid', 'login');
588d307f52SEvan Bacon  } catch (e) {
59e1bb5bdfSKudo Chien    const error = e as ExecaError;
60e1bb5bdfSKudo Chien    expect(error.stderr).toMatch(/Invalid project root: \//);
618d307f52SEvan Bacon  }
628d307f52SEvan Bacon});
638d307f52SEvan Bacon
648d307f52SEvan Baconit('runs `npx expo login` and throws due to CI', async () => {
658d307f52SEvan Bacon  expect.assertions(2);
668d307f52SEvan Bacon  try {
678d307f52SEvan Bacon    console.log(await execute('login'));
688d307f52SEvan Bacon  } catch (e) {
69e1bb5bdfSKudo Chien    const error = e as ExecaError;
70e1bb5bdfSKudo Chien    expect(error.stderr).toMatch(/Input is required/);
71e1bb5bdfSKudo Chien    expect(error.stderr).toMatch(/Use the EXPO_TOKEN environment variable to authenticate in CI/);
728d307f52SEvan Bacon  }
738d307f52SEvan Bacon});
748d307f52SEvan Bacon
758d307f52SEvan Baconit('runs `npx expo login` and throws due to invalid credentials', async () => {
768d307f52SEvan Bacon  expect.assertions(1);
778d307f52SEvan Bacon  try {
788d307f52SEvan Bacon    console.log(await execute('login', '--username', 'bacon', '--password', 'invalid'));
798d307f52SEvan Bacon  } catch (e) {
80e1bb5bdfSKudo Chien    const error = e as ExecaError;
81e1bb5bdfSKudo Chien    expect(error.stderr).toMatch(/Your username, email, or password was incorrect/);
828d307f52SEvan Bacon  }
838d307f52SEvan Bacon});
84