Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-08-11 18:10:57 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-08-11 18:10:57 +0300
commit4f54ec92edd344449ee005fd4dd727fa2e3e3ffd (patch)
treee8e8fe275493e6af3c572c0b93525c77a4623400 /spec
parent4d68d8b937211e5cdcf58443ddf693f0f1d13794 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/fixtures/api/schemas/graphql/packages/package_details.json42
-rw-r--r--spec/fixtures/api/schemas/graphql/packages/package_nuget_dependency_link_metadata.json12
-rw-r--r--spec/frontend/environments/confirm_rollback_modal_spec.js111
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/version_row_spec.js.snap101
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/app_spec.js39
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/version_row_spec.js89
-rw-r--r--spec/frontend/packages_and_registries/package_registry/mock_data.js28
-rw-r--r--spec/graphql/types/packages/nuget/dependency_link_metdatum_type_spec.rb13
-rw-r--r--spec/graphql/types/packages/package_dependency_link_type_spec.rb13
-rw-r--r--spec/graphql/types/packages/package_dependency_type_enum_spec.rb9
-rw-r--r--spec/graphql/types/packages/package_dependency_type_spec.rb13
-rw-r--r--spec/graphql/types/packages/package_details_type_spec.rb2
-rw-r--r--spec/initializers/rails_asset_host_spec.rb9
-rw-r--r--spec/lib/gitlab/ci/config/entry/job_spec.rb14
-rw-r--r--spec/requests/api/graphql/packages/nuget_spec.rb33
-rw-r--r--spec/support/shared_contexts/graphql/requests/packages_shared_context.rb6
16 files changed, 467 insertions, 67 deletions
diff --git a/spec/fixtures/api/schemas/graphql/packages/package_details.json b/spec/fixtures/api/schemas/graphql/packages/package_details.json
index 3dfe6712b75..9e8bf7c52d0 100644
--- a/spec/fixtures/api/schemas/graphql/packages/package_details.json
+++ b/spec/fixtures/api/schemas/graphql/packages/package_details.json
@@ -99,6 +99,48 @@
"status": {
"type": ["string"],
"enum": ["DEFAULT", "HIDDEN", "PROCESSING", "ERROR"]
+ },
+ "dependencyLinks": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "pageInfo": { "type": "object" },
+ "edges": { "type": "array" },
+ "nodes": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "dependencyType": {
+ "type": "string"
+ },
+ "dependency": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "versionPattern": {
+ "type": "string"
+ }
+ }
+ },
+ "metadata": {
+ "anyOf": [
+ { "$ref": "./package_nuget_dependency_link_metadata.json" },
+ { "type": "null" }
+ ]
+ }
+ }
+ }
+ }
+ }
}
}
}
diff --git a/spec/fixtures/api/schemas/graphql/packages/package_nuget_dependency_link_metadata.json b/spec/fixtures/api/schemas/graphql/packages/package_nuget_dependency_link_metadata.json
new file mode 100644
index 00000000000..0738354528e
--- /dev/null
+++ b/spec/fixtures/api/schemas/graphql/packages/package_nuget_dependency_link_metadata.json
@@ -0,0 +1,12 @@
+{
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "targetFramework": {
+ "type": "string"
+ }
+ }
+}
diff --git a/spec/frontend/environments/confirm_rollback_modal_spec.js b/spec/frontend/environments/confirm_rollback_modal_spec.js
index d675726b82b..7ecb6602dc6 100644
--- a/spec/frontend/environments/confirm_rollback_modal_spec.js
+++ b/spec/frontend/environments/confirm_rollback_modal_spec.js
@@ -23,66 +23,73 @@ describe('Confirm Rollback Modal Component', () => {
commitUrl: 'test/-/commit/abc0123',
};
+ const retryPath = 'test/-/jobs/123/retry';
+
describe.each`
- hasMultipleCommits | environmentData
- ${true} | ${envWithLastDeployment}
- ${false} | ${envWithoutLastDeployment}
- `('when hasMultipleCommits=$hasMultipleCommits', ({ hasMultipleCommits, environmentData }) => {
- beforeEach(() => {
- environment = environmentData;
- });
+ hasMultipleCommits | environmentData | retryUrl | primaryPropsAttrs
+ ${true} | ${envWithLastDeployment} | ${null} | ${[{ variant: 'danger' }]}
+ ${false} | ${envWithoutLastDeployment} | ${retryPath} | ${[{ variant: 'danger' }, { 'data-method': 'post' }, { href: retryPath }]}
+ `(
+ 'when hasMultipleCommits=$hasMultipleCommits',
+ ({ hasMultipleCommits, environmentData, retryUrl, primaryPropsAttrs }) => {
+ beforeEach(() => {
+ environment = environmentData;
+ });
- it('should show "Rollback" when isLastDeployment is false', () => {
- const component = shallowMount(ConfirmRollbackModal, {
- propsData: {
- environment: {
- ...environment,
- isLastDeployment: false,
+ it('should show "Rollback" when isLastDeployment is false', () => {
+ const component = shallowMount(ConfirmRollbackModal, {
+ propsData: {
+ environment: {
+ ...environment,
+ isLastDeployment: false,
+ },
+ hasMultipleCommits,
+ retryUrl,
},
- hasMultipleCommits,
- },
- });
- const modal = component.find(GlModal);
+ });
+ const modal = component.find(GlModal);
- expect(modal.attributes('title')).toContain('Rollback');
- expect(modal.attributes('title')).toContain('test');
- expect(modal.attributes('ok-title')).toBe('Rollback');
- expect(modal.text()).toContain('commit abc0123');
- expect(modal.text()).toContain('Are you sure you want to continue?');
- });
+ expect(modal.attributes('title')).toContain('Rollback');
+ expect(modal.attributes('title')).toContain('test');
+ expect(modal.props('actionPrimary').text).toBe('Rollback');
+ expect(modal.props('actionPrimary').attributes).toEqual(primaryPropsAttrs);
+ expect(modal.text()).toContain('commit abc0123');
+ expect(modal.text()).toContain('Are you sure you want to continue?');
+ });
- it('should show "Re-deploy" when isLastDeployment is true', () => {
- const component = shallowMount(ConfirmRollbackModal, {
- propsData: {
- environment: {
- ...environment,
- isLastDeployment: true,
+ it('should show "Re-deploy" when isLastDeployment is true', () => {
+ const component = shallowMount(ConfirmRollbackModal, {
+ propsData: {
+ environment: {
+ ...environment,
+ isLastDeployment: true,
+ },
+ hasMultipleCommits,
},
- hasMultipleCommits,
- },
+ });
+ const modal = component.find(GlModal);
+
+ expect(modal.attributes('title')).toContain('Re-deploy');
+ expect(modal.attributes('title')).toContain('test');
+ expect(modal.props('actionPrimary').text).toBe('Re-deploy');
+ expect(modal.text()).toContain('commit abc0123');
+ expect(modal.text()).toContain('Are you sure you want to continue?');
});
- const modal = component.find(GlModal);
- expect(modal.attributes('title')).toContain('Re-deploy');
- expect(modal.attributes('title')).toContain('test');
- expect(modal.attributes('ok-title')).toBe('Re-deploy');
- expect(modal.text()).toContain('commit abc0123');
- expect(modal.text()).toContain('Are you sure you want to continue?');
- });
+ it('should emit the "rollback" event when "ok" is clicked', () => {
+ const env = { ...environmentData, isLastDeployment: true };
+ const component = shallowMount(ConfirmRollbackModal, {
+ propsData: {
+ environment: env,
+ hasMultipleCommits,
+ },
+ });
+ const eventHubSpy = jest.spyOn(eventHub, '$emit');
+ const modal = component.find(GlModal);
+ modal.vm.$emit('ok');
- it('should emit the "rollback" event when "ok" is clicked', () => {
- const env = { ...environmentData, isLastDeployment: true };
- const component = shallowMount(ConfirmRollbackModal, {
- propsData: {
- environment: env,
- hasMultipleCommits,
- },
+ expect(eventHubSpy).toHaveBeenCalledWith('rollbackEnvironment', env);
});
- const eventHubSpy = jest.spyOn(eventHub, '$emit');
- const modal = component.find(GlModal);
- modal.vm.$emit('ok');
-
- expect(eventHubSpy).toHaveBeenCalledWith('rollbackEnvironment', env);
- });
- });
+ },
+ );
});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/version_row_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/version_row_spec.js.snap
new file mode 100644
index 00000000000..8f69f943112
--- /dev/null
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/version_row_spec.js.snap
@@ -0,0 +1,101 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`VersionRow renders 1`] = `
+<div
+ class="gl-display-flex gl-flex-direction-column gl-border-b-solid gl-border-t-solid gl-border-t-1 gl-border-b-1 gl-border-t-transparent gl-border-b-gray-100"
+>
+ <div
+ class="gl-display-flex gl-align-items-center gl-py-3 gl-px-5"
+ >
+ <!---->
+
+ <div
+ class="gl-display-flex gl-xs-flex-direction-column gl-justify-content-space-between gl-align-items-stretch gl-flex-grow-1"
+ >
+ <div
+ class="gl-display-flex gl-flex-direction-column gl-xs-mb-3 gl-min-w-0 gl-flex-grow-1"
+ >
+ <div
+ class="gl-display-flex gl-align-items-center gl-text-body gl-font-weight-bold gl-min-h-6 gl-min-w-0"
+ >
+ <div
+ class="gl-display-flex gl-align-items-center gl-mr-3 gl-min-w-0"
+ >
+ <gl-link-stub
+ class="gl-text-body gl-min-w-0"
+ href="243"
+ >
+ <span
+ class="gl-truncate"
+ title="@gitlab-org/package-15"
+ >
+ <span
+ class="gl-truncate-end"
+ >
+ @gitlab-org/package-15
+ </span>
+ </span>
+ </gl-link-stub>
+
+ <package-tags-stub
+ class="gl-ml-3"
+ hidelabel="true"
+ tagdisplaylimit="1"
+ tags="[object Object],[object Object],[object Object]"
+ />
+ </div>
+
+ <!---->
+ </div>
+
+ <div
+ class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-min-h-6 gl-min-w-0 gl-flex-grow-1"
+ >
+
+ 1.0.1
+
+ </div>
+ </div>
+
+ <div
+ class="gl-display-flex gl-flex-direction-column gl-sm-align-items-flex-end gl-justify-content-space-between gl-text-gray-500 gl-flex-shrink-0"
+ >
+ <div
+ class="gl-display-flex gl-align-items-center gl-sm-text-body gl-sm-font-weight-bold gl-min-h-6"
+ >
+ <publish-method-stub
+ packageentity="[object Object]"
+ />
+ </div>
+
+ <div
+ class="gl-display-flex gl-align-items-center gl-min-h-6"
+ >
+ Created
+ <time-ago-tooltip-stub
+ cssclass=""
+ time="2021-08-10T09:33:54Z"
+ tooltipplacement="top"
+ />
+ </div>
+ </div>
+ </div>
+
+ <!---->
+ </div>
+
+ <div
+ class="gl-display-flex"
+ >
+ <div
+ class="gl-w-7"
+ />
+
+ <!---->
+
+ <div
+ class="gl-w-9"
+ />
+ </div>
+</div>
+`;
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/app_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/app_spec.js
index e5155a8e140..1bd2058cf5b 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/app_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/app_spec.js
@@ -14,6 +14,7 @@ import InstallationCommands from '~/packages_and_registries/package_registry/com
import PackageFiles from '~/packages_and_registries/package_registry/components/details/package_files.vue';
import PackageHistory from '~/packages_and_registries/package_registry/components/details/package_history.vue';
import PackageTitle from '~/packages_and_registries/package_registry/components/details/package_title.vue';
+import VersionRow from '~/packages_and_registries/package_registry/components/details/version_row.vue';
import {
FETCH_PACKAGE_DETAILS_ERROR_MESSAGE,
DELETE_PACKAGE_ERROR_MESSAGE,
@@ -28,6 +29,7 @@ import getPackageDetails from '~/packages_and_registries/package_registry/graphq
import {
packageDetailsQuery,
packageData,
+ packageVersions,
emptyPackageDetailsQuery,
packageDestroyMutation,
packageDestroyMutationError,
@@ -96,6 +98,8 @@ describe('PackagesApp', () => {
const findDeleteButton = () => wrapper.findByTestId('delete-package');
const findPackageFiles = () => wrapper.findComponent(PackageFiles);
const findDeleteFileModal = () => wrapper.findByTestId('delete-file-modal');
+ const findVersionRows = () => wrapper.findAllComponents(VersionRow);
+ const noVersionsMessage = () => wrapper.findByTestId('no-versions-message');
afterEach(() => {
wrapper.destroy();
@@ -362,4 +366,39 @@ describe('PackagesApp', () => {
});
});
});
+
+ describe('versions', () => {
+ it('displays the correct version count when the package has versions', async () => {
+ createComponent();
+
+ await waitForPromises();
+
+ expect(findVersionRows()).toHaveLength(packageVersions().length);
+ });
+
+ it('binds the correct props', async () => {
+ const [versionPackage] = packageVersions();
+ // eslint-disable-next-line no-underscore-dangle
+ delete versionPackage.__typename;
+ delete versionPackage.tags;
+
+ createComponent();
+
+ await waitForPromises();
+
+ expect(findVersionRows().at(0).props()).toMatchObject({
+ packageEntity: expect.objectContaining(versionPackage),
+ });
+ });
+
+ it('displays the no versions message when there are none', async () => {
+ createComponent({
+ resolver: jest.fn().mockResolvedValue(packageDetailsQuery({ versions: { nodes: [] } })),
+ });
+
+ await waitForPromises();
+
+ expect(noVersionsMessage().exists()).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/version_row_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/version_row_spec.js
new file mode 100644
index 00000000000..f7613949fe4
--- /dev/null
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/version_row_spec.js
@@ -0,0 +1,89 @@
+import { GlLink, GlSprintf, GlTruncate } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import PackageTags from '~/packages/shared/components/package_tags.vue';
+import PublishMethod from '~/packages/shared/components/publish_method.vue';
+import VersionRow from '~/packages_and_registries/package_registry/components/details/version_row.vue';
+import ListItem from '~/vue_shared/components/registry/list_item.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+import { packageVersions } from '../../mock_data';
+
+const packageVersion = packageVersions()[0];
+
+describe('VersionRow', () => {
+ let wrapper;
+
+ const findListItem = () => wrapper.findComponent(ListItem);
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findPackageTags = () => wrapper.findComponent(PackageTags);
+ const findPublishMethod = () => wrapper.findComponent(PublishMethod);
+ const findTimeAgoTooltip = () => wrapper.findComponent(TimeAgoTooltip);
+
+ function createComponent(packageEntity = packageVersion) {
+ wrapper = shallowMountExtended(VersionRow, {
+ propsData: {
+ packageEntity,
+ },
+ stubs: {
+ ListItem,
+ GlSprintf,
+ GlTruncate,
+ },
+ });
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders', () => {
+ createComponent();
+
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ it('has a link to the version detail', () => {
+ createComponent();
+
+ expect(findLink().attributes('href')).toBe(`${getIdFromGraphQLId(packageVersion.id)}`);
+ expect(findLink().text()).toBe(packageVersion.name);
+ });
+
+ it('has the version of the package', () => {
+ createComponent();
+
+ expect(wrapper.text()).toContain(packageVersion.version);
+ });
+
+ it('has a package tags component', () => {
+ createComponent();
+
+ expect(findPackageTags().props('tags')).toBe(packageVersion.tags.nodes);
+ });
+
+ it('has a publish method component', () => {
+ createComponent();
+
+ expect(findPublishMethod().props('packageEntity')).toBe(packageVersion);
+ });
+ it('has a time-ago tooltip', () => {
+ createComponent();
+
+ expect(findTimeAgoTooltip().props('time')).toBe(packageVersion.createdAt);
+ });
+
+ describe('disabled status', () => {
+ it('disables the list item', () => {
+ createComponent({ ...packageVersion, status: 'something' });
+
+ expect(findListItem().props('disabled')).toBe(true);
+ });
+
+ it('disables the link', () => {
+ createComponent({ ...packageVersion, status: 'something' });
+
+ expect(findLink().attributes('disabled')).toBe('true');
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/package_registry/mock_data.js b/spec/frontend/packages_and_registries/package_registry/mock_data.js
index 5cf81e5cd09..9e5457aa0fe 100644
--- a/spec/frontend/packages_and_registries/package_registry/mock_data.js
+++ b/spec/frontend/packages_and_registries/package_registry/mock_data.js
@@ -51,6 +51,27 @@ export const packageFiles = () => [
},
];
+export const packageVersions = () => [
+ {
+ createdAt: '2021-08-10T09:33:54Z',
+ id: 'gid://gitlab/Packages::Package/243',
+ name: '@gitlab-org/package-15',
+ status: 'DEFAULT',
+ tags: { nodes: packageTags() },
+ version: '1.0.1',
+ __typename: 'Package',
+ },
+ {
+ createdAt: '2021-08-10T09:33:54Z',
+ id: 'gid://gitlab/Packages::Package/244',
+ name: '@gitlab-org/package-15',
+ status: 'DEFAULT',
+ tags: { nodes: packageTags() },
+ version: '1.0.2',
+ __typename: 'Package',
+ },
+];
+
export const packageData = (extend) => ({
id: 'gid://gitlab/Packages::Package/111',
name: '@gitlab-org/package-15',
@@ -105,6 +126,9 @@ export const packageDetailsQuery = (extendPackage) => ({
...mavenMetadata(),
...nugetMetadata(),
},
+ project: {
+ path: 'projectPath',
+ },
tags: {
nodes: packageTags(),
__typename: 'PackageTagConnection',
@@ -117,6 +141,10 @@ export const packageDetailsQuery = (extendPackage) => ({
nodes: packageFiles(),
__typename: 'PackageFileConnection',
},
+ versions: {
+ nodes: packageVersions(),
+ __typename: 'PackageConnection',
+ },
__typename: 'PackageDetailsType',
...extendPackage,
},
diff --git a/spec/graphql/types/packages/nuget/dependency_link_metdatum_type_spec.rb b/spec/graphql/types/packages/nuget/dependency_link_metdatum_type_spec.rb
new file mode 100644
index 00000000000..b11d9d131aa
--- /dev/null
+++ b/spec/graphql/types/packages/nuget/dependency_link_metdatum_type_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['NugetDependencyLinkMetadata'] do
+ it 'includes nuget dependency link metadatum fields' do
+ expected_fields = %w[
+ id target_framework
+ ]
+
+ expect(described_class).to include_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/packages/package_dependency_link_type_spec.rb b/spec/graphql/types/packages/package_dependency_link_type_spec.rb
new file mode 100644
index 00000000000..53ee8be69a6
--- /dev/null
+++ b/spec/graphql/types/packages/package_dependency_link_type_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['PackageDependencyLink'] do
+ it 'includes package file fields' do
+ expected_fields = %w[
+ id dependency_type dependency metadata
+ ]
+
+ expect(described_class).to include_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/packages/package_dependency_type_enum_spec.rb b/spec/graphql/types/packages/package_dependency_type_enum_spec.rb
new file mode 100644
index 00000000000..b8893a3619e
--- /dev/null
+++ b/spec/graphql/types/packages/package_dependency_type_enum_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['PackageDependencyType'] do
+ it 'exposes all depeendency type values' do
+ expect(described_class.values.keys).to contain_exactly(*%w[DEPENDENCIES DEV_DEPENDENCIES BUNDLE_DEPENDENCIES PEER_DEPENDENCIES])
+ end
+end
diff --git a/spec/graphql/types/packages/package_dependency_type_spec.rb b/spec/graphql/types/packages/package_dependency_type_spec.rb
new file mode 100644
index 00000000000..67474729781
--- /dev/null
+++ b/spec/graphql/types/packages/package_dependency_type_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['PackageDependency'] do
+ it 'includes package file fields' do
+ expected_fields = %w[
+ id name version_pattern
+ ]
+
+ expect(described_class).to include_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/packages/package_details_type_spec.rb b/spec/graphql/types/packages/package_details_type_spec.rb
index 06093813315..7e1103d8aa0 100644
--- a/spec/graphql/types/packages/package_details_type_spec.rb
+++ b/spec/graphql/types/packages/package_details_type_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['PackageDetailsType'] do
it 'includes all the package fields' do
expected_fields = %w[
- id name version created_at updated_at package_type tags project pipelines versions package_files
+ id name version created_at updated_at package_type tags project pipelines versions package_files dependency_links
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/initializers/rails_asset_host_spec.rb b/spec/initializers/rails_asset_host_spec.rb
index 682ef9d9bbe..eb69c1fa85b 100644
--- a/spec/initializers/rails_asset_host_spec.rb
+++ b/spec/initializers/rails_asset_host_spec.rb
@@ -7,6 +7,15 @@ RSpec.describe 'Rails asset host initializer' do
load Rails.root.join('config/initializers/rails_asset_host.rb')
end
+ around do |example|
+ old_asset_host = Rails.application.config.action_controller.asset_host
+
+ example.run
+
+ Rails.application.config.action_controller.asset_host = old_asset_host
+ ActionController::Base.asset_host = old_asset_host
+ end
+
subject { Rails.application.config.action_controller.asset_host }
it 'uses no asset host by default' do
diff --git a/spec/lib/gitlab/ci/config/entry/job_spec.rb b/spec/lib/gitlab/ci/config/entry/job_spec.rb
index 01a890cacd3..5b47d3a3922 100644
--- a/spec/lib/gitlab/ci/config/entry/job_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/job_spec.rb
@@ -434,20 +434,6 @@ RSpec.describe Gitlab::Ci::Config::Entry::Job do
expect(entry.errors).to include 'job dependencies the another-job should be part of needs'
end
end
-
- context 'when stage: is missing' do
- let(:config) do
- {
- script: 'echo',
- needs: ['build-job']
- }
- end
-
- it 'returns error about invalid data' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include 'job config missing required keys: stage'
- end
- end
end
context 'when timeout value is not correct' do
diff --git a/spec/requests/api/graphql/packages/nuget_spec.rb b/spec/requests/api/graphql/packages/nuget_spec.rb
index 1de16009684..ba8d2ca42d2 100644
--- a/spec/requests/api/graphql/packages/nuget_spec.rb
+++ b/spec/requests/api/graphql/packages/nuget_spec.rb
@@ -6,8 +6,11 @@ RSpec.describe 'nuget package details' do
include_context 'package details setup'
let_it_be(:package) { create(:nuget_package, :with_metadatum, project: project) }
+ let_it_be(:dependency_link) { create(:packages_dependency_link, :with_nuget_metadatum, package: package) }
let(:metadata) { query_graphql_fragment('NugetMetadata') }
+ let(:dependency_link_response) { graphql_data_at(:package, :dependency_links, :nodes, 0) }
+ let(:dependency_response) { graphql_data_at(:package, :dependency_links, :nodes, 0, :dependency) }
subject { post_graphql(query, current_user: user) }
@@ -26,4 +29,34 @@ RSpec.describe 'nuget package details' do
'iconUrl' => package.nuget_metadatum.icon_url
)
end
+
+ it 'has dependency links' do
+ expect(dependency_link_response).to include(
+ 'id' => global_id_of(dependency_link),
+ 'dependencyType' => dependency_link.dependency_type.upcase
+ )
+
+ expect(dependency_response).to include(
+ 'id' => global_id_of(dependency_link.dependency),
+ 'name' => dependency_link.dependency.name,
+ 'versionPattern' => dependency_link.dependency.version_pattern
+ )
+ end
+
+ it 'avoids N+1 queries' do
+ first_user = create(:user)
+ second_user = create(:user)
+
+ control_count = ActiveRecord::QueryRecorder.new do
+ post_graphql(query, current_user: first_user)
+ end
+
+ create_list(:packages_dependency_link, 10, :with_nuget_metadatum, package: package)
+
+ expect do
+ post_graphql(query, current_user: second_user)
+ end.not_to exceed_query_limit(control_count)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
end
diff --git a/spec/support/shared_contexts/graphql/requests/packages_shared_context.rb b/spec/support/shared_contexts/graphql/requests/packages_shared_context.rb
index 334b11c9f6e..645ea742f07 100644
--- a/spec/support/shared_contexts/graphql/requests/packages_shared_context.rb
+++ b/spec/support/shared_contexts/graphql/requests/packages_shared_context.rb
@@ -9,6 +9,7 @@ RSpec.shared_context 'package details setup' do
let(:depth) { 3 }
let(:excluded) { %w[metadata apiFuzzingCiConfiguration pipeline packageFiles] }
let(:package_files) { all_graphql_fields_for('PackageFile') }
+ let(:dependency_links) { all_graphql_fields_for('PackageDependencyLink') }
let(:user) { project.owner }
let(:package_details) { graphql_data_at(:package) }
let(:metadata_response) { graphql_data_at(:package, :metadata) }
@@ -28,6 +29,11 @@ RSpec.shared_context 'package details setup' do
#{package_files}
}
}
+ dependencyLinks {
+ nodes {
+ #{dependency_links}
+ }
+ }
FIELDS
end
end