2017-01-10 18:02:20 -05:00
|
|
|
/* eslint-disable space-before-function-paren, no-unused-expressions, no-var, object-shorthand, comma-dangle, max-len */
|
2016-12-14 00:26:26 -05:00
|
|
|
/* global Notes */
|
|
|
|
|
2017-05-03 13:41:16 -04:00
|
|
|
import 'vendor/autosize';
|
|
|
|
import '~/gl_form';
|
|
|
|
import '~/lib/utils/text_utility';
|
|
|
|
import '~/render_gfm';
|
|
|
|
import '~/render_math';
|
|
|
|
import '~/notes';
|
2016-07-24 16:45:11 -04:00
|
|
|
|
|
|
|
(function() {
|
|
|
|
window.gon || (window.gon = {});
|
2016-11-22 17:46:58 -05:00
|
|
|
window.gl = window.gl || {};
|
|
|
|
gl.utils = gl.utils || {};
|
2016-07-24 16:45:11 -04:00
|
|
|
|
|
|
|
describe('Notes', function() {
|
2016-12-30 16:27:40 -05:00
|
|
|
var commentsTemplate = 'issues/issue_with_comment.html.raw';
|
2016-12-30 19:14:33 -05:00
|
|
|
preloadFixtures(commentsTemplate);
|
2016-08-31 10:32:48 -04:00
|
|
|
|
2016-11-22 17:46:58 -05:00
|
|
|
beforeEach(function () {
|
2016-12-30 19:14:33 -05:00
|
|
|
loadFixtures(commentsTemplate);
|
2016-11-22 17:46:58 -05:00
|
|
|
gl.utils.disableButtonIfEmptyField = _.noop;
|
|
|
|
window.project_uploads_path = 'http://test.host/uploads';
|
2016-12-08 16:49:32 -05:00
|
|
|
$('body').data('page', 'projects:issues:show');
|
2016-11-22 17:46:58 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('task lists', function() {
|
2016-07-24 16:45:11 -04:00
|
|
|
beforeEach(function() {
|
|
|
|
$('form').on('submit', function(e) {
|
2016-08-31 10:32:48 -04:00
|
|
|
e.preventDefault();
|
2016-07-24 16:45:11 -04:00
|
|
|
});
|
2016-08-31 10:32:48 -04:00
|
|
|
this.notes = new Notes();
|
2016-07-24 16:45:11 -04:00
|
|
|
});
|
2016-08-31 10:32:48 -04:00
|
|
|
|
2016-07-24 16:45:11 -04:00
|
|
|
it('modifies the Markdown field', function() {
|
|
|
|
$('input[type=checkbox]').attr('checked', true).trigger('change');
|
2016-08-31 10:32:48 -04:00
|
|
|
expect($('.js-task-list-field').val()).toBe('- [x] Task List Item');
|
2016-07-24 16:45:11 -04:00
|
|
|
});
|
2016-08-31 10:32:48 -04:00
|
|
|
|
2017-02-08 09:12:12 -05:00
|
|
|
it('submits an ajax request on tasklist:changed', function() {
|
|
|
|
spyOn(jQuery, 'ajax').and.callFake(function(req) {
|
|
|
|
expect(req.type).toBe('PATCH');
|
|
|
|
expect(req.url).toBe('http://test.host/frontend-fixtures/issues-project/notes/1');
|
|
|
|
return expect(req.data.note).not.toBe(null);
|
2016-07-24 16:45:11 -04:00
|
|
|
});
|
2017-02-13 21:52:20 -05:00
|
|
|
$('.js-task-list-field').trigger('tasklist:changed');
|
2016-08-31 10:32:48 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('comments', function() {
|
|
|
|
var textarea = '.js-note-text';
|
|
|
|
|
|
|
|
beforeEach(function() {
|
|
|
|
this.notes = new Notes();
|
|
|
|
|
|
|
|
this.autoSizeSpy = spyOnEvent($(textarea), 'autosize:update');
|
|
|
|
spyOn(this.notes, 'renderNote').and.stub();
|
|
|
|
|
|
|
|
$(textarea).data('autosave', {
|
|
|
|
reset: function() {}
|
|
|
|
});
|
|
|
|
|
|
|
|
$('form').on('submit', function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
$('.js-main-target-form').trigger('ajax:success');
|
|
|
|
});
|
2016-07-24 16:45:11 -04:00
|
|
|
});
|
2016-08-31 10:32:48 -04:00
|
|
|
|
|
|
|
it('autosizes after comment submission', function() {
|
|
|
|
$(textarea).text('This is an example comment note');
|
|
|
|
expect(this.autoSizeSpy).not.toHaveBeenTriggered();
|
|
|
|
|
|
|
|
$('.js-comment-button').click();
|
|
|
|
expect(this.autoSizeSpy).toHaveBeenTriggered();
|
2017-01-10 17:54:56 -05:00
|
|
|
});
|
2016-07-24 16:45:11 -04:00
|
|
|
});
|
2017-04-19 15:48:48 -04:00
|
|
|
|
|
|
|
describe('renderNote', () => {
|
|
|
|
let notes;
|
|
|
|
let note;
|
|
|
|
let $notesList;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
note = {
|
2017-05-03 13:41:16 -04:00
|
|
|
id: 1,
|
2017-04-19 15:48:48 -04:00
|
|
|
discussion_html: null,
|
|
|
|
valid: true,
|
2017-05-03 13:41:16 -04:00
|
|
|
note: 'heya',
|
|
|
|
html: '<div>heya</div>',
|
2017-04-19 15:48:48 -04:00
|
|
|
};
|
2017-05-03 13:41:16 -04:00
|
|
|
$notesList = jasmine.createSpyObj('$notesList', [
|
|
|
|
'find',
|
|
|
|
'append',
|
|
|
|
]);
|
2017-04-19 15:48:48 -04:00
|
|
|
|
|
|
|
notes = jasmine.createSpyObj('notes', [
|
|
|
|
'refresh',
|
|
|
|
'isNewNote',
|
2017-05-03 13:41:16 -04:00
|
|
|
'isUpdatedNote',
|
2017-04-19 15:48:48 -04:00
|
|
|
'collapseLongCommitList',
|
|
|
|
'updateNotesCount',
|
2017-05-03 13:41:16 -04:00
|
|
|
'putConflictEditWarningInPlace'
|
2017-04-19 15:48:48 -04:00
|
|
|
]);
|
|
|
|
notes.taskList = jasmine.createSpyObj('tasklist', ['init']);
|
|
|
|
notes.note_ids = [];
|
2017-05-03 13:41:16 -04:00
|
|
|
notes.updatedNotesTrackingMap = {};
|
2017-04-19 15:48:48 -04:00
|
|
|
|
|
|
|
spyOn(gl.utils, 'localTimeAgo');
|
2017-05-03 13:41:16 -04:00
|
|
|
spyOn(Notes, 'animateAppendNote').and.callThrough();
|
|
|
|
spyOn(Notes, 'animateUpdateNote').and.callThrough();
|
2017-04-19 15:48:48 -04:00
|
|
|
});
|
|
|
|
|
2017-05-03 13:41:16 -04:00
|
|
|
describe('when adding note', () => {
|
|
|
|
it('should call .animateAppendNote', () => {
|
|
|
|
notes.isNewNote.and.returnValue(true);
|
|
|
|
Notes.prototype.renderNote.call(notes, note, null, $notesList);
|
|
|
|
|
|
|
|
expect(Notes.animateAppendNote).toHaveBeenCalledWith(note.html, $notesList);
|
|
|
|
});
|
2017-04-19 15:48:48 -04:00
|
|
|
});
|
|
|
|
|
2017-05-03 13:41:16 -04:00
|
|
|
describe('when note was edited', () => {
|
|
|
|
it('should call .animateUpdateNote', () => {
|
|
|
|
notes.isUpdatedNote.and.returnValue(true);
|
|
|
|
const $note = $('<div>');
|
|
|
|
$notesList.find.and.returnValue($note);
|
|
|
|
Notes.prototype.renderNote.call(notes, note, null, $notesList);
|
|
|
|
|
|
|
|
expect(Notes.animateUpdateNote).toHaveBeenCalledWith(note.html, $note);
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('while editing', () => {
|
|
|
|
it('should update textarea if nothing has been touched', () => {
|
|
|
|
notes.isUpdatedNote.and.returnValue(true);
|
|
|
|
const $note = $(`<div class="is-editing">
|
|
|
|
<div class="original-note-content">initial</div>
|
|
|
|
<textarea class="js-note-text">initial</textarea>
|
|
|
|
</div>`);
|
|
|
|
$notesList.find.and.returnValue($note);
|
|
|
|
Notes.prototype.renderNote.call(notes, note, null, $notesList);
|
|
|
|
|
|
|
|
expect($note.find('.js-note-text').val()).toEqual(note.note);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should call .putConflictEditWarningInPlace', () => {
|
|
|
|
notes.isUpdatedNote.and.returnValue(true);
|
|
|
|
const $note = $(`<div class="is-editing">
|
|
|
|
<div class="original-note-content">initial</div>
|
|
|
|
<textarea class="js-note-text">different</textarea>
|
|
|
|
</div>`);
|
|
|
|
$notesList.find.and.returnValue($note);
|
|
|
|
Notes.prototype.renderNote.call(notes, note, null, $notesList);
|
|
|
|
|
|
|
|
expect(notes.putConflictEditWarningInPlace).toHaveBeenCalledWith(note, $note);
|
|
|
|
});
|
|
|
|
});
|
2017-04-19 15:48:48 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('renderDiscussionNote', () => {
|
|
|
|
let discussionContainer;
|
|
|
|
let note;
|
|
|
|
let notes;
|
|
|
|
let $form;
|
|
|
|
let row;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
note = {
|
|
|
|
html: '<li></li>',
|
|
|
|
discussion_html: '<div></div>',
|
|
|
|
discussion_id: 1,
|
|
|
|
discussion_resolvable: false,
|
|
|
|
diff_discussion_html: false,
|
|
|
|
};
|
|
|
|
$form = jasmine.createSpyObj('$form', ['closest', 'find']);
|
|
|
|
row = jasmine.createSpyObj('row', ['prevAll', 'first', 'find']);
|
|
|
|
|
|
|
|
notes = jasmine.createSpyObj('notes', [
|
|
|
|
'isNewNote',
|
|
|
|
'isParallelView',
|
|
|
|
'updateNotesCount',
|
|
|
|
]);
|
|
|
|
notes.note_ids = [];
|
|
|
|
|
|
|
|
spyOn(gl.utils, 'localTimeAgo');
|
|
|
|
spyOn(Notes, 'animateAppendNote');
|
|
|
|
notes.isNewNote.and.returnValue(true);
|
|
|
|
notes.isParallelView.and.returnValue(false);
|
|
|
|
row.prevAll.and.returnValue(row);
|
|
|
|
row.first.and.returnValue(row);
|
|
|
|
row.find.and.returnValue(row);
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('Discussion root note', () => {
|
|
|
|
let body;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
body = jasmine.createSpyObj('body', ['attr']);
|
|
|
|
discussionContainer = { length: 0 };
|
|
|
|
|
|
|
|
$form.closest.and.returnValues(row, $form);
|
|
|
|
$form.find.and.returnValues(discussionContainer);
|
|
|
|
body.attr.and.returnValue('');
|
|
|
|
|
|
|
|
Notes.prototype.renderDiscussionNote.call(notes, note, $form);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should call Notes.animateAppendNote', () => {
|
2017-05-03 13:41:16 -04:00
|
|
|
expect(Notes.animateAppendNote).toHaveBeenCalledWith(note.discussion_html, $('.main-notes-list'));
|
2017-04-19 15:48:48 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('Discussion sub note', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
discussionContainer = { length: 1 };
|
|
|
|
|
2017-05-03 13:41:16 -04:00
|
|
|
$form.closest.and.returnValues(row, $form);
|
|
|
|
$form.find.and.returnValues(discussionContainer);
|
2017-04-19 15:48:48 -04:00
|
|
|
|
|
|
|
Notes.prototype.renderDiscussionNote.call(notes, note, $form);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should call Notes.animateAppendNote', () => {
|
|
|
|
expect(Notes.animateAppendNote).toHaveBeenCalledWith(note.html, discussionContainer);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('animateAppendNote', () => {
|
|
|
|
let noteHTML;
|
|
|
|
let $notesList;
|
2017-05-03 13:41:16 -04:00
|
|
|
let $resultantNote;
|
2017-04-19 15:48:48 -04:00
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
noteHTML = '<div></div>';
|
|
|
|
$notesList = jasmine.createSpyObj('$notesList', ['append']);
|
|
|
|
|
2017-05-03 13:41:16 -04:00
|
|
|
$resultantNote = Notes.animateAppendNote(noteHTML, $notesList);
|
|
|
|
});
|
2017-04-19 15:48:48 -04:00
|
|
|
|
2017-05-03 13:41:16 -04:00
|
|
|
it('should have `fade-in` class', () => {
|
|
|
|
expect($resultantNote.hasClass('fade-in')).toEqual(true);
|
2017-04-19 15:48:48 -04:00
|
|
|
});
|
|
|
|
|
2017-05-03 13:41:16 -04:00
|
|
|
it('should append note to the notes list', () => {
|
|
|
|
expect($notesList.append).toHaveBeenCalledWith($resultantNote);
|
2017-04-19 15:48:48 -04:00
|
|
|
});
|
2017-05-03 13:41:16 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('animateUpdateNote', () => {
|
|
|
|
let noteHTML;
|
|
|
|
let $note;
|
|
|
|
let $updatedNote;
|
2017-04-19 15:48:48 -04:00
|
|
|
|
2017-05-03 13:41:16 -04:00
|
|
|
beforeEach(() => {
|
|
|
|
noteHTML = '<div></div>';
|
|
|
|
$note = jasmine.createSpyObj('$note', [
|
|
|
|
'replaceWith'
|
|
|
|
]);
|
|
|
|
|
|
|
|
$updatedNote = Notes.animateUpdateNote(noteHTML, $note);
|
2017-04-19 15:48:48 -04:00
|
|
|
});
|
2017-05-03 13:41:16 -04:00
|
|
|
|
|
|
|
it('should have `fade-in` class', () => {
|
|
|
|
expect($updatedNote.hasClass('fade-in')).toEqual(true);
|
2017-04-19 15:48:48 -04:00
|
|
|
});
|
|
|
|
|
2017-05-03 13:41:16 -04:00
|
|
|
it('should call replaceWith on $note', () => {
|
|
|
|
expect($note.replaceWith).toHaveBeenCalledWith($updatedNote);
|
2017-04-19 15:48:48 -04:00
|
|
|
});
|
|
|
|
});
|
2016-07-24 16:45:11 -04:00
|
|
|
});
|
2017-02-10 02:29:41 -05:00
|
|
|
}).call(window);
|