Skip to content

Commit 4181183

Browse files
committed
test: add more unit tests and refactor the last one. update docs
1 parent ec07f85 commit 4181183

File tree

4 files changed

+47
-38
lines changed

4 files changed

+47
-38
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@
1717
<a href="http://standardjs.com"><img src="https://img.shields.io/badge/code%20style-standard-brightgreen.svg" alt="Style standard"></a>
1818
</p>
1919

20-
> **Note:**
20+
> **Notes:**
2121
> This is an unofficial project.
2222
> I do not work or am I affiliated with Image Kit
23+
> :warning: **Warning**: This project is in it's early stage. I do not recommend to use this in a production environment yet! :warning:
2324
2425
## Demo
2526

src/components/VueImageKit.vue

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,13 @@ export default {
9292
getSizes () {
9393
const { sizes, srcset, defaultSize } = this
9494
let sizesString = ''
95+
9596
if (sizes && sizes.length && (sizes.length === srcset.length)) {
9697
sizesString = srcset.map((size, idx) => `(max-width: ${size}px) ${sizes[idx]}px`).join(', ')
98+
} else {
99+
sizesString = srcset.map(size => `(max-width: ${size}px) ${parseInt(size, 10) - 40}px`).join(', ')
97100
}
98101
99-
sizesString = srcset.map(size => `(max-width: ${size}px) ${parseInt(size, 10) - 40}px`).join(', ')
100102
sizesString += ` ${defaultSize}px`
101103
102104
return sizesString
@@ -117,21 +119,26 @@ export default {
117119
})
118120
},
119121
methods: {
120-
triggerIntersection(entry = {}) {
121-
const { $el, timeOut, srcset, getSrcset, imageKitPrefix, hash, src } = this
122-
const img = $el.querySelector('.vue-image-kit__img')
122+
onloadImage (imgEl) {
123+
delete imgEl.onload
124+
const { $el } = this
123125
const placeholder = $el.querySelector('.vue-image-kit__placeholder')
124126
125-
img.onload = function () {
126-
delete img.onload
127-
$el.classList.add('vue-image-kit--loaded')
127+
$el.classList.add('vue-image-kit--loaded')
128128
129-
if (placeholder) {
130-
timeOut = setTimeout(() => {
131-
placeholder.remove()
132-
}, 300)
133-
}
129+
if (placeholder) {
130+
this.timeOut = setTimeout(() => {
131+
placeholder.remove()
132+
}, 300)
134133
}
134+
},
135+
triggerIntersection (entry = {}) {
136+
const { $el, srcset, getSrcset, imageKitPrefix, hash, src } = this
137+
const img = $el.querySelector('.vue-image-kit__img')
138+
139+
img.onload = function () {
140+
this.onloadImage(img)
141+
}.bind(this)
135142
136143
if (entry.isIntersecting) {
137144
this.showCanvas = false

stories/index.stories.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ timelineStory.add('Default', () => {
5757
default: text('Custom transform', '')
5858
},
5959
width: {
60-
type: String,
61-
default: text('Width', '1400px')
60+
type: Number,
61+
default: number('Width', 1400)
6262
},
6363
height: {
64-
type: String,
65-
default: text('Height', '800px')
64+
type: Number,
65+
default: number('Height', 800)
6666
},
6767
alt: {
6868
type: String,

tests/unit/vue-image-kit.spec.js

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { mount, shallowMount, createLocalVue } from '@vue/test-utils'
22
import VueImageKit from '../../src/components/VueImageKit'
33
import 'jest-canvas-mock'
44

5-
function setupIntersectionObserverMock({
5+
function setupIntersectionObserverMock ({
66
observe = () => null,
7-
unobserve = () => null,
7+
unobserve = () => null
88
} = {}) {
99
class IntersectionObserver {
1010
observe = observe
1111
unobserve = unobserve
12-
disconnect() {}
12+
disconnect () {}
1313
}
1414
Object.defineProperty(
1515
window,
@@ -23,16 +23,13 @@ function setupIntersectionObserverMock({
2323
)
2424
}
2525

26-
function waitForImageToLoad(imageElement) {
27-
return new Promise(resolve => { imageElement.onload = resolve })
28-
}
29-
3026
describe('When I create the VueImageKit component', () => {
3127
const item = { hash: '6xhf1gnexgdgk', src: 'lion_BllLvaqVn.jpg' }
3228

3329
beforeEach(() => {
3430
setupIntersectionObserverMock()
3531
})
32+
3633
const createComponent = (propsData = {}) => {
3734
return shallowMount(VueImageKit, { propsData })
3835
}
@@ -141,6 +138,16 @@ describe('When I create the VueImageKit component', () => {
141138
expect(main.attributes().sizes).toBe(expected)
142139
})
143140

141+
it('should have different sizes and srcset from default', () => {
142+
const wrapper = createComponent({ ...item, srcset: [210, 220, 230], sizes: [210, 220, 230] })
143+
const main = wrapper.find('.vue-image-kit > .vue-image-kit__img')
144+
expect(main.exists()).toBe(true)
145+
const expected = '(max-width: 210px) 210px, (max-width: 220px) 220px, (max-width: 230px) 230px 1080px'
146+
expect(main.attributes().sizes).toBe(expected)
147+
const expectedSrcset = 'https://ik.imagekit.io/6xhf1gnexgdgk/tr:w-210/lion_BllLvaqVn.jpg 210w, https://ik.imagekit.io/6xhf1gnexgdgk/tr:w-220/lion_BllLvaqVn.jpg 220w, https://ik.imagekit.io/6xhf1gnexgdgk/tr:w-230/lion_BllLvaqVn.jpg 230w'
148+
expect(main.attributes().srcset).toBe(expectedSrcset)
149+
})
150+
144151
it('should have different default size', () => {
145152
const wrapper = createComponent({ ...item, defaultSize: 1366 })
146153
const main = wrapper.find('.vue-image-kit > .vue-image-kit__img')
@@ -170,15 +177,14 @@ describe('When I create the VueImageKit component', () => {
170177
it('should clear the timeout on disconnect', (done) => {
171178
const wrapper = createComponent({ ...item, width: 300, height: 300, placeholder: 'https://ik.imagekit.io/6xhf1gnexgdgk/igor2_HJhiHMa54.png' })
172179
expect(wrapper.exists()).toBe(true)
180+
wrapper.destroy()
173181
setTimeout(() => {
174-
wrapper.destroy()
175182
expect(wrapper.vm.timeOut).toBe(null)
176183
done()
177184
}, 500)
178185
})
179186

180-
it('should trigger intersection', (done) => {
181-
// ! WIP
187+
it('should trigger intersection', async () => {
182188
const localVue = createLocalVue()
183189
const wrapper = mount(VueImageKit, {
184190
propsData: { ...item, width: 300, height: 300, placeholder: 'https://ik.imagekit.io/6xhf1gnexgdgk/igor2_HJhiHMa54.png' },
@@ -197,17 +203,12 @@ describe('When I create the VueImageKit component', () => {
197203
const placeholder = wrapper.find('.vue-image-kit__placeholder')
198204
expect(placeholder.exists()).toBe(true)
199205
expect(wrapper.vm.$el.querySelector('.vue-image-kit__placeholder')).toBeDefined()
200-
setTimeout(() => {
201-
const imgQuerySelector = wrapper.vm.$el.querySelector('.vue-image-kit__img')
202-
waitForImageToLoad(imgQuerySelector)
203-
// expect(imgQuerySelector.classList).toContainEqual(['vue-image-kit--loaded'])
204-
const placeholderAgain = wrapper.find('.vue-image-kit__placeholder')
205-
expect(placeholderAgain.exists()).toBe(false)
206-
expect(wrapper.vm.timeOut).toBeNull()
207-
expect(wrapper.vm.$el.querySelector('.vue-image-kit__placeholder')).toBeNull()
208-
// expect(wrapper.vm.$el.querySelector('.vue-image-kit__img').onload).toHaveBeenCalled()
209-
done()
210-
}, 301)
206+
wrapper.vm.$el.querySelector('.vue-image-kit__img').onload()
207+
await wrapper.vm.$nextTick()
208+
const placeholderAgain = wrapper.find('.vue-image-kit__placeholder')
209+
expect(placeholderAgain.exists()).toBe(false)
210+
expect(wrapper.vm.timeOut).not.toBeNull()
211+
expect(wrapper.vm.$el.querySelector('.vue-image-kit__placeholder')).toBeNull()
211212
})
212213

213214
it('should match snapshot', () => {

0 commit comments

Comments
 (0)