2018-03-17 18:26:18 +05:30
require 'rails_helper'
2016-09-13 17:45:13 +05:30
2018-03-17 18:26:18 +05:30
describe 'Merge request > User resolves diff notes and discussions' , :js do
2017-09-10 17:25:29 +05:30
let ( :project ) { create ( :project , :public , :repository ) }
2018-03-17 18:26:18 +05:30
let ( :user ) { project . creator }
let ( :guest ) { create ( :user ) }
2016-09-13 17:45:13 +05:30
let ( :merge_request ) { create ( :merge_request_with_diffs , source_project : project , author : user , title : " Bug NS-04 " ) }
2018-05-09 12:01:36 +05:30
let! ( :note ) { create ( :diff_note_on_merge_request , project : project , noteable : merge_request , note : " | Markdown | Table | \n |-------|---------| \n | first | second | " ) }
2016-09-13 17:45:13 +05:30
let ( :path ) { " files/ruby/popen.rb " }
let ( :position ) do
Gitlab :: Diff :: Position . new (
old_path : path ,
new_path : path ,
old_line : nil ,
new_line : 9 ,
diff_refs : merge_request . diff_refs
)
end
context 'no discussions' do
before do
2018-11-18 11:00:15 +05:30
project . add_maintainer ( user )
2018-03-17 18:26:18 +05:30
sign_in ( user )
2016-09-13 17:45:13 +05:30
note . destroy
visit_merge_request
end
it 'displays no discussion resolved data' do
expect ( page ) . not_to have_content ( 'discussion resolved' )
expect ( page ) . not_to have_selector ( '.discussion-next-btn' )
end
end
context 'as authorized user' do
before do
2018-11-18 11:00:15 +05:30
project . add_maintainer ( user )
2018-03-17 18:26:18 +05:30
sign_in ( user )
2016-09-13 17:45:13 +05:30
visit_merge_request
end
context 'single discussion' do
it 'shows text with how many discussions' do
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
end
end
it 'allows user to mark a note as resolved' do
page . within '.diff-content .note' do
find ( '.line-resolve-btn' ) . click
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
2019-01-03 12:48:30 +05:30
expect ( find ( '.line-resolve-btn' ) [ 'data-original-title' ] ) . to eq ( " Resolved by #{ user . name } " )
2016-09-13 17:45:13 +05:30
end
page . within '.diff-content' do
expect ( page ) . to have_selector ( '.btn' , text : 'Unresolve discussion' )
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/1 discussion resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
end
it 'allows user to mark discussion as resolved' do
page . within '.diff-content' do
click_button 'Resolve discussion'
end
2018-03-17 18:26:18 +05:30
expect ( page ) . to have_selector ( '.discussion-body' , visible : false )
2016-09-13 17:45:13 +05:30
page . within '.diff-content .note' do
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/1 discussion resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
end
it 'allows user to unresolve discussion' do
page . within '.diff-content' do
click_button 'Resolve discussion'
click_button 'Unresolve discussion'
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
end
end
2018-03-17 18:26:18 +05:30
describe 'resolved discussion' do
before do
page . within '.diff-content' do
click_button 'Resolve discussion'
end
visit_merge_request
2016-09-13 17:45:13 +05:30
end
2018-03-17 18:26:18 +05:30
describe 'timeline view' do
it 'hides when resolve discussion is clicked' do
2018-11-08 19:23:39 +05:30
expect ( page ) . to have_selector ( '.discussion-header' )
expect ( page ) . not_to have_selector ( '.discussion-body' )
2018-03-17 18:26:18 +05:30
end
2016-09-13 17:45:13 +05:30
2018-03-17 18:26:18 +05:30
it 'shows resolved discussion when toggled' do
find ( " .timeline-content .discussion[data-discussion-id=' #{ note . discussion_id } '] .discussion-toggle-button " ) . click
2018-05-09 12:01:36 +05:30
expect ( page . find ( " .line-holder-placeholder " ) ) . to be_visible
2018-03-17 18:26:18 +05:30
expect ( page . find ( " .timeline-content # note_ #{ note . id } " ) ) . to be_visible
end
2018-05-09 12:01:36 +05:30
it 'renders tables in lazy-loaded resolved diff dicussions' do
find ( " .timeline-content .discussion[data-discussion-id=' #{ note . discussion_id } '] .discussion-toggle-button " ) . click
wait_for_requests
expect ( page . find ( " .timeline-content # note_ #{ note . id } " ) ) . not_to have_css ( " .line_holder " )
expect ( page . find ( " .timeline-content # note_ #{ note . id } " ) ) . to have_css ( " tr " , count : 2 )
end
2018-03-17 18:26:18 +05:30
end
describe 'side-by-side view' do
before do
page . within ( '.merge-request-tabs' ) { click_link 'Changes' }
page . find ( '#parallel-diff-btn' ) . click
end
it 'hides when resolve discussion is clicked' do
2018-11-08 19:23:39 +05:30
expect ( page ) . not_to have_selector ( '.diffs .diff-file .notes_holder' )
2018-03-17 18:26:18 +05:30
end
it 'shows resolved discussion when toggled' do
find ( '.diff-comment-avatar-holders' ) . click
expect ( find ( '.diffs .diff-file .notes_holder' ) ) . to be_visible
end
end
2016-09-13 17:45:13 +05:30
2018-12-05 23:21:45 +05:30
describe 'reply form' do
before do
click_button 'Toggle discussion'
2016-09-13 17:45:13 +05:30
2018-12-05 23:21:45 +05:30
page . within '.diff-content' do
click_button 'Reply...'
end
end
2016-09-13 17:45:13 +05:30
2018-12-05 23:21:45 +05:30
it 'allows user to comment' do
page . within '.diff-content' do
find ( '.js-note-text' ) . set 'testing'
2016-09-13 17:45:13 +05:30
2018-12-05 23:21:45 +05:30
click_button 'Comment'
2016-09-13 17:45:13 +05:30
2018-12-05 23:21:45 +05:30
wait_for_requests
end
2016-09-13 17:45:13 +05:30
2018-12-05 23:21:45 +05:30
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/1 discussion resolved' )
end
end
2016-09-13 17:45:13 +05:30
2018-12-05 23:21:45 +05:30
it 'allows user to unresolve from reply form without a comment' do
page . within '.diff-content' do
click_button 'Unresolve discussion'
wait_for_requests
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
expect ( page ) . not_to have_selector ( '.line-resolve-btn.is-active' )
end
end
it 'allows user to comment & unresolve discussion' do
page . within '.diff-content' do
find ( '.js-note-text' ) . set 'testing'
click_button 'Comment & unresolve discussion'
wait_for_requests
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
end
end
2016-09-13 17:45:13 +05:30
end
end
2018-12-05 23:21:45 +05:30
it 'allows user to resolve from reply form without a comment' do
2016-09-13 17:45:13 +05:30
page . within '.diff-content' do
click_button 'Reply...'
2018-12-05 23:21:45 +05:30
click_button 'Resolve discussion'
2016-09-13 17:45:13 +05:30
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/1 discussion resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
end
2018-12-05 23:21:45 +05:30
it 'allows user to comment & resolve discussion' do
2016-09-13 17:45:13 +05:30
page . within '.diff-content' do
click_button 'Reply...'
find ( '.js-note-text' ) . set 'testing'
2018-12-05 23:21:45 +05:30
click_button 'Comment & resolve discussion'
2016-09-13 17:45:13 +05:30
end
page . within '.line-resolve-all-container' do
2018-12-05 23:21:45 +05:30
expect ( page ) . to have_content ( '1/1 discussion resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
2016-09-13 17:45:13 +05:30
end
end
it 'allows user to quickly scroll to next unresolved discussion' do
page . within '.line-resolve-all-container' do
page . find ( '.discussion-next-btn' ) . click
end
2018-03-17 18:26:18 +05:30
expect ( page . evaluate_script ( " window.pageYOffset " ) ) . to be > 0
2016-09-13 17:45:13 +05:30
end
it 'hides jump to next button when all resolved' do
page . within '.diff-content' do
click_button 'Resolve discussion'
end
expect ( page ) . to have_selector ( '.discussion-next-btn' , visible : false )
end
it 'updates updated text after resolving note' do
page . within '.diff-content .note' do
2018-11-08 19:23:39 +05:30
resolve_button = find ( '.line-resolve-btn' )
resolve_button . click
wait_for_requests
2016-09-13 17:45:13 +05:30
2019-01-03 12:48:30 +05:30
expect ( resolve_button [ 'data-original-title' ] ) . to eq ( " Resolved by #{ user . name } " )
2018-11-08 19:23:39 +05:30
end
2016-09-13 17:45:13 +05:30
end
it 'hides jump to next discussion button' do
page . within '.discussion-reply-holder' do
expect ( page ) . not_to have_selector ( '.discussion-next-btn' )
end
end
end
context 'multiple notes' do
before do
2017-08-17 22:00:37 +05:30
create ( :diff_note_on_merge_request , project : project , noteable : merge_request , in_reply_to : note )
visit_merge_request
2016-09-13 17:45:13 +05:30
end
it 'does not mark discussion as resolved when resolving single note' do
2018-03-17 18:26:18 +05:30
page . within ( " # note_ #{ note . id } " ) do
2016-09-13 17:45:13 +05:30
first ( '.line-resolve-btn' ) . click
2017-08-17 22:00:37 +05:30
2018-03-17 18:26:18 +05:30
wait_for_requests
2019-01-03 12:48:30 +05:30
expect ( first ( '.line-resolve-btn' ) [ 'data-original-title' ] ) . to eq ( " Resolved by #{ user . name } " )
2016-09-13 17:45:13 +05:30
end
expect ( page ) . to have_content ( 'Last updated' )
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
end
end
it 'resolves discussion' do
2018-11-08 19:23:39 +05:30
resolve_buttons = page . all ( '.note .line-resolve-btn' , count : 2 )
resolve_buttons . each do | button |
2018-03-17 18:26:18 +05:30
button . click
2016-09-13 17:45:13 +05:30
end
2018-11-08 19:23:39 +05:30
wait_for_requests
resolve_buttons . each do | button |
2019-01-03 12:48:30 +05:30
expect ( button [ 'data-original-title' ] ) . to eq ( " Resolved by #{ user . name } " )
2018-11-08 19:23:39 +05:30
end
2016-09-13 17:45:13 +05:30
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/1 discussion resolved' )
end
end
end
context 'muliple discussions' do
before do
create ( :diff_note_on_merge_request , project : project , position : position , noteable : merge_request )
visit_merge_request
end
it 'shows text with how many discussions' do
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/2 discussions resolved' )
end
end
it 'allows user to mark a single note as resolved' do
click_button ( 'Resolve discussion' , match : :first )
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/2 discussions resolved' )
end
end
it 'allows user to mark all notes as resolved' do
2018-11-08 19:23:39 +05:30
page . all ( '.note .line-resolve-btn' , count : 2 ) . each do | btn |
2016-09-13 17:45:13 +05:30
btn . click
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '2/2 discussions resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
end
2019-01-03 12:48:30 +05:30
it 'allows user user to mark all discussions as resolved' do
2018-11-08 19:23:39 +05:30
page . all ( '.discussion-reply-holder' , count : 2 ) . each do | reply_holder |
2016-09-13 17:45:13 +05:30
page . within reply_holder do
click_button 'Resolve discussion'
end
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '2/2 discussions resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
end
it 'allows user to quickly scroll to next unresolved discussion' do
2018-11-08 19:23:39 +05:30
page . within ( '.discussion-reply-holder' , match : :first ) do
2016-09-13 17:45:13 +05:30
click_button 'Resolve discussion'
end
page . within '.line-resolve-all-container' do
2018-03-17 18:26:18 +05:30
page . find ( '.discussion-next-btn' ) . click
2016-09-13 17:45:13 +05:30
end
2018-03-17 18:26:18 +05:30
expect ( page . evaluate_script ( " window.pageYOffset " ) ) . to be > 0
2016-09-13 17:45:13 +05:30
end
it 'updates updated text after resolving note' do
2018-11-08 19:23:39 +05:30
page . within ( '.diff-content .note' , match : :first ) do
resolve_button = find ( '.line-resolve-btn' )
2016-09-13 17:45:13 +05:30
2018-11-08 19:23:39 +05:30
resolve_button . click
wait_for_requests
2019-01-03 12:48:30 +05:30
expect ( resolve_button [ 'data-original-title' ] ) . to eq ( " Resolved by #{ user . name } " )
2018-11-08 19:23:39 +05:30
end
2016-09-13 17:45:13 +05:30
end
2019-01-03 12:48:30 +05:30
it 'shows jump to next discussion button, apart from the last one' do
expect ( page ) . to have_selector ( '.discussion-reply-holder' , count : 2 )
expect ( page ) . to have_selector ( '.discussion-reply-holder .discussion-next-btn' , count : 1 )
2016-09-13 17:45:13 +05:30
end
2017-08-17 22:00:37 +05:30
2016-09-13 17:45:13 +05:30
it 'displays next discussion even if hidden' do
2018-11-08 19:23:39 +05:30
page . all ( '.note-discussion' , count : 2 ) . each do | discussion |
2016-09-13 17:45:13 +05:30
page . within discussion do
2017-08-17 22:00:37 +05:30
click_button 'Toggle discussion'
2016-09-13 17:45:13 +05:30
end
end
page . within ( '.issuable-discussion #notes' ) do
expect ( page ) . not_to have_selector ( '.btn' , text : 'Resolve discussion' )
end
page . within '.line-resolve-all-container' do
page . find ( '.discussion-next-btn' ) . click
end
2019-01-03 12:48:30 +05:30
expect ( find ( '.discussion-with-resolve-btn' ) ) . to have_selector ( '.btn' , text : 'Resolve discussion' )
2016-09-13 17:45:13 +05:30
end
end
context 'changes tab' do
it 'shows text with how many discussions' do
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
end
end
it 'allows user to mark a note as resolved' do
page . within '.diff-content .note' do
find ( '.line-resolve-btn' ) . click
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
page . within '.diff-content' do
expect ( page ) . to have_selector ( '.btn' , text : 'Unresolve discussion' )
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/1 discussion resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
end
it 'allows user to mark discussion as resolved' do
page . within '.diff-content' do
click_button 'Resolve discussion'
end
page . within '.diff-content .note' do
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/1 discussion resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
end
it 'allows user to unresolve discussion' do
page . within '.diff-content' do
click_button 'Resolve discussion'
click_button 'Unresolve discussion'
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
end
end
it 'allows user to comment & resolve discussion' do
page . within '.diff-content' do
click_button 'Reply...'
find ( '.js-note-text' ) . set 'testing'
click_button 'Comment & resolve discussion'
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/1 discussion resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
end
it 'allows user to comment & unresolve discussion' do
page . within '.diff-content' do
click_button 'Resolve discussion'
click_button 'Reply...'
find ( '.js-note-text' ) . set 'testing'
click_button 'Comment & unresolve discussion'
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
end
end
end
end
context 'as a guest' do
before do
2018-03-17 18:26:18 +05:30
project . add_guest ( guest )
sign_in ( guest )
2016-09-13 17:45:13 +05:30
end
context 'someone elses merge request' do
before do
visit_merge_request
end
it 'does not allow user to mark note as resolved' do
page . within '.diff-content .note' do
expect ( page ) . not_to have_selector ( '.line-resolve-btn' )
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
end
end
it 'does not allow user to mark discussion as resolved' do
page . within '.diff-content .note' do
expect ( page ) . not_to have_selector ( '.btn' , text : 'Resolve discussion' )
end
end
end
context 'guest users merge request' do
2018-03-17 18:26:18 +05:30
let ( :user ) { guest }
2016-09-13 17:45:13 +05:30
before do
2018-03-17 18:26:18 +05:30
visit_merge_request
2016-09-13 17:45:13 +05:30
end
it 'allows user to mark a note as resolved' do
page . within '.diff-content .note' do
find ( '.line-resolve-btn' ) . click
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
page . within '.diff-content' do
expect ( page ) . to have_selector ( '.btn' , text : 'Unresolve discussion' )
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '1/1 discussion resolved' )
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
end
end
end
context 'unauthorized user' do
context 'no resolved comments' do
before do
visit_merge_request
end
it 'does not allow user to mark note as resolved' do
page . within '.diff-content .note' do
expect ( page ) . not_to have_selector ( '.line-resolve-btn' )
end
page . within '.line-resolve-all-container' do
expect ( page ) . to have_content ( '0/1 discussion resolved' )
end
end
end
context 'resolved comment' do
before do
note . resolve! ( user )
visit_merge_request
end
it 'shows resolved icon' do
expect ( page ) . to have_content '1/1 discussion resolved'
2017-08-17 22:00:37 +05:30
click_button 'Toggle discussion'
2016-09-13 17:45:13 +05:30
expect ( page ) . to have_selector ( '.line-resolve-btn.is-active' )
end
it 'does not allow user to click resolve button' do
expect ( page ) . to have_selector ( '.line-resolve-btn.is-disabled' )
2017-08-17 22:00:37 +05:30
click_button 'Toggle discussion'
2016-09-13 17:45:13 +05:30
expect ( page ) . to have_selector ( '.line-resolve-btn.is-disabled' )
end
end
end
def visit_merge_request ( mr = nil )
2018-03-17 18:26:18 +05:30
mr || = merge_request
2017-09-10 17:25:29 +05:30
visit project_merge_request_path ( mr . project , mr )
2016-09-13 17:45:13 +05:30
end
end