163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
import { GlLoadingIcon } from '@gitlab/ui';
 | 
						|
import Vue from 'vue';
 | 
						|
import VueApollo from 'vue-apollo';
 | 
						|
import { mountExtended } from 'helpers/vue_test_utils_helper';
 | 
						|
import waitForPromises from 'helpers/wait_for_promises';
 | 
						|
import EditEnvironment from '~/environments/components/edit_environment.vue';
 | 
						|
import { createAlert } from '~/alert';
 | 
						|
import { visitUrl } from '~/lib/utils/url_utility';
 | 
						|
import getEnvironment from '~/environments/graphql/queries/environment.query.graphql';
 | 
						|
import updateEnvironment from '~/environments/graphql/mutations/update_environment.mutation.graphql';
 | 
						|
import { __ } from '~/locale';
 | 
						|
import createMockApollo from '../__helpers__/mock_apollo_helper';
 | 
						|
 | 
						|
jest.mock('~/lib/utils/url_utility');
 | 
						|
jest.mock('~/alert');
 | 
						|
 | 
						|
const environment = {
 | 
						|
  id: '1',
 | 
						|
  name: 'foo',
 | 
						|
  externalUrl: 'https://foo.example.com',
 | 
						|
  clusterAgent: null,
 | 
						|
  kubernetesNamespace: null,
 | 
						|
  fluxResourcePath: null,
 | 
						|
};
 | 
						|
const resolvedEnvironment = { project: { id: '1', environment } };
 | 
						|
const environmentUpdateSuccess = {
 | 
						|
  environment: { id: '1', path: 'path/to/environment', clusterAgentId: null },
 | 
						|
  errors: [],
 | 
						|
};
 | 
						|
const environmentUpdateError = {
 | 
						|
  environment: null,
 | 
						|
  errors: [{ message: 'uh oh!' }],
 | 
						|
};
 | 
						|
 | 
						|
const provide = {
 | 
						|
  projectEnvironmentsPath: '/projects/environments',
 | 
						|
  protectedEnvironmentSettingsPath: '/projects/1/settings/ci_cd',
 | 
						|
  projectPath: '/path/to/project',
 | 
						|
  environmentName: 'foo',
 | 
						|
};
 | 
						|
 | 
						|
describe('~/environments/components/edit.vue', () => {
 | 
						|
  let wrapper;
 | 
						|
 | 
						|
  const getEnvironmentQuery = jest.fn().mockResolvedValue({ data: resolvedEnvironment });
 | 
						|
 | 
						|
  const updateEnvironmentSuccess = jest
 | 
						|
    .fn()
 | 
						|
    .mockResolvedValue({ data: { environmentUpdate: environmentUpdateSuccess } });
 | 
						|
  const updateEnvironmentFail = jest
 | 
						|
    .fn()
 | 
						|
    .mockResolvedValue({ data: { environmentUpdate: environmentUpdateError } });
 | 
						|
 | 
						|
  const createMockApolloProvider = (mutationHandler) => {
 | 
						|
    Vue.use(VueApollo);
 | 
						|
 | 
						|
    const mocks = [
 | 
						|
      [getEnvironment, getEnvironmentQuery],
 | 
						|
      [updateEnvironment, mutationHandler],
 | 
						|
    ];
 | 
						|
 | 
						|
    return createMockApollo(mocks);
 | 
						|
  };
 | 
						|
 | 
						|
  const createWrapperWithApollo = async ({ mutationHandler = updateEnvironmentSuccess } = {}) => {
 | 
						|
    wrapper = mountExtended(EditEnvironment, {
 | 
						|
      propsData: { environment: {} },
 | 
						|
      provide: {
 | 
						|
        ...provide,
 | 
						|
      },
 | 
						|
      apolloProvider: createMockApolloProvider(mutationHandler),
 | 
						|
    });
 | 
						|
 | 
						|
    await waitForPromises();
 | 
						|
  };
 | 
						|
 | 
						|
  const findNameInput = () => wrapper.findByLabelText(__('Name'));
 | 
						|
  const findExternalUrlInput = () => wrapper.findByLabelText(__('External URL'));
 | 
						|
  const findForm = () => wrapper.findByRole('form', { name: __('Edit environment') });
 | 
						|
 | 
						|
  const showsLoading = () => wrapper.findComponent(GlLoadingIcon).exists();
 | 
						|
 | 
						|
  describe('default', () => {
 | 
						|
    it('performs the environment apollo query', () => {
 | 
						|
      createWrapperWithApollo();
 | 
						|
      expect(getEnvironmentQuery).toHaveBeenCalled();
 | 
						|
    });
 | 
						|
 | 
						|
    it('renders loading icon when environment query is loading', () => {
 | 
						|
      createWrapperWithApollo();
 | 
						|
      expect(showsLoading()).toBe(true);
 | 
						|
    });
 | 
						|
 | 
						|
    it('sets the title to Edit environment', async () => {
 | 
						|
      await createWrapperWithApollo();
 | 
						|
 | 
						|
      const header = wrapper.findByRole('heading', { name: __('Edit environment') });
 | 
						|
      expect(header.exists()).toBe(true);
 | 
						|
    });
 | 
						|
 | 
						|
    it('renders a disabled "Name" field', async () => {
 | 
						|
      await createWrapperWithApollo();
 | 
						|
 | 
						|
      const nameInput = findNameInput();
 | 
						|
      expect(nameInput.attributes().disabled).toBe('disabled');
 | 
						|
      expect(nameInput.element.value).toBe(environment.name);
 | 
						|
    });
 | 
						|
 | 
						|
    it('renders an "External URL" field', async () => {
 | 
						|
      await createWrapperWithApollo();
 | 
						|
 | 
						|
      const urlInput = findExternalUrlInput();
 | 
						|
      expect(urlInput.element.value).toBe(environment.externalUrl);
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  describe('on submit', () => {
 | 
						|
    it('performs the updateEnvironment apollo mutation', async () => {
 | 
						|
      await createWrapperWithApollo();
 | 
						|
      await findForm().trigger('submit');
 | 
						|
 | 
						|
      expect(updateEnvironmentSuccess).toHaveBeenCalled();
 | 
						|
    });
 | 
						|
 | 
						|
    describe('when mutation successful', () => {
 | 
						|
      beforeEach(async () => {
 | 
						|
        await createWrapperWithApollo();
 | 
						|
      });
 | 
						|
 | 
						|
      it('shows loader after form is submitted', async () => {
 | 
						|
        expect(showsLoading()).toBe(false);
 | 
						|
 | 
						|
        await findForm().trigger('submit');
 | 
						|
 | 
						|
        expect(showsLoading()).toBe(true);
 | 
						|
      });
 | 
						|
 | 
						|
      it('submits the updated environment on submit', async () => {
 | 
						|
        await findForm().trigger('submit');
 | 
						|
        await waitForPromises();
 | 
						|
 | 
						|
        expect(visitUrl).toHaveBeenCalledWith(environmentUpdateSuccess.environment.path);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('when mutation failed', () => {
 | 
						|
      beforeEach(async () => {
 | 
						|
        await createWrapperWithApollo({
 | 
						|
          mutationHandler: updateEnvironmentFail,
 | 
						|
        });
 | 
						|
      });
 | 
						|
 | 
						|
      it('shows errors on error', async () => {
 | 
						|
        await findForm().trigger('submit');
 | 
						|
        await waitForPromises();
 | 
						|
 | 
						|
        expect(createAlert).toHaveBeenCalledWith({ message: 'uh oh!' });
 | 
						|
        expect(showsLoading()).toBe(false);
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |