BigW Consortium Gitlab

task_lists_spec.rb 10.1 KB
Newer Older
1 2
require 'spec_helper'

3
feature 'Task Lists', feature: true do
4 5
  include Warden::Test::Helpers

6
  let(:project) { create(:empty_project) }
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
  let(:user)    { create(:user) }
  let(:user2)   { create(:user) }

  let(:markdown) do
    <<-MARKDOWN.strip_heredoc
    This is a task list:

    - [ ] Incomplete entry 1
    - [x] Complete entry 1
    - [ ] Incomplete entry 2
    - [x] Complete entry 2
    - [ ] Incomplete entry 3
    - [ ] Incomplete entry 4
    MARKDOWN
  end

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
  let(:singleIncompleteMarkdown) do
    <<-MARKDOWN.strip_heredoc
    This is a task list:

    - [ ] Incomplete entry 1
    MARKDOWN
  end

  let(:singleCompleteMarkdown) do
    <<-MARKDOWN.strip_heredoc
    This is a task list:

    - [x] Incomplete entry 1
    MARKDOWN
  end

39 40 41 42 43 44 45 46 47 48 49 50 51
  let(:nested_tasks_markdown) do
    <<-EOT.strip_heredoc
    - [ ] Task a
      - [x] Task a.1
      - [ ] Task a.2
    - [ ] Task b

    1. [ ] Task 1
      1. [ ] Task 1.1
      1. [x] Task 1.2
    EOT
  end

52 53 54 55 56 57 58 59 60 61
  before do
    Warden.test_mode!

    project.team << [user, :master]
    project.team << [user2, :guest]

    login_as(user)
  end

  def visit_issue(project, issue)
62
    visit project_issue_path(project, issue)
63 64
  end

65
  describe 'for Issues', feature: true do
66
    describe 'multiple tasks', js: true do
67
      let!(:issue) { create(:issue, description: markdown, author: user, project: project) }
68

69 70
      it 'renders' do
        visit_issue(project, issue)
71
        wait_for_requests
72

73 74 75 76 77 78 79
        expect(page).to have_selector('ul.task-list',      count: 1)
        expect(page).to have_selector('li.task-list-item', count: 6)
        expect(page).to have_selector('ul input[checked]', count: 2)
      end

      it 'contains the required selectors' do
        visit_issue(project, issue)
80
        wait_for_requests
81

Regis committed
82
        expect(page).to have_selector(".wiki .task-list .task-list-item .task-list-item-checkbox")
83 84
        expect(page).to have_selector('a.btn-close')
      end
85

86 87
      it 'is only editable by author' do
        visit_issue(project, issue)
88
        wait_for_requests
89

Regis committed
90
        expect(page).to have_selector(".wiki .task-list .task-list-item .task-list-item-checkbox")
91

92 93 94
        logout(:user)
        login_as(user2)
        visit current_path
95
        wait_for_requests
Regis committed
96 97

        expect(page).to have_selector(".wiki .task-list .task-list-item .task-list-item-checkbox")
98 99 100
      end

      it 'provides a summary on Issues#index' do
101
        visit project_issues_path(project)
102 103
        expect(page).to have_content("2 of 6 tasks completed")
      end
104 105
    end

Regis committed
106
    describe 'single incomplete task', js: true do
107
      let!(:issue) { create(:issue, description: singleIncompleteMarkdown, author: user, project: project) }
108

109 110
      it 'renders' do
        visit_issue(project, issue)
111
        wait_for_requests
112

113 114 115 116 117 118
        expect(page).to have_selector('ul.task-list',      count: 1)
        expect(page).to have_selector('li.task-list-item', count: 1)
        expect(page).to have_selector('ul input[checked]', count: 0)
      end

      it 'provides a summary on Issues#index' do
119
        visit project_issues_path(project)
Regis committed
120

121 122
        expect(page).to have_content("0 of 1 task completed")
      end
123 124
    end

Regis committed
125
    describe 'single complete task', js: true do
126 127 128 129
      let!(:issue) { create(:issue, description: singleCompleteMarkdown, author: user, project: project) }

      it 'renders' do
        visit_issue(project, issue)
130
        wait_for_requests
131

132 133 134 135 136 137
        expect(page).to have_selector('ul.task-list',      count: 1)
        expect(page).to have_selector('li.task-list-item', count: 1)
        expect(page).to have_selector('ul input[checked]', count: 1)
      end

      it 'provides a summary on Issues#index' do
138
        visit project_issues_path(project)
Regis committed
139

140 141
        expect(page).to have_content("1 of 1 task completed")
      end
142
    end
143 144 145 146

    describe 'nested tasks', js: true do
      let(:issue) { create(:issue, description: nested_tasks_markdown, author: user, project: project) }

147 148 149
      before do
        visit_issue(project, issue)
      end
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173

      it 'renders' do
        expect(page).to have_selector('ul.task-list',      count: 2)
        expect(page).to have_selector('li.task-list-item', count: 7)
        expect(page).to have_selector('ul input[checked]', count: 1)
        expect(page).to have_selector('ol input[checked]', count: 1)
      end

      it 'solves tasks' do
        expect(page).to have_content("2 of 7 tasks completed")

        page.find('li.task-list-item', text: 'Task b').find('input').click
        page.find('li.task-list-item ul li.task-list-item', text: 'Task a.2').find('input').click
        page.find('li.task-list-item ol li.task-list-item', text: 'Task 1.1').find('input').click

        expect(page).to have_content("5 of 7 tasks completed")

        visit_issue(project, issue) # reload to see new system notes

        expect(page).to have_content('marked the task Task b as complete')
        expect(page).to have_content('marked the task Task a.2 as complete')
        expect(page).to have_content('marked the task Task 1.1 as complete')
      end
    end
174 175 176 177
  end

  describe 'for Notes' do
    let!(:issue) { create(:issue, author: user, project: project) }
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
    describe 'multiple tasks' do
      let!(:note) do
        create(:note, note: markdown, noteable: issue,
                      project: project, author: user)
      end

      it 'renders for note body' do
        visit_issue(project, issue)

        expect(page).to have_selector('.note ul.task-list',      count: 1)
        expect(page).to have_selector('.note li.task-list-item', count: 6)
        expect(page).to have_selector('.note ul input[checked]', count: 2)
      end

      it 'contains the required selectors' do
        visit_issue(project, issue)

        expect(page).to have_selector('.note .js-task-list-container')
        expect(page).to have_selector('.note .js-task-list-container .task-list .task-list-item .task-list-item-checkbox')
        expect(page).to have_selector('.note .js-task-list-container .js-task-list-field')
      end

      it 'is only editable by author' do
        visit_issue(project, issue)
        expect(page).to have_selector('.js-task-list-container')

        logout(:user)

        login_as(user2)
        visit current_path
        expect(page).not_to have_selector('.js-task-list-container')
      end
210
    end
211

212 213 214 215 216
    describe 'single incomplete task' do
      let!(:note) do
        create(:note, note: singleIncompleteMarkdown, noteable: issue,
                      project: project, author: user)
      end
217

218 219
      it 'renders for note body' do
        visit_issue(project, issue)
220

221 222 223 224
        expect(page).to have_selector('.note ul.task-list',      count: 1)
        expect(page).to have_selector('.note li.task-list-item', count: 1)
        expect(page).to have_selector('.note ul input[checked]', count: 0)
      end
225 226
    end

227 228 229 230 231
    describe 'single complete task' do
      let!(:note) do
        create(:note, note: singleCompleteMarkdown, noteable: issue,
                      project: project, author: user)
      end
232

233 234
      it 'renders for note body' do
        visit_issue(project, issue)
235

236 237 238 239
        expect(page).to have_selector('.note ul.task-list',      count: 1)
        expect(page).to have_selector('.note li.task-list-item', count: 1)
        expect(page).to have_selector('.note ul input[checked]', count: 1)
      end
240 241 242 243 244
    end
  end

  describe 'for Merge Requests' do
    def visit_merge_request(project, merge)
245
      visit project_merge_request_path(project, merge)
246 247
    end

248
    describe 'multiple tasks' do
249
      let(:project) { create(:project, :repository) }
250
      let!(:merge) { create(:merge_request, :simple, description: markdown, author: user, source_project: project) }
251

252 253
      it 'renders for description' do
        visit_merge_request(project, merge)
254

255 256 257 258
        expect(page).to have_selector('ul.task-list',      count: 1)
        expect(page).to have_selector('li.task-list-item', count: 6)
        expect(page).to have_selector('ul input[checked]', count: 2)
      end
259

260 261
      it 'contains the required selectors' do
        visit_merge_request(project, merge)
262

263
        container = '.detail-page-description .description.js-task-list-container'
264

265 266 267 268 269 270
        expect(page).to have_selector(container)
        expect(page).to have_selector("#{container} .wiki .task-list .task-list-item .task-list-item-checkbox")
        expect(page).to have_selector("#{container} .js-task-list-field")
        expect(page).to have_selector('form.js-issuable-update')
        expect(page).to have_selector('a.btn-close')
      end
271

272 273 274
      it 'is only editable by author' do
        visit_merge_request(project, merge)
        expect(page).to have_selector('.js-task-list-container')
275

276
        logout(:user)
277

278 279 280 281 282 283
        login_as(user2)
        visit current_path
        expect(page).not_to have_selector('.js-task-list-container')
      end

      it 'provides a summary on MergeRequests#index' do
284
        visit project_merge_requests_path(project)
285 286 287
        expect(page).to have_content("2 of 6 tasks completed")
      end
    end
288

289 290 291 292 293 294 295 296 297 298 299 300
    describe 'single incomplete task' do
      let!(:merge) { create(:merge_request, :simple, description: singleIncompleteMarkdown, author: user, source_project: project) }

      it 'renders for description' do
        visit_merge_request(project, merge)

        expect(page).to have_selector('ul.task-list',      count: 1)
        expect(page).to have_selector('li.task-list-item', count: 1)
        expect(page).to have_selector('ul input[checked]', count: 0)
      end

      it 'provides a summary on MergeRequests#index' do
301
        visit project_merge_requests_path(project)
302 303
        expect(page).to have_content("0 of 1 task completed")
      end
304 305
    end

306 307 308 309 310 311 312 313 314 315 316 317
    describe 'single complete task' do
      let!(:merge) { create(:merge_request, :simple, description: singleCompleteMarkdown, author: user, source_project: project) }

      it 'renders for description' do
        visit_merge_request(project, merge)

        expect(page).to have_selector('ul.task-list',      count: 1)
        expect(page).to have_selector('li.task-list-item', count: 1)
        expect(page).to have_selector('ul input[checked]', count: 1)
      end

      it 'provides a summary on MergeRequests#index' do
318
        visit project_merge_requests_path(project)
319 320
        expect(page).to have_content("1 of 1 task completed")
      end
321 322 323
    end
  end
end