BigW Consortium Gitlab

todos_spec.rb 6.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
require 'spec_helper'

describe API::Todos, api: true do
  include ApiHelpers

  let(:project_1) { create(:project) }
  let(:project_2) { create(:project) }
  let(:author_1) { create(:user) }
  let(:author_2) { create(:user) }
  let(:john_doe) { create(:user, username: 'john_doe') }
  let(:merge_request) { create(:merge_request, source_project: project_1) }
12
  let!(:pending_1) { create(:todo, :mentioned, project: project_1, author: author_1, user: john_doe) }
13
  let!(:pending_2) { create(:todo, project: project_2, author: author_2, user: john_doe) }
14
  let!(:pending_3) { create(:todo, project: project_1, author: author_2, user: john_doe) }
15 16
  let!(:done) { create(:todo, :done, project: project_1, author: author_1, user: john_doe) }

17 18 19 20 21
  before do
    project_1.team << [john_doe, :developer]
    project_2.team << [john_doe, :developer]
  end

22 23
  describe 'GET /todos' do
    context 'when unauthenticated' do
24
      it 'returns authentication error' do
25
        get api('/todos')
26

27 28 29 30 31
        expect(response.status).to eq(401)
      end
    end

    context 'when authenticated' do
32
      it 'returns an array of pending todos for current user' do
33
        get api('/todos', john_doe)
34

35 36 37
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.length).to eq(3)
38 39 40 41
        expect(json_response[0]['id']).to eq(pending_3.id)
        expect(json_response[0]['project']).to be_a Hash
        expect(json_response[0]['author']).to be_a Hash
        expect(json_response[0]['target_type']).to be_present
42
        expect(json_response[0]['target']).to be_a Hash
43 44 45
        expect(json_response[0]['target_url']).to be_present
        expect(json_response[0]['body']).to be_present
        expect(json_response[0]['state']).to eq('pending')
Robert Schilling committed
46
        expect(json_response[0]['action_name']).to eq('assigned')
47
        expect(json_response[0]['created_at']).to be_present
48 49 50
      end

      context 'and using the author filter' do
51
        it 'filters based on author_id param' do
52
          get api('/todos', john_doe), { author_id: author_2.id }
53

54 55 56 57 58 59 60
          expect(response.status).to eq(200)
          expect(json_response).to be_an Array
          expect(json_response.length).to eq(2)
        end
      end

      context 'and using the type filter' do
61
        it 'filters based on type param' do
62 63
          create(:todo, project: project_1, author: author_2, user: john_doe, target: merge_request)

64
          get api('/todos', john_doe), { type: 'MergeRequest' }
65

66 67 68 69 70 71 72
          expect(response.status).to eq(200)
          expect(json_response).to be_an Array
          expect(json_response.length).to eq(1)
        end
      end

      context 'and using the state filter' do
73
        it 'filters based on state param' do
74
          get api('/todos', john_doe), { state: 'done' }
75

76 77 78 79 80 81 82
          expect(response.status).to eq(200)
          expect(json_response).to be_an Array
          expect(json_response.length).to eq(1)
        end
      end

      context 'and using the project filter' do
83
        it 'filters based on project_id param' do
84
          get api('/todos', john_doe), { project_id: project_2.id }
85

86 87 88 89 90
          expect(response.status).to eq(200)
          expect(json_response).to be_an Array
          expect(json_response.length).to eq(1)
        end
      end
91 92 93 94 95 96 97 98 99 100

      context 'and using the action filter' do
        it 'filters based on action param' do
          get api('/todos', john_doe), { action: 'mentioned' }

          expect(response.status).to eq(200)
          expect(json_response).to be_an Array
          expect(json_response.length).to eq(1)
        end
      end
101 102 103 104 105
    end
  end

  describe 'DELETE /todos/:id' do
    context 'when unauthenticated' do
106
      it 'returns authentication error' do
107
        delete api("/todos/#{pending_1.id}")
108

109 110 111 112 113
        expect(response.status).to eq(401)
      end
    end

    context 'when authenticated' do
114
      it 'marks a todo as done' do
115
        delete api("/todos/#{pending_1.id}", john_doe)
116

117 118 119
        expect(response.status).to eq(200)
        expect(pending_1.reload).to be_done
      end
120 121 122 123 124 125

      it 'updates todos cache' do
        expect_any_instance_of(User).to receive(:update_todos_count_cache).and_call_original

        delete api("/todos/#{pending_1.id}", john_doe)
      end
126 127 128 129 130
    end
  end

  describe 'DELETE /todos' do
    context 'when unauthenticated' do
131
      it 'returns authentication error' do
132
        delete api('/todos')
133

134 135 136 137 138
        expect(response.status).to eq(401)
      end
    end

    context 'when authenticated' do
139
      it 'marks all todos as done' do
140
        delete api('/todos', john_doe)
141

142
        expect(response.status).to eq(200)
143
        expect(response.body).to eq('3')
144 145 146 147
        expect(pending_1.reload).to be_done
        expect(pending_2.reload).to be_done
        expect(pending_3.reload).to be_done
      end
148 149 150 151 152 153

      it 'updates todos cache' do
        expect_any_instance_of(User).to receive(:update_todos_count_cache).and_call_original

        delete api("/todos", john_doe)
      end
154 155
    end
  end
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

  shared_examples 'an issuable' do |issuable_type|
    it 'creates a todo on an issuable' do
      post api("/projects/#{project_1.id}/#{issuable_type}/#{issuable.id}/todo", john_doe)

      expect(response.status).to eq(201)
      expect(json_response['project']).to be_a Hash
      expect(json_response['author']).to be_a Hash
      expect(json_response['target_type']).to eq(issuable.class.name)
      expect(json_response['target']).to be_a Hash
      expect(json_response['target_url']).to be_present
      expect(json_response['body']).to be_present
      expect(json_response['state']).to eq('pending')
      expect(json_response['action_name']).to eq('marked')
      expect(json_response['created_at']).to be_present
    end

    it 'returns 304 there already exist a todo on that issuable' do
      create(:todo, project: project_1, author: author_1, user: john_doe, target: issuable)

      post api("/projects/#{project_1.id}/#{issuable_type}/#{issuable.id}/todo", john_doe)

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

    it 'returns 404 if the issuable is not found' do
      post api("/projects/#{project_1.id}/#{issuable_type}/123/todo", john_doe)

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

  describe 'POST :id/issuable_type/:issueable_id/todo' do
    context 'for an issue' do
      it_behaves_like 'an issuable', 'issues' do
        let(:issuable) { create(:issue, author: author_1, project: project_1) }
      end
    end

    context 'for a merge request' do
      it_behaves_like 'an issuable', 'merge_requests' do
        let(:issuable) { merge_request }
      end
    end
  end
201
end