summaryrefslogtreecommitdiff
path: root/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/pages/projects/forks/new/components/fork_form_spec.js')
-rw-r--r--spec/frontend/pages/projects/forks/new/components/fork_form_spec.js152
1 files changed, 91 insertions, 61 deletions
diff --git a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
index 2992c7f0624..6d853120232 100644
--- a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
+++ b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
@@ -1,5 +1,5 @@
-import { GlForm, GlFormInputGroup, GlFormInput } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { GlFormInputGroup, GlFormInput, GlForm } from '@gitlab/ui';
+import { mount, shallowMount } from '@vue/test-utils';
import axios from 'axios';
import AxiosMockAdapter from 'axios-mock-adapter';
import { kebabCase } from 'lodash';
@@ -43,8 +43,8 @@ describe('ForkForm component', () => {
axiosMock.onGet(DEFAULT_PROPS.endpoint).replyOnce(statusCode, data);
};
- const createComponent = (props = {}, data = {}) => {
- wrapper = shallowMount(ForkForm, {
+ const createComponentFactory = (mountFn) => (props = {}, data = {}) => {
+ wrapper = mountFn(ForkForm, {
provide: {
newGroupPath: 'some/groups/path',
visibilityHelpPath: 'some/visibility/help/path',
@@ -65,6 +65,9 @@ describe('ForkForm component', () => {
});
};
+ const createComponent = createComponentFactory(shallowMount);
+ const createFullComponent = createComponentFactory(mount);
+
beforeEach(() => {
axiosMock = new AxiosMockAdapter(axios);
window.gon = {
@@ -99,44 +102,6 @@ describe('ForkForm component', () => {
expect(cancelButton.attributes('href')).toBe(projectFullPath);
});
- it('make POST request with project param', async () => {
- jest.spyOn(axios, 'post');
-
- const namespaceId = 20;
-
- mockGetRequest();
- createComponent(
- {},
- {
- selectedNamespace: {
- id: namespaceId,
- },
- },
- );
-
- wrapper.find(GlForm).vm.$emit('submit', { preventDefault: () => {} });
-
- const {
- projectId,
- projectDescription,
- projectName,
- projectPath,
- projectVisibility,
- } = DEFAULT_PROPS;
-
- const url = `/api/${GON_API_VERSION}/projects/${projectId}/fork`;
- const project = {
- description: projectDescription,
- id: projectId,
- name: projectName,
- namespace_id: namespaceId,
- path: projectPath,
- visibility: projectVisibility,
- };
-
- expect(axios.post).toHaveBeenCalledWith(url, project);
- });
-
it('has input with csrf token', () => {
mockGetRequest();
createComponent();
@@ -258,9 +223,7 @@ describe('ForkForm component', () => {
projectVisibility: project,
},
{
- selectedNamespace: {
- visibility: namespace,
- },
+ form: { fields: { namespace: { value: { visibility: namespace } } } },
},
);
@@ -274,34 +237,101 @@ describe('ForkForm component', () => {
describe('onSubmit', () => {
beforeEach(() => {
jest.spyOn(urlUtility, 'redirectTo').mockImplementation();
+
+ mockGetRequest();
+ createFullComponent(
+ {},
+ {
+ namespaces: MOCK_NAMESPACES_RESPONSE,
+ form: {
+ state: true,
+ },
+ },
+ );
});
- it('redirect to POST web_url response', async () => {
- const webUrl = `new/fork-project`;
+ const selectedMockNamespaceIndex = 1;
+ const namespaceId = MOCK_NAMESPACES_RESPONSE[selectedMockNamespaceIndex].id;
- jest.spyOn(axios, 'post').mockResolvedValue({ data: { web_url: webUrl } });
+ const fillForm = async () => {
+ const namespaceOptions = findForkUrlInput().findAll('option');
- mockGetRequest();
- createComponent();
+ await namespaceOptions.at(selectedMockNamespaceIndex + 1).setSelected();
+ };
- await wrapper.vm.onSubmit();
+ const submitForm = async () => {
+ await fillForm();
+ const form = wrapper.find(GlForm);
- expect(urlUtility.redirectTo).toHaveBeenCalledWith(webUrl);
+ await form.trigger('submit');
+ await wrapper.vm.$nextTick();
+ };
+
+ describe('with invalid form', () => {
+ it('does not make POST request', async () => {
+ jest.spyOn(axios, 'post');
+
+ expect(axios.post).not.toHaveBeenCalled();
+ });
+
+ it('does not redirect the current page', async () => {
+ await submitForm();
+
+ expect(urlUtility.redirectTo).not.toHaveBeenCalled();
+ });
});
- it('display flash when POST is unsuccessful', async () => {
- const dummyError = 'Fork project failed';
+ describe('with valid form', () => {
+ beforeEach(() => {
+ fillForm();
+ });
- jest.spyOn(axios, 'post').mockRejectedValue(dummyError);
+ it('make POST request with project param', async () => {
+ jest.spyOn(axios, 'post');
+
+ await submitForm();
+
+ const {
+ projectId,
+ projectDescription,
+ projectName,
+ projectPath,
+ projectVisibility,
+ } = DEFAULT_PROPS;
+
+ const url = `/api/${GON_API_VERSION}/projects/${projectId}/fork`;
+ const project = {
+ description: projectDescription,
+ id: projectId,
+ name: projectName,
+ namespace_id: namespaceId,
+ path: projectPath,
+ visibility: projectVisibility,
+ };
- mockGetRequest();
- createComponent();
+ expect(axios.post).toHaveBeenCalledWith(url, project);
+ });
+
+ it('redirect to POST web_url response', async () => {
+ const webUrl = `new/fork-project`;
+ jest.spyOn(axios, 'post').mockResolvedValue({ data: { web_url: webUrl } });
+
+ await submitForm();
+
+ expect(urlUtility.redirectTo).toHaveBeenCalledWith(webUrl);
+ });
+
+ it('display flash when POST is unsuccessful', async () => {
+ const dummyError = 'Fork project failed';
+
+ jest.spyOn(axios, 'post').mockRejectedValue(dummyError);
- await wrapper.vm.onSubmit();
+ await submitForm();
- expect(urlUtility.redirectTo).not.toHaveBeenCalled();
- expect(createFlash).toHaveBeenCalledWith({
- message: dummyError,
+ expect(urlUtility.redirectTo).not.toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalledWith({
+ message: dummyError,
+ });
});
});
});