Commit dbb934c8 authored by Fatih Acet's avatar Fatih Acet

Merge branch '42462-edit-note' into 'master'

Resolve "Cancelling a second comment edit doesn't return its state to before the edit"

Closes #42462

See merge request gitlab-org/gitlab-ce!16869
parents 4c3dd91f 2ee08f47
...@@ -102,6 +102,7 @@ ...@@ -102,6 +102,7 @@
.then(() => { .then(() => {
this.isEditing = false; this.isEditing = false;
this.isRequesting = false; this.isRequesting = false;
this.oldContent = null;
$(this.$refs.noteBody.$el).renderGFM(); $(this.$refs.noteBody.$el).renderGFM();
this.$refs.noteBody.resetAutoSave(); this.$refs.noteBody.resetAutoSave();
callback(); callback();
......
---
title: Fix cnacel edit note button reverting changes
merge_request: 42462
author:
type: fixed
...@@ -2,14 +2,29 @@ import _ from 'underscore'; ...@@ -2,14 +2,29 @@ import _ from 'underscore';
import Vue from 'vue'; import Vue from 'vue';
import notesApp from '~/notes/components/notes_app.vue'; import notesApp from '~/notes/components/notes_app.vue';
import service from '~/notes/services/notes_service'; import service from '~/notes/services/notes_service';
import '~/render_gfm';
import * as mockData from '../mock_data'; import * as mockData from '../mock_data';
import getSetTimeoutPromise from '../../helpers/set_timeout_promise_helper';
const vueMatchers = {
toIncludeElement() {
return {
compare(vm, selector) {
const result = {
pass: vm.$el.querySelector(selector) !== null,
};
return result;
},
};
},
};
describe('note_app', () => { describe('note_app', () => {
let mountComponent; let mountComponent;
let vm; let vm;
beforeEach(() => { beforeEach(() => {
jasmine.addMatchers(vueMatchers);
const IssueNotesApp = Vue.extend(notesApp); const IssueNotesApp = Vue.extend(notesApp);
mountComponent = (data) => { mountComponent = (data) => {
...@@ -105,7 +120,7 @@ describe('note_app', () => { ...@@ -105,7 +120,7 @@ describe('note_app', () => {
}); });
it('should render loading icon', () => { it('should render loading icon', () => {
expect(vm.$el.querySelector('.js-loading')).toBeDefined(); expect(vm).toIncludeElement('.js-loading');
}); });
it('should render form', () => { it('should render form', () => {
...@@ -118,10 +133,14 @@ describe('note_app', () => { ...@@ -118,10 +133,14 @@ describe('note_app', () => {
describe('update note', () => { describe('update note', () => {
describe('individual note', () => { describe('individual note', () => {
beforeEach(() => { beforeEach((done) => {
Vue.http.interceptors.push(mockData.individualNoteInterceptor); Vue.http.interceptors.push(mockData.individualNoteInterceptor);
spyOn(service, 'updateNote').and.callThrough(); spyOn(service, 'updateNote').and.callThrough();
vm = mountComponent(); vm = mountComponent();
setTimeout(() => {
vm.$el.querySelector('.js-note-edit').click();
Vue.nextTick(done);
}, 0);
}); });
afterEach(() => { afterEach(() => {
...@@ -131,40 +150,32 @@ describe('note_app', () => { ...@@ -131,40 +150,32 @@ describe('note_app', () => {
); );
}); });
it('renders edit form', (done) => { it('renders edit form', () => {
setTimeout(() => { expect(vm).toIncludeElement('.js-vue-issue-note-form');
vm.$el.querySelector('.js-note-edit').click();
Vue.nextTick(() => {
expect(vm.$el.querySelector('.js-vue-issue-note-form')).toBeDefined();
done();
});
}, 0);
}); });
it('calls the service to update the note', (done) => { it('calls the service to update the note', (done) => {
getSetTimeoutPromise() vm.$el.querySelector('.js-vue-issue-note-form').value = 'this is a note';
.then(() => { vm.$el.querySelector('.js-vue-issue-save').click();
vm.$el.querySelector('.js-note-edit').click();
}) expect(service.updateNote).toHaveBeenCalled();
.then(Vue.nextTick) // Wait for the requests to finish before destroying
.then(() => { Vue.nextTick()
vm.$el.querySelector('.js-vue-issue-note-form').value = 'this is a note';
vm.$el.querySelector('.js-vue-issue-save').click();
expect(service.updateNote).toHaveBeenCalled();
})
// Wait for the requests to finish before destroying
.then(Vue.nextTick)
.then(done) .then(done)
.catch(done.fail); .catch(done.fail);
}); });
}); });
describe('dicussion note', () => { describe('discussion note', () => {
beforeEach(() => { beforeEach((done) => {
Vue.http.interceptors.push(mockData.discussionNoteInterceptor); Vue.http.interceptors.push(mockData.discussionNoteInterceptor);
spyOn(service, 'updateNote').and.callThrough(); spyOn(service, 'updateNote').and.callThrough();
vm = mountComponent(); vm = mountComponent();
setTimeout(() => {
vm.$el.querySelector('.js-note-edit').click();
Vue.nextTick(done);
}, 0);
}); });
afterEach(() => { afterEach(() => {
...@@ -174,30 +185,17 @@ describe('note_app', () => { ...@@ -174,30 +185,17 @@ describe('note_app', () => {
); );
}); });
it('renders edit form', (done) => { it('renders edit form', () => {
setTimeout(() => { expect(vm).toIncludeElement('.js-vue-issue-note-form');
vm.$el.querySelector('.js-note-edit').click();
Vue.nextTick(() => {
expect(vm.$el.querySelector('.js-vue-issue-note-form')).toBeDefined();
done();
});
}, 0);
}); });
it('updates the note and resets the edit form', (done) => { it('updates the note and resets the edit form', (done) => {
getSetTimeoutPromise() vm.$el.querySelector('.js-vue-issue-note-form').value = 'this is a note';
.then(() => { vm.$el.querySelector('.js-vue-issue-save').click();
vm.$el.querySelector('.js-note-edit').click();
}) expect(service.updateNote).toHaveBeenCalled();
.then(Vue.nextTick) // Wait for the requests to finish before destroying
.then(() => { Vue.nextTick()
vm.$el.querySelector('.js-vue-issue-note-form').value = 'this is a note';
vm.$el.querySelector('.js-vue-issue-save').click();
expect(service.updateNote).toHaveBeenCalled();
})
// Wait for the requests to finish before destroying
.then(Vue.nextTick)
.then(done) .then(done)
.catch(done.fail); .catch(done.fail);
}); });
......
...@@ -56,4 +56,25 @@ describe('issue_note', () => { ...@@ -56,4 +56,25 @@ describe('issue_note', () => {
done(); done();
}, 0); }, 0);
}); });
describe('cancel edit', () => {
it('restores content of updated note', (done) => {
const noteBody = 'updated note text';
vm.updateNote = () => Promise.resolve();
vm.formUpdateHandler(noteBody, null, $.noop);
setTimeout(() => {
expect(vm.note.note_html).toEqual(noteBody);
vm.formCancelHandler();
setTimeout(() => {
expect(vm.note.note_html).toEqual(noteBody);
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