mirror of
https://github.com/bs-community/blessing-skin-server.git
synced 2024-12-21 06:19:38 +08:00
Add test for component "ClosetItem"
This commit is contained in:
parent
83c40cfd40
commit
69e9641bf4
141
resources/assets/src/components/user/ClosetItem.vue
Normal file
141
resources/assets/src/components/user/ClosetItem.vue
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
<template>
|
||||||
|
<div class="item" :class="{ 'item-selected': selected }">
|
||||||
|
<div class="item-body" @click="$emit('select')">
|
||||||
|
<img :src="previewLink">
|
||||||
|
</div>
|
||||||
|
<div class="item-footer">
|
||||||
|
<p class="texture-name">
|
||||||
|
<span :title="name">{{ textureName }} <small>({{ type }})</small></span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<a :href="linkToSkinlib" :title="$t('user.viewInSkinlib')" class="more" data-toggle="tooltip" data-placement="bottom"><i class="fa fa-share"></i></a>
|
||||||
|
<span :title="$t('general.more')" class="more" data-toggle="dropdown" aria-haspopup="true" id="more-button"><i class="fa fa-cog"></i></span>
|
||||||
|
|
||||||
|
<ul class="dropup dropdown-menu" aria-labelledby="more-button">
|
||||||
|
<li><a @click="rename" v-t="'user.renameItem'"></a></li>
|
||||||
|
<li><a @click="remove" v-t="'user.removeItem'"></a></li>
|
||||||
|
<li><a @click="setAsAvatar" v-t="'user.setAsAvatar'"></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import swal from 'sweetalert2';
|
||||||
|
import toastr from 'toastr';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'ClosetItem',
|
||||||
|
props: {
|
||||||
|
tid: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
validator: value => ['steve', 'alex', 'cape'].includes(value)
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
selected: Boolean
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
previewLink() {
|
||||||
|
return `${blessing.base_url}/preview/${this.tid}.png`;
|
||||||
|
},
|
||||||
|
linkToSkinlib() {
|
||||||
|
return `${blessing.base_url}/skinlib/show/${this.tid}`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
textureName: this.name
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async rename() {
|
||||||
|
let newTextureName = '';
|
||||||
|
|
||||||
|
try {
|
||||||
|
newTextureName = await swal({
|
||||||
|
title: this.$t('user.renameClosetItem'),
|
||||||
|
input: 'text',
|
||||||
|
inputValue: this.textureName,
|
||||||
|
showCancelButton: true,
|
||||||
|
inputValidator: value => (new Promise((resolve, reject) => {
|
||||||
|
value ? resolve() : reject(this.$t('skinlib.emptyNewTextureName'));
|
||||||
|
}))
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: { errno, msg } } = await axios.post(
|
||||||
|
'/user/closet/rename',
|
||||||
|
{ tid: this.tid, new_name: newTextureName }
|
||||||
|
);
|
||||||
|
|
||||||
|
if (errno === 0) {
|
||||||
|
this.textureName = newTextureName;
|
||||||
|
toastr.success(msg);
|
||||||
|
} else {
|
||||||
|
toastr.warning(msg);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async remove() {
|
||||||
|
try {
|
||||||
|
await swal({
|
||||||
|
text: this.$t('user.removeFromClosetNotice'),
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: true
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: { errno, msg } } = await axios.post(
|
||||||
|
'/user/closet/remove',
|
||||||
|
{ tid: this.tid }
|
||||||
|
);
|
||||||
|
|
||||||
|
if (errno === 0) {
|
||||||
|
this.$emit('item-removed', this.tid);
|
||||||
|
swal({ type: 'success', html: msg });
|
||||||
|
} else {
|
||||||
|
toastr.warning(msg);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async setAsAvatar() {
|
||||||
|
try {
|
||||||
|
await swal({
|
||||||
|
title: this.$t('user.setAvatar'),
|
||||||
|
text: this.$t('user.setAvatarNotice'),
|
||||||
|
type: 'question',
|
||||||
|
showCancelButton: true
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: { errno, msg } } = await axios.post(
|
||||||
|
'/user/profile/avatar',
|
||||||
|
{ tid: this.tid }
|
||||||
|
);
|
||||||
|
|
||||||
|
if (errno === 0) {
|
||||||
|
toastr.success(msg);
|
||||||
|
|
||||||
|
// Refresh avatars
|
||||||
|
$('[alt="User Image"]').each(function () {
|
||||||
|
$(this).prop('src', $(this).attr('src') + '?' + new Date().getTime());
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
toastr.warning(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
117
resources/assets/tests/components/user/ClosetItem.test.js
Normal file
117
resources/assets/tests/components/user/ClosetItem.test.js
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
import { mount } from '@vue/test-utils';
|
||||||
|
import ClosetItem from '@/user/ClosetItem';
|
||||||
|
import axios from 'axios';
|
||||||
|
import swal from 'sweetalert2';
|
||||||
|
|
||||||
|
jest.mock('axios');
|
||||||
|
jest.mock('sweetalert2');
|
||||||
|
|
||||||
|
window.blessing = {
|
||||||
|
base_url: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
function factory(opt = {}) {
|
||||||
|
return {
|
||||||
|
tid: 1,
|
||||||
|
name: 'texture',
|
||||||
|
type: 'steve',
|
||||||
|
...opt
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
axios.post.mockReset();
|
||||||
|
swal.mockReset();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('computed values', () => {
|
||||||
|
const wrapper = mount(ClosetItem, { propsData: factory() });
|
||||||
|
expect(wrapper.find('img').attributes().src).toBe('/preview/1.png');
|
||||||
|
expect(wrapper.find('a.more').attributes().href).toBe('/skinlib/show/1');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('selected item', () => {
|
||||||
|
const wrapper = mount(ClosetItem, { propsData: factory({ selected: true }) });
|
||||||
|
expect(wrapper.find('.item').classes()).toContain('item-selected');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('click item body', () => {
|
||||||
|
const wrapper = mount(ClosetItem, { propsData: factory() });
|
||||||
|
|
||||||
|
wrapper.find('.item').trigger('click');
|
||||||
|
expect(wrapper.emitted().select).toBeUndefined();
|
||||||
|
|
||||||
|
wrapper.find('.item-body').trigger('click');
|
||||||
|
expect(wrapper.emitted().select).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('rename texture', async () => {
|
||||||
|
axios.post
|
||||||
|
.mockResolvedValueOnce({ data: { errno: 0 } })
|
||||||
|
.mockResolvedValueOnce({ data: { errno: 1 } });
|
||||||
|
swal.mockImplementation(async options => {
|
||||||
|
options.inputValidator('name');
|
||||||
|
options.inputValidator().catch(() => {});
|
||||||
|
return 'new-name';
|
||||||
|
});
|
||||||
|
|
||||||
|
const wrapper = mount(ClosetItem, { propsData: factory() });
|
||||||
|
const button = wrapper.findAll('.dropdown-menu > li').at(0).find('a');
|
||||||
|
|
||||||
|
button.trigger('click');
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
|
||||||
|
button.trigger('click');
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
|
||||||
|
expect(wrapper.find('.texture-name > span').text()).toBe('new-name (steve)');
|
||||||
|
expect(axios.post).toBeCalledWith(
|
||||||
|
'/user/closet/rename',
|
||||||
|
{ tid: 1, new_name: 'new-name' }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('remove texture', async () => {
|
||||||
|
axios.post
|
||||||
|
.mockResolvedValueOnce({ data: { errno: 0 } })
|
||||||
|
.mockResolvedValueOnce({ data: { errno: 1 } });
|
||||||
|
swal.mockResolvedValue();
|
||||||
|
|
||||||
|
const wrapper = mount(ClosetItem, { propsData: factory() });
|
||||||
|
const button = wrapper.findAll('.dropdown-menu > li').at(1).find('a');
|
||||||
|
|
||||||
|
button.trigger('click');
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
|
||||||
|
button.trigger('click');
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
expect(wrapper.emitted()['item-removed'][0][0]).toBe(1);
|
||||||
|
expect(axios.post).toBeCalledWith('/user/closet/remove', { tid: 1 });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set as avatar', async () => {
|
||||||
|
axios.post
|
||||||
|
.mockResolvedValueOnce({ data: { errno: 0 } })
|
||||||
|
.mockResolvedValueOnce({ data: { errno: 1 } });
|
||||||
|
swal.mockResolvedValue();
|
||||||
|
window.$ = jest.fn(() => ({
|
||||||
|
each(fn) { fn(); },
|
||||||
|
prop() {},
|
||||||
|
attr() { return ''; }
|
||||||
|
}));
|
||||||
|
|
||||||
|
const wrapper = mount(ClosetItem, { propsData: factory() });
|
||||||
|
const button = wrapper.findAll('.dropdown-menu > li').at(2).find('a');
|
||||||
|
|
||||||
|
button.trigger('click');
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
|
||||||
|
button.trigger('click');
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
expect(axios.post).toBeCalledWith('/user/profile/avatar', { tid: 1 });
|
||||||
|
expect(window.$).toBeCalledWith('[alt="User Image"]');
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user