Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 15bafcd

Browse files
Add unit tests
1 parent 5274fd7 commit 15bafcd

File tree

4 files changed

+95
-5
lines changed

4 files changed

+95
-5
lines changed

src/components/DownloadButton.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
setSelectedFormat(format)
4343
toggleOpen()
4444
"
45-
@keydown="onItemKeydown"
45+
@keydown="onItemKeydown($event)"
4646
>
4747
<span class="font-bold mr-2">{{ format.extension_name }}</span>
4848
<span>{{ getFormatSize(format.extension_name) }}</span>
@@ -57,17 +57,19 @@
5757
import filesize from 'filesize'
5858
import axios from 'axios'
5959
import local from '~/utils/local'
60+
import DropdownButton from '~/components/DropdownButton'
6061
6162
const LS_DOWNLOAD_FORMAT_EXTENSION_KEY = 'openverse:download-format-extension'
6263
6364
export default {
6465
name: 'DownloadButton',
66+
components: { DropdownButton },
6567
props: {
6668
formats: {
6769
type: Array,
6870
required: true,
6971
validator: (formats) => {
70-
const properties = ['extension_name', 'download_url', 'filesize']
72+
const properties = ['extension_name', 'download_url']
7173
return formats.every((format) => properties.every((p) => p in format))
7274
},
7375
},

src/components/meta/DownloadButton.stories.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default {
66
}
77

88
export const Default = () => ({
9-
template: `<DownloadButton :file-name="fileName" :formats="formats" />`,
9+
template: `<DownloadButton :formats="formats" />`,
1010
components: { DownloadButton },
1111
data: () => ({
1212
formats: [
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import DownloadButton from '~/components/DownloadButton'
2+
import render from '../../test-utils/render'
3+
import { mount } from '@vue/test-utils'
4+
import axios from 'axios'
5+
6+
import local from '~/utils/local'
7+
8+
jest.mock('~/utils/local', () => ({
9+
get: jest.fn(),
10+
set: jest.fn(),
11+
}))
12+
13+
const mockFilesizes = {
14+
'MP3 98kbs': 1000,
15+
'MP3 VBR': 1500,
16+
FLAC: 2500,
17+
OGG: 2000,
18+
}
19+
20+
jest.mock('axios', () => ({
21+
head: jest.fn((extensionName) => mockFilesizes[extensionName]),
22+
}))
23+
24+
const formats = [
25+
{
26+
extension_name: 'MP3 98kbs',
27+
download_url: 'https://mp3d.jamendo.com/download/track/1532771/mp31/',
28+
},
29+
{
30+
extension_name: 'MP3 VBR',
31+
download_url: 'https://mp3d.jamendo.com/download/track/1532771/mp32/',
32+
},
33+
{
34+
extension_name: 'FLAC',
35+
download_url: 'https://mp3d.jamendo.com/download/track/1532771/flac/',
36+
},
37+
{
38+
extension_name: 'OGG',
39+
download_url: 'https://mp3d.jamendo.com/download/track/1532771/ogg/',
40+
},
41+
]
42+
43+
const doRender = async () => {
44+
const wrapper = render(DownloadButton, { propsData: { formats } }, mount)
45+
await DownloadButton.fetch.call(wrapper.vm)
46+
return wrapper
47+
}
48+
49+
describe('DownloadButton', () => {
50+
beforeEach(() => {
51+
axios.head.mockReset()
52+
})
53+
54+
// TODO(@sarayourfriend) convert this to testing-library once it's possible to get the `vm` from the wrapper
55+
it('should default to the first format', async () => {
56+
const wrapper = await doRender()
57+
const downloadLink = wrapper.element.querySelector('a')
58+
expect(downloadLink.getAttribute('href')).toEqual(formats[0].download_url)
59+
})
60+
61+
it('should use the local storage default on first render', async () => {
62+
local.get.mockImplementationOnce(() => formats[1].extension_name)
63+
const wrapper = await doRender()
64+
const downloadLink = wrapper.element.querySelector('a')
65+
expect(downloadLink.getAttribute('href')).toEqual(formats[1].download_url)
66+
})
67+
68+
it('should set the local storage default when a format is selected', async () => {
69+
const wrapper = await doRender()
70+
wrapper.find('[aria-haspopup="menu"]').trigger('click')
71+
wrapper.findAll('[role="menuitem"]').wrappers[1].trigger('click')
72+
expect(local.set).toHaveBeenCalledWith(
73+
expect.any(String),
74+
formats[1].extension_name
75+
)
76+
})
77+
78+
it('should retrieve the filesizes using a head request', async () => {
79+
await doRender()
80+
formats.forEach(({ download_url }) =>
81+
expect(axios.head).toHaveBeenCalledWith(download_url)
82+
)
83+
})
84+
})

test/unit/test-utils/render.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,19 @@ const i18n = new VueI18n({
1515
messages,
1616
})
1717

18-
const render = (Component, options = { localVue, i18n }) => {
18+
const render = (
19+
Component,
20+
options = { localVue, i18n },
21+
renderer = shallowMount
22+
) => {
1923
if (!options.store) {
2024
const store = new Vuex.Store(sampleStore)
2125
options.store = store
2226
}
2327
if (!options.i18n) {
2428
options.i18n = i18n
2529
}
26-
return shallowMount(Component, options)
30+
return renderer(Component, options)
2731
}
2832

2933
export default render

0 commit comments

Comments
 (0)