boards_spec.rb 6.45 KB
Newer Older
1 2
require 'spec_helper'

3
describe API::Boards do
Rémy Coutable's avatar
Rémy Coutable committed
4 5 6 7 8 9 10
  set(:user)        { create(:user) }
  set(:non_member)  { create(:user) }
  set(:guest)       { create(:user) }
  set(:admin)       { create(:user, :admin) }
  set(:project)    { create(:project, :public, creator_id: user.id, namespace: user.namespace ) }

  set(:dev_label) do
11 12 13
    create(:label, title: 'Development', color: '#FFAABB', project: project)
  end

Rémy Coutable's avatar
Rémy Coutable committed
14
  set(:test_label) do
15 16 17
    create(:label, title: 'Testing', color: '#FFAACC', project: project)
  end

Rémy Coutable's avatar
Rémy Coutable committed
18
  set(:ux_label) do
19 20 21
    create(:label, title: 'UX', color: '#FF0000', project: project)
  end

Rémy Coutable's avatar
Rémy Coutable committed
22
  set(:dev_list) do
23 24 25
    create(:list, label: dev_label, position: 1)
  end

Rémy Coutable's avatar
Rémy Coutable committed
26
  set(:test_list) do
27 28 29
    create(:list, label: test_label, position: 2)
  end

30 31 32
  # EE only
  set(:milestone) { create(:milestone, project: project) }

Rémy Coutable's avatar
Rémy Coutable committed
33
  set(:board) do
34
    create(:board, project: project, milestone: milestone, lists: [dev_list, test_list])
35 36 37 38 39 40 41 42 43 44 45 46 47 48
  end

  before do
    project.team << [user, :reporter]
    project.team << [guest, :guest]
  end

  describe "GET /projects/:id/boards" do
    let(:base_url) { "/projects/#{project.id}/boards" }

    context "when unauthenticated" do
      it "returns authentication error" do
        get api(base_url)

49
        expect(response).to have_gitlab_http_status(401)
50 51 52 53
      end
    end

    context "when authenticated" do
54
      it "returns the project issue boards" do
55 56
        get api(base_url, user)

57
        expect(response).to have_gitlab_http_status(200)
58
        expect(response).to include_pagination_headers
59
        expect(response).to match_response_schema('public_api/v4/boards')
60 61
      end
    end
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

    context 'with the issue_board_milestone-feature available' do
      it 'returns the milestone when the `issue_board_milestone`-feature is enabled' do
        stub_licensed_features(issue_board_milestone: true)

        get api(base_url, user)

        expect(json_response.first["milestone"]).not_to be_nil
      end

      it 'hides the milestone when the `issue_board_milestone`-feature is disabled' do
        stub_licensed_features(issue_board_milestone: false)

        get api(base_url, user)

        expect(json_response.first["milestone"]).to be_nil
      end
    end
80 81 82 83 84 85 86 87
  end

  describe "GET /projects/:id/boards/:board_id/lists" do
    let(:base_url) { "/projects/#{project.id}/boards/#{board.id}/lists" }

    it 'returns issue board lists' do
      get api(base_url, user)

88
      expect(response).to have_gitlab_http_status(200)
89
      expect(response).to include_pagination_headers
90 91 92 93 94 95 96 97
      expect(json_response).to be_an Array
      expect(json_response.length).to eq(2)
      expect(json_response.first['label']['name']).to eq(dev_label.title)
    end

    it 'returns 404 if board not found' do
      get api("/projects/#{project.id}/boards/22343/lists", user)

98
      expect(response).to have_gitlab_http_status(404)
99 100 101 102 103 104 105 106 107
    end
  end

  describe "GET /projects/:id/boards/:board_id/lists/:list_id" do
    let(:base_url) { "/projects/#{project.id}/boards/#{board.id}/lists" }

    it 'returns a list' do
      get api("#{base_url}/#{dev_list.id}", user)

108
      expect(response).to have_gitlab_http_status(200)
109 110 111 112 113 114 115 116
      expect(json_response['id']).to eq(dev_list.id)
      expect(json_response['label']['name']).to eq(dev_label.title)
      expect(json_response['position']).to eq(1)
    end

    it 'returns 404 if list not found' do
      get api("#{base_url}/5324", user)

117
      expect(response).to have_gitlab_http_status(404)
118 119 120 121 122 123
    end
  end

  describe "POST /projects/:id/board/lists" do
    let(:base_url) { "/projects/#{project.id}/boards/#{board.id}/lists" }

124 125 126 127 128 129 130
    it 'creates a new issue board list for group labels' do
      group = create(:group)
      group_label = create(:group_label, group: group)
      project.update(group: group)

      post api(base_url, user), label_id: group_label.id

131
      expect(response).to have_gitlab_http_status(201)
132 133 134 135 136 137
      expect(json_response['label']['name']).to eq(group_label.title)
      expect(json_response['position']).to eq(3)
    end

    it 'creates a new issue board list for project labels' do
      post api(base_url, user), label_id: ux_label.id
138

139
      expect(response).to have_gitlab_http_status(201)
140 141 142 143 144
      expect(json_response['label']['name']).to eq(ux_label.title)
      expect(json_response['position']).to eq(3)
    end

    it 'returns 400 when creating a new list if label_id is invalid' do
145
      post api(base_url, user), label_id: 23423
146

147
      expect(response).to have_gitlab_http_status(400)
148 149
    end

150 151
    it 'returns 403 for project members with guest role' do
      put api("#{base_url}/#{test_list.id}", guest), position: 1
152

153
      expect(response).to have_gitlab_http_status(403)
154 155 156 157 158 159 160 161 162 163
    end
  end

  describe "PUT /projects/:id/boards/:board_id/lists/:list_id to update only position" do
    let(:base_url) { "/projects/#{project.id}/boards/#{board.id}/lists" }

    it "updates a list" do
      put api("#{base_url}/#{test_list.id}", user),
        position: 1

164
      expect(response).to have_gitlab_http_status(200)
165 166 167 168 169 170 171
      expect(json_response['position']).to eq(1)
    end

    it "returns 404 error if list id not found" do
      put api("#{base_url}/44444", user),
        position: 1

172
      expect(response).to have_gitlab_http_status(404)
173 174 175 176 177 178
    end

    it "returns 403 for project members with guest role" do
      put api("#{base_url}/#{test_list.id}", guest),
        position: 1

179
      expect(response).to have_gitlab_http_status(403)
180 181 182 183 184 185 186 187 188
    end
  end

  describe "DELETE /projects/:id/board/lists/:list_id" do
    let(:base_url) { "/projects/#{project.id}/boards/#{board.id}/lists" }

    it "rejects a non member from deleting a list" do
      delete api("#{base_url}/#{dev_list.id}", non_member)

189
      expect(response).to have_gitlab_http_status(403)
190 191 192 193 194
    end

    it "rejects a user with guest role from deleting a list" do
      delete api("#{base_url}/#{dev_list.id}", guest)

195
      expect(response).to have_gitlab_http_status(403)
196 197 198 199 200
    end

    it "returns 404 error if list id not found" do
      delete api("#{base_url}/44444", user)

201
      expect(response).to have_gitlab_http_status(404)
202 203 204
    end

    context "when the user is project owner" do
Rémy Coutable's avatar
Rémy Coutable committed
205 206 207 208 209
      set(:owner) { create(:user) }

      before do
        project.update(namespace: owner.namespace)
      end
210 211 212 213

      it "deletes the list if an admin requests it" do
        delete api("#{base_url}/#{dev_list.id}", owner)

214
        expect(response).to have_gitlab_http_status(204)
215
      end
216 217 218 219

      it_behaves_like '412 response' do
        let(:request) { api("#{base_url}/#{dev_list.id}", owner) }
      end
220 221 222
    end
  end
end