groups_controller_spec.rb 7.6 KB
Newer Older
1 2 3
require 'rails_helper'

describe GroupsController do
4 5
  let(:user) { create(:user) }
  let(:group) { create(:group) }
6
  let(:project) { create(:empty_project, namespace: group) }
7 8 9
  let!(:group_member) { create(:group_member, group: group, user: user) }

  describe 'GET #index' do
10 11
    context 'as a user' do
      it 'redirects to Groups Dashboard' do
12
        sign_in(user)
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

        get :index

        expect(response).to redirect_to(dashboard_groups_path)
      end
    end

    context 'as a guest' do
      it 'redirects to Explore Groups' do
        get :index

        expect(response).to redirect_to(explore_groups_path)
      end
    end
  end
28

29
  describe 'GET #subgroups', :nested_groups do
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    let!(:public_subgroup) { create(:group, :public, parent: group) }
    let!(:private_subgroup) { create(:group, :private, parent: group) }

    context 'as a user' do
      before do
        sign_in(user)
      end

      it 'shows the public subgroups' do
        get :subgroups, id: group.to_param

        expect(assigns(:nested_groups)).to contain_exactly(public_subgroup)
      end

      context 'being member' do
        it 'shows public and private subgroups the user is member of' do
          private_subgroup.add_guest(user)

          get :subgroups, id: group.to_param

          expect(assigns(:nested_groups)).to contain_exactly(public_subgroup, private_subgroup)
        end
      end
    end

    context 'as a guest' do
      it 'shows the public subgroups' do
        get :subgroups, id: group.to_param

        expect(assigns(:nested_groups)).to contain_exactly(public_subgroup)
      end
    end
  end

64 65 66 67 68
  describe 'GET #issues' do
    let(:issue_1) { create(:issue, project: project) }
    let(:issue_2) { create(:issue, project: project) }

    before do
69 70
      create_list(:award_emoji, 3, awardable: issue_2)
      create_list(:award_emoji, 2, awardable: issue_1)
71
      create_list(:award_emoji, 2, :downvote, awardable: issue_2)
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

      sign_in(user)
    end

    context 'sorting by votes' do
      it 'sorts most popular issues' do
        get :issues, id: group.to_param, sort: 'upvotes_desc'
        expect(assigns(:issues)).to eq [issue_2, issue_1]
      end

      it 'sorts least popular issues' do
        get :issues, id: group.to_param, sort: 'downvotes_desc'
        expect(assigns(:issues)).to eq [issue_2, issue_1]
      end
    end
87 88 89 90 91 92

    context 'when requesting the canonical path with different casing' do
      it 'redirects to the correct casing' do
        get :issues, id: group.to_param.upcase

        expect(response).to redirect_to(issues_group_path(group.to_param))
M
Michael Kozono 已提交
93
        expect(controller).not_to set_flash[:notice]
94 95 96 97 98 99 100 101 102 103
      end
    end

    context 'when requesting a redirected path' do
      let(:redirect_route) { group.redirect_routes.create(path: 'old-path') }

      it 'redirects to the canonical path' do
        get :issues, id: redirect_route.path

        expect(response).to redirect_to(issues_group_path(group.to_param))
104
        expect(controller).to set_flash[:notice].to(group_moved_message(redirect_route, group))
105 106
      end
    end
107 108 109 110 111 112 113
  end

  describe 'GET #merge_requests' do
    let(:merge_request_1) { create(:merge_request, source_project: project) }
    let(:merge_request_2) { create(:merge_request, :simple, source_project: project) }

    before do
114 115
      create_list(:award_emoji, 3, awardable: merge_request_2)
      create_list(:award_emoji, 2, awardable: merge_request_1)
Z
Z.J. van de Weg 已提交
116
      create_list(:award_emoji, 2, :downvote, awardable: merge_request_2)
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131

      sign_in(user)
    end

    context 'sorting by votes' do
      it 'sorts most popular merge requests' do
        get :merge_requests, id: group.to_param, sort: 'upvotes_desc'
        expect(assigns(:merge_requests)).to eq [merge_request_2, merge_request_1]
      end

      it 'sorts least popular merge requests' do
        get :merge_requests, id: group.to_param, sort: 'downvotes_desc'
        expect(assigns(:merge_requests)).to eq [merge_request_2, merge_request_1]
      end
    end
132 133 134 135 136 137

    context 'when requesting the canonical path with different casing' do
      it 'redirects to the correct casing' do
        get :merge_requests, id: group.to_param.upcase

        expect(response).to redirect_to(merge_requests_group_path(group.to_param))
M
Michael Kozono 已提交
138
        expect(controller).not_to set_flash[:notice]
139 140 141 142 143 144 145 146 147 148
      end
    end

    context 'when requesting a redirected path' do
      let(:redirect_route) { group.redirect_routes.create(path: 'old-path') }

      it 'redirects to the canonical path' do
        get :merge_requests, id: redirect_route.path

        expect(response).to redirect_to(merge_requests_group_path(group.to_param))
149
        expect(controller).to set_flash[:notice].to(group_moved_message(redirect_route, group))
150 151
      end
    end
152
  end
153 154 155 156 157 158

  describe 'DELETE #destroy' do
    context 'as another user' do
      it 'returns 404' do
        sign_in(create(:user))

159
        delete :destroy, id: group.to_param
160 161 162 163 164 165 166 167 168 169 170

        expect(response.status).to eq(404)
      end
    end

    context 'as the group owner' do
      before do
        sign_in(user)
      end

      it 'schedules a group destroy' do
171
        Sidekiq::Testing.fake! do
172
          expect { delete :destroy, id: group.to_param }.to change(GroupDestroyWorker.jobs, :size).by(1)
173
        end
174 175 176
      end

      it 'redirects to the root path' do
177
        delete :destroy, id: group.to_param
178 179 180

        expect(response).to redirect_to(root_path)
      end
181 182 183 184 185

      context 'when requesting the canonical path with different casing' do
        it 'does not 404' do
          delete :destroy, id: group.to_param.upcase

M
Michael Kozono 已提交
186
          expect(response).not_to have_http_status(404)
187 188 189 190 191
        end

        it 'does not redirect to the correct casing' do
          delete :destroy, id: group.to_param.upcase

M
Michael Kozono 已提交
192
          expect(response).not_to redirect_to(group_path(group.to_param))
193 194 195 196 197 198 199 200 201 202 203 204
        end
      end

      context 'when requesting a redirected path' do
        let(:redirect_route) { group.redirect_routes.create(path: 'old-path') }

        it 'returns not found' do
          delete :destroy, id: redirect_route.path

          expect(response).to have_http_status(404)
        end
      end
205 206
    end
  end
207 208 209 210 211 212

  describe 'PUT update' do
    before do
      sign_in(user)
    end

213
    it 'updates the path successfully' do
214 215 216 217 218 219 220 221 222 223
      post :update, id: group.to_param, group: { path: 'new_path' }

      expect(response).to have_http_status(302)
      expect(controller).to set_flash[:notice]
    end

    it 'does not update the path on error' do
      allow_any_instance_of(Group).to receive(:move_dir).and_raise(Gitlab::UpdatePathError)
      post :update, id: group.to_param, group: { path: 'new_path' }

J
James Lopez 已提交
224 225
      expect(assigns(:group).errors).not_to be_empty
      expect(assigns(:group).path).not_to eq('new_path')
226
    end
227 228 229 230 231

    context 'when requesting the canonical path with different casing' do
      it 'does not 404' do
        post :update, id: group.to_param.upcase, group: { path: 'new_path' }

M
Michael Kozono 已提交
232
        expect(response).not_to have_http_status(404)
233 234 235 236 237
      end

      it 'does not redirect to the correct casing' do
        post :update, id: group.to_param.upcase, group: { path: 'new_path' }

M
Michael Kozono 已提交
238
        expect(response).not_to redirect_to(group_path(group.to_param))
239 240 241 242 243 244 245 246 247 248 249 250
      end
    end

    context 'when requesting a redirected path' do
      let(:redirect_route) { group.redirect_routes.create(path: 'old-path') }

      it 'returns not found' do
        post :update, id: redirect_route.path, group: { path: 'new_path' }

        expect(response).to have_http_status(404)
      end
    end
251
  end
252 253 254 255

  def group_moved_message(redirect_route, group)
    "Group '#{redirect_route.path}' was moved to '#{group.full_path}'. Please update any links and bookmarks that may still have the old path."
  end
256
end