Fixes per feedback on user avatar components.

This commit is contained in:
Bryce Johnson 2017-05-17 11:22:26 -04:00
parent 3c668fa04f
commit b73959a94b
7 changed files with 26 additions and 92 deletions

View file

@ -16,12 +16,11 @@
*/
import defaultAvatarUrl from 'images/no_avatar.png';
import UserAvatarSizeMixin from './user_avatar_size_mixin';
import TooltipMixin from '../../mixins/tooltip';
export default {
name: 'UserAvatarImage',
mixins: [UserAvatarSizeMixin, TooltipMixin],
mixins: [TooltipMixin],
props: {
imgSrc: {
type: String,
@ -58,8 +57,8 @@ export default {
tooltipContainer() {
return this.tooltipText ? 'body' : null;
},
imgCssClasses() {
return `avatar ${this.avatarSizeClass} ${this.cssClasses}`;
avatarSizeClass() {
return `s${this.size}`;
},
},
};
@ -67,9 +66,11 @@ export default {
<template>
<img
:class="imgCssClasses"
class="avatar"
:class="[avatarSizeClass, cssClasses]"
:src="imgSrc"
:style="avatarSizeStylesMap"
:width="size"
:height="size"
:alt="imgAlt"
:data-container="tooltipContainer"
:data-placement="tooltipPlacement"

View file

@ -1,13 +0,0 @@
export default {
computed: {
avatarSizeStylesMap() {
return {
width: `${this.size}px`,
height: `${this.size}px`,
};
},
avatarSizeClass() {
return `s${this.size}`;
},
},
};

View file

@ -14,10 +14,7 @@
*/
import UserAvatarSizeMixin from './user_avatar_size_mixin';
export default {
mixins: [UserAvatarSizeMixin],
props: {
svg: {
type: String,
@ -29,13 +26,19 @@ export default {
default: 20,
},
},
computed: {
avatarSizeClass() {
return `s${this.size}`;
},
},
};
</script>
<template>
<svg
:class="avatarSizeClass"
:style="avatarSizeStylesMap"
:height="size"
:width="size"
v-html="svg">
</svg>
</template>

View file

@ -18,8 +18,6 @@ describe('User Avatar Image Component', function () {
this.userAvatarImage = new UserAvatarImageComponent({
propsData: this.propsData,
}).$mount();
this.imageElement = this.userAvatarImage.$el.outerHTML;
});
it('should return a defined Vue component', function () {
@ -27,14 +25,7 @@ describe('User Avatar Image Component', function () {
});
it('should have <img> as a child element', function () {
const componentImgTag = this.userAvatarImage.$el.outerHTML;
expect(componentImgTag).toContain('<img');
});
it('should return neccessary props as defined', function () {
_.each(this.propsData, (val, key) => {
expect(this.userAvatarImage[key]).toBeDefined();
});
expect(this.userAvatarImage.$el.tagName).toBe('IMG');
});
it('should properly compute tooltipContainer', function () {
@ -42,19 +33,22 @@ describe('User Avatar Image Component', function () {
});
it('should properly render tooltipContainer', function () {
expect(this.imageElement).toContain('data-container="body"');
expect(this.userAvatarImage.$el.getAttribute('data-container')).toBe('body');
});
it('should properly compute avatarSizeClass', function () {
expect(this.userAvatarImage.avatarSizeClass).toBe('s99');
});
it('should properly compute imgCssClasses', function () {
expect(this.userAvatarImage.imgCssClasses).toBe('avatar s99 myextraavatarclass');
});
it('should properly render img css', function () {
const classList = this.userAvatarImage.$el.classList;
const containsAvatar = classList.contains('avatar');
const containsSizeClass = classList.contains('s99');
const containsCustomClass = classList.contains('myextraavatarclass');
it('should properly render imgCssClasses', function () {
expect(this.imageElement).toContain('avatar s99 myextraavatarclass');
expect(containsAvatar).toBe(true);
expect(containsSizeClass).toBe(true);
expect(containsCustomClass).toBe(true);
});
});
});

View file

@ -35,13 +35,11 @@ describe('User Avatar Link Component', function () {
});
it('should render <a> as a child element', function () {
const componentLinkTag = this.userAvatarLink.$el.outerHTML;
expect(componentLinkTag).toContain('<a');
expect(this.userAvatarLink.$el.tagName).toBe('A');
});
it('should have <img> as a child element', function () {
const componentImgTag = this.userAvatarLink.$el.outerHTML;
expect(componentImgTag).toContain('<img');
expect(this.userAvatarLink.$el.querySelector('img')).not.toBeNull();
});
it('should return neccessary props as defined', function () {
@ -49,10 +47,4 @@ describe('User Avatar Link Component', function () {
expect(this.userAvatarLink[key]).toBeDefined();
});
});
it('should include props in the rendered output', function () {
_.each(this.propsData, (val) => {
expect(this.userAvatarLink.$el.outerHTML).toContain(val);
});
});
});

View file

@ -1,37 +0,0 @@
import Vue from 'vue';
import UserAvatarSizeMixin from '~/vue_shared/components/user_avatar/user_avatar_size_mixin';
describe('User Avatar Size Mixin', () => {
beforeEach(() => {
this.vueInstance = new Vue({
data: {
size: 99,
},
mixins: [UserAvatarSizeMixin],
});
});
describe('#avatarSizeClass', () => {
it('should be a defined computed value', () => {
expect(this.vueInstance.avatarSizeClass).toBeDefined();
});
it('should correctly transform size into the class name', () => {
expect(this.vueInstance.avatarSizeClass).toBe('s99');
});
});
describe('#avatarSizeStylesMap', () => {
it('should be a defined computed value', () => {
expect(this.vueInstance.avatarSizeStylesMap).toBeDefined();
});
it('should return a correctly formatted styles width', () => {
expect(this.vueInstance.avatarSizeStylesMap.width).toBe('99px');
});
it('should return a correctly formatted styles height', () => {
expect(this.vueInstance.avatarSizeStylesMap.height).toBe('99px');
});
});
});

View file

@ -25,11 +25,5 @@ describe('User Avatar Svg Component', function () {
expect(this.userAvatarSvg.$el.tagName).toEqual('svg');
expect(this.userAvatarSvg.$el.innerHTML).toContain('<path');
});
it('should return neccessary props as defined', function () {
_.each(this.propsData, (val, key) => {
expect(this.userAvatarSvg[key]).toBeDefined();
});
});
});
});