diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-17 21:13:06 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-17 21:13:06 +0300 |
commit | ec76d14980534d45d25ef65134a756c733fe4877 (patch) | |
tree | f5c9b06b63f0dc6b7a19b04c8a25b067b6e5a696 /spec/frontend | |
parent | 99f4b14cb0546a905d8f14f938d679d17e569005 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend')
7 files changed, 126 insertions, 98 deletions
diff --git a/spec/frontend/diffs/components/tree_list_spec.js b/spec/frontend/diffs/components/tree_list_spec.js index 1656eaf8ba0..7e6274d7778 100644 --- a/spec/frontend/diffs/components/tree_list_spec.js +++ b/spec/frontend/diffs/components/tree_list_spec.js @@ -1,20 +1,36 @@ -import { shallowMount, mount } from '@vue/test-utils'; +import { shallowMount } from '@vue/test-utils'; import Vue, { nextTick } from 'vue'; import Vuex from 'vuex'; import TreeList from '~/diffs/components/tree_list.vue'; import createStore from '~/diffs/store/modules'; -import FileTree from '~/vue_shared/components/file_tree.vue'; +import DiffFileRow from '~/diffs/components//diff_file_row.vue'; +import { stubComponent } from 'helpers/stub_component'; describe('Diffs tree list component', () => { let wrapper; let store; - const getFileRows = () => wrapper.findAll('.file-row'); + const getScroller = () => wrapper.findComponent({ name: 'RecycleScroller' }); + const getFileRow = () => wrapper.findComponent(DiffFileRow); Vue.use(Vuex); - const createComponent = (mountFn = mount) => { - wrapper = mountFn(TreeList, { + const createComponent = () => { + wrapper = shallowMount(TreeList, { store, propsData: { hideFileStats: false }, + stubs: { + // eslint will fail if we import the real component + RecycleScroller: stubComponent( + { + name: 'RecycleScroller', + props: { + items: null, + }, + }, + { + template: '<div><slot :item="{ tree: [] }"></slot></div>', + }, + ), + }, }); }; @@ -101,26 +117,32 @@ describe('Diffs tree list component', () => { }); describe('search by file extension', () => { + it('hides scroller for no matches', async () => { + wrapper.find('[data-testid="diff-tree-search"]').setValue('*.md'); + + await nextTick(); + + expect(getScroller().exists()).toBe(false); + expect(wrapper.text()).toContain('No files found'); + }); + it.each` extension | itemSize - ${'*.md'} | ${0} - ${'*.js'} | ${1} - ${'index.js'} | ${1} - ${'app/*.js'} | ${1} - ${'*.js, *.rb'} | ${2} + ${'*.js'} | ${2} + ${'index.js'} | ${2} + ${'app/*.js'} | ${2} + ${'*.js, *.rb'} | ${3} `('returns $itemSize item for $extension', async ({ extension, itemSize }) => { wrapper.find('[data-testid="diff-tree-search"]').setValue(extension); await nextTick(); - expect(getFileRows()).toHaveLength(itemSize); + expect(getScroller().props('items')).toHaveLength(itemSize); }); }); it('renders tree', () => { - expect(getFileRows()).toHaveLength(2); - expect(getFileRows().at(0).html()).toContain('index.js'); - expect(getFileRows().at(1).html()).toContain('app'); + expect(getScroller().props('items')).toHaveLength(2); }); it('hides file stats', async () => { @@ -133,33 +155,16 @@ describe('Diffs tree list component', () => { it('calls toggleTreeOpen when clicking folder', () => { jest.spyOn(wrapper.vm.$store, 'dispatch').mockReturnValue(undefined); - getFileRows().at(1).trigger('click'); + getFileRow().vm.$emit('toggleTreeOpen', 'app'); expect(wrapper.vm.$store.dispatch).toHaveBeenCalledWith('diffs/toggleTreeOpen', 'app'); }); - it('calls scrollToFile when clicking blob', () => { - jest.spyOn(wrapper.vm.$store, 'dispatch').mockReturnValue(undefined); - - wrapper.find('.file-row').trigger('click'); - - expect(wrapper.vm.$store.dispatch).toHaveBeenCalledWith('diffs/scrollToFile', { - path: 'app/index.js', - }); - }); - - it('renders as file list when renderTreeList is false', async () => { + it('renders when renderTreeList is false', async () => { wrapper.vm.$store.state.diffs.renderTreeList = false; await nextTick(); - expect(getFileRows()).toHaveLength(2); - }); - - it('renders file paths when renderTreeList is false', async () => { - wrapper.vm.$store.state.diffs.renderTreeList = false; - - await nextTick(); - expect(wrapper.find('.file-row').html()).toContain('index.js'); + expect(getScroller().props('items')).toHaveLength(3); }); }); @@ -172,12 +177,10 @@ describe('Diffs tree list component', () => { }); it('passes the viewedDiffFileIds to the FileTree', async () => { - createComponent(shallowMount); + createComponent(); await nextTick(); - // Have to use $attrs['viewed-files'] because we are passing down an object - // and attributes('') stringifies values (e.g. [object])... - expect(wrapper.findComponent(FileTree).vm.$attrs['viewed-files']).toBe(viewedDiffFileIds); + expect(wrapper.findComponent(DiffFileRow).props('viewedFiles')).toBe(viewedDiffFileIds); }); }); }); diff --git a/spec/frontend/editor/schema/ci/ci_schema_spec.js b/spec/frontend/editor/schema/ci/ci_schema_spec.js index c822a0bfeaf..87208ec7aa8 100644 --- a/spec/frontend/editor/schema/ci/ci_schema_spec.js +++ b/spec/frontend/editor/schema/ci/ci_schema_spec.js @@ -33,6 +33,7 @@ import JobWhenYaml from './yaml_tests/positive_tests/job_when.yml'; import IdTokensYaml from './yaml_tests/positive_tests/id_tokens.yml'; import HooksYaml from './yaml_tests/positive_tests/hooks.yml'; import SecretsYaml from './yaml_tests/positive_tests/secrets.yml'; +import ServicesYaml from './yaml_tests/positive_tests/services.yml'; // YAML NEGATIVE TEST import ArtifactsNegativeYaml from './yaml_tests/negative_tests/artifacts.yml'; @@ -52,6 +53,7 @@ import VariablesWrongSyntaxUsageExpand from './yaml_tests/negative_tests/variabl import IdTokensNegativeYaml from './yaml_tests/negative_tests/id_tokens.yml'; import HooksNegative from './yaml_tests/negative_tests/hooks.yml'; import SecretsNegativeYaml from './yaml_tests/negative_tests/secrets.yml'; +import ServicesNegativeYaml from './yaml_tests/negative_tests/services.yml'; const ajv = new Ajv({ strictTypes: false, @@ -89,6 +91,7 @@ describe('positive tests', () => { VariablesYaml, ProjectPathYaml, IdTokensYaml, + ServicesYaml, SecretsYaml, }), )('schema validates %s', (_, input) => { @@ -113,10 +116,12 @@ describe('negative tests', () => { // YAML ArtifactsNegativeYaml, CacheKeyNeative, + HooksNegative, IdTokensNegativeYaml, IncludeNegativeYaml, JobWhenNegativeYaml, RulesNegativeYaml, + TriggerNegative, VariablesInvalidOptionsYaml, VariablesInvalidSyntaxDescYaml, VariablesWrongSyntaxUsageExpand, @@ -126,8 +131,7 @@ describe('negative tests', () => { ProjectPathIncludeNoSlashYaml, ProjectPathIncludeTailSlashYaml, SecretsNegativeYaml, - TriggerNegative, - HooksNegative, + ServicesNegativeYaml, }), )('schema validates %s', (_, input) => { // We construct a new "JSON" from each main key that is inside a diff --git a/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/services.yml b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/services.yml new file mode 100644 index 00000000000..6761a603a0a --- /dev/null +++ b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/services.yml @@ -0,0 +1,38 @@ +empty_services: + services: + +without_name: + services: + - alias: db-postgres + entrypoint: ["/usr/local/bin/db-postgres"] + command: ["start"] + +invalid_entrypoint: + services: + - name: my-postgres:11.7 + alias: db-postgres + entrypoint: "/usr/local/bin/db-postgres" # must be array + +empty_entrypoint: + services: + - name: my-postgres:11.7 + alias: db-postgres + entrypoint: [] + +invalid_command: + services: + - name: my-postgres:11.7 + alias: db-postgres + command: "start" # must be array + +empty_command: + services: + - name: my-postgres:11.7 + alias: db-postgres + command: [] + +empty_pull_policy: + script: echo "Multiple pull policies." + services: + - name: postgres:11.6 + pull_policy: [] diff --git a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/services.yml b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/services.yml new file mode 100644 index 00000000000..8a0f59d1dfd --- /dev/null +++ b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/services.yml @@ -0,0 +1,31 @@ +valid_services_list: + services: + - php:7 + - node:latest + - golang:1.10 + +valid_services_object: + services: + - name: my-postgres:11.7 + alias: db-postgres + entrypoint: ["/usr/local/bin/db-postgres"] + command: ["start"] + +services_with_variables: + services: + - name: bitnami/nginx + alias: nginx + variables: + NGINX_HTTP_PORT_NUMBER: ${NGINX_HTTP_PORT_NUMBER} + +pull_policy_string: + script: echo "A single pull policy." + services: + - name: postgres:11.6 + pull_policy: if-not-present + +pull_policy_array: + script: echo "Multiple pull policies." + services: + - name: postgres:11.6 + pull_policy: [always, if-not-present] diff --git a/spec/frontend/vue_merge_request_widget/stores/get_state_key_spec.js b/spec/frontend/vue_merge_request_widget/stores/get_state_key_spec.js index 88d9d0b4cff..a6288b9c725 100644 --- a/spec/frontend/vue_merge_request_widget/stores/get_state_key_spec.js +++ b/spec/frontend/vue_merge_request_widget/stores/get_state_key_spec.js @@ -20,7 +20,7 @@ describe('getStateKey', () => { }; const bound = getStateKey.bind(context); - expect(bound()).toEqual(null); + expect(bound()).toEqual('checking'); context.detailedMergeStatus = 'MERGEABLE'; diff --git a/spec/frontend/vue_shared/components/__snapshots__/file_row_header_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/file_row_header_spec.js.snap deleted file mode 100644 index ca9d4488870..00000000000 --- a/spec/frontend/vue_shared/components/__snapshots__/file_row_header_spec.js.snap +++ /dev/null @@ -1,40 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`File row header component adds multiple ellipsises after 40 characters 1`] = ` -<div - class="file-row-header bg-white sticky-top p-2 js-file-row-header" - title="app/assets/javascripts/merge_requests/widget/diffs/notes" -> - <gl-truncate-stub - class="bold" - position="middle" - text="app/assets/javascripts/merge_requests/widget/diffs/notes" - /> -</div> -`; - -exports[`File row header component renders file path 1`] = ` -<div - class="file-row-header bg-white sticky-top p-2 js-file-row-header" - title="app/assets" -> - <gl-truncate-stub - class="bold" - position="middle" - text="app/assets" - /> -</div> -`; - -exports[`File row header component trucates path after 40 characters 1`] = ` -<div - class="file-row-header bg-white sticky-top p-2 js-file-row-header" - title="app/assets/javascripts/merge_requests" -> - <gl-truncate-stub - class="bold" - position="middle" - text="app/assets/javascripts/merge_requests" - /> -</div> -`; diff --git a/spec/frontend/vue_shared/components/file_row_header_spec.js b/spec/frontend/vue_shared/components/file_row_header_spec.js index 80f4c275dcc..7aea581fe51 100644 --- a/spec/frontend/vue_shared/components/file_row_header_spec.js +++ b/spec/frontend/vue_shared/components/file_row_header_spec.js @@ -1,11 +1,12 @@ import { shallowMount } from '@vue/test-utils'; +import { GlTruncate } from '@gitlab/ui'; import FileRowHeader from '~/vue_shared/components/file_row_header.vue'; describe('File row header component', () => { - let vm; + let wrapper; function createComponent(path) { - vm = shallowMount(FileRowHeader, { + wrapper = shallowMount(FileRowHeader, { propsData: { path, }, @@ -13,24 +14,15 @@ describe('File row header component', () => { } afterEach(() => { - vm.destroy(); + wrapper.destroy(); }); it('renders file path', () => { - createComponent('app/assets'); + const path = 'app/assets'; + createComponent(path); - expect(vm.element).toMatchSnapshot(); - }); - - it('trucates path after 40 characters', () => { - createComponent('app/assets/javascripts/merge_requests'); - - expect(vm.element).toMatchSnapshot(); - }); - - it('adds multiple ellipsises after 40 characters', () => { - createComponent('app/assets/javascripts/merge_requests/widget/diffs/notes'); - - expect(vm.element).toMatchSnapshot(); + const truncate = wrapper.findComponent(GlTruncate); + expect(truncate.exists()).toBe(true); + expect(truncate.props('text')).toBe(path); }); }); |