calendar_spec.rb 5.74 KB
Newer Older
1 2
require 'spec_helper'

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

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

11 12 13 14
  issue_title = 'Bug in old browser'
  issue_params = { title: issue_title }

  def get_cell_color_selector(contributions)
15
    activity_colors = ["#ededed", "rgb(172, 213, 242)", "rgb(127, 168, 201)", "rgb(82, 123, 160)", "rgb(37, 78, 119)"]
16 17 18 19 20 21 22 23 24 25 26 27 28
    # 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
29

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

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

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

  def push_code_contribution
45 46 47 48 49 50 51 52
    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')
53
  end
54

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

63
    Event.create(note_comment_params)
64 65
  end

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

70
  before do
71
    sign_in user
72
  end
73

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

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

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

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

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

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

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

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

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

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

132 133
    shared_examples 'a day with activity' do |contribution_count:|
      include_context 'visit user page'
134

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

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

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

150
      it_behaves_like 'a day with activity', contribution_count: 1
151

152 153
      describe 'issue title is shown on activity page' do
        include_context 'visit user page'
154

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

161 162 163 164
    describe '1 comment calendar activity' do
      before do
        note_comment_contribution
      end
165

166
      it_behaves_like 'a day with activity', contribution_count: 1
167 168
    end

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

174
      it_behaves_like 'a day with activity', contribution_count: 10
175 176
    end

177 178 179 180 181 182 183 184 185 186 187
    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
188
        expect(find('#js-overview')).to have_selector(get_cell_color_selector(1), count: 2)
189 190 191 192
      end

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

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