1# frozen_string_literal: true 2 3require 'spec_helper' 4 5RSpec.describe 'Users > User browses projects on user page', :js do 6 let!(:user) { create :user } 7 let!(:private_project) do 8 create :project, :private, name: 'private', namespace: user.namespace do |project| 9 project.add_maintainer(user) 10 end 11 end 12 13 let!(:internal_project) do 14 create :project, :internal, name: 'internal', namespace: user.namespace do |project| 15 project.add_maintainer(user) 16 end 17 end 18 19 let!(:public_project) do 20 create :project, :public, name: 'public', namespace: user.namespace do |project| 21 project.add_maintainer(user) 22 end 23 end 24 25 def click_nav_link(name) 26 page.within '.nav-links' do 27 click_link name 28 end 29 end 30 31 it 'hides loading spinner after load', :js do 32 visit user_path(user) 33 click_nav_link('Personal projects') 34 35 wait_for_requests 36 37 expect(page).not_to have_selector('.loading-status .loading', visible: true) 38 end 39 40 it 'paginates projects', :js do 41 project = create(:project, namespace: user.namespace, updated_at: 2.minutes.since) 42 project2 = create(:project, namespace: user.namespace, updated_at: 1.minute.since) 43 allow(Project).to receive(:default_per_page).and_return(1) 44 45 sign_in(user) 46 visit user_path(user) 47 click_nav_link('Personal projects') 48 49 wait_for_requests 50 51 expect(page).to have_content(project.name) 52 53 click_link('Next') 54 55 expect(page).to have_content(project2.name) 56 end 57 58 it 'does not have incorrectly interpolated message', :js do 59 project = create(:project, namespace: user.namespace, updated_at: 2.minutes.since) 60 61 sign_in(user) 62 visit user_path(user) 63 click_nav_link('Personal projects') 64 65 wait_for_requests 66 67 expect(page).to have_content(project.name) 68 expect(page).not_to have_content("_('Updated')") 69 end 70 71 context 'when not signed in' do 72 it 'renders user public project' do 73 visit user_path(user) 74 click_nav_link('Personal projects') 75 76 expect(page).to have_css('.tab-content #projects.active') 77 expect(title).to start_with(user.name) 78 79 expect(page).to have_content(public_project.name) 80 expect(page).not_to have_content(private_project.name) 81 expect(page).not_to have_content(internal_project.name) 82 end 83 end 84 85 context 'when signed in as another user' do 86 let(:another_user) { create :user } 87 88 before do 89 sign_in(another_user) 90 end 91 92 it 'renders user public and internal projects' do 93 visit user_path(user) 94 click_nav_link('Personal projects') 95 96 expect(title).to start_with(user.name) 97 98 expect(page).not_to have_content(private_project.name) 99 expect(page).to have_content(public_project.name) 100 expect(page).to have_content(internal_project.name) 101 end 102 end 103 104 context 'when signed in as user' do 105 before do 106 sign_in(user) 107 end 108 109 describe 'personal projects' do 110 it 'renders all user projects' do 111 visit user_path(user) 112 click_nav_link('Personal projects') 113 114 expect(title).to start_with(user.name) 115 expect(page).to have_content(private_project.name) 116 expect(page).to have_content(public_project.name) 117 expect(page).to have_content(internal_project.name) 118 end 119 end 120 121 describe 'contributed projects' do 122 context 'when user has contributions' do 123 let(:contributed_project) do 124 create :project, :public, :empty_repo 125 end 126 127 before do 128 Issues::CreateService.new(project: contributed_project, current_user: user, params: { title: 'Bug in old browser' }, spam_params: nil).execute 129 event = create(:push_event, project: contributed_project, author: user) 130 create(:push_event_payload, event: event, commit_count: 3) 131 end 132 133 it 'renders contributed project' do 134 visit user_path(user) 135 136 expect(title).to start_with(user.name) 137 expect(page).to have_css('.js-contrib-calendar') 138 139 click_nav_link('Contributed projects') 140 141 page.within '#contributed' do 142 expect(page).to have_content(contributed_project.name) 143 end 144 end 145 end 146 end 147 end 148end 149