Remove reply_to_individual_notes feature flag
Also removes specs related to the flag
This commit is contained in:
parent
645303c7e7
commit
c17b7afa02
7 changed files with 36 additions and 146 deletions
|
@ -86,9 +86,6 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
...mapGetters(['getUserDataByProp']),
|
||||
showReplyButton() {
|
||||
return gon.features && gon.features.replyToIndividualNotes && this.showReply;
|
||||
},
|
||||
shouldShowActionsDropdown() {
|
||||
return this.currentUserId && (this.canEdit || this.canReportAsAbuse);
|
||||
},
|
||||
|
@ -167,7 +164,7 @@ export default {
|
|||
</a>
|
||||
</div>
|
||||
<reply-button
|
||||
v-if="showReplyButton"
|
||||
v-if="showReply"
|
||||
ref="replyButton"
|
||||
class="js-reply-button"
|
||||
@startReplying="$emit('startReplying')"
|
||||
|
|
|
@ -7,9 +7,6 @@ module IssuableActions
|
|||
included do
|
||||
before_action :authorize_destroy_issuable!, only: :destroy
|
||||
before_action :authorize_admin_issuable!, only: :bulk_update
|
||||
before_action only: :show do
|
||||
push_frontend_feature_flag(:reply_to_individual_notes, default_enabled: true)
|
||||
end
|
||||
end
|
||||
|
||||
def permitted_keys
|
||||
|
|
|
@ -14,7 +14,7 @@ class IndividualNoteDiscussion < Discussion
|
|||
end
|
||||
|
||||
def can_convert_to_discussion?
|
||||
noteable.supports_replying_to_individual_notes? && Feature.enabled?(:reply_to_individual_notes, default_enabled: true)
|
||||
noteable.supports_replying_to_individual_notes?
|
||||
end
|
||||
|
||||
def convert_to_discussion!(save: false)
|
||||
|
|
|
@ -67,18 +67,7 @@ describe 'Merge request > User posts notes', :js do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'when reply_to_individual_notes feature flag is disabled' do
|
||||
before do
|
||||
stub_feature_flags(reply_to_individual_notes: false)
|
||||
visit project_merge_request_path(project, merge_request)
|
||||
end
|
||||
|
||||
it 'does not show a reply button' do
|
||||
expect(page).to have_no_selector('.js-reply-button')
|
||||
end
|
||||
end
|
||||
|
||||
describe 'when reply_to_individual_notes feature flag is not set' do
|
||||
describe 'reply button' do
|
||||
before do
|
||||
visit project_merge_request_path(project, merge_request)
|
||||
end
|
||||
|
|
|
@ -128,87 +128,33 @@ describe('noteActions', () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe('with feature flag replyToIndividualNotes enabled', () => {
|
||||
describe('for showReply = true', () => {
|
||||
beforeEach(() => {
|
||||
gon.features = {
|
||||
replyToIndividualNotes: true,
|
||||
};
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
gon.features = {};
|
||||
});
|
||||
|
||||
describe('for showReply = true', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = shallowMountNoteActions({
|
||||
...props,
|
||||
showReply: true,
|
||||
});
|
||||
});
|
||||
|
||||
it('shows a reply button', () => {
|
||||
const replyButton = wrapper.find({ ref: 'replyButton' });
|
||||
|
||||
expect(replyButton.exists()).toBe(true);
|
||||
wrapper = shallowMountNoteActions({
|
||||
...props,
|
||||
showReply: true,
|
||||
});
|
||||
});
|
||||
|
||||
describe('for showReply = false', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = shallowMountNoteActions({
|
||||
...props,
|
||||
showReply: false,
|
||||
});
|
||||
});
|
||||
it('shows a reply button', () => {
|
||||
const replyButton = wrapper.find({ ref: 'replyButton' });
|
||||
|
||||
it('does not show a reply button', () => {
|
||||
const replyButton = wrapper.find({ ref: 'replyButton' });
|
||||
|
||||
expect(replyButton.exists()).toBe(false);
|
||||
});
|
||||
expect(replyButton.exists()).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with feature flag replyToIndividualNotes disabled', () => {
|
||||
describe('for showReply = false', () => {
|
||||
beforeEach(() => {
|
||||
gon.features = {
|
||||
replyToIndividualNotes: false,
|
||||
};
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
gon.features = {};
|
||||
});
|
||||
|
||||
describe('for showReply = true', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = shallowMountNoteActions({
|
||||
...props,
|
||||
showReply: true,
|
||||
});
|
||||
});
|
||||
|
||||
it('does not show a reply button', () => {
|
||||
const replyButton = wrapper.find({ ref: 'replyButton' });
|
||||
|
||||
expect(replyButton.exists()).toBe(false);
|
||||
wrapper = shallowMountNoteActions({
|
||||
...props,
|
||||
showReply: false,
|
||||
});
|
||||
});
|
||||
|
||||
describe('for showReply = false', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = shallowMountNoteActions({
|
||||
...props,
|
||||
showReply: false,
|
||||
});
|
||||
});
|
||||
it('does not show a reply button', () => {
|
||||
const replyButton = wrapper.find({ ref: 'replyButton' });
|
||||
|
||||
it('does not show a reply button', () => {
|
||||
const replyButton = wrapper.find({ ref: 'replyButton' });
|
||||
|
||||
expect(replyButton.exists()).toBe(false);
|
||||
});
|
||||
expect(replyButton.exists()).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -128,39 +128,21 @@ describe Notes::BuildService do
|
|||
|
||||
subject { described_class.new(project, author, note: 'Test', in_reply_to_discussion_id: note.discussion_id).execute }
|
||||
|
||||
shared_examples 'an individual note reply' do
|
||||
it 'sets the note up to be in reply to that note' do
|
||||
expect(subject).to be_valid
|
||||
expect(subject).to be_a(DiscussionNote)
|
||||
expect(subject.discussion_id).to eq(note.discussion_id)
|
||||
end
|
||||
|
||||
context 'when noteable does not support replies' do
|
||||
let(:note) { create(:note_on_commit) }
|
||||
|
||||
it 'builds another individual note' do
|
||||
expect(subject).to be_valid
|
||||
expect(subject).to be_a(Note)
|
||||
expect(subject.discussion_id).not_to eq(note.discussion_id)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when reply_to_individual_notes is disabled' do
|
||||
before do
|
||||
stub_feature_flags(reply_to_individual_notes: false)
|
||||
end
|
||||
|
||||
it_behaves_like 'an individual note reply'
|
||||
end
|
||||
|
||||
context 'when reply_to_individual_notes is enabled' do
|
||||
before do
|
||||
stub_feature_flags(reply_to_individual_notes: true)
|
||||
end
|
||||
|
||||
it 'sets the note up to be in reply to that note' do
|
||||
expect(subject).to be_valid
|
||||
expect(subject).to be_a(DiscussionNote)
|
||||
expect(subject.discussion_id).to eq(note.discussion_id)
|
||||
end
|
||||
|
||||
context 'when noteable does not support replies' do
|
||||
let(:note) { create(:note_on_commit) }
|
||||
|
||||
it_behaves_like 'an individual note reply'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it 'builds a note without saving it' do
|
||||
|
|
|
@ -298,41 +298,20 @@ describe Notes::CreateService do
|
|||
|
||||
subject { described_class.new(project, user, reply_opts).execute }
|
||||
|
||||
context 'when reply_to_individual_notes is disabled' do
|
||||
before do
|
||||
stub_feature_flags(reply_to_individual_notes: false)
|
||||
end
|
||||
|
||||
it 'creates an individual note' do
|
||||
expect(subject.type).to eq(nil)
|
||||
expect(subject.discussion_id).not_to eq(existing_note.discussion_id)
|
||||
end
|
||||
|
||||
it 'does not convert existing note' do
|
||||
expect { subject }.not_to change { existing_note.reload.type }
|
||||
end
|
||||
it 'creates a DiscussionNote in reply to existing note' do
|
||||
expect(subject).to be_a(DiscussionNote)
|
||||
expect(subject.discussion_id).to eq(existing_note.discussion_id)
|
||||
end
|
||||
|
||||
context 'when reply_to_individual_notes is enabled' do
|
||||
before do
|
||||
stub_feature_flags(reply_to_individual_notes: true)
|
||||
end
|
||||
it 'converts existing note to DiscussionNote' do
|
||||
expect do
|
||||
existing_note
|
||||
|
||||
it 'creates a DiscussionNote in reply to existing note' do
|
||||
expect(subject).to be_a(DiscussionNote)
|
||||
expect(subject.discussion_id).to eq(existing_note.discussion_id)
|
||||
end
|
||||
Timecop.freeze(Time.now + 1.minute) { subject }
|
||||
|
||||
it 'converts existing note to DiscussionNote' do
|
||||
expect do
|
||||
existing_note
|
||||
|
||||
Timecop.freeze(Time.now + 1.minute) { subject }
|
||||
|
||||
existing_note.reload
|
||||
end.to change { existing_note.type }.from(nil).to('DiscussionNote')
|
||||
.and change { existing_note.updated_at }
|
||||
end
|
||||
existing_note.reload
|
||||
end.to change { existing_note.type }.from(nil).to('DiscussionNote')
|
||||
.and change { existing_note.updated_at }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue