From e56fd471503e00167ca96e7792f75a0d1f3b7891 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Sat, 29 Feb 2020 00:07:44 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- Gemfile | 3 +- Gemfile.lock | 4 +- bin/mail_room | 2 +- changelogs/unreleased/201771.yml | 5 ++ config/routes.rb | 5 +- lib/gitlab/sidekiq_logging/structured_logger.rb | 6 +- spec/features/groups/navbar_spec.rb | 15 ++++ .../content_viewer/content_viewer_spec.js | 86 +++++++++++----------- .../sidekiq_logging/structured_logger_spec.rb | 19 ++++- vendor/gitignore/C++.gitignore | 0 vendor/gitignore/Java.gitignore | 0 11 files changed, 94 insertions(+), 51 deletions(-) create mode 100644 changelogs/unreleased/201771.yml mode change 100644 => 100755 vendor/gitignore/C++.gitignore mode change 100644 => 100755 vendor/gitignore/Java.gitignore diff --git a/Gemfile b/Gemfile index 6737bc3012b..40aca12aea8 100644 --- a/Gemfile +++ b/Gemfile @@ -419,7 +419,8 @@ end gem 'octokit', '~> 4.15' -gem 'mail_room', '~> 0.10.0' +# https://gitlab.com/gitlab-org/gitlab/issues/207207 +gem 'gitlab-mail_room', '~> 0.0.2', require: 'mail_room' gem 'email_reply_trimmer', '~> 0.1' gem 'html2text' diff --git a/Gemfile.lock b/Gemfile.lock index f4a0ae4ebef..38de70b41ef 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -388,6 +388,7 @@ GEM opentracing (~> 0.4) redis (> 3.0.0, < 5.0.0) gitlab-license (1.0.0) + gitlab-mail_room (0.0.2) gitlab-markup (1.7.0) gitlab-net-dns (0.9.1) gitlab-puma (4.3.1.gitlab.2) @@ -616,7 +617,6 @@ GEM lumberjack (1.0.13) mail (2.7.1) mini_mime (>= 0.1.1) - mail_room (0.10.0) marcel (0.3.3) mimemagic (~> 0.3.2) marginalia (1.8.0) @@ -1235,6 +1235,7 @@ DEPENDENCIES gitlab-chronic (~> 0.10.5) gitlab-labkit (= 0.10.0) gitlab-license (~> 1.0) + gitlab-mail_room (~> 0.0.2) gitlab-markup (~> 1.7.0) gitlab-net-dns (~> 0.9.1) gitlab-puma (~> 4.3.1.gitlab.2) @@ -1284,7 +1285,6 @@ DEPENDENCIES loofah (~> 2.2) lru_redux mail (= 2.7.1) - mail_room (~> 0.10.0) marginalia (~> 1.8.0) memory_profiler (~> 0.9) method_source (~> 0.8) diff --git a/bin/mail_room b/bin/mail_room index 74a84f5b2b4..2539e3d388e 100755 --- a/bin/mail_room +++ b/bin/mail_room @@ -19,7 +19,7 @@ get_mail_room_pid() start() { - bin/daemon_with_pidfile $mail_room_pidfile bundle exec mail_room -q -c $mail_room_config >> $mail_room_logfile 2>&1 + bin/daemon_with_pidfile $mail_room_pidfile bundle exec mail_room --log-exit-as json -q -c $mail_room_config >> $mail_room_logfile 2>&1 } stop() diff --git a/changelogs/unreleased/201771.yml b/changelogs/unreleased/201771.yml new file mode 100644 index 00000000000..8677b3d853c --- /dev/null +++ b/changelogs/unreleased/201771.yml @@ -0,0 +1,5 @@ +--- +title: Replace content_viewer_spec setTimeouts with semantic actions / events +merge_request: +author: Oregand +type: other diff --git a/config/routes.rb b/config/routes.rb index 16b15e5300a..cf39ca3384d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -121,10 +121,7 @@ Rails.application.routes.draw do draw :country draw :country_state draw :subscription - - constraints(-> (*) { Gitlab::Analytics.any_features_enabled? }) do - draw :analytics - end + draw :analytics end if ENV['GITLAB_CHAOS_SECRET'] || Rails.env.development? || Rails.env.test? diff --git a/lib/gitlab/sidekiq_logging/structured_logger.rb b/lib/gitlab/sidekiq_logging/structured_logger.rb index b45014d283f..72820d0a25e 100644 --- a/lib/gitlab/sidekiq_logging/structured_logger.rb +++ b/lib/gitlab/sidekiq_logging/structured_logger.rb @@ -85,7 +85,11 @@ module Gitlab job['pid'] = ::Process.pid job.delete('args') unless ENV['SIDEKIQ_LOG_ARGUMENTS'] - job['args'] = Gitlab::Utils::LogLimitedArray.log_limited_array(job['args']) if job['args'] + + if job['args'] + job['args'].map!(&:to_s) + job['args'] = Gitlab::Utils::LogLimitedArray.log_limited_array(job['args']) + end job end diff --git a/spec/features/groups/navbar_spec.rb b/spec/features/groups/navbar_spec.rb index 8c16dcec42f..4d45bcf639d 100644 --- a/spec/features/groups/navbar_spec.rb +++ b/spec/features/groups/navbar_spec.rb @@ -73,5 +73,20 @@ describe 'Group navbar' do it_behaves_like 'verified navigation bar' end + + context 'when value stream analytics is available' do + before do + stub_licensed_features(cycle_analytics_for_groups: true) + + analytics_nav_item[:nav_sub_items] << _('Value Stream Analytics') + + group.add_maintainer(user) + sign_in(user) + + visit group_path(group) + end + + it_behaves_like 'verified navigation bar' + end end end diff --git a/spec/javascripts/vue_shared/components/content_viewer/content_viewer_spec.js b/spec/javascripts/vue_shared/components/content_viewer/content_viewer_spec.js index e2a1ed931f1..fbe9337ecf4 100644 --- a/spec/javascripts/vue_shared/components/content_viewer/content_viewer_spec.js +++ b/spec/javascripts/vue_shared/components/content_viewer/content_viewer_spec.js @@ -1,6 +1,7 @@ import Vue from 'vue'; import MockAdapter from 'axios-mock-adapter'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import waitForPromises from 'spec/helpers/wait_for_promises'; import { GREEN_BOX_IMAGE_URL } from 'spec/test_constants'; import axios from '~/lib/utils/axios_utils'; import contentViewer from '~/vue_shared/components/content_viewer/content_viewer.vue'; @@ -22,7 +23,7 @@ describe('ContentViewer', () => { it('markdown preview renders + loads rendered markdown from server', done => { mock = new MockAdapter(axios); - mock.onPost(`${gon.relative_url_root}/testproject/preview_markdown`).reply(200, { + mock.onPost(`${gon.relative_url_root}/testproject/preview_markdown`).replyOnce(200, { body: 'testing', }); @@ -33,13 +34,12 @@ describe('ContentViewer', () => { type: 'markdown', }); - const previewContainer = vm.$el.querySelector('.md-previewer'); - - setTimeout(() => { - expect(previewContainer.textContent).toContain('testing'); - - done(); - }); + waitForPromises() + .then(() => { + expect(vm.$el.querySelector('.md-previewer').textContent).toContain('testing'); + }) + .then(done) + .catch(done.fail); }); it('renders image preview', done => { @@ -49,11 +49,12 @@ describe('ContentViewer', () => { type: 'image', }); - setTimeout(() => { - expect(vm.$el.querySelector('img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL); - - done(); - }); + vm.$nextTick() + .then(() => { + expect(vm.$el.querySelector('img').getAttribute('src')).toBe(GREEN_BOX_IMAGE_URL); + }) + .then(done) + .catch(done.fail); }); it('renders fallback download control', done => { @@ -62,18 +63,19 @@ describe('ContentViewer', () => { fileSize: 1024, }); - setTimeout(() => { - expect( - vm.$el - .querySelector('.file-info') - .textContent.trim() - .replace(/\s+/, ' '), - ).toEqual('test.abc (1.00 KiB)'); - - expect(vm.$el.querySelector('.btn.btn-default').textContent.trim()).toEqual('Download'); - - done(); - }); + vm.$nextTick() + .then(() => { + expect( + vm.$el + .querySelector('.file-info') + .textContent.trim() + .replace(/\s+/, ' '), + ).toEqual('test.abc (1.00 KiB)'); + + expect(vm.$el.querySelector('.btn.btn-default').textContent.trim()).toEqual('Download'); + }) + .then(done) + .catch(done.fail); }); it('renders fallback download control for file with a data URL path properly', done => { @@ -82,13 +84,14 @@ describe('ContentViewer', () => { filePath: 'somepath/test.abc', }); - setTimeout(() => { - expect(vm.$el.querySelector('.file-info').textContent.trim()).toEqual('test.abc'); - expect(vm.$el.querySelector('.btn.btn-default')).toHaveAttr('download', 'test.abc'); - expect(vm.$el.querySelector('.btn.btn-default').textContent.trim()).toEqual('Download'); - - done(); - }); + vm.$nextTick() + .then(() => { + expect(vm.$el.querySelector('.file-info').textContent.trim()).toEqual('test.abc'); + expect(vm.$el.querySelector('.btn.btn-default')).toHaveAttr('download', 'test.abc'); + expect(vm.$el.querySelector('.btn.btn-default').textContent.trim()).toEqual('Download'); + }) + .then(done) + .catch(done.fail); }); it('markdown preview receives the file path as a parameter', done => { @@ -106,14 +109,15 @@ describe('ContentViewer', () => { filePath: 'foo/test.md', }); - setTimeout(() => { - expect(axios.post).toHaveBeenCalledWith( - `${gon.relative_url_root}/testproject/preview_markdown`, - { path: 'foo/test.md', text: '* Test' }, - jasmine.any(Object), - ); - - done(); - }); + vm.$nextTick() + .then(() => { + expect(axios.post).toHaveBeenCalledWith( + `${gon.relative_url_root}/testproject/preview_markdown`, + { path: 'foo/test.md', text: '* Test' }, + jasmine.any(Object), + ); + }) + .then(done) + .catch(done.fail); }); }); diff --git a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb index f294d7f7fcd..4b012f4f83d 100644 --- a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb +++ b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb @@ -30,6 +30,7 @@ describe Gitlab::SidekiqLogging::StructuredLogger do let(:clock_thread_cputime_end) { 1.333333799 } let(:start_payload) do job.except('error_backtrace', 'error_class', 'error_message').merge( + 'args' => job['args'].map(&:to_s), 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: start', 'job_status' => 'start', 'pid' => Process.pid, @@ -99,13 +100,29 @@ describe Gitlab::SidekiqLogging::StructuredLogger do end end + context 'when the job args contain non-string objects' do + it 'converts them to strings' do + Timecop.freeze(timestamp) do + job['args'] = [2, true, 'foo', { "foo" => "bar" }] + expected_args = ['2', 'true', 'foo', '{"foo"=>"bar"}'] + + expect(logger).to receive(:info).with(start_payload.merge('args' => expected_args)).ordered + expect(logger).to receive(:info).with(end_payload.merge('args' => expected_args)).ordered + expect(subject).to receive(:log_job_start).and_call_original + expect(subject).to receive(:log_job_done).and_call_original + + subject.call(job, 'test_queue') { } + end + end + end + context 'when the job args are bigger than the maximum allowed' do it 'keeps args from the front until they exceed the limit' do Timecop.freeze(timestamp) do half_limit = Gitlab::Utils::LogLimitedArray::MAXIMUM_ARRAY_LENGTH / 2 job['args'] = [1, 2, 'a' * half_limit, 'b' * half_limit, 3] - expected_args = job['args'].take(3) + ['...'] + expected_args = job['args'].map(&:to_s).take(3) + ['...'] expect(logger).to receive(:info).with(start_payload.merge('args' => expected_args)).ordered expect(logger).to receive(:info).with(end_payload.merge('args' => expected_args)).ordered diff --git a/vendor/gitignore/C++.gitignore b/vendor/gitignore/C++.gitignore old mode 100644 new mode 100755 diff --git a/vendor/gitignore/Java.gitignore b/vendor/gitignore/Java.gitignore old mode 100644 new mode 100755 -- cgit v1.2.3