@remotehq/vue-notification
Version:
Vue.js Notification Library
572 lines (441 loc) • 16.5 kB
JavaScript
import { mount } from 'avoriaz';
import Notifications from '../../../src/Notifications.vue';
import CssGroup from '../../../src/CssGroup.vue';
import VelocityGroup from '../../../src/VelocityGroup.vue';
describe('Notifications', () => {
describe('defaults', () => {
it('has correct default props', () => {
const wrapper = mount(Notifications);
expect(wrapper.vm.$props.width).to.eq(300);
expect(wrapper.vm.$props.reverse).to.eq(false);
expect(wrapper.vm.$props.position).to.deep.eq(['top', 'right']);
expect(wrapper.vm.$props.classes).to.eq('vue-notification');
expect(wrapper.vm.$props.animationType).to.eq('css');
expect(wrapper.vm.$props.animation.enter).to.exist;
expect(wrapper.vm.$props.animation.leave).to.exist;
expect(wrapper.vm.$props.speed).to.eq(300);
expect(wrapper.vm.$props.duration).to.eq(3000);
expect(wrapper.vm.$props.delay).to.eq(0);
expect(wrapper.vm.$props.ignoreDuplicates).to.eq(false);
});
it('list is empty', () => {
const wrapper = mount(Notifications);
expect(wrapper.data().list).to.deep.eq([]);
});
});
describe('methods', ()=> {
describe('addItem', () => {
describe('when no group', () => {
it('adds item to list', () => {
const wrapper = mount(Notifications);
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
const result = wrapper.vm.addItem(event);
expect(wrapper.data().list.length).to.eq(1);
expect(wrapper.data().list[0].id).to.exist;
expect(wrapper.data().list[0].title).to.eq('Title');
expect(wrapper.data().list[0].text).to.eq('Text');
expect(wrapper.data().list[0].type).to.eq('success');
expect(wrapper.data().list[0].state).to.eq(0);
expect(wrapper.data().list[0].speed).to.eq(300);
expect(wrapper.data().list[0].length).to.eq(3600);
expect(wrapper.data().list[0].timer).to.exist;
});
});
describe('when a group is defined and matches event group name', () => {
it('adds item to list', () => {
const propsData = {
group: 'Group',
};
const wrapper = mount(Notifications, { propsData });
const event = {
group: 'Group',
title: 'Title',
text: 'Text',
type: 'success',
};
const result = wrapper.vm.addItem(event);
expect(wrapper.data().list.length).to.eq(1);
expect(wrapper.data().list[0].id).to.exist;
expect(wrapper.data().list[0].title).to.eq('Title');
expect(wrapper.data().list[0].text).to.eq('Text');
expect(wrapper.data().list[0].type).to.eq('success');
expect(wrapper.data().list[0].state).to.eq(0);
expect(wrapper.data().list[0].speed).to.eq(300);
expect(wrapper.data().list[0].length).to.eq(3600);
expect(wrapper.data().list[0].timer).to.exist;
});
});
describe('when a group is defined and does not match event group name', () => {
it('does not add item to list', () => {
const propsData = {
group: 'Does Not Match',
};
const wrapper = mount(Notifications, { propsData });
const event = {
group: 'Group',
title: 'Title',
text: 'Text',
type: 'success',
};
const result = wrapper.vm.addItem(event);
expect(wrapper.data().list.length).to.eq(0);
});
});
describe('item property overrides', () => {
it('item length calculated from duration and speed props', () => {
const duration = 50;
const speed = 25;
const expectedLength = duration + 2 * speed;
const propsData = {
duration,
speed,
};
const wrapper = mount(Notifications, { propsData });
const event = {
group: 'Group',
title: 'Title',
text: 'Text',
type: 'success',
};
const result = wrapper.vm.addItem(event);
expect(wrapper.data().list.length).to.eq(1);
expect(wrapper.data().list[0].speed).to.eq(speed);
expect(wrapper.data().list[0].length).to.eq(expectedLength);
});
});
describe('order of inserted items', () => {
it('by default inserts items in reverse order', () => {
const wrapper = mount(Notifications);
const event1 = {
title: 'First',
};
const event2 = {
title: 'Second',
};
wrapper.vm.addItem(event1);
wrapper.vm.addItem(event2);
expect(wrapper.data().list.length).to.eq(2);
expect(wrapper.data().list[0].title).to.eq('Second');
expect(wrapper.data().list[1].title).to.eq('First');
});
it('when position is top and reverse is false, inserts in reverse order', () => {
const propsData = {
position: 'top right',
reverse: false,
};
const wrapper = mount(Notifications, { propsData });
const event1 = {
title: 'First',
};
const event2 = {
title: 'Second',
};
wrapper.vm.addItem(event1);
wrapper.vm.addItem(event2);
expect(wrapper.data().list.length).to.eq(2);
expect(wrapper.data().list[0].title).to.eq('Second');
expect(wrapper.data().list[1].title).to.eq('First');
});
it('when position is top and reverse is true, inserts in sequential order', () => {
const propsData = {
position: 'top right',
reverse: true,
};
const wrapper = mount(Notifications, { propsData });
const event1 = {
title: 'First',
};
const event2 = {
title: 'Second',
};
wrapper.vm.addItem(event1);
wrapper.vm.addItem(event2);
expect(wrapper.data().list.length).to.eq(2);
expect(wrapper.data().list[0].title).to.eq('First');
expect(wrapper.data().list[1].title).to.eq('Second');
});
it('when position is bottom and reverse is false, inserts in sequential order', () => {
const propsData = {
position: 'bottom right',
reverse: false,
};
const wrapper = mount(Notifications, { propsData });
const event1 = {
title: 'First',
};
const event2 = {
title: 'Second',
};
wrapper.vm.addItem(event1);
wrapper.vm.addItem(event2);
expect(wrapper.data().list.length).to.eq(2);
expect(wrapper.data().list[0].title).to.eq('First');
expect(wrapper.data().list[1].title).to.eq('Second');
});
it('when position is bottom and reverse is true, inserts in reverse order', () => {
const propsData = {
position: 'bottom right',
reverse: true,
};
const wrapper = mount(Notifications, { propsData });
const event1 = {
title: 'First',
};
const event2 = {
title: 'Second',
};
wrapper.vm.addItem(event1);
wrapper.vm.addItem(event2);
expect(wrapper.data().list.length).to.eq(2);
expect(wrapper.data().list[0].title).to.eq('Second');
expect(wrapper.data().list[1].title).to.eq('First');
});
});
describe('auto-destroy of items', () => {
it('item is destroyed after certain duration', () => {
const duration = 50;
const speed = 25;
const expectedLength = duration + 2 * speed;
const propsData = {
duration,
speed,
};
const clock = sinon.useFakeTimers();
const wrapper = mount(Notifications, { propsData });
const event = {
group: 'Group',
title: 'Title',
text: 'Text',
type: 'success',
};
const result = wrapper.vm.addItem(event);
expect(wrapper.data().list.length).to.eq(1);
clock.tick(expectedLength);
expect(wrapper.data().list.length).to.eq(0);
clock.restore();
});
});
describe('when ignoreDuplictes is on', () => {
const wrapper = mount(Notifications, {
propsData: {
ignoreDuplicates: true
}
});
it('adds unique item to list', () => {
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
const result = wrapper.vm.addItem(event);
expect(wrapper.data().list.length).to.eq(1);
expect(wrapper.data().list[0].id).to.exist;
expect(wrapper.data().list[0].title).to.eq('Title');
expect(wrapper.data().list[0].text).to.eq('Text');
expect(wrapper.data().list[0].type).to.eq('success');
expect(wrapper.data().list[0].state).to.eq(0);
expect(wrapper.data().list[0].speed).to.eq(300);
expect(wrapper.data().list[0].length).to.eq(3600);
expect(wrapper.data().list[0].timer).to.exist;
});
});
it('does not add item with same title and text to list', () => {
const wrapper = mount(Notifications);
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
const result = wrapper.vm.addItem(event);
expect(wrapper.data().list.length).to.eq(1);
expect(wrapper.data().list[0].id).to.exist;
expect(wrapper.data().list[0].title).to.eq('Title');
expect(wrapper.data().list[0].text).to.eq('Text');
expect(wrapper.data().list[0].type).to.eq('success');
expect(wrapper.data().list[0].state).to.eq(0);
expect(wrapper.data().list[0].speed).to.eq(300);
expect(wrapper.data().list[0].length).to.eq(3600);
expect(wrapper.data().list[0].timer).to.exist;
});
});
});
describe('rendering', () => {
describe('notification wrapper', () => {
it('adds notification item with correct title and text', (done) => {
const wrapper = mount(Notifications);
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
wrapper.vm.addItem(event);
wrapper.vm.$nextTick(() => {
const notifications = wrapper.find('.notification-wrapper');
expect(notifications.length).to.eq(1);
const title = wrapper.first('.notification-title').text();
expect(title).to.eq('Title');
const text = wrapper.first('.notification-content').text();
expect(text).to.eq('Text');
done();
});
});
it('adds notification with correct inline styling', (done) => {
const wrapper = mount(Notifications);
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
wrapper.vm.addItem(event);
wrapper.vm.$nextTick(() => {
const notification = wrapper.first('.notification-wrapper');
expect(notification).to.exist;
expect(notification.element.style.transition).to.eq('all 300ms');
done();
});
});
it('adds the event type as css class body', (done) => {
const wrapper = mount(Notifications);
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
wrapper.vm.addItem(event);
wrapper.vm.$nextTick(() => {
const notification = wrapper.first('.notification-wrapper > div');
expect(notification).to.exist;
expect(notification.element.className).includes('notification')
expect(notification.element.className).includes('vue-notification')
expect(notification.element.className).includes('success')
done();
});
});
it('has correct default body classes', (done) => {
const wrapper = mount(Notifications);
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
wrapper.vm.addItem(event);
wrapper.vm.$nextTick(() => {
const notification = wrapper.first('.notification-wrapper > div');
expect(notification).to.exist;
expect(notification.element.className).includes('vue-notification')
done();
});
});
it('body classes can be customized via prop', (done) => {
const propsData = {
classes: 'pizza taco-sushi'
};
const wrapper = mount(Notifications, { propsData });
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
wrapper.vm.addItem(event);
wrapper.vm.$nextTick(() => {
const notification = wrapper.first('.notification-wrapper > div');
expect(notification).to.exist;
expect(notification.element.className).includes('pizza');
expect(notification.element.className).includes('taco-sushi');
done();
});
});
});
describe('transition wrapper', () => {
it('default is css transition', () => {
const wrapper = mount(Notifications);
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
expect(wrapper.find(CssGroup).length).to.eq(1);
expect(wrapper.find(VelocityGroup).length).to.eq(0);
});
it('uses using velocity transition when enabled via prop', () => {
const propsData = {
animationType: 'velocity',
};
const wrapper = mount(Notifications, { propsData });
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
expect(wrapper.find(CssGroup).length).to.eq(0);
expect(wrapper.find(VelocityGroup).length).to.eq(1);
});
});
});
describe('with velocity animation library', () => {
const velocity = sinon.stub();
Notifications.configure({ velocity });
it('applies no additional inline styling to notification', (done) => {
const propsData = {
animationType: 'velocity',
};
const wrapper = mount(Notifications, { propsData });
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
wrapper.vm.addItem(event);
wrapper.vm.$nextTick(() => {
const notification = wrapper.first('.notification-wrapper');
expect(notification).to.exist;
expect(notification.element.style.transition).to.eq('');
done();
});
});
it('adds item to list', () => {
const propsData = {
animationType: 'velocity',
};
const wrapper = mount(Notifications, { propsData });
const event = {
title: 'Title',
text: 'Text',
type: 'success',
};
const result = wrapper.vm.addItem(event);
expect(wrapper.data().list.length).to.eq(1);
expect(wrapper.data().list[0].id).to.exist;
expect(wrapper.data().list[0].title).to.eq('Title');
expect(wrapper.data().list[0].text).to.eq('Text');
expect(wrapper.data().list[0].type).to.eq('success');
expect(wrapper.data().list[0].state).to.eq(0);
expect(wrapper.data().list[0].speed).to.eq(300);
expect(wrapper.data().list[0].length).to.eq(3600);
expect(wrapper.data().list[0].timer).to.exist;
});
it('calls velocity service for animations', () => {
const duration = 50;
const speed = 25;
const expectedLength = duration + 2 * speed;
const propsData = {
animationType: 'velocity',
duration,
speed,
};
const wrapper = mount(Notifications, { propsData });
const event = {
group: 'Group',
title: 'Title',
text: 'Text',
type: 'success',
};
const result = wrapper.vm.addItem(event);
expect(velocity.called).to.eq(true);
});
});
});