calendar_spec.rb 5.77 KB
Newer Older
1 2
# frozen_string_literal: true

3 4
require 'spec_helper'

5
describe 'Contributions Calendar', :js do
6
  let(:user) { create(:user) }
7
  let(:contributed_project) { create(:project, :public, :repository) }
8
  let(:issue_note) { create(:note, project: contributed_project) }
9

10 11 12
  # Ex/ Sunday Jan 1, 2016
  date_format = '%A %b %-d, %Y'

13 14 15 16
  issue_title = 'Bug in old browser'
  issue_params = { title: issue_title }

  def get_cell_color_selector(contributions)
17
    activity_colors = ["#ededed", "rgb(172, 213, 242)", "rgb(127, 168, 201)", "rgb(82, 123, 160)", "rgb(37, 78, 119)"]
18 19 20 21 22 23 24 25 26 27 28 29 30
    # We currently don't actually test the cases with contributions >= 20
    activity_colors_index =
      if contributions > 0 && contributions < 10
        1
      elsif contributions >= 10 && contributions < 20
        2
      elsif contributions >= 20 && contributions < 30
        3
      elsif contributions >= 30
        4
      else
        0
      end
31

32
    ".user-contrib-cell[fill='#{activity_colors[activity_colors_index]}']"
33 34 35
  end

  def get_cell_date_selector(contributions, date)
36 37 38 39 40 41
    contribution_text =
      if contributions.zero?
        'No contributions'
      else
        "#{contributions} #{'contribution'.pluralize(contributions)}"
      end
42

43 44 45 46
    "#{get_cell_color_selector(contributions)}[data-original-title='#{contribution_text}<br />#{date}']"
  end

  def push_code_contribution
47 48 49 50 51 52 53 54
    event = create(:push_event, project: contributed_project, author: user)

    create(:push_event_payload,
           event: event,
           commit_from: '11f9ac0a48b62cef25eedede4c1819964f08d5ce',
           commit_to: '1cf19a015df3523caf0a1f9d40c98a267d6a2fc2',
           commit_count: 3,
           ref: 'master')
55
  end
56

57 58 59 60 61 62 63
  def note_comment_contribution
    note_comment_params = {
      project: contributed_project,
      action: Event::COMMENTED,
      target: issue_note,
      author_id: user.id
    }
64

65
    Event.create(note_comment_params)
66 67
  end

68
  def selected_day_activities(visible: true)
69
    find('#js-overview .user-calendar-activities', visible: visible).text
70 71
  end

72
  before do
73
    sign_in user
74
  end
75

76
  describe 'calendar day selection' do
77
    before do
78
      visit user.username
79
      page.find('.js-overview-tab a').click
80
      wait_for_requests
81 82
    end

83
    it 'displays calendar' do
84
      expect(find('#js-overview')).to have_css('.js-contrib-calendar')
85 86
    end

87
    describe 'select calendar day' do
88
      let(:cells) { page.all('#js-overview .user-contrib-cell') }
89

90
      before do
91
        cells[0].click
92
        wait_for_requests
93
        @first_day_activities = selected_day_activities
94 95
      end

96 97
      it 'displays calendar day activities' do
        expect(selected_day_activities).not_to be_empty
98 99
      end

100 101 102
      describe 'select another calendar day' do
        before do
          cells[1].click
103
          wait_for_requests
104 105 106 107 108
        end

        it 'displays different calendar day activities' do
          expect(selected_day_activities).not_to eq(@first_day_activities)
        end
109 110
      end

111 112 113
      describe 'deselect calendar day' do
        before do
          cells[0].click
114
          page.find('.js-overview-tab a').click
115
          wait_for_requests
116 117 118
        end

        it 'hides calendar day activities' do
119
          expect(selected_day_activities(visible: false)).to be_empty
120
        end
121 122 123 124
      end
    end
  end

125 126 127 128
  describe 'calendar daily activities' do
    shared_context 'visit user page' do
      before do
        visit user.username
129
        page.find('.js-overview-tab a').click
130
        wait_for_requests
131
      end
132 133
    end

134 135
    shared_examples 'a day with activity' do |contribution_count:|
      include_context 'visit user page'
136

137
      it 'displays calendar activity square color for 1 contribution' do
138
        expect(find('#js-overview')).to have_selector(get_cell_color_selector(contribution_count), count: 1)
139
      end
140

141 142
      it 'displays calendar activity square on the correct date' do
        today = Date.today.strftime(date_format)
143
        expect(find('#js-overview')).to have_selector(get_cell_date_selector(contribution_count, today), count: 1)
144
      end
145 146
    end

147 148 149
    describe '1 issue creation calendar activity' do
      before do
        Issues::CreateService.new(contributed_project, user, issue_params).execute
150 151
      end

152
      it_behaves_like 'a day with activity', contribution_count: 1
153

154 155
      describe 'issue title is shown on activity page' do
        include_context 'visit user page'
156

157
        it 'displays calendar activity log' do
158
          expect(find('#js-overview .overview-content-list .event-target-title')).to have_content issue_title
159 160
        end
      end
161
    end
162

163 164 165 166
    describe '1 comment calendar activity' do
      before do
        note_comment_contribution
      end
167

168
      it_behaves_like 'a day with activity', contribution_count: 1
169 170
    end

171 172 173 174
    describe '10 calendar activities' do
      before do
        10.times { push_code_contribution }
      end
175

176
      it_behaves_like 'a day with activity', contribution_count: 10
177 178
    end

179 180 181 182 183 184 185 186 187 188 189
    describe 'calendar activity on two days' do
      before do
        push_code_contribution

        Timecop.freeze(Date.yesterday) do
          Issues::CreateService.new(contributed_project, user, issue_params).execute
        end
      end
      include_context 'visit user page'

      it 'displays calendar activity squares for both days' do
190
        expect(find('#js-overview')).to have_selector(get_cell_color_selector(1), count: 2)
191 192 193 194
      end

      it 'displays calendar activity square for yesterday' do
        yesterday = Date.yesterday.strftime(date_format)
195
        expect(find('#js-overview')).to have_selector(get_cell_date_selector(1, yesterday), count: 1)
196 197 198 199
      end

      it 'displays calendar activity square for today' do
        today = Date.today.strftime(date_format)
200
        expect(find('#js-overview')).to have_selector(get_cell_date_selector(1, today), count: 1)
201
      end
202
    end
203 204
  end
end