summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG-EE.md8
-rw-r--r--app/assets/javascripts/ide/stores/actions.js2
-rw-r--r--app/assets/javascripts/notes/components/comment_form.vue17
-rw-r--r--app/assets/javascripts/notes/components/noteable_discussion.vue23
-rw-r--r--app/assets/javascripts/notes/stores/actions.js43
-rw-r--r--app/services/notes/build_service.rb2
-rw-r--r--app/services/notes/create_service.rb6
-rw-r--r--changelogs/unreleased/27239-display-a-better-message-when-starting-a-discussion-on-a-deleted-co.yml5
-rw-r--r--changelogs/unreleased/27244-webide-discard-all-changes.yml5
-rw-r--r--doc/development/new_fe_guide/tips.md4
-rw-r--r--doc/development/testing_guide/frontend_testing.md19
-rw-r--r--lib/gitlab/kubernetes/helm/client_command.rb32
-rw-r--r--lib/gitlab/kubernetes/helm/delete_command.rb2
-rw-r--r--lib/gitlab/kubernetes/helm/install_command.rb2
-rw-r--r--locale/gitlab.pot12
-rw-r--r--qa/qa/page/merge_request/show.rb14
-rw-r--r--spec/features/merge_request/user_posts_notes_spec.rb18
-rw-r--r--spec/javascripts/diffs/store/actions_spec.js3
-rw-r--r--spec/javascripts/ide/stores/actions_spec.js25
-rw-r--r--spec/javascripts/notes/stores/actions_spec.js39
-rw-r--r--spec/lib/gitlab/kubernetes/helm/delete_command_spec.rb53
-rw-r--r--spec/lib/gitlab/kubernetes/helm/install_command_spec.rb84
-rw-r--r--spec/services/notes/create_service_spec.rb13
-rw-r--r--spec/support/shared_examples/graphql/notes_creation_shared_examples.rb1
24 files changed, 316 insertions, 116 deletions
diff --git a/CHANGELOG-EE.md b/CHANGELOG-EE.md
index f00eff26de8..c808664207b 100644
--- a/CHANGELOG-EE.md
+++ b/CHANGELOG-EE.md
@@ -480,6 +480,13 @@ Please view this file on the master branch, on stable branches it's out of date.
- Fixes style-lint errors and warnings for EE builds.scss file.
+## 12.2.11
+
+### Fixed (1 change)
+
+- Backport the new reliable fetcher. !21198
+
+
## 12.2.8
### Fixed (1 change)
@@ -830,6 +837,7 @@ Please view this file on the master branch, on stable branches it's out of date.
## 12.0.10
+- No changes.
### Fixed (1 change)
- Backport the new reliable fetcher to 12.0.9. !20532
diff --git a/app/assets/javascripts/ide/stores/actions.js b/app/assets/javascripts/ide/stores/actions.js
index e0fa5a5d9cd..2e7bf9a7d5a 100644
--- a/app/assets/javascripts/ide/stores/actions.js
+++ b/app/assets/javascripts/ide/stores/actions.js
@@ -20,7 +20,7 @@ export const discardAllChanges = ({ state, commit, dispatch }) => {
commit(types.DISCARD_FILE_CHANGES, file.path);
if (file.tempFile) {
- dispatch('closeFile', file.path);
+ dispatch('closeFile', file);
}
});
diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue
index fda494fec07..492d8de3802 100644
--- a/app/assets/javascripts/notes/components/comment_form.vue
+++ b/app/assets/javascripts/notes/components/comment_form.vue
@@ -193,23 +193,10 @@ export default {
this.stopPolling();
this.saveNote(noteData)
- .then(res => {
+ .then(() => {
this.enableButton();
this.restartPolling();
-
- if (res.errors) {
- if (res.errors.commands_only) {
- this.discard();
- } else {
- Flash(
- __('Something went wrong while adding your comment. Please try again.'),
- 'alert',
- this.$refs.commentForm,
- );
- }
- } else {
- this.discard();
- }
+ this.discard();
if (withIssueAction) {
this.toggleIssueState();
diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue
index 0151a3f10a5..1f31720ff40 100644
--- a/app/assets/javascripts/notes/components/noteable_discussion.vue
+++ b/app/assets/javascripts/notes/components/noteable_discussion.vue
@@ -198,23 +198,22 @@ export default {
data: postData,
};
- this.isReplying = false;
this.saveNote(replyData)
- .then(() => {
- clearDraft(this.autosaveKey);
+ .then(res => {
+ if (res.hasFlash !== true) {
+ this.isReplying = false;
+ clearDraft(this.autosaveKey);
+ }
callback();
})
.catch(err => {
this.removePlaceholderNotes();
- this.isReplying = true;
- this.$nextTick(() => {
- const msg = __(
- 'Your comment could not be submitted! Please check your network connection and try again.',
- );
- Flash(msg, 'alert', this.$el);
- this.$refs.noteForm.note = noteText;
- callback(err);
- });
+ const msg = __(
+ 'Your comment could not be submitted! Please check your network connection and try again.',
+ );
+ Flash(msg, 'alert', this.$el);
+ this.$refs.noteForm.note = noteText;
+ callback(err);
});
},
jumpToNextDiscussion() {
diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js
index 97b0269509a..9bd245c094d 100644
--- a/app/assets/javascripts/notes/stores/actions.js
+++ b/app/assets/javascripts/notes/stores/actions.js
@@ -14,7 +14,7 @@ import sidebarTimeTrackingEventHub from '../../sidebar/event_hub';
import { isInViewport, scrollToElement, isInMRPage } from '../../lib/utils/common_utils';
import { mergeUrlParams } from '../../lib/utils/url_utility';
import mrWidgetEventHub from '../../vue_merge_request_widget/event_hub';
-import { __ } from '~/locale';
+import { __, sprintf } from '~/locale';
import Api from '~/api';
let eTagPoll;
@@ -252,29 +252,22 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
}
}
- const processErrors = res => {
- const { errors } = res;
- if (!errors || !Object.keys(errors).length) {
- return res;
- }
-
+ const processQuickActions = res => {
+ const { errors: { commands_only: message } = { commands_only: null } } = res;
/*
The following reply means that quick actions have been successfully applied:
{"commands_changes":{},"valid":false,"errors":{"commands_only":["Commands applied"]}}
*/
- if (hasQuickActions) {
+ if (hasQuickActions && message) {
eTagPoll.makeRequest();
$('.js-gfm-input').trigger('clear-commands-cache.atwho');
- const { commands_only: message } = errors;
Flash(message || __('Commands applied'), 'notice', noteData.flashContainer);
-
- return res;
}
- throw new Error(__('Failed to save comment!'));
+ return res;
};
const processEmojiAward = res => {
@@ -321,11 +314,33 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
return res;
};
+ const processErrors = error => {
+ if (error.response) {
+ const {
+ response: { data = {} },
+ } = error;
+ const { errors = {} } = data;
+ const { base = [] } = errors;
+
+ // we handle only errors.base for now
+ if (base.length > 0) {
+ const errorMsg = sprintf(__('Your comment could not be submitted because %{error}'), {
+ error: base[0].toLowerCase(),
+ });
+ Flash(errorMsg, 'alert', noteData.flashContainer);
+ return { ...data, hasFlash: true };
+ }
+ }
+
+ throw error;
+ };
+
return dispatch(methodToDispatch, postData, { root: true })
- .then(processErrors)
+ .then(processQuickActions)
.then(processEmojiAward)
.then(processTimeTracking)
- .then(removePlaceholder);
+ .then(removePlaceholder)
+ .catch(processErrors);
};
const pollSuccessCallBack = (resp, commit, state, getters, dispatch) => {
diff --git a/app/services/notes/build_service.rb b/app/services/notes/build_service.rb
index 541f3e0d23c..cf21818a886 100644
--- a/app/services/notes/build_service.rb
+++ b/app/services/notes/build_service.rb
@@ -11,7 +11,7 @@ module Notes
unless discussion && can?(current_user, :create_note, discussion.noteable)
note = Note.new
- note.errors.add(:base, 'Discussion to reply to cannot be found')
+ note.errors.add(:base, _('Discussion to reply to cannot be found'))
return note
end
diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index 3468341a0f2..accfdb5b863 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -2,6 +2,7 @@
module Notes
class CreateService < ::Notes::BaseService
+ # rubocop:disable Metrics/CyclomaticComplexity
def execute
merge_request_diff_head_sha = params.delete(:merge_request_diff_head_sha)
@@ -9,7 +10,9 @@ module Notes
# n+1: https://gitlab.com/gitlab-org/gitlab-foss/issues/37440
note_valid = Gitlab::GitalyClient.allow_n_plus_1_calls do
- note.valid?
+ # We may set errors manually in Notes::BuildService for this reason
+ # we also need to check for already existing errors.
+ note.errors.empty? && note.valid?
end
return note unless note_valid
@@ -67,6 +70,7 @@ module Notes
note
end
+ # rubocop:enable Metrics/CyclomaticComplexity
private
diff --git a/changelogs/unreleased/27239-display-a-better-message-when-starting-a-discussion-on-a-deleted-co.yml b/changelogs/unreleased/27239-display-a-better-message-when-starting-a-discussion-on-a-deleted-co.yml
new file mode 100644
index 00000000000..03c68b50c68
--- /dev/null
+++ b/changelogs/unreleased/27239-display-a-better-message-when-starting-a-discussion-on-a-deleted-co.yml
@@ -0,0 +1,5 @@
+---
+title: Display a better message when starting a discussion on a deleted comment
+merge_request: 20031
+author: Jacopo Beschi @jacopo-beschi
+type: changed
diff --git a/changelogs/unreleased/27244-webide-discard-all-changes.yml b/changelogs/unreleased/27244-webide-discard-all-changes.yml
new file mode 100644
index 00000000000..ace7ed8d7f7
--- /dev/null
+++ b/changelogs/unreleased/27244-webide-discard-all-changes.yml
@@ -0,0 +1,5 @@
+---
+title: "Web IDE: Fix the console error that happens when discarding a newly added/uploaded file."
+merge_request: 21537
+author:
+type: fixed
diff --git a/doc/development/new_fe_guide/tips.md b/doc/development/new_fe_guide/tips.md
index 879b54bd93c..657da1be1a7 100644
--- a/doc/development/new_fe_guide/tips.md
+++ b/doc/development/new_fe_guide/tips.md
@@ -23,3 +23,7 @@ Your feature flag can now be:
- [Deleting a feature flag](../../api/features.md#delete-a-feature)
- [Manage feature flags](../feature_flags/process.md)
- [Feature flags API](../../api/features.md)
+
+## Running tests locally
+
+This can be done as outlined by the [frontend testing guide](../testing_guide/frontend_testing.md#running-frontend-tests).
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index 6a2cc5eeb6b..8934f0d4b65 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -552,6 +552,7 @@ For running the frontend tests, you need the following commands:
- `rake frontend:fixtures` (re-)generates [fixtures](#frontend-test-fixtures).
- `yarn test` executes the tests.
+- `yarn jest` executes only the Jest tests.
As long as the fixtures don't change, `yarn test` is sufficient (and saves you some time).
@@ -593,6 +594,24 @@ glob otherwise your shell may split it into multiple arguments:
yarn karma -f 'spec/javascripts/ide/**/file_spec.js'
```
+It is also possible to target individual Jest / RSpec tests:
+
+```bash
+# Run specific jest file
+yarn jest ./path/to/local_spec.js
+# Run specific jest folder
+yarn jest ./path/to/folder/
+# Run all jest files which path contain term
+yarn jest term
+```
+
+```bash
+# Run specific rspec file
+rspec ./path/to/local_spec.rb
+# Run specific block within rspec file
+rspec ./path/to/local_spec.rb:15
+```
+
## Frontend test fixtures
Code that is added to HAML templates (in `app/views/`) or makes Ajax requests to the backend has tests that require HTML or JSON from the backend.
diff --git a/lib/gitlab/kubernetes/helm/client_command.rb b/lib/gitlab/kubernetes/helm/client_command.rb
index a3f732e1283..df3f35d1075 100644
--- a/lib/gitlab/kubernetes/helm/client_command.rb
+++ b/lib/gitlab/kubernetes/helm/client_command.rb
@@ -5,14 +5,24 @@ module Gitlab
module Helm
module ClientCommand
def init_command
- # Here we are always upgrading to the latest version of Tiller when
- # installing an app. We ensure the helm version stored in the
- # database is correct by also updating this after transition to
- # :installed,:updated in Clusters::Concerns::ApplicationStatus
- 'helm init --upgrade'
+ if local_tiller_enabled?
+ <<~HEREDOC.chomp
+ export HELM_HOST="localhost:44134"
+ tiller -listen ${HELM_HOST} -alsologtostderr &
+ helm init --client-only
+ HEREDOC
+ else
+ # Here we are always upgrading to the latest version of Tiller when
+ # installing an app. We ensure the helm version stored in the
+ # database is correct by also updating this after transition to
+ # :installed,:updated in Clusters::Concerns::ApplicationStatus
+ 'helm init --upgrade'
+ end
end
def wait_for_tiller_command
+ return if local_tiller_enabled?
+
helm_check = ['helm', 'version', *optional_tls_flags].shelljoin
# This is necessary to give Tiller time to restart after upgrade.
# Ideally we'd be able to use --wait but cannot because of
@@ -25,6 +35,14 @@ module Gitlab
['helm', 'repo', 'add', name, repository].shelljoin if repository
end
+ private
+
+ def tls_flags_if_remote_tiller
+ return [] if local_tiller_enabled?
+
+ optional_tls_flags
+ end
+
def optional_tls_flags
return [] unless files.key?(:'ca.pem')
@@ -35,6 +53,10 @@ module Gitlab
'--tls-key', "#{files_dir}/key.pem"
]
end
+
+ def local_tiller_enabled?
+ Feature.enabled?(:managed_apps_local_tiller)
+ end
end
end
end
diff --git a/lib/gitlab/kubernetes/helm/delete_command.rb b/lib/gitlab/kubernetes/helm/delete_command.rb
index dcf22e7abb6..9d0fd30ba8f 100644
--- a/lib/gitlab/kubernetes/helm/delete_command.rb
+++ b/lib/gitlab/kubernetes/helm/delete_command.rb
@@ -39,7 +39,7 @@ module Gitlab
private
def delete_command
- command = ['helm', 'delete', '--purge', name] + optional_tls_flags
+ command = ['helm', 'delete', '--purge', name] + tls_flags_if_remote_tiller
command.shelljoin
end
diff --git a/lib/gitlab/kubernetes/helm/install_command.rb b/lib/gitlab/kubernetes/helm/install_command.rb
index ccb053f507d..82f6f5d0024 100644
--- a/lib/gitlab/kubernetes/helm/install_command.rb
+++ b/lib/gitlab/kubernetes/helm/install_command.rb
@@ -49,7 +49,7 @@ module Gitlab
command = ['helm', 'upgrade', name, chart] +
install_flag +
reset_values_flag +
- optional_tls_flags +
+ tls_flags_if_remote_tiller +
optional_version_flag +
rbac_create_flag +
namespace_flag +
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index b8d97df1ab9..4a787a55e31 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -6078,6 +6078,9 @@ msgstr ""
msgid "Discussion"
msgstr ""
+msgid "Discussion to reply to cannot be found"
+msgstr ""
+
msgid "Disk Usage"
msgstr ""
@@ -7395,9 +7398,6 @@ msgstr ""
msgid "Failed to reset key. Please try again."
msgstr ""
-msgid "Failed to save comment!"
-msgstr ""
-
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
@@ -16399,9 +16399,6 @@ msgstr ""
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
-msgid "Something went wrong while adding your comment. Please try again."
-msgstr ""
-
msgid "Something went wrong while applying the suggestion. Please try again."
msgstr ""
@@ -20647,6 +20644,9 @@ msgstr ""
msgid "Your changes have been successfully committed."
msgstr ""
+msgid "Your comment could not be submitted because %{error}"
+msgstr ""
+
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index 9ad53636c42..198699c2fee 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -91,16 +91,14 @@ module QA
end
def merge_immediately
- wait(reload: false, max: 60) do
- has_merge_options?
+ wait(reload: false) do
+ finished_loading?
end
if has_merge_options?
- if has_no_element? :merge_immediately_option
- retry_until do
- click_element :merge_moment_dropdown
- has_element? :merge_immediately_option
- end
+ retry_until do
+ click_element :merge_moment_dropdown
+ has_element? :merge_immediately_option
end
click_element :merge_immediately_option
@@ -108,7 +106,7 @@ module QA
click_element :merge_button
end
- wait(reload: false, max: 60) do
+ wait(reload: false) do
merged?
end
end
diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb
index 733d79127f7..c0655581b18 100644
--- a/spec/features/merge_request/user_posts_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_notes_spec.rb
@@ -95,6 +95,24 @@ describe 'Merge request > User posts notes', :js do
end
end
+ describe 'reply on a deleted conversation' do
+ before do
+ visit project_merge_request_path(project, merge_request)
+ end
+
+ it 'shows an error message' do
+ find('.js-reply-button').click
+ note.delete
+
+ page.within('.discussion-reply-holder') do
+ fill_in 'note[note]', with: 'A reply'
+ click_button 'Comment'
+ wait_for_requests
+ expect(page).to have_content('Your comment could not be submitted because discussion to reply to cannot be found')
+ end
+ end
+ end
+
describe 'when previewing a note' do
it 'shows the toolbar buttons when editing a note' do
page.within('.js-main-target-form') do
diff --git a/spec/javascripts/diffs/store/actions_spec.js b/spec/javascripts/diffs/store/actions_spec.js
index c716053b288..589bd0e649a 100644
--- a/spec/javascripts/diffs/store/actions_spec.js
+++ b/spec/javascripts/diffs/store/actions_spec.js
@@ -145,8 +145,7 @@ describe('DiffsStoreActions', () => {
});
describe('fetchDiffFilesBatch', () => {
- // eslint-disable-next-line jasmine/no-focused-tests
- fit('should fetch batch diff files', done => {
+ it('should fetch batch diff files', done => {
const endpointBatch = '/fetch/diffs_batch';
const batch1 = `${endpointBatch}?per_page=${DIFFS_PER_PAGE}`;
const batch2 = `${endpointBatch}?per_page=${DIFFS_PER_PAGE}&page=2`;
diff --git a/spec/javascripts/ide/stores/actions_spec.js b/spec/javascripts/ide/stores/actions_spec.js
index 246b3995395..708c5ea75e0 100644
--- a/spec/javascripts/ide/stores/actions_spec.js
+++ b/spec/javascripts/ide/stores/actions_spec.js
@@ -12,6 +12,7 @@ import actions, {
renameEntry,
getBranchData,
createTempEntry,
+ discardAllChanges,
} from '~/ide/stores/actions';
import axios from '~/lib/utils/axios_utils';
import { createStore } from '~/ide/stores';
@@ -60,8 +61,9 @@ describe('Multi-file store actions', () => {
});
describe('discardAllChanges', () => {
+ let f;
beforeEach(() => {
- const f = file('discardAll');
+ f = file('discardAll');
f.changed = true;
store.state.openFiles.push(f);
@@ -89,6 +91,27 @@ describe('Multi-file store actions', () => {
.then(done)
.catch(done.fail);
});
+
+ it('closes the temp file if it was open', done => {
+ f.tempFile = true;
+
+ testAction(
+ discardAllChanges,
+ undefined,
+ store.state,
+ [
+ { type: types.DISCARD_FILE_CHANGES, payload: 'discardAll' },
+ { type: types.REMOVE_ALL_CHANGES_FILES },
+ ],
+ [
+ {
+ type: 'closeFile',
+ payload: jasmine.objectContaining({ path: 'discardAll' }),
+ },
+ ],
+ done,
+ );
+ });
});
describe('closeAllFiles', () => {
diff --git a/spec/javascripts/notes/stores/actions_spec.js b/spec/javascripts/notes/stores/actions_spec.js
index 3e0c90277ee..ec1f1392845 100644
--- a/spec/javascripts/notes/stores/actions_spec.js
+++ b/spec/javascripts/notes/stores/actions_spec.js
@@ -751,24 +751,54 @@ describe('Actions Notes Store', () => {
});
describe('saveNote', () => {
- const payload = { endpoint: TEST_HOST, data: { 'note[note]': 'some text' } };
+ const flashContainer = {};
+ const payload = { endpoint: TEST_HOST, data: { 'note[note]': 'some text' }, flashContainer };
describe('if response contains errors', () => {
const res = { errors: { something: ['went wrong'] } };
+ const error = { message: 'Unprocessable entity', response: { data: res } };
it('throws an error', done => {
actions
.saveNote(
{
commit() {},
- dispatch: () => Promise.resolve(res),
+ dispatch: () => Promise.reject(error),
},
payload,
)
.then(() => done.fail('Expected error to be thrown!'))
- .catch(error => {
- expect(error.message).toBe('Failed to save comment!');
+ .catch(err => {
+ expect(err).toBe(error);
+ expect(flashSpy).not.toHaveBeenCalled();
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+
+ describe('if response contains errors.base', () => {
+ const res = { errors: { base: ['something went wrong'] } };
+ const error = { message: 'Unprocessable entity', response: { data: res } };
+
+ it('sets flash alert using errors.base message', done => {
+ actions
+ .saveNote(
+ {
+ commit() {},
+ dispatch: () => Promise.reject(error),
+ },
+ { ...payload, flashContainer },
+ )
+ .then(resp => {
+ expect(resp.hasFlash).toBe(true);
+ expect(flashSpy).toHaveBeenCalledWith(
+ 'Your comment could not be submitted because something went wrong',
+ 'alert',
+ flashContainer,
+ );
})
+ .catch(() => done.fail('Expected success response!'))
.then(done)
.catch(done.fail);
});
@@ -788,6 +818,7 @@ describe('Actions Notes Store', () => {
)
.then(data => {
expect(data).toBe(res);
+ expect(flashSpy).not.toHaveBeenCalled();
})
.then(done)
.catch(done.fail);
diff --git a/spec/lib/gitlab/kubernetes/helm/delete_command_spec.rb b/spec/lib/gitlab/kubernetes/helm/delete_command_spec.rb
index 7e9853cf9ea..82e15864687 100644
--- a/spec/lib/gitlab/kubernetes/helm/delete_command_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/delete_command_spec.rb
@@ -13,40 +13,57 @@ describe Gitlab::Kubernetes::Helm::DeleteCommand do
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --upgrade
- for i in $(seq 1 30); do helm version && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
+ export HELM_HOST="localhost:44134"
+ tiller -listen ${HELM_HOST} -alsologtostderr &
+ helm init --client-only
helm delete --purge app-name
EOS
end
end
- let(:tls_flags) do
- <<~EOS.squish
- --tls
- --tls-ca-cert /data/helm/app-name/config/ca.pem
- --tls-cert /data/helm/app-name/config/cert.pem
- --tls-key /data/helm/app-name/config/key.pem
- EOS
- end
-
- context 'when there is a ca.pem file' do
- let(:files) { { 'ca.pem': 'some file content' } }
+ context 'tillerless feature disabled' do
+ before do
+ stub_feature_flags(managed_apps_local_tiller: false)
+ end
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
helm init --upgrade
- for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
- #{helm_delete_command}
+ for i in $(seq 1 30); do helm version && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
+ helm delete --purge app-name
EOS
end
+ end
- let(:helm_delete_command) do
+ context 'when there is a ca.pem file' do
+ let(:files) { { 'ca.pem': 'some file content' } }
+
+ let(:tls_flags) do
<<~EOS.squish
- helm delete --purge app-name
- #{tls_flags}
+ --tls
+ --tls-ca-cert /data/helm/app-name/config/ca.pem
+ --tls-cert /data/helm/app-name/config/cert.pem
+ --tls-key /data/helm/app-name/config/key.pem
EOS
end
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ helm init --upgrade
+ for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
+ #{helm_delete_command}
+ EOS
+ end
+
+ let(:helm_delete_command) do
+ <<~EOS.squish
+ helm delete --purge app-name
+ #{tls_flags}
+ EOS
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb b/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
index a25b6b9a398..9c04e101e78 100644
--- a/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
@@ -23,22 +23,14 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
)
end
- let(:tls_flags) do
- <<~EOS.squish
- --tls
- --tls-ca-cert /data/helm/app-name/config/ca.pem
- --tls-cert /data/helm/app-name/config/cert.pem
- --tls-key /data/helm/app-name/config/key.pem
- EOS
- end
-
subject { install_command }
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --upgrade
- for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
+ export HELM_HOST="localhost:44134"
+ tiller -listen ${HELM_HOST} -alsologtostderr &
+ helm init --client-only
helm repo add app-name https://repository.example.com
helm repo update
#{helm_install_comand}
@@ -50,7 +42,6 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
helm upgrade app-name chart-name
--install
--reset-values
- #{tls_flags}
--version 1.2.3
--set rbac.create\\=false,rbac.enabled\\=false
--namespace gitlab-managed-apps
@@ -59,8 +50,19 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
end
end
- context 'when rbac is true' do
- let(:rbac) { true }
+ context 'tillerless feature disabled' do
+ before do
+ stub_feature_flags(managed_apps_local_tiller: false)
+ end
+
+ let(:tls_flags) do
+ <<~EOS.squish
+ --tls
+ --tls-ca-cert /data/helm/app-name/config/ca.pem
+ --tls-cert /data/helm/app-name/config/cert.pem
+ --tls-key /data/helm/app-name/config/key.pem
+ EOS
+ end
it_behaves_like 'helm commands' do
let(:commands) do
@@ -69,6 +71,36 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
helm repo add app-name https://repository.example.com
helm repo update
+ #{helm_install_comand}
+ EOS
+ end
+
+ let(:helm_install_comand) do
+ <<~EOS.squish
+ helm upgrade app-name chart-name
+ --install
+ --reset-values
+ #{tls_flags}
+ --version 1.2.3
+ --set rbac.create\\=false,rbac.enabled\\=false
+ --namespace gitlab-managed-apps
+ -f /data/helm/app-name/config/values.yaml
+ EOS
+ end
+ end
+ end
+
+ context 'when rbac is true' do
+ let(:rbac) { true }
+
+ it_behaves_like 'helm commands' do
+ let(:commands) do
+ <<~EOS
+ export HELM_HOST="localhost:44134"
+ tiller -listen ${HELM_HOST} -alsologtostderr &
+ helm init --client-only
+ helm repo add app-name https://repository.example.com
+ helm repo update
#{helm_install_command}
EOS
end
@@ -78,7 +110,6 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
helm upgrade app-name chart-name
--install
--reset-values
- #{tls_flags}
--version 1.2.3
--set rbac.create\\=true,rbac.enabled\\=true
--namespace gitlab-managed-apps
@@ -94,8 +125,9 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --upgrade
- for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
+ export HELM_HOST="localhost:44134"
+ tiller -listen ${HELM_HOST} -alsologtostderr &
+ helm init --client-only
helm repo add app-name https://repository.example.com
helm repo update
/bin/date
@@ -109,7 +141,6 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
helm upgrade app-name chart-name
--install
--reset-values
- #{tls_flags}
--version 1.2.3
--set rbac.create\\=false,rbac.enabled\\=false
--namespace gitlab-managed-apps
@@ -125,8 +156,9 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --upgrade
- for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
+ export HELM_HOST="localhost:44134"
+ tiller -listen ${HELM_HOST} -alsologtostderr &
+ helm init --client-only
helm repo add app-name https://repository.example.com
helm repo update
#{helm_install_command}
@@ -140,7 +172,6 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
helm upgrade app-name chart-name
--install
--reset-values
- #{tls_flags}
--version 1.2.3
--set rbac.create\\=false,rbac.enabled\\=false
--namespace gitlab-managed-apps
@@ -156,8 +187,9 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --upgrade
- for i in $(seq 1 30); do helm version && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
+ export HELM_HOST="localhost:44134"
+ tiller -listen ${HELM_HOST} -alsologtostderr &
+ helm init --client-only
helm repo add app-name https://repository.example.com
helm repo update
#{helm_install_command}
@@ -184,8 +216,9 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
it_behaves_like 'helm commands' do
let(:commands) do
<<~EOS
- helm init --upgrade
- for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
+ export HELM_HOST="localhost:44134"
+ tiller -listen ${HELM_HOST} -alsologtostderr &
+ helm init --client-only
helm repo add app-name https://repository.example.com
helm repo update
#{helm_install_command}
@@ -197,7 +230,6 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
helm upgrade app-name chart-name
--install
--reset-values
- #{tls_flags}
--set rbac.create\\=false,rbac.enabled\\=false
--namespace gitlab-managed-apps
-f /data/helm/app-name/config/values.yaml
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index 79ea8f48a58..8fd03428eb2 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -382,6 +382,19 @@ describe Notes::CreateService do
end.to change { existing_note.type }.from(nil).to('DiscussionNote')
.and change { existing_note.updated_at }
end
+
+ context 'discussion to reply cannot be found' do
+ before do
+ existing_note.delete
+ end
+
+ it 'returns an note with errors' do
+ note = subject
+
+ expect(note.errors).not_to be_empty
+ expect(note.errors[:base]).to eq(['Discussion to reply to cannot be found'])
+ end
+ end
end
describe "usage counter" do
diff --git a/spec/support/shared_examples/graphql/notes_creation_shared_examples.rb b/spec/support/shared_examples/graphql/notes_creation_shared_examples.rb
index f2e1a95345b..522211340ea 100644
--- a/spec/support/shared_examples/graphql/notes_creation_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/notes_creation_shared_examples.rb
@@ -26,6 +26,7 @@ end
RSpec.shared_examples 'a Note mutation when there are active record validation errors' do |model: Note|
before do
expect_next_instance_of(model) do |note|
+ allow(note).to receive_message_chain(:errors, :empty?).and_return(true)
expect(note).to receive(:valid?).at_least(:once).and_return(false)
expect(note).to receive_message_chain(
:errors,