summaryrefslogtreecommitdiff
path: root/spec/frontend/packages_and_registries/package_registry/components
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/packages_and_registries/package_registry/components')
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js8
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap2
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js16
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js57
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js2
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js156
6 files changed, 145 insertions, 96 deletions
diff --git a/spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js b/spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js
index e0e26434680..9c1ebf5a2eb 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js
@@ -63,6 +63,14 @@ describe('DeleteModal', () => {
expect(wrapper.emitted('confirm')).toHaveLength(1);
});
+ it('emits cancel when cancel event is emitted', () => {
+ expect(wrapper.emitted('cancel')).toBeUndefined();
+
+ findModal().vm.$emit('cancel');
+
+ expect(wrapper.emitted('cancel')).toHaveLength(1);
+ });
+
it('show calls gl-modal show', () => {
findModal().vm.show();
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap
index c4020eeb75f..b2375da7b11 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap
@@ -114,7 +114,7 @@ exports[`PypiInstallation renders all the messages 1`] = `
aria-live="polite"
class="btn input-group-text btn-default btn-md gl-button btn-default-secondary btn-icon"
data-clipboard-handle-tooltip="false"
- data-clipboard-text="pip install @gitlab-org/package-15 --extra-index-url http://__token__:<your_personal_token>@gdk.test:3000/api/v4/projects/1/packages/pypi/simple"
+ data-clipboard-text="pip install @gitlab-org/package-15 --index-url http://__token__:<your_personal_token>@gdk.test:3000/api/v4/projects/1/packages/pypi/simple"
id="clipboard-button-6"
title="Copy Pip command"
type="button"
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js
index ec2e833552a..bb2fa9eb6f5 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js
@@ -131,14 +131,14 @@ describe('Package History', () => {
});
describe.each`
- name | amount | icon | text | timeAgoTooltip | link
- ${'created-on'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'clock'} | ${'@gitlab-org/package-15 version 1.0.0 was first created'} | ${packageData().createdAt} | ${null}
- ${'first-pipeline-commit'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'commit'} | ${'Created by commit #b83d6e39 on branch master'} | ${null} | ${onePipeline.commitPath}
- ${'first-pipeline-pipeline'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pipeline'} | ${'Built by pipeline #1 triggered by Administrator'} | ${onePipeline.createdAt} | ${onePipeline.path}
- ${'published'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'package'} | ${'Published to the baz project Package Registry'} | ${packageData().createdAt} | ${null}
- ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'history'} | ${'Package has 1 archived update'} | ${null} | ${null}
- ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 3} | ${'history'} | ${'Package has 2 archived updates'} | ${null} | ${null}
- ${'pipeline-entry'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pencil'} | ${'Package updated by commit #b83d6e39 on branch master, built by pipeline #3, and published to the registry'} | ${packageData().createdAt} | ${onePipeline.commitPath}
+ name | amount | icon | text | timeAgoTooltip | link
+ ${'created-on'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'clock'} | ${'@gitlab-org/package-15 version 1.0.0 was first created'} | ${packageData().createdAt} | ${null}
+ ${'first-pipeline-commit'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'commit'} | ${'Created by commit b83d6e39 on branch master'} | ${null} | ${onePipeline.commitPath}
+ ${'first-pipeline-pipeline'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pipeline'} | ${'Built by pipeline #1 triggered by Administrator'} | ${onePipeline.createdAt} | ${onePipeline.path}
+ ${'published'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'package'} | ${'Published to the baz project Package Registry'} | ${packageData().createdAt} | ${null}
+ ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'history'} | ${'Package has 1 archived update'} | ${null} | ${null}
+ ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 3} | ${'history'} | ${'Package has 2 archived updates'} | ${null} | ${null}
+ ${'pipeline-entry'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pencil'} | ${'Package updated by commit b83d6e39 on branch master, built by pipeline #3, and published to the registry'} | ${packageData().createdAt} | ${onePipeline.commitPath}
`(
'with $amount pipelines history element $name',
({ name, icon, text, timeAgoTooltip, link, amount }) => {
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js
index f0fa9592419..20a459e2c1a 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js
@@ -1,7 +1,7 @@
-import { GlKeysetPagination } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import PackageVersionsList from '~/packages_and_registries/package_registry/components/details/package_versions_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 VersionRow from '~/packages_and_registries/package_registry/components/details/version_row.vue';
import { packageData } from '../../mock_data';
@@ -21,7 +21,7 @@ describe('PackageVersionsList', () => {
const uiElements = {
findLoader: () => wrapper.findComponent(PackagesListLoader),
- findListPagination: () => wrapper.findComponent(GlKeysetPagination),
+ findRegistryList: () => wrapper.findComponent(RegistryList),
findEmptySlot: () => wrapper.findComponent(EmptySlotStub),
findListRow: () => wrapper.findAllComponents(VersionRow),
};
@@ -33,6 +33,9 @@ describe('PackageVersionsList', () => {
isLoading: false,
...props,
},
+ stubs: {
+ RegistryList,
+ },
slots: {
'empty-state': EmptySlotStub,
},
@@ -55,8 +58,8 @@ describe('PackageVersionsList', () => {
expect(uiElements.findEmptySlot().exists()).toBe(false);
});
- it('does not display pagination', () => {
- expect(uiElements.findListPagination().exists()).toBe(false);
+ it('does not display registry list', () => {
+ expect(uiElements.findRegistryList().exists()).toBe(false);
});
});
@@ -77,8 +80,8 @@ describe('PackageVersionsList', () => {
expect(uiElements.findListRow().exists()).toBe(false);
});
- it('does not display pagination', () => {
- expect(uiElements.findListPagination().exists()).toBe(false);
+ it('does not display registry list', () => {
+ expect(uiElements.findRegistryList().exists()).toBe(false);
});
});
@@ -87,6 +90,19 @@ describe('PackageVersionsList', () => {
mountComponent();
});
+ it('displays package registry list', () => {
+ expect(uiElements.findRegistryList().exists()).toEqual(true);
+ });
+
+ it('binds the right props', () => {
+ expect(uiElements.findRegistryList().props()).toMatchObject({
+ items: packageList,
+ pagination: {},
+ isLoading: false,
+ hiddenDelete: true,
+ });
+ });
+
it('displays package version rows', () => {
expect(uiElements.findListRow().exists()).toEqual(true);
expect(uiElements.findListRow()).toHaveLength(packageList.length);
@@ -102,27 +118,6 @@ describe('PackageVersionsList', () => {
});
});
- describe('pagination display', () => {
- it('does not display pagination if there is no previous or next page', () => {
- expect(uiElements.findListPagination().exists()).toBe(false);
- });
-
- it('displays pagination if pageInfo.hasNextPage is true', async () => {
- await wrapper.setProps({ pageInfo: { hasNextPage: true } });
- expect(uiElements.findListPagination().exists()).toBe(true);
- });
-
- it('displays pagination if pageInfo.hasPreviousPage is true', async () => {
- await wrapper.setProps({ pageInfo: { hasPreviousPage: true } });
- expect(uiElements.findListPagination().exists()).toBe(true);
- });
-
- it('displays pagination if both pageInfo.hasNextPage and pageInfo.hasPreviousPage are true', async () => {
- await wrapper.setProps({ pageInfo: { hasNextPage: true, hasPreviousPage: true } });
- expect(uiElements.findListPagination().exists()).toBe(true);
- });
- });
-
it('does not display loader', () => {
expect(uiElements.findLoader().exists()).toBe(false);
});
@@ -137,14 +132,14 @@ describe('PackageVersionsList', () => {
mountComponent({ pageInfo: { hasNextPage: true } });
});
- it('emits prev-page event when paginator emits prev event', () => {
- uiElements.findListPagination().vm.$emit('prev');
+ it('emits prev-page event when registry list emits prev event', () => {
+ uiElements.findRegistryList().vm.$emit('prev-page');
expect(wrapper.emitted('prev-page')).toHaveLength(1);
});
- it('emits next-page when paginator emits next event', () => {
- uiElements.findListPagination().vm.$emit('next');
+ it('emits next-page when registry list emits next event', () => {
+ uiElements.findRegistryList().vm.$emit('next-page');
expect(wrapper.emitted('next-page')).toHaveLength(1);
});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js
index 20acb0872e5..4a27f8011df 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js
@@ -16,7 +16,7 @@ const packageEntity = { ...packageData(), packageType: PACKAGE_TYPE_PYPI };
describe('PypiInstallation', () => {
let wrapper;
- const pipCommandStr = `pip install @gitlab-org/package-15 --extra-index-url ${packageEntity.pypiUrl}`;
+ const pipCommandStr = `pip install @gitlab-org/package-15 --index-url ${packageEntity.pypiUrl}`;
const pypiSetupStr = `[gitlab]
repository = ${packageEntity.pypiSetupUrl}
username = __token__
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js
index 7cc5bea0f7a..5e9cb8fbb0b 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js
@@ -1,14 +1,19 @@
import { GlAlert, GlSprintf } from '@gitlab/ui';
import { nextTick } from 'vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { stubComponent } from 'helpers/stub_component';
import PackagesListRow from '~/packages_and_registries/package_registry/components/list/package_list_row.vue';
import PackagesListLoader from '~/packages_and_registries/shared/components/packages_list_loader.vue';
import DeletePackageModal from '~/packages_and_registries/shared/components/delete_package_modal.vue';
+import DeleteModal from '~/packages_and_registries/package_registry/components/delete_modal.vue';
import RegistryList from '~/packages_and_registries/shared/components/registry_list.vue';
import {
DELETE_PACKAGE_TRACKING_ACTION,
+ DELETE_PACKAGES_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
+ REQUEST_DELETE_PACKAGES_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
+ CANCEL_DELETE_PACKAGES_TRACKING_ACTION,
} from '~/packages_and_registries/package_registry/constants';
import PackagesList from '~/packages_and_registries/package_registry/components/list/packages_list.vue';
import Tracking from '~/tracking';
@@ -44,6 +49,7 @@ describe('packages_list', () => {
const findRegistryList = () => wrapper.findComponent(RegistryList);
const findPackagesListRow = () => wrapper.findComponent(PackagesListRow);
const findErrorPackageAlert = () => wrapper.findComponent(GlAlert);
+ const findDeletePackagesModal = () => wrapper.findComponent(DeleteModal);
const mountComponent = (props) => {
wrapper = shallowMountExtended(PackagesList, {
@@ -53,6 +59,11 @@ describe('packages_list', () => {
},
stubs: {
DeletePackageModal,
+ DeleteModal: stubComponent(DeleteModal, {
+ methods: {
+ show: jest.fn(),
+ },
+ }),
GlSprintf,
RegistryList,
},
@@ -125,20 +136,48 @@ describe('packages_list', () => {
});
});
- describe('when the user can destroy the package', () => {
- beforeEach(async () => {
+ describe.each`
+ description | finderFunction | deletePayload
+ ${'when the user can destroy the package'} | ${findPackagesListRow} | ${firstPackage}
+ ${'when the user can bulk destroy packages and deletes only one package'} | ${findRegistryList} | ${[firstPackage]}
+ `('$description', ({ finderFunction, deletePayload }) => {
+ let eventSpy;
+ const category = 'UI::NpmPackages';
+
+ beforeEach(() => {
+ eventSpy = jest.spyOn(Tracking, 'event');
mountComponent();
- await findPackagesListRow().vm.$emit('delete', firstPackage);
+ finderFunction().vm.$emit('delete', deletePayload);
});
it('passes itemToBeDeleted to the modal', () => {
expect(findPackageListDeleteModal().props('itemToBeDeleted')).toStrictEqual(firstPackage);
});
- it('emits package:delete when modal confirms', async () => {
- await findPackageListDeleteModal().vm.$emit('ok');
+ it('requesting delete tracks the right action', () => {
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
+
+ describe('when modal confirms', () => {
+ beforeEach(() => {
+ findPackageListDeleteModal().vm.$emit('ok');
+ });
+
+ it('emits package:delete when modal confirms', () => {
+ expect(wrapper.emitted('package:delete')[0]).toEqual([firstPackage]);
+ });
- expect(wrapper.emitted('package:delete')[0]).toEqual([firstPackage]);
+ it('tracks the right action', () => {
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ DELETE_PACKAGE_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
});
it.each(['ok', 'cancel'])('resets itemToBeDeleted when modal emits %s', async (event) => {
@@ -146,26 +185,73 @@ describe('packages_list', () => {
expect(findPackageListDeleteModal().props('itemToBeDeleted')).toBeNull();
});
+
+ it('canceling delete tracks the right action', () => {
+ findPackageListDeleteModal().vm.$emit('cancel');
+
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
});
describe('when the user can bulk destroy packages', () => {
+ let eventSpy;
+ const items = [firstPackage, secondPackage];
+
beforeEach(() => {
+ eventSpy = jest.spyOn(Tracking, 'event');
mountComponent();
+ findRegistryList().vm.$emit('delete', items);
});
- it('passes itemToBeDeleted to the modal when there is only one package', async () => {
- await findRegistryList().vm.$emit('delete', [firstPackage]);
-
- expect(findPackageListDeleteModal().props('itemToBeDeleted')).toStrictEqual(firstPackage);
+ it('passes itemsToBeDeleted to the modal', () => {
+ expect(findDeletePackagesModal().props('itemsToBeDeleted')).toStrictEqual(items);
expect(wrapper.emitted('delete')).toBeUndefined();
});
- it('emits delete when there is more than one package', () => {
- const items = [firstPackage, secondPackage];
- findRegistryList().vm.$emit('delete', items);
+ it('requesting delete tracks the right action', () => {
+ expect(eventSpy).toHaveBeenCalledWith(
+ undefined,
+ REQUEST_DELETE_PACKAGES_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
+
+ describe('when modal confirms', () => {
+ beforeEach(() => {
+ findDeletePackagesModal().vm.$emit('confirm');
+ });
+
+ it('emits delete event', () => {
+ expect(wrapper.emitted('delete')[0]).toEqual([items]);
+ });
+
+ it('tracks the right action', () => {
+ expect(eventSpy).toHaveBeenCalledWith(
+ undefined,
+ DELETE_PACKAGES_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
+ });
+
+ it.each(['confirm', 'cancel'])('resets itemsToBeDeleted when modal emits %s', async (event) => {
+ await findDeletePackagesModal().vm.$emit(event);
- expect(wrapper.emitted('delete')).toHaveLength(1);
- expect(wrapper.emitted('delete')[0]).toEqual([items]);
+ expect(findDeletePackagesModal().props('itemsToBeDeleted')).toHaveLength(0);
+ });
+
+ it('canceling delete tracks the right action', () => {
+ findDeletePackagesModal().vm.$emit('cancel');
+
+ expect(eventSpy).toHaveBeenCalledWith(
+ undefined,
+ CANCEL_DELETE_PACKAGES_TRACKING_ACTION,
+ expect.any(Object),
+ );
});
});
@@ -223,44 +309,4 @@ describe('packages_list', () => {
expect(wrapper.emitted('next-page')).toHaveLength(1);
});
});
-
- describe('tracking', () => {
- let eventSpy;
- const category = 'UI::NpmPackages';
-
- beforeEach(() => {
- eventSpy = jest.spyOn(Tracking, 'event');
- mountComponent();
- findPackagesListRow().vm.$emit('delete', firstPackage);
- return nextTick();
- });
-
- it('requesting the delete tracks the right action', () => {
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
- expect.any(Object),
- );
- });
-
- it('confirming delete tracks the right action', () => {
- findPackageListDeleteModal().vm.$emit('ok');
-
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- DELETE_PACKAGE_TRACKING_ACTION,
- expect.any(Object),
- );
- });
-
- it('canceling delete tracks the right action', () => {
- findPackageListDeleteModal().vm.$emit('cancel');
-
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
- expect.any(Object),
- );
- });
- });
});