Commit 634e7b77 authored by Filipa Lacerda's avatar Filipa Lacerda

Merge branch '3501-fix-rebase-in-ie' into 'master'

Fix rebase in IE

Closes #3501

See merge request gitlab-org/gitlab-ee!3732
parents 453cc7d4 21fb6b9f
...@@ -2,6 +2,8 @@ import axios from 'axios'; ...@@ -2,6 +2,8 @@ import axios from 'axios';
import csrf from './csrf'; import csrf from './csrf';
axios.defaults.headers.common[csrf.headerKey] = csrf.token; axios.defaults.headers.common[csrf.headerKey] = csrf.token;
// Used by Rails to check if it is a valid XHR request
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
// Maintain a global counter for active requests // Maintain a global counter for active requests
// see: spec/support/wait_for_requests.rb // see: spec/support/wait_for_requests.rb
......
---
title: Fix Merge Rquest widget rebase action in Internet Explorer
merge_request: 3732
author:
type: fixed
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
data() { data() {
return { return {
isMakingRequest: false, isMakingRequest: false,
rebasingError: '', rebasingError: null,
}; };
}, },
computed: { computed: {
...@@ -39,14 +39,11 @@ ...@@ -39,14 +39,11 @@
showDisabledButton() { showDisabledButton() {
return ['failed', 'loading'].includes(this.status); return ['failed', 'loading'].includes(this.status);
}, },
hasRebasingError() {
return this.rebasingError.length;
},
}, },
methods: { methods: {
rebase() { rebase() {
this.isMakingRequest = true; this.isMakingRequest = true;
this.rebasingError = ''; this.rebasingError = null;
this.service.rebase() this.service.rebase()
.then(() => { .then(() => {
...@@ -117,7 +114,7 @@ ...@@ -117,7 +114,7 @@
Rebase Rebase
</button> </button>
<span <span
v-if="!hasRebasingError" v-if="!rebasingError"
class="bold"> class="bold">
Fast-forward merge is not possible. Fast-forward merge is not possible.
Rebase the source branch onto the target branch or merge target Rebase the source branch onto the target branch or merge target
......
import Vue from 'vue'; import axios from '~/lib/utils/axios_utils';
import CEWidgetService from '~/vue_merge_request_widget/services/mr_widget_service'; import CEWidgetService from '~/vue_merge_request_widget/services/mr_widget_service';
...@@ -6,36 +6,31 @@ export default class MRWidgetService extends CEWidgetService { ...@@ -6,36 +6,31 @@ export default class MRWidgetService extends CEWidgetService {
constructor(mr) { constructor(mr) {
super(mr); super(mr);
// Set as a text/plain request so BE doesn't try to parse this.approvalsPath = mr.approvalsPath;
// See https://gitlab.com/gitlab-org/gitlab-ce/issues/34534 this.rebasePath = mr.rebasePath;
this.approvalsResource = Vue.resource(mr.approvalsPath, {}, {}, {
headers: {
'Content-Type': 'text/plain',
},
});
this.rebaseResource = Vue.resource(mr.rebasePath);
} }
fetchApprovals() { fetchApprovals() {
return this.approvalsResource.get() return axios.get(this.approvalsPath)
.then(res => res.json()); .then(res => res.data);
} }
approveMergeRequest() { approveMergeRequest() {
return this.approvalsResource.save() return axios.post(this.approvalsPath)
.then(res => res.json()); .then(res => res.data);
} }
unapproveMergeRequest() { unapproveMergeRequest() {
return this.approvalsResource.delete() return axios.delete(this.approvalsPath)
.then(res => res.json()); .then(res => res.data);
} }
rebase() { rebase() {
return this.rebaseResource.save(); return axios.post(this.rebasePath);
} }
fetchReport(endpoint) { // eslint-disable-line fetchReport(endpoint) { // eslint-disable-line
return Vue.http.get(endpoint).then(res => res.json()); return axios.get(endpoint)
.then(res => res.data);
} }
} }
import Vue from 'vue'; import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import mrWidgetOptions from 'ee/vue_merge_request_widget/mr_widget_options'; import mrWidgetOptions from 'ee/vue_merge_request_widget/mr_widget_options';
import MRWidgetService from 'ee/vue_merge_request_widget/services/mr_widget_service'; import MRWidgetService from 'ee/vue_merge_request_widget/services/mr_widget_service';
import MRWidgetStore from 'ee/vue_merge_request_widget/stores/mr_widget_store'; import MRWidgetStore from 'ee/vue_merge_request_widget/stores/mr_widget_store';
...@@ -49,21 +51,16 @@ describe('ee merge request widget options', () => { ...@@ -49,21 +51,16 @@ describe('ee merge request widget options', () => {
}); });
describe('with successful request', () => { describe('with successful request', () => {
const interceptor = (request, next) => { let mock;
if (request.url === 'path.json') {
next(request.respondWith(JSON.stringify(securityIssues), {
status: 200,
}));
}
};
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(interceptor); mock = mock = new MockAdapter(axios);
mock.onGet('path.json').reply(200, securityIssues);
vm = mountComponent(Component); vm = mountComponent(Component);
}); });
afterEach(() => { afterEach(() => {
Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor); mock.reset();
}); });
it('should render provided data', (done) => { it('should render provided data', (done) => {
...@@ -77,21 +74,16 @@ describe('ee merge request widget options', () => { ...@@ -77,21 +74,16 @@ describe('ee merge request widget options', () => {
}); });
describe('with empty successful request', () => { describe('with empty successful request', () => {
const emptyInterceptor = (request, next) => { let mock;
if (request.url === 'path.json') {
next(request.respondWith(JSON.stringify([]), {
status: 200,
}));
}
};
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(emptyInterceptor); mock = mock = new MockAdapter(axios);
mock.onGet('path.json').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component);
}); });
afterEach(() => { afterEach(() => {
Vue.http.interceptors = _.without(Vue.http.interceptors, emptyInterceptor); mock.reset();
}); });
it('should render provided data', (done) => { it('should render provided data', (done) => {
...@@ -105,21 +97,16 @@ describe('ee merge request widget options', () => { ...@@ -105,21 +97,16 @@ describe('ee merge request widget options', () => {
}); });
describe('with failed request', () => { describe('with failed request', () => {
const errorInterceptor = (request, next) => { let mock;
if (request.url === 'path.json') {
next(request.respondWith(JSON.stringify([]), {
status: 500,
}));
}
};
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(errorInterceptor); mock = mock = new MockAdapter(axios);
mock.onGet('path.json').reply(500, []);
vm = mountComponent(Component); vm = mountComponent(Component);
}); });
afterEach(() => { afterEach(() => {
Vue.http.interceptors = _.without(Vue.http.interceptors, errorInterceptor); mock.reset();
}); });
it('should render error indicator', (done) => { it('should render error indicator', (done) => {
...@@ -157,27 +144,17 @@ describe('ee merge request widget options', () => { ...@@ -157,27 +144,17 @@ describe('ee merge request widget options', () => {
}); });
describe('with successful request', () => { describe('with successful request', () => {
const interceptor = (request, next) => { let mock;
if (request.url === 'head.json') {
next(request.respondWith(JSON.stringify(headIssues), {
status: 200,
}));
}
if (request.url === 'base.json') {
next(request.respondWith(JSON.stringify(baseIssues), {
status: 200,
}));
}
};
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(interceptor); mock = mock = new MockAdapter(axios);
mock.onGet('head.json').reply(200, headIssues);
mock.onGet('base.json').reply(200, baseIssues);
vm = mountComponent(Component); vm = mountComponent(Component);
}); });
afterEach(() => { afterEach(() => {
Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor); mock.reset();
}); });
it('should render provided data', (done) => { it('should render provided data', (done) => {
...@@ -218,27 +195,17 @@ describe('ee merge request widget options', () => { ...@@ -218,27 +195,17 @@ describe('ee merge request widget options', () => {
}); });
describe('with empty successful request', () => { describe('with empty successful request', () => {
const emptyInterceptor = (request, next) => { let mock;
if (request.url === 'head.json') {
next(request.respondWith(JSON.stringify([]), {
status: 200,
}));
}
if (request.url === 'base.json') {
next(request.respondWith(JSON.stringify([]), {
status: 200,
}));
}
};
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(emptyInterceptor); mock = mock = new MockAdapter(axios);
mock.onGet('head.json').reply(200, []);
mock.onGet('base.json').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component);
}); });
afterEach(() => { afterEach(() => {
Vue.http.interceptors = _.without(Vue.http.interceptors, emptyInterceptor); mock.reset();
}); });
it('should render provided data', (done) => { it('should render provided data', (done) => {
...@@ -252,27 +219,17 @@ describe('ee merge request widget options', () => { ...@@ -252,27 +219,17 @@ describe('ee merge request widget options', () => {
}); });
describe('with failed request', () => { describe('with failed request', () => {
const errorInterceptor = (request, next) => { let mock;
if (request.url === 'head.json') {
next(request.respondWith(JSON.stringify([]), {
status: 500,
}));
}
if (request.url === 'base.json') {
next(request.respondWith(JSON.stringify([]), {
status: 500,
}));
}
};
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(errorInterceptor); mock = mock = new MockAdapter(axios);
mock.onGet('head.json').reply(500, []);
mock.onGet('base.json').reply(500, []);
vm = mountComponent(Component); vm = mountComponent(Component);
}); });
afterEach(() => { afterEach(() => {
Vue.http.interceptors = _.without(Vue.http.interceptors, errorInterceptor); mock.reset();
}); });
it('should render error indicator', (done) => { it('should render error indicator', (done) => {
...@@ -308,27 +265,17 @@ describe('ee merge request widget options', () => { ...@@ -308,27 +265,17 @@ describe('ee merge request widget options', () => {
}); });
describe('with successful request', () => { describe('with successful request', () => {
const interceptor = (request, next) => { let mock;
if (request.url === 'head.json') {
next(request.respondWith(JSON.stringify(headPerformance), {
status: 200,
}));
}
if (request.url === 'base.json') {
next(request.respondWith(JSON.stringify(basePerformance), {
status: 200,
}));
}
};
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(interceptor); mock = mock = new MockAdapter(axios);
mock.onGet('head.json').reply(200, headPerformance);
mock.onGet('base.json').reply(200, basePerformance);
vm = mountComponent(Component); vm = mountComponent(Component);
}); });
afterEach(() => { afterEach(() => {
Vue.http.interceptors = _.without(Vue.http.interceptors, interceptor); mock.reset();
}); });
it('should render provided data', (done) => { it('should render provided data', (done) => {
...@@ -370,27 +317,17 @@ describe('ee merge request widget options', () => { ...@@ -370,27 +317,17 @@ describe('ee merge request widget options', () => {
}); });
describe('with empty successful request', () => { describe('with empty successful request', () => {
const emptyInterceptor = (request, next) => { let mock;
if (request.url === 'head.json') {
next(request.respondWith(JSON.stringify([]), {
status: 200,
}));
}
if (request.url === 'base.json') {
next(request.respondWith(JSON.stringify([]), {
status: 200,
}));
}
};
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(emptyInterceptor); mock = mock = new MockAdapter(axios);
mock.onGet('head.json').reply(200, []);
mock.onGet('base.json').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component);
}); });
afterEach(() => { afterEach(() => {
Vue.http.interceptors = _.without(Vue.http.interceptors, emptyInterceptor); mock.reset();
}); });
it('should render provided data', (done) => { it('should render provided data', (done) => {
...@@ -404,27 +341,17 @@ describe('ee merge request widget options', () => { ...@@ -404,27 +341,17 @@ describe('ee merge request widget options', () => {
}); });
describe('with failed request', () => { describe('with failed request', () => {
const errorInterceptor = (request, next) => { let mock;
if (request.url === 'head.json') {
next(request.respondWith(JSON.stringify([]), {
status: 500,
}));
}
if (request.url === 'base.json') {
next(request.respondWith(JSON.stringify([]), {
status: 500,
}));
}
};
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(errorInterceptor); mock = mock = new MockAdapter(axios);
mock.onGet('head.json').reply(500, []);
mock.onGet('base.json').reply(500, []);
vm = mountComponent(Component); vm = mountComponent(Component);
}); });
afterEach(() => { afterEach(() => {
Vue.http.interceptors = _.without(Vue.http.interceptors, errorInterceptor); mock.reset();
}); });
it('should render error indicator', (done) => { it('should render error indicator', (done) => {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment