From 9806d879561d2dd6795bcca65da862e5fcc7fba5 Mon Sep 17 00:00:00 2001
From: Clement Ho <ClemMakesApps@gmail.com>
Date: Mon, 19 Sep 2016 16:04:19 -0500
Subject: [PATCH] Add more tests for calendar contribution

---
 CHANGELOG                      |   1 +
 spec/features/calendar_spec.rb | 109 ++++++++++++++++++++++++++++++---
 2 files changed, 101 insertions(+), 9 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 463b07b635e..d228f814f76 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,7 @@ Please view this file on the master branch, on stable branches it's out of date.
 
 v 8.13.0 (unreleased)
   - Speed-up group milestones show page
+  - Add more tests for calendar contribution (ClemMakesApps)
   - Fix robots.txt disallowing access to groups starting with "s" (Matt Harrison)
 
 v 8.12.2 (unreleased)
diff --git a/spec/features/calendar_spec.rb b/spec/features/calendar_spec.rb
index fd5fbaf2af4..f52682f229c 100644
--- a/spec/features/calendar_spec.rb
+++ b/spec/features/calendar_spec.rb
@@ -5,13 +5,41 @@ feature 'Contributions Calendar', js: true, feature: true do
 
   let(:contributed_project) { create(:project, :public) }
 
-  before do
-    login_as :user
+  date_format = '%A %b %d, %Y'
+  issue_title = 'Bug in old browser'
+  issue_params = { title: issue_title }
+
+  def get_cell_color_selector(contributions)
+    contribution_cell = '.user-contrib-cell'
+    activity_colors = Array['#ededed', '#acd5f2', '#7fa8c9', '#527ba0', '#254e77']
+    activity_colors_index = 0
+
+    if contributions > 0 && contributions < 10
+      activity_colors_index = 1
+    elsif contributions >= 10 && contributions < 20
+      activity_colors_index = 2
+    elsif contributions >= 20 && contributions < 30
+      activity_colors_index = 3
+    elsif contributions >= 30
+      activity_colors_index = 4
+    end
+
+    "#{contribution_cell}[fill='#{activity_colors[activity_colors_index]}']"
+  end
+
+  def get_cell_date_selector(contributions, date)
+    contribution_text = 'No contributions'
 
-    issue_params = { title: 'Bug in old browser' }
-    Issues::CreateService.new(contributed_project, @user, issue_params).execute
+    if contributions === 1
+      contribution_text = '1 contribution'
+    elsif contributions > 1
+      contribution_text = "#{contributions} contributions"
+    end
 
-    # Push code contribution
+    "#{get_cell_color_selector(contributions)}[data-original-title='#{contribution_text}<br />#{date}']"
+  end
+
+  def push_code_contribution
     push_params = {
       project: contributed_project,
       action: Event::PUSHED,
@@ -20,7 +48,10 @@ feature 'Contributions Calendar', js: true, feature: true do
     }
 
     Event.create(push_params)
+  end
 
+  before do
+    login_as :user
     visit @user.username
     wait_for_ajax
   end
@@ -29,11 +60,71 @@ feature 'Contributions Calendar', js: true, feature: true do
     expect(page).to have_css('.js-contrib-calendar')
   end
 
-  it 'displays calendar activity log', js: true do
-    expect(find('.content_list .event-note')).to have_content "Bug in old browser"
+  describe '1 calendar activity' do
+    before do
+      Issues::CreateService.new(contributed_project, @user, issue_params).execute
+      visit @user.username
+      wait_for_ajax
+    end
+
+    it 'displays calendar activity log', js: true do
+      expect(find('.content_list .event-note')).to have_content issue_title
+    end
+
+    it 'displays calendar activity square color for 1 contribution', js: true do
+      expect(page).to have_selector(get_cell_color_selector(1), count: 1)
+    end
+
+    it 'displays calendar activity square on the correct date', js: true do
+      today = Date.today.strftime(date_format)
+      expect(page).to have_selector(get_cell_date_selector(1, today), count: 1)
+    end
+  end
+
+  describe '10 calendar activities' do
+    before do
+      (0..9).each do |i|
+        push_code_contribution()
+      end
+
+      visit @user.username
+      wait_for_ajax
+    end
+
+    it 'displays calendar activity square color for 10 contributions', js: true do
+      expect(page).to have_selector(get_cell_color_selector(10), count: 1)
+    end
+
+    it 'displays calendar activity square on the correct date', js: true do
+      today = Date.today.strftime(date_format)
+      expect(page).to have_selector(get_cell_date_selector(10, today), count: 1)
+    end
   end
 
-  it 'displays calendar activity square color', js: true do
-    expect(page).to have_selector('.user-contrib-cell[fill=\'#acd5f2\']', count: 1)
+  describe 'calendar activity on two days' do
+    before do
+      push_code_contribution()
+
+      Timecop.freeze(Date.yesterday)
+      Issues::CreateService.new(contributed_project, @user, issue_params).execute
+      Timecop.return
+
+      visit @user.username
+      wait_for_ajax
+    end
+
+    it 'displays calendar activity squares for both days', js: true do
+      expect(page).to have_selector(get_cell_color_selector(1), count: 2)
+    end
+
+    it 'displays calendar activity square for yesterday', js: true do
+      yesterday = Date.yesterday.strftime(date_format)
+      expect(page).to have_selector(get_cell_date_selector(1, yesterday), count: 1)
+    end
+
+    it 'displays calendar activity square for today', js: true do
+      today = Date.today.strftime(date_format)
+      expect(page).to have_selector(get_cell_date_selector(1, today), count: 1)
+    end
   end
 end
-- 
GitLab