import $ from 'jquery'; import _ from 'underscore'; import Vue from 'vue'; import createStore from '~/notes/stores'; import issueNote from '~/notes/components/noteable_note.vue'; import { noteableDataMock, notesDataMock, note } from '../mock_data'; describe('issue_note', () => { let store; let vm; beforeEach(() => { const Component = Vue.extend(issueNote); store = createStore(); store.dispatch('setNoteableData', noteableDataMock); store.dispatch('setNotesData', notesDataMock); vm = new Component({ store, propsData: { note, }, }).$mount(); }); afterEach(() => { vm.$destroy(); }); it('should render user information', () => { expect(vm.$el.querySelector('.user-avatar-link img').getAttribute('src')).toEqual( note.author.avatar_url, ); }); it('should render note header content', () => { const el = vm.$el.querySelector('.note-header .note-header-author-name'); expect(el.textContent.trim()).toEqual(note.author.name); }); it('should render note actions', () => { expect(vm.$el.querySelector('.note-actions')).toBeDefined(); }); it('should render issue body', () => { expect(vm.$el.querySelector('.note-text').innerHTML).toEqual(note.note_html); }); it('prevents note preview xss', done => { const imgSrc = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; const noteBody = ``; const alertSpy = spyOn(window, 'alert'); vm.updateNote = () => new Promise($.noop); vm.formUpdateHandler(noteBody, null, $.noop); setTimeout(() => { expect(alertSpy).not.toHaveBeenCalled(); expect(vm.note.note_html).toEqual(_.escape(noteBody)); done(); }, 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(); }); }); }); }); });