mirror of
https://github.com/gitlabhq/gitlabhq.git
synced 2025-08-10 03:00:46 +00:00
147 lines
4.6 KiB
JavaScript
147 lines
4.6 KiB
JavaScript
import {
|
|
GlAvatarLabeled,
|
|
GlAvatarLink,
|
|
GlEmptyState,
|
|
GlLoadingIcon,
|
|
GlPagination,
|
|
} from '@gitlab/ui';
|
|
import { shallowMount } from '@vue/test-utils';
|
|
|
|
import users from 'test_fixtures/api/users/followers/get.json';
|
|
import Follow from '~/profile/components/follow.vue';
|
|
import { DEFAULT_PER_PAGE } from '~/api';
|
|
import { isCurrentUser } from '~/lib/utils/common_utils';
|
|
|
|
jest.mock('~/rest_api');
|
|
jest.mock('~/lib/utils/common_utils');
|
|
|
|
describe('FollowersTab', () => {
|
|
let wrapper;
|
|
|
|
const defaultPropsData = {
|
|
users,
|
|
loading: false,
|
|
page: 1,
|
|
totalItems: 50,
|
|
currentUserEmptyStateTitle: 'UserProfile|You do not have any followers.',
|
|
visitorEmptyStateTitle: "UserProfile|This user doesn't have any followers.",
|
|
};
|
|
|
|
const defaultProvide = {
|
|
followEmptyState: '/illustrations/empty-state/empty-friends-md.svg',
|
|
userId: '1',
|
|
};
|
|
|
|
const createComponent = ({ propsData = {} } = {}) => {
|
|
wrapper = shallowMount(Follow, {
|
|
propsData: {
|
|
...defaultPropsData,
|
|
...propsData,
|
|
},
|
|
provide: defaultProvide,
|
|
});
|
|
};
|
|
|
|
const findPagination = () => wrapper.findComponent(GlPagination);
|
|
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
|
|
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
|
|
|
|
describe('when `loading` prop is `true`', () => {
|
|
it('renders loading icon', () => {
|
|
createComponent({ propsData: { loading: true } });
|
|
|
|
expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('when `loading` prop is `false`', () => {
|
|
beforeEach(() => {
|
|
createComponent();
|
|
});
|
|
|
|
it('does not render loading icon', () => {
|
|
expect(findLoadingIcon().exists()).toBe(false);
|
|
});
|
|
|
|
it('renders users', () => {
|
|
const avatarLinksHref = wrapper
|
|
.findAllComponents(GlAvatarLink)
|
|
.wrappers.map((avatarLinkWrapper) => avatarLinkWrapper.attributes('href'));
|
|
const expectedAvatarLinksHref = users.map((user) => user.web_url);
|
|
|
|
const avatarLabeledProps = wrapper
|
|
.findAllComponents(GlAvatarLabeled)
|
|
.wrappers.map((avatarLabeledWrapper) => ({
|
|
label: avatarLabeledWrapper.props('label'),
|
|
subLabel: avatarLabeledWrapper.props('subLabel'),
|
|
size: avatarLabeledWrapper.attributes('size'),
|
|
entityName: avatarLabeledWrapper.attributes('entity-name'),
|
|
entityId: avatarLabeledWrapper.attributes('entity-id'),
|
|
src: avatarLabeledWrapper.attributes('src'),
|
|
}));
|
|
const expectedAvatarLabeledProps = users.map((user) => ({
|
|
src: user.avatar_url,
|
|
size: '48',
|
|
entityId: user.id.toString(),
|
|
entityName: user.name,
|
|
label: user.name,
|
|
subLabel: user.username,
|
|
}));
|
|
|
|
expect(avatarLinksHref).toEqual(expectedAvatarLinksHref);
|
|
expect(avatarLabeledProps).toEqual(expectedAvatarLabeledProps);
|
|
});
|
|
|
|
it('renders `GlPagination` and passes correct props', () => {
|
|
expect(wrapper.findComponent(GlPagination).props()).toMatchObject({
|
|
align: 'center',
|
|
value: defaultPropsData.page,
|
|
totalItems: defaultPropsData.totalItems,
|
|
perPage: DEFAULT_PER_PAGE,
|
|
prevText: Follow.i18n.prev,
|
|
nextText: Follow.i18n.next,
|
|
});
|
|
});
|
|
|
|
describe('when `GlPagination` emits `input` event', () => {
|
|
it('emits `pagination-input` event', () => {
|
|
const nextPage = defaultPropsData.page + 1;
|
|
|
|
findPagination().vm.$emit('input', nextPage);
|
|
|
|
expect(wrapper.emitted('pagination-input')).toEqual([[nextPage]]);
|
|
});
|
|
});
|
|
|
|
describe('when the users prop is empty', () => {
|
|
describe('when user is the current user', () => {
|
|
beforeEach(() => {
|
|
isCurrentUser.mockImplementation(() => true);
|
|
createComponent({ propsData: { users: [] } });
|
|
});
|
|
|
|
it('displays empty state with correct message', () => {
|
|
expect(findEmptyState().props()).toMatchObject({
|
|
svgPath: defaultProvide.followEmptyState,
|
|
title: defaultPropsData.currentUserEmptyStateTitle,
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('when user is a visitor', () => {
|
|
beforeEach(() => {
|
|
isCurrentUser.mockImplementation(() => false);
|
|
createComponent({ propsData: { users: [] } });
|
|
});
|
|
|
|
it('displays empty state with correct message', () => {
|
|
expect(findEmptyState().props()).toMatchObject({
|
|
svgPath: defaultProvide.followEmptyState,
|
|
title: defaultPropsData.visitorEmptyStateTitle,
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|