import { GlAlert } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import SearchableList from '~/ml/model_registry/components/searchable_list.vue';
import PackagesListLoader from '~/packages_and_registries/shared/components/packages_list_loader.vue';
import RegistryList from '~/packages_and_registries/shared/components/registry_list.vue';
import { defaultPageInfo } from '../mock_data';
describe('ml/model_registry/components/searchable_list.vue', () => {
let wrapper;
const findAlert = () => wrapper.findComponent(GlAlert);
const findLoader = () => wrapper.findComponent(PackagesListLoader);
const findRegistryList = () => wrapper.findComponent(RegistryList);
const findEmptyState = () => wrapper.findByTestId('empty-state-slot');
const findFirstRow = () => wrapper.findByTestId('element');
const findRows = () => wrapper.findAllByTestId('element');
const defaultProps = {
items: ['a', 'b', 'c'],
pageInfo: defaultPageInfo,
isLoading: false,
errorMessage: '',
};
const mountComponent = (props = {}) => {
wrapper = shallowMountExtended(SearchableList, {
propsData: {
...defaultProps,
...props,
},
stubs: {
RegistryList,
},
slots: {
'empty-state': '
This is empty
',
item: '',
},
});
};
describe('when list is loaded and has no data', () => {
beforeEach(() => mountComponent({ items: [] }));
it('shows empty state', () => {
expect(findEmptyState().text()).toBe('This is empty');
});
it('does not display loader', () => {
expect(findLoader().exists()).toBe(false);
});
it('does not display rows', () => {
expect(findFirstRow().exists()).toBe(false);
});
it('does not display registry list', () => {
expect(findRegistryList().exists()).toBe(false);
});
it('does not display alert', () => {
expect(findAlert().exists()).toBe(false);
});
});
describe('if errorMessage', () => {
beforeEach(() => mountComponent({ errorMessage: 'Failure!' }));
it('shows error message', () => {
expect(findAlert().text()).toContain('Failure!');
});
it('is not dismissible', () => {
expect(findAlert().props('dismissible')).toBe(false);
});
it('is of variant danger', () => {
expect(findAlert().attributes('variant')).toBe('danger');
});
it('hides loader', () => {
expect(findLoader().exists()).toBe(false);
});
it('hides registry list', () => {
expect(findRegistryList().exists()).toBe(false);
});
it('hides empty state', () => {
expect(findEmptyState().exists()).toBe(false);
});
});
describe('if loading', () => {
beforeEach(() => mountComponent({ isLoading: true }));
it('shows loader', () => {
expect(findLoader().exists()).toBe(true);
});
it('hides error message', () => {
expect(findAlert().exists()).toBe(false);
});
it('hides registry list', () => {
expect(findRegistryList().exists()).toBe(false);
});
it('hides empty state', () => {
expect(findEmptyState().exists()).toBe(false);
});
});
describe('when list is loaded with data', () => {
beforeEach(() => mountComponent());
it('displays package registry list', () => {
expect(findRegistryList().exists()).toEqual(true);
});
it('binds the right props', () => {
expect(findRegistryList().props()).toMatchObject({
items: ['a', 'b', 'c'],
isLoading: false,
pagination: defaultPageInfo,
hiddenDelete: true,
});
});
it('displays package version rows', () => {
expect(findRows().exists()).toEqual(true);
expect(findRows()).toHaveLength(3);
});
it('does not display loader', () => {
expect(findLoader().exists()).toBe(false);
});
it('does not display empty state', () => {
expect(findEmptyState().exists()).toBe(false);
});
});
describe('when user interacts with pagination', () => {
beforeEach(() => mountComponent());
it('when list emits next-page emits fetchPage with correct pageInfo', () => {
findRegistryList().vm.$emit('next-page');
const expectedNewPageInfo = {
after: 'eyJpZCI6IjIifQ',
first: 30,
last: null,
};
expect(wrapper.emitted('fetch-page')).toEqual([[expectedNewPageInfo]]);
});
it('when list emits prev-page emits fetchPage with correct pageInfo', () => {
findRegistryList().vm.$emit('prev-page');
const expectedNewPageInfo = {
before: 'eyJpZCI6IjE2In0',
first: null,
last: 30,
};
expect(wrapper.emitted('fetch-page')).toEqual([[expectedNewPageInfo]]);
});
});
});