summaryrefslogtreecommitdiff
path: root/spec/features/milestones/user_views_milestone_spec.rb
blob: 9c19f84242776f4e2693f32a65ffb3e813f18899 (plain)
1
2
3
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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
126
127
128
129
130
131
132
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe "User views milestone" do
  let_it_be(:user) { create(:user) }
  let_it_be(:group) { create(:group) }
  let_it_be(:project) { create(:project, :repository, group: group) }
  let_it_be(:milestone) { create(:milestone, project: project, description: '**Lorem** _ipsum_ dolor sit [amet](https://example.com)') }
  let_it_be(:labels) { create_list(:label, 2, project: project) }

  before_all do
    project.add_developer(user)
  end

  before do
    sign_in(user)
  end

  context 'page description' do
    before do
      visit(project_milestone_path(project, milestone))
    end

    it_behaves_like 'page meta description', 'Lorem ipsum dolor sit amet'
  end

  it "avoids N+1 database queries" do
    issue_params = { project: project, assignees: [user], author: user, milestone: milestone, labels: labels }.freeze

    create(:labeled_issue, issue_params)

    control = ActiveRecord::QueryRecorder.new { visit_milestone }

    create(:labeled_issue, issue_params)

    expect { visit_milestone }.not_to exceed_query_limit(control)
  end

  context 'issues list', :js do
    before_all do
      2.times do
        create(:issue, milestone: milestone, project: project)
        create(:issue, milestone: milestone, project: project, assignees: [user])
        create(:issue, milestone: milestone, project: project, state: :closed)
      end
    end

    context 'for a project milestone' do
      it 'does not show the project name' do
        visit(project_milestone_path(project, milestone))

        wait_for_requests

        expect(page.find('#tab-issues')).not_to have_text(project.name)
      end
    end

    context 'for a group milestone' do
      let(:group_milestone) { create(:milestone, group: group) }

      it 'shows the project name' do
        create(:issue, project: project, milestone: group_milestone)

        visit(group_milestone_path(group, group_milestone))

        expect(page.find('#tab-issues')).to have_text(project.name)
      end
    end

    context 'when issues on milestone are over DISPLAY_ISSUES_LIMIT' do
      it "limits issues to display and shows warning" do
        stub_const('Milestoneish::DISPLAY_ISSUES_LIMIT', 3)

        visit(project_milestone_path(project, milestone))

        expect(page).to have_selector('.issuable-row', count: 3)
        expect(page).to have_selector('#milestone-issue-count-warning', text: 'Showing 3 of 6 issues. View all issues')
        expect(page).to have_link('View all issues', href: project_issues_path(project, { milestone_title: milestone.title }))
      end
    end

    context 'when issues on milestone are below DISPLAY_ISSUES_LIMIT' do
      it 'does not display warning' do
        visit(project_milestone_path(project, milestone))

        expect(page).not_to have_selector('#milestone-issue-count-warning', text: 'Showing 3 of 6 issues. View all issues')
        expect(page).to have_selector('.issuable-row', count: 6)
      end
    end
  end

  context 'merge requests list', :js do
    context 'for a project milestone' do
      it 'does not show the project name' do
        create(:merge_request, source_project: project, milestone: milestone)

        visit(project_milestone_path(project, milestone))

        within('.js-milestone-tabs') do
          click_link('Merge Requests')
        end

        wait_for_requests

        expect(page.find('#tab-merge-requests')).not_to have_text(project.name)
      end
    end

    context 'for a group milestone' do
      let(:group_milestone) { create(:milestone, group: group) }

      it 'shows the project name' do
        create(:merge_request, source_project: project, milestone: group_milestone)

        visit(group_milestone_path(group, group_milestone))

        within('.js-milestone-tabs') do
          click_link('Merge Requests')
        end

        expect(page.find('#tab-merge-requests')).to have_text(project.name)
      end
    end
  end

  private

  def visit_milestone
    visit(project_milestone_path(project, milestone))
  end
end