diff --git a/app/controllers/admin/overview_controller.rb b/app/controllers/admin/overview_controller.rb index 57c4b51bc..373ccdbbf 100644 --- a/app/controllers/admin/overview_controller.rb +++ b/app/controllers/admin/overview_controller.rb @@ -3,7 +3,7 @@ module Admin layout "admin" def index @length = (params[:period] || 7).to_i - @labels = (0..@length - 1).map { |n| n.days.ago.strftime("%b %d") }.reverse + @labels = (1..@length).map { |n| n.days.ago.strftime("%b %d") }.reverse @analytics = Admin::ChartsData.new(@length).call @data_counts = Admin::DataCounts.call end diff --git a/app/services/admin/charts_data.rb b/app/services/admin/charts_data.rb index d64cac8b3..233c19bbc 100644 --- a/app/services/admin/charts_data.rb +++ b/app/services/admin/charts_data.rb @@ -5,7 +5,7 @@ module Admin end def call - period = @length.days.ago..Time.current + period = (@length + 1).days.ago..1.day.ago previous_period = (@length * 2).days.ago..@length.days.ago grouped_posts = Article.where(published_at: period).group("DATE(published_at)").size @@ -13,7 +13,7 @@ module Admin grouped_reactions = Reaction.where(created_at: period).group("DATE(created_at)").size grouped_users = User.where(registered_at: period).group("DATE(registered_at)").size - days_range = (@length - 1).downto(0) + days_range = @length.downto(1) posts_values = days_range.map { |n| grouped_posts[n.days.ago.to_date] || 0 } comments_values = days_range.map { |n| grouped_comments[n.days.ago.to_date] || 0 } reactions_values = days_range.map { |n| grouped_reactions[n.days.ago.to_date] || 0 } diff --git a/app/views/admin/overview/_analytics.html.erb b/app/views/admin/overview/_analytics.html.erb index 140c1a446..bc7e1090d 100644 --- a/app/views/admin/overview/_analytics.html.erb +++ b/app/views/admin/overview/_analytics.html.erb @@ -61,7 +61,7 @@ data-values="<%= values.join(",") %>"> <% end %> diff --git a/spec/requests/admin/overview_spec.rb b/spec/requests/admin/overview_spec.rb index 813a74a4e..9698b1b67 100644 --- a/spec/requests/admin/overview_spec.rb +++ b/spec/requests/admin/overview_spec.rb @@ -25,4 +25,82 @@ RSpec.describe "/admin", type: :request do expect(response.body).to include(ENV["HEROKU_RELEASE_CREATED_AT"]) end end + + describe "analytics" do + subject(:body) { response.body } + + before do + Timecop.freeze("2019-04-30T12:00:00Z") + get admin_path + end + + after { Timecop.return } + + it { is_expected.to include("Analytics and trends") } + it { is_expected.to include("Yesterday") } + it { is_expected.to include("Apr 23") } + + it "displays correct number of posts from past week" do + create(:article, published_at: Time.zone.today) + create(:article, published_at: 1.day.ago) + create(:article, published_at: 7.days.ago) + create(:article, published_at: 8.days.ago) + get admin_path + + expect(body).to include "2 Posts" + end + + it "displays correct number of comments from past week" do + create(:comment, created_at: Time.zone.today) + create(:comment, created_at: 1.day.ago) + create(:comment, created_at: 8.days.ago) + get admin_path + + expect(body).to include "1 Comments" + end + + it "displays correct number of reactions from past week" do + create(:reaction, created_at: Time.zone.today) + create(:reaction, created_at: 3.days.ago) + create(:reaction, created_at: 2.weeks.ago) + get admin_path + + expect(body).to include "1 Reaction" + end + + it "displays correct number of new members from past week" do + create(:user, registered_at: Time.zone.today) + create(:user, registered_at: 2.days.ago) + create(:user, registered_at: 10.days.ago) + get admin_path + + expect(body).to include "1 New members" + end + + it "does not display data from previous weeks", :aggregate_failures do + create(:article, published_at: 8.days.ago) + create(:comment, created_at: 2.weeks.ago) + create(:reaction, created_at: 1.month.ago) + create(:user, registered_at: 10.days.ago) + get admin_path + + expect(body).to include "0 Posts" + expect(body).to include "0 Comments" + expect(body).to include "0 Reactions" + expect(body).to include "0 New members" + end + + it "does not display data from today", :aggregate_failures do + create(:article, published_at: Time.zone.today) + create(:comment, created_at: Time.zone.today) + create(:reaction, created_at: Time.zone.today) + create(:user, registered_at: Time.zone.today) + get admin_path + + expect(body).to include "0 Posts" + expect(body).to include "0 Comments" + expect(body).to include "0 Reactions" + expect(body).to include "0 New members" + end + end end diff --git a/spec/services/admin/charts_data_spec.rb b/spec/services/admin/charts_data_spec.rb index 6ec9aa100..544577b35 100644 --- a/spec/services/admin/charts_data_spec.rb +++ b/spec/services/admin/charts_data_spec.rb @@ -9,13 +9,8 @@ RSpec.describe Admin::ChartsData, type: :service do expect(described_class.new.call.map(&:first)).to eq(["Posts", "Comments", "Reactions", "New members"]) end - it "returns proper current period number" do - create_list(:article, 3, published_at: 4.days.ago) - expect(described_class.new.call.first.second).to eq(3) - end - it "returns proper previous period number" do - create_list(:article, 2, published_at: 9.days.ago) + create_list(:article, 2, published_at: 8.days.ago) expect(described_class.new.call.first.third).to eq(2) end @@ -23,4 +18,27 @@ RSpec.describe Admin::ChartsData, type: :service do expect(described_class.new(20).call.first.fourth.size).to eq(20) end + describe "current period" do + it "returns proper number of items" do + create(:article, published_at: Time.zone.today) + create_list(:article, 3, published_at: 4.days.ago) + create_list(:article, 2, published_at: 7.days.ago) + create(:article, published_at: 8.days.ago) + + expect(described_class.new.call.first.second).to eq(5) + end + + it "ignores today" do + create(:article, published_at: Time.zone.today) + + expect(described_class.new.call.first.second).to eq(0) + end + + it "goes back seven days by default" do + create(:article, published_at: 7.days.ago) + create(:article, published_at: 8.days.ago) + + expect(described_class.new.call.first.second).to eq(1) + end + end end