Skip to content

Commit

Permalink
Added test for AdvancedLinkForm
Browse files Browse the repository at this point in the history
  • Loading branch information
pirhoo committed Apr 2, 2020
1 parent ee90e3b commit aa8d88b
Show file tree
Hide file tree
Showing 5 changed files with 177 additions and 19 deletions.
48 changes: 30 additions & 18 deletions lib/components/AdvancedLinkForm.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<script>
import { BTabs, BTab, BInputGroup, BFormInput } from 'bootstrap-vue'
import { BTabs, BTab, BInputGroup, BInputGroupAppend, BFormInput } from 'bootstrap-vue'
import HapticCopy from './HapticCopy.vue'
/**
* A form with tabs to offer several copy formats to users.
*/
Expand All @@ -9,7 +11,9 @@
BTabs,
BTab,
BInputGroup,
BFormInput
BInputGroupAppend,
BFormInput,
HapticCopy
},
props: {
/**
Expand Down Expand Up @@ -84,6 +88,13 @@
},
linkAsHtml () {
return `<a href="${this.link}" target="_blank">${this.titleOrLink}</a>`
},
formClasses () {
const props = ['card', 'pills', 'small', 'vertical']
return props.reduce((classes, prop) => {
classes[`advanced-link-form--${prop}`] = this[prop]
return classes
}, {})
}
},
methods: {
Expand Down Expand Up @@ -124,63 +135,64 @@
</script>

<template>
<b-tabs class="advanced-link-form" :content-class="card ? 'advanced-link-form--card' : 'mt-3'"
<b-tabs class="advanced-link-form" :content-class="card ? 'mt-0' : 'mt-3'"
:card="card"
:pills="pills"
:value="value"
:small="small"
:vertical="vertical"
:active-nav-item-class="activeNavItemClass"
:no-fade="noFade"
:class="formClasses"
@input="$emit('input', $event)">
<b-tab title="Text" v-if="showForm('raw')">
<b-card-text class="advanced-link-form__raw" :class="{ small }">
<b-tab :title="$t('advanced-link-form.raw.tab')" v-if="showForm('raw')">
<div class="advanced-link-form__raw" :class="{ small }">
<b-input-group :size="small ? 'sm' : 'md'">
<b-form-input readonly :value="link" class="advanced-link-form__raw__input" @click="selectRaw()" />
<b-input-group-append>
<haptic-copy class="btn-secondary" :text="link" @attempt="selectRaw()" />
</b-input-group-append>
</b-input-group>
</b-card-text>
</div>
</b-tab>
<b-tab title="Formatted Text" v-if="showForm('rich')">
<b-card-text class="advanced-link-form__rich" :class="{ small }">
<b-tab :title="$t('advanced-link-form.rich.tab')" v-if="showForm('rich')">
<div class="advanced-link-form__rich" :class="{ small }">
<b-input-group :size="small ? 'sm' : 'md'">
<a :href="link" class="form-control advanced-link-form__rich__input" @click.prevent="selectRich()" v-html="titleOrLink"></a>
<b-input-group-append>
<haptic-copy class="btn-secondary" html :text="linkAsHtml" :plain="link" @attempt="selectRich()" />
</b-input-group-append>
</b-input-group>
<p class="text-muted mt-2 mb-0">
Copy this link in Libre Office, Word, Google Document, etc.
{{ $t('advanced-link-form.rich.description') }}
</p>
</b-card-text>
</div>
</b-tab>
<b-tab title="Markdown" v-if="showForm('markdown')">
<b-card-text class="advanced-link-form__markdown" :class="{ small }">
<b-tab :title="$t('advanced-link-form.markdown.tab')" v-if="showForm('markdown')">
<div class="advanced-link-form__markdown" :class="{ small }">
<b-input-group :size="small ? 'sm' : 'md'">
<b-form-input readonly :value="linkAsMarkdown" class="advanced-link-form__markdown__input" @click="selectMarkdown()" />
<b-input-group-append>
<haptic-copy class="btn-secondary" :text="linkAsMarkdown" @attempt="selectMarkdown()" />
</b-input-group-append>
</b-input-group>
<p class="text-muted mt-2 mb-0">
Copy this link for online platforms supporting Markdown.
{{ $t('advanced-link-form.markdown.description') }}
</p>
</b-card-text>
</div>
</b-tab>
<b-tab title="HTML" v-if="showForm('html')">
<b-card-text class="advanced-link-form__html" :class="{ small }">
<b-tab :title="$t('advanced-link-form.html.tab')" v-if="showForm('html')">
<div class="advanced-link-form__html" :class="{ small }">
<b-input-group :size="small ? 'sm' : 'md'">
<b-form-input readonly :value="linkAsHtml" class="advanced-link-form__html__input" @click="selectHtml()" />
<b-input-group-append>
<haptic-copy class="btn-secondary" :text="linkAsHtml" @attempt="selectHtml()" />
</b-input-group-append>
</b-input-group>
<p class="text-muted mt-2 mb-0">
Copy this link to your website.
{{ $t('advanced-link-form.html.description') }}
</p>
</b-card-text>
</div>
</b-tab>
</b-tabs>
</template>
Expand Down
17 changes: 17 additions & 0 deletions lib/locales/en.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,21 @@
{
"advanced-form-link": {
"raw": {
"tab": "Text"
},
"rich": {
"tab": "Formatted Text",
"description": "Copy this link in Libre Office, Word, Google Document, etc."
},
"markdown": {
"tab": "Markdown",
"description": "Copy this link for online platforms supporting Markdown."
},
"html": {
"tab": "HTML",
"description": "Copy this link to your website."
}
},
"imddb-header": {
"navbar": {
"leak": "Leak to us",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@
"**/tests/unit/**/*.spec.js"
],
"coverageDirectory": "tests/unit/coverage",
"collectCoverage": true,
"collectCoverage": false,
"collectCoverageFrom": [
"lib/**/*.(js|vue)"
],
Expand Down
120 changes: 120 additions & 0 deletions tests/unit/components/AdvancedLinkForm.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import { mount } from '@vue/test-utils'
import AdvancedLinkForm from '@/components/AdvancedLinkForm.vue'

describe('AdvancedLinkForm.vue', () => {

// Mock Vue i18n method
const mocks = { $t: (t) => (t) }

beforeAll(() => {
// Prevent multiple Bootstrap Vue warnings in tests
jest.spyOn(console, 'warn').mockImplementation(() => {})
})

afterAll(() => {
console.warn.mockClear()
})

it('should be a Vue instance', () => {
const wrapper = mount(AdvancedLinkForm, { mocks })
expect(wrapper.isVueInstance()).toBeTruthy()
})

it('should create 4 nav items (tabs) by default', () => {
const wrapper = mount(AdvancedLinkForm, { mocks })
expect(wrapper.findAll('.nav-item').length).toBe(4)
})

it('should create 4 pans by default, only one active', () => {
const wrapper = mount(AdvancedLinkForm, { mocks })
expect(wrapper.findAll('.tab-pane').length).toBe(4)
expect(wrapper.findAll('.tab-pane.active').length).toBe(1)
})

it('should create a raw link input, active by default', () => {
const propsData = { link: 'https://www.icij.org', title: 'A Great Website' }
const wrapper = mount(AdvancedLinkForm, { propsData, mocks })
expect(wrapper.find('.tab-pane.active .advanced-link-form__raw__input').exists()).toBeTruthy()
expect(wrapper.find('.advanced-link-form__raw__input').element.value).toBe(propsData.link)
})

it('should create switch between form using `value` property', () => {
const wrapper = mount(AdvancedLinkForm, { mocks })
expect(wrapper.find('.tab-pane.active .advanced-link-form__raw').exists()).toBeTruthy()
wrapper.setProps({ value: 1})
expect(wrapper.find('.tab-pane.active .advanced-link-form__rich').exists()).toBeTruthy()
wrapper.setProps({ value: 2})
expect(wrapper.find('.tab-pane.active .advanced-link-form__markdown').exists()).toBeTruthy()
})

it('should create only 3 forms, markdown active by default ', () => {
const propsData = { forms: ['raw', 'markdown', 'html'], value: 1 }
const wrapper = mount(AdvancedLinkForm, { propsData, mocks })
expect(wrapper.findAll('.tab-pane').length).toBe(3)
expect(wrapper.find('.tab-pane.active .advanced-link-form__markdown').exists()).toBeTruthy()
})

it('should not use card by default', () => {
const wrapper = mount(AdvancedLinkForm, { mocks })
expect(wrapper.classes()).not.toContain('advanced-link-form--card')
expect(wrapper.find('.nav').classes()).not.toContain('card-header-tabs')
expect(wrapper.find('.tab-pane.active').classes()).not.toContain('card-body')
})

it('should use card when property is set', () => {
const propsData = { card: true }
const wrapper = mount(AdvancedLinkForm, { propsData, mocks })
expect(wrapper.classes()).toContain('advanced-link-form--card')
expect(wrapper.find('.nav').classes()).toContain('card-header-tabs')
expect(wrapper.find('.tab-pane.active').classes()).toContain('card-body')
})

it('should not use pills by default', () => {
const wrapper = mount(AdvancedLinkForm, { mocks })
expect(wrapper.classes()).not.toContain('advanced-link-form--pills')
expect(wrapper.find('.nav').classes()).not.toContain('nav-pills')
})

it('should use pills when property is set', () => {
const propsData = { pills: true }
const wrapper = mount(AdvancedLinkForm, { propsData, mocks })
expect(wrapper.classes()).toContain('advanced-link-form--pills')
expect(wrapper.find('.nav').classes()).toContain('nav-pills')
})

it('should not use small layout by default', () => {
const wrapper = mount(AdvancedLinkForm, { mocks })
expect(wrapper.classes()).not.toContain('advanced-link-form--small')
})

it('should use small layout when property is set', () => {
const propsData = { small: true }
const wrapper = mount(AdvancedLinkForm, { propsData, mocks })
expect(wrapper.classes()).toContain('advanced-link-form--small')
})

it('should not use vertical layout by default', () => {
const wrapper = mount(AdvancedLinkForm, { mocks })
expect(wrapper.classes()).not.toContain('advanced-link-form--vertical')
})

it('should use vertical layout when property is set', () => {
const propsData = { vertical: true }
const wrapper = mount(AdvancedLinkForm, { propsData, mocks })
expect(wrapper.classes()).toContain('advanced-link-form--vertical')
})

it('should use the title in markdwon input', () => {
const propsData = { link: 'https://www.icij.org', title: 'A Great Website' }
const markdown = `[${propsData.title}](${propsData.link})`
const wrapper = mount(AdvancedLinkForm, { propsData, mocks })
expect(wrapper.find('.advanced-link-form__markdown__input').element.value).toBe(markdown)
})

it('should use the title in rich input', () => {
const propsData = { link: 'https://www.icij.org', title: 'A Great Website' }
const wrapper = mount(AdvancedLinkForm, { propsData, mocks })
expect(wrapper.find('.advanced-link-form__rich__input').text()).toBe(propsData.title)
expect(wrapper.find('.advanced-link-form__rich__input').attributes('href')).toBe(propsData.link)
})
})
9 changes: 9 additions & 0 deletions tests/unit/components/HapticCopy.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@ describe('Ha.vue', () => {

const propsData = { text: 'Lorem ipsum' }

beforeAll(() => {
// Prevent multiple Bootstrap Vue warnings in tests
jest.spyOn(console, 'warn').mockImplementation(() => {})
})

afterAll(() => {
console.warn.mockClear()
})

it('is a Vue instance', () => {
const wrapper = mount(HapticCopy, { propsData })
expect(wrapper.isVueInstance()).toBeTruthy()
Expand Down

0 comments on commit aa8d88b

Please sign in to comment.