BigW Consortium Gitlab

task_lists_spec.rb 10.3 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 62 63 64
  before do
    Warden.test_mode!

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

    login_as(user)
  end

  def visit_issue(project, issue)
    visit namespace_project_issue_path(project.namespace, project, issue)
  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 101 102 103
      end

      it 'provides a summary on Issues#index' do
        visit namespace_project_issues_path(project.namespace, project)
        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 119
        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
        visit namespace_project_issues_path(project.namespace, 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 138
        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
        visit namespace_project_issues_path(project.namespace, project)
Regis committed
139

140 141
        expect(page).to have_content("1 of 1 task completed")
      end
142
    end
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171

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

      before { visit_issue(project, issue) }

      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
172 173 174 175
  end

  describe 'for Notes' do
    let!(:issue) { create(:issue, author: user, project: project) }
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 201 202 203 204 205 206 207
    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
208
    end
209

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

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

219 220 221 222
        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
223 224
    end

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

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

234 235 236 237
        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
238 239 240 241 242 243 244 245
    end
  end

  describe 'for Merge Requests' do
    def visit_merge_request(project, merge)
      visit namespace_project_merge_request_path(project.namespace, project, merge)
    end

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

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

253 254 255 256
        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
257

258 259
      it 'contains the required selectors' do
        visit_merge_request(project, merge)
260

261
        container = '.detail-page-description .description.js-task-list-container'
262

263 264 265 266 267 268
        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
269

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

274
        logout(:user)
275

276 277 278 279 280 281 282 283 284 285
        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
        visit namespace_project_merge_requests_path(project.namespace, project)
        expect(page).to have_content("2 of 6 tasks completed")
      end
    end
286

287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
    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
        visit namespace_project_merge_requests_path(project.namespace, project)
        expect(page).to have_content("0 of 1 task completed")
      end
302 303
    end

304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
    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
        visit namespace_project_merge_requests_path(project.namespace, project)
        expect(page).to have_content("1 of 1 task completed")
      end
319 320 321
    end
  end
end