2018-05-09 12:01:36 +05:30
|
|
|
import $ from 'jquery';
|
2017-09-10 17:25:29 +05:30
|
|
|
import Vue from 'vue';
|
|
|
|
import fieldComponent from '~/vue_shared/components/markdown/field.vue';
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
function assertMarkdownTabs(isWrite, writeLink, previewLink, vm) {
|
|
|
|
expect(writeLink.parentNode.classList.contains('active')).toEqual(isWrite);
|
|
|
|
expect(previewLink.parentNode.classList.contains('active')).toEqual(!isWrite);
|
|
|
|
expect(vm.$el.querySelector('.md-preview').style.display).toEqual(isWrite ? 'none' : '');
|
|
|
|
}
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
describe('Markdown field component', () => {
|
|
|
|
let vm;
|
|
|
|
|
|
|
|
beforeEach((done) => {
|
|
|
|
vm = new Vue({
|
2018-03-17 18:26:18 +05:30
|
|
|
components: {
|
|
|
|
fieldComponent,
|
|
|
|
},
|
2017-09-10 17:25:29 +05:30
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
text: 'testing\n123',
|
|
|
|
};
|
|
|
|
},
|
|
|
|
template: `
|
|
|
|
<field-component
|
2018-03-17 18:26:18 +05:30
|
|
|
markdown-preview-path="/preview"
|
|
|
|
markdown-docs-path="/docs"
|
2017-09-10 17:25:29 +05:30
|
|
|
>
|
|
|
|
<textarea
|
|
|
|
slot="textarea"
|
|
|
|
v-model="text">
|
|
|
|
</textarea>
|
|
|
|
</field-component>
|
|
|
|
`,
|
|
|
|
}).$mount();
|
|
|
|
|
|
|
|
Vue.nextTick(done);
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('mounted', () => {
|
|
|
|
it('renders textarea inside backdrop', () => {
|
|
|
|
expect(
|
|
|
|
vm.$el.querySelector('.zen-backdrop textarea'),
|
|
|
|
).not.toBeNull();
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('markdown preview', () => {
|
|
|
|
let previewLink;
|
2018-03-17 18:26:18 +05:30
|
|
|
let writeLink;
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
spyOn(Vue.http, 'post').and.callFake(() => new Promise((resolve) => {
|
2018-03-17 18:26:18 +05:30
|
|
|
setTimeout(() => {
|
|
|
|
resolve({
|
|
|
|
json() {
|
|
|
|
return {
|
|
|
|
body: '<p>markdown preview</p>',
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
2017-09-10 17:25:29 +05:30
|
|
|
});
|
|
|
|
}));
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
previewLink = vm.$el.querySelector('.nav-links .js-preview-link');
|
|
|
|
writeLink = vm.$el.querySelector('.nav-links .js-write-link');
|
2017-09-10 17:25:29 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
it('sets preview link as active', (done) => {
|
|
|
|
previewLink.click();
|
|
|
|
|
|
|
|
Vue.nextTick(() => {
|
|
|
|
expect(
|
|
|
|
previewLink.parentNode.classList.contains('active'),
|
|
|
|
).toBeTruthy();
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('shows preview loading text', (done) => {
|
|
|
|
previewLink.click();
|
|
|
|
|
|
|
|
Vue.nextTick(() => {
|
|
|
|
expect(
|
|
|
|
vm.$el.querySelector('.md-preview').textContent.trim(),
|
|
|
|
).toContain('Loading...');
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('renders markdown preview', (done) => {
|
|
|
|
previewLink.click();
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
expect(
|
|
|
|
vm.$el.querySelector('.md-preview').innerHTML,
|
|
|
|
).toContain('<p>markdown preview</p>');
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('renders GFM with jQuery', (done) => {
|
|
|
|
spyOn($.fn, 'renderGFM');
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
previewLink.click();
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
expect(
|
|
|
|
$.fn.renderGFM,
|
|
|
|
).toHaveBeenCalled();
|
|
|
|
|
|
|
|
done();
|
2018-03-17 18:26:18 +05:30
|
|
|
}, 0);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('clicking already active write or preview link does nothing', (done) => {
|
|
|
|
writeLink.click();
|
|
|
|
Vue.nextTick()
|
|
|
|
.then(() => assertMarkdownTabs(true, writeLink, previewLink, vm))
|
|
|
|
.then(() => writeLink.click())
|
|
|
|
.then(() => Vue.nextTick())
|
|
|
|
.then(() => assertMarkdownTabs(true, writeLink, previewLink, vm))
|
|
|
|
.then(() => previewLink.click())
|
|
|
|
.then(() => Vue.nextTick())
|
|
|
|
.then(() => assertMarkdownTabs(false, writeLink, previewLink, vm))
|
|
|
|
.then(() => previewLink.click())
|
|
|
|
.then(() => Vue.nextTick())
|
|
|
|
.then(() => assertMarkdownTabs(false, writeLink, previewLink, vm))
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
2017-09-10 17:25:29 +05:30
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('markdown buttons', () => {
|
|
|
|
it('converts single words', (done) => {
|
|
|
|
const textarea = vm.$el.querySelector('textarea');
|
|
|
|
|
|
|
|
textarea.setSelectionRange(0, 7);
|
|
|
|
vm.$el.querySelector('.js-md').click();
|
|
|
|
|
|
|
|
Vue.nextTick(() => {
|
|
|
|
expect(
|
|
|
|
textarea.value,
|
|
|
|
).toContain('**testing**');
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('converts a line', (done) => {
|
|
|
|
const textarea = vm.$el.querySelector('textarea');
|
|
|
|
|
|
|
|
textarea.setSelectionRange(0, 0);
|
2018-12-05 23:21:45 +05:30
|
|
|
vm.$el.querySelectorAll('.js-md')[5].click();
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
Vue.nextTick(() => {
|
|
|
|
expect(
|
|
|
|
textarea.value,
|
|
|
|
).toContain('* testing');
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('converts multiple lines', (done) => {
|
|
|
|
const textarea = vm.$el.querySelector('textarea');
|
|
|
|
|
|
|
|
textarea.setSelectionRange(0, 50);
|
2018-12-05 23:21:45 +05:30
|
|
|
vm.$el.querySelectorAll('.js-md')[5].click();
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
Vue.nextTick(() => {
|
|
|
|
expect(
|
|
|
|
textarea.value,
|
|
|
|
).toContain('* testing\n* 123');
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|