mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-11 04:22:13 +00:00
#8170 added a new message at the end of `vc env pull` which shows a delta of what was added, modified, and removed. Some people shared feedback that the yellow chalk color and `~` prefix to indicate modified variables was confusing. This PR instead keeps the prefix as `+` with a green color, but adds a `(Modified)` suffix at the end of every modified variable. <img width="638" alt="Screen Shot 2022-08-03 at 10 18 28 AM" src="https://user-images.githubusercontent.com/14811170/182670327-5a3df6db-d84d-40a1-956b-9cf159501759.png"> ### 📋 Checklist <!-- Please keep your PR as a Draft until the checklist is complete --> #### Tests - [x] The code changed/added as part of this PR has been covered with tests - [x] All tests pass locally with `yarn test-unit` #### Code Review - [ ] This PR has a concise title and thorough description useful to a reviewer - [ ] Issue from task tracker has a link to this PR
227 lines
7.4 KiB
TypeScript
227 lines
7.4 KiB
TypeScript
import fs from 'fs-extra';
|
||
import path from 'path';
|
||
import env from '../../../src/commands/env';
|
||
import { setupFixture } from '../../helpers/setup-fixture';
|
||
import { client } from '../../mocks/client';
|
||
import { defaultProject, useProject } from '../../mocks/project';
|
||
import { useTeams } from '../../mocks/team';
|
||
import { useUser } from '../../mocks/user';
|
||
|
||
describe('env', () => {
|
||
describe('pull', () => {
|
||
it('should handle pulling', async () => {
|
||
const cwd = setupFixture('vercel-env-pull');
|
||
useUser();
|
||
useTeams('team_dummy');
|
||
useProject({
|
||
...defaultProject,
|
||
id: 'vercel-env-pull',
|
||
name: 'vercel-env-pull',
|
||
});
|
||
client.setArgv('env', 'pull', '--yes', '--cwd', cwd);
|
||
const exitCodePromise = env(client);
|
||
await expect(client.stderr).toOutput(
|
||
'Downloading `development` Environment Variables for Project vercel-env-pull'
|
||
);
|
||
await expect(client.stderr).toOutput('Created .env file');
|
||
await expect(exitCodePromise).resolves.toEqual(0);
|
||
|
||
const rawDevEnv = await fs.readFile(path.join(cwd, '.env'));
|
||
|
||
// check for development env value
|
||
const devFileHasDevEnv = rawDevEnv.toString().includes('SPECIAL_FLAG');
|
||
expect(devFileHasDevEnv).toBeTruthy();
|
||
});
|
||
|
||
it('should handle alternate filename', async () => {
|
||
const cwd = setupFixture('vercel-env-pull');
|
||
useUser();
|
||
useTeams('team_dummy');
|
||
useProject({
|
||
...defaultProject,
|
||
id: 'vercel-env-pull',
|
||
name: 'vercel-env-pull',
|
||
});
|
||
client.setArgv('env', 'pull', 'other.env', '--yes', '--cwd', cwd);
|
||
const exitCodePromise = env(client);
|
||
await expect(client.stderr).toOutput(
|
||
'Downloading `development` Environment Variables for Project vercel-env-pull'
|
||
);
|
||
await expect(client.stderr).toOutput('Created other.env file');
|
||
await expect(exitCodePromise).resolves.toEqual(0);
|
||
|
||
const rawDevEnv = await fs.readFile(path.join(cwd, 'other.env'));
|
||
|
||
// check for development env value
|
||
const devFileHasDevEnv = rawDevEnv.toString().includes('SPECIAL_FLAG');
|
||
expect(devFileHasDevEnv).toBeTruthy();
|
||
});
|
||
|
||
it('should use given environment', async () => {
|
||
const cwd = setupFixture('vercel-env-pull');
|
||
useUser();
|
||
useTeams('team_dummy');
|
||
useProject({
|
||
...defaultProject,
|
||
id: 'vercel-env-pull',
|
||
name: 'vercel-env-pull',
|
||
});
|
||
|
||
client.setArgv(
|
||
'env',
|
||
'pull',
|
||
'--environment',
|
||
'production',
|
||
'--cwd',
|
||
cwd
|
||
);
|
||
const exitCodePromise = env(client);
|
||
await expect(client.stderr).toOutput(
|
||
`Downloading \`production\` Environment Variables for Project vercel-env-pull`
|
||
);
|
||
await expect(client.stderr).toOutput('Created .env file');
|
||
await expect(exitCodePromise).resolves.toEqual(0);
|
||
|
||
const rawProdEnv = await fs.readFile(path.join(cwd, '.env'));
|
||
|
||
// check for development env value
|
||
const envFileHasEnv = rawProdEnv
|
||
.toString()
|
||
.includes('REDIS_CONNECTION_STRING');
|
||
expect(envFileHasEnv).toBeTruthy();
|
||
});
|
||
|
||
it('should throw an error when it does not recognize given environment', async () => {
|
||
const cwd = setupFixture('vercel-env-pull');
|
||
useUser();
|
||
useTeams('team_dummy');
|
||
useProject({
|
||
...defaultProject,
|
||
id: 'vercel-env-pull',
|
||
name: 'vercel-env-pull',
|
||
});
|
||
|
||
client.setArgv(
|
||
'env',
|
||
'pull',
|
||
'.env.production',
|
||
'--environment',
|
||
'something-invalid',
|
||
'--cwd',
|
||
cwd
|
||
);
|
||
|
||
const exitCodePromise = env(client);
|
||
await expect(client.stderr).toOutput(
|
||
`Invalid environment \`something-invalid\`. Valid options: <production | preview | development>`
|
||
);
|
||
|
||
await expect(exitCodePromise).resolves.toEqual(1);
|
||
});
|
||
|
||
it('should expose production system env variables', async () => {
|
||
const cwd = setupFixture('vercel-env-pull');
|
||
useUser();
|
||
useTeams('team_dummy');
|
||
useProject({
|
||
...defaultProject,
|
||
id: 'vercel-env-pull',
|
||
name: 'vercel-env-pull',
|
||
autoExposeSystemEnvs: true,
|
||
});
|
||
|
||
client.setArgv('env', 'pull', 'other.env', '--yes', '--cwd', cwd);
|
||
const exitCodePromise = env(client);
|
||
await expect(client.stderr).toOutput(
|
||
'Downloading `development` Environment Variables for Project vercel-env-pull'
|
||
);
|
||
await expect(client.stderr).toOutput('Created other.env file');
|
||
await expect(exitCodePromise).resolves.toEqual(0);
|
||
|
||
const rawDevEnv = await fs.readFile(path.join(cwd, 'other.env'));
|
||
|
||
const productionFileHasVercelEnv = rawDevEnv
|
||
.toString()
|
||
.includes('VERCEL_ENV="development"');
|
||
expect(productionFileHasVercelEnv).toBeTruthy();
|
||
});
|
||
|
||
it('should show a delta string', async () => {
|
||
const cwd = setupFixture('vercel-env-pull-delta');
|
||
try {
|
||
useUser();
|
||
useTeams('team_dummy');
|
||
useProject({
|
||
...defaultProject,
|
||
id: 'env-pull-delta',
|
||
name: 'env-pull-delta',
|
||
});
|
||
|
||
client.setArgv('env', 'add', 'NEW_VAR', '--cwd', cwd);
|
||
const addPromise = env(client);
|
||
|
||
await expect(client.stderr).toOutput('What’s the value of NEW_VAR?');
|
||
client.stdin.write('testvalue\n');
|
||
|
||
await expect(client.stderr).toOutput(
|
||
'Add NEW_VAR to which Environments (select multiple)?'
|
||
);
|
||
client.stdin.write('\x1B[B'); // Down arrow
|
||
client.stdin.write('\x1B[B');
|
||
client.stdin.write(' ');
|
||
client.stdin.write('\r');
|
||
|
||
await expect(addPromise).resolves.toEqual(0);
|
||
|
||
client.setArgv('env', 'pull', '--yes', '--cwd', cwd);
|
||
const pullPromise = env(client);
|
||
await expect(client.stderr).toOutput(
|
||
'Downloading `development` Environment Variables for Project env-pull-delta'
|
||
);
|
||
await expect(client.stderr).toOutput(
|
||
'+ SPECIAL_FLAG (Updated)\n+ NEW_VAR\n- TEST\n'
|
||
);
|
||
await expect(client.stderr).toOutput('Updated .env file');
|
||
|
||
await expect(pullPromise).resolves.toEqual(0);
|
||
} finally {
|
||
client.setArgv('env', 'rm', 'NEW_VAR', '--yes', '--cwd', cwd);
|
||
await env(client);
|
||
}
|
||
});
|
||
|
||
it('should not show a delta string when it fails to read a file', async () => {
|
||
const cwd = setupFixture('vercel-env-pull-delta-corrupt');
|
||
useUser();
|
||
useTeams('team_dummy');
|
||
useProject({
|
||
...defaultProject,
|
||
id: 'env-pull-delta-corrupt',
|
||
name: 'env-pull-delta-corrupt',
|
||
});
|
||
|
||
client.setArgv('env', 'pull', '--yes', '--cwd', cwd);
|
||
const pullPromise = env(client);
|
||
await expect(client.stderr).toOutput('Updated .env file');
|
||
await expect(pullPromise).resolves.toEqual(0);
|
||
});
|
||
|
||
it('should show that no changes were found', async () => {
|
||
const cwd = setupFixture('vercel-env-pull-delta-no-changes');
|
||
useUser();
|
||
useTeams('team_dummy');
|
||
useProject({
|
||
...defaultProject,
|
||
id: 'env-pull-delta-no-changes',
|
||
name: 'env-pull-delta-no-changes',
|
||
});
|
||
|
||
client.setArgv('env', 'pull', '--yes', '--cwd', cwd);
|
||
const pullPromise = env(client);
|
||
await expect(client.stderr).toOutput('> No changes found.');
|
||
await expect(client.stderr).toOutput('Updated .env file');
|
||
await expect(pullPromise).resolves.toEqual(0);
|
||
});
|
||
});
|
||
});
|