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