BigW Consortium Gitlab

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

3
feature 'Task Lists', feature: true do
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
  include Warden::Test::Helpers

  let(:project) { create(:project) }
  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

  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

  describe 'for Issues' do
    let!(:issue) { create(:issue, description: markdown, author: user, project: project) }

    it 'renders' do
      visit_issue(project, issue)

      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)

50
      container = '.detail-page-description .description.js-task-list-container'
51 52 53

      expect(page).to have_selector(container)
      expect(page).to have_selector("#{container} .wiki .task-list .task-list-item .task-list-item-checkbox")
54
      expect(page).to have_selector("#{container} .js-task-list-field")
55
      expect(page).to have_selector('form.js-issuable-update')
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
      expect(page).to have_selector('a.btn-close')
    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

    it 'provides a summary on Issues#index' do
      visit namespace_project_issues_path(project.namespace, project)
72
      expect(page).to have_content("6 tasks (2 completed, 4 remaining)")
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
    end
  end

  describe 'for Notes' do
    let!(:issue) { create(:issue, author: user, project: project) }
    let!(:note)  { create(:note, note: markdown, noteable: issue, author: user) }

    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')
93
      expect(page).to have_selector('.note .js-task-list-container .js-task-list-field')
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
    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
  end

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

    let!(:merge) { create(:merge_request, :simple, description: markdown, 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: 6)
      expect(page).to have_selector('ul input[checked]', count: 2)
    end

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

126
      container = '.detail-page-description .description.js-task-list-container'
127 128 129

      expect(page).to have_selector(container)
      expect(page).to have_selector("#{container} .wiki .task-list .task-list-item .task-list-item-checkbox")
130
      expect(page).to have_selector("#{container} .js-task-list-field")
131
      expect(page).to have_selector('form.js-issuable-update')
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
      expect(page).to have_selector('a.btn-close')
    end

    it 'is only editable by author' do
      visit_merge_request(project, merge)
      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

    it 'provides a summary on MergeRequests#index' do
      visit namespace_project_merge_requests_path(project.namespace, project)
148
      expect(page).to have_content("6 tasks (2 completed, 4 remaining)")
149 150 151
    end
  end
end