Merge pull request #447 from AyuntamientoMadrid/ahoy_queue

Ahoy queue
This commit is contained in:
Juanjo Bazán
2015-09-09 14:50:26 +02:00
9 changed files with 97 additions and 9 deletions

View File

@@ -13,6 +13,7 @@ class DebatesController < ApplicationController
@debates = @debates.page(params[:page]).for_render.send("sort_by_#{@order}")
@tag_cloud = Debate.tag_counts.order(taggings_count: :desc, name: :asc).limit(20)
set_debate_votes(@debates)
ahoy.track_visit
end
def show
@@ -23,6 +24,7 @@ class DebatesController < ApplicationController
@all_visible_comments = @root_comments + @comments
set_comment_flags(@all_visible_comments)
ahoy.track_visit
end
def new

View File

@@ -4,6 +4,7 @@ class StatsController < ApplicationController
def show
@event_types = Ahoy::Event.select(:name).uniq.pluck(:name)
@debates_created_count = Ahoy::Event.where(name: 'debate_created').count
end
private

6
app/jobs/stats_job.rb Normal file
View File

@@ -0,0 +1,6 @@
class StatsJob < ActiveJob::Base
queue_as :default
def perform(*args)
end
end

View File

@@ -34,9 +34,6 @@ class Debate < ActiveRecord::Base
scope :sort_by_most_commented, -> { order(comments_count: :desc) }
scope :sort_by_random, -> { order("RANDOM()") }
# Ahoy setup
visitable # Ahoy will automatically assign visit_id on create
def likes
cached_votes_up
end

View File

@@ -4,7 +4,7 @@
<h2>Stats</h2>
<div class="small-12 medium-6 column">
<h3>Visits</h3>
<h3>Visits (<%= Visit.count %>) </h3>
<%= visits_chart_tag id: "visits" %>
</div>
@@ -15,7 +15,7 @@
<div class="small-12">
<% @event_types.each do |event_type| %>
<h3><%= event_type.titleize %></h3>
<h3><%= event_type.titleize %> (<%= @debates_created_count %>)</h3>
<%= events_chart_tag event_type %>
<% end %>
</div>

View File

@@ -1,9 +1,11 @@
class Ahoy::Store < Ahoy::Stores::ActiveRecordStore
def track_visit(options)
StatsJob.perform_later(super, name: "visit")
end
# Track user IP
def track_event(name, properties, options)
super do |event|
event.ip = request.ip
end
StatsJob.perform_later(super { |event| event.ip = request.ip }, name: "event")
end
end
end

View File

@@ -11,6 +11,30 @@ describe DebatesController do
SimpleCaptcha.always_pass = @original_captcha_pass_value
end
describe 'GET show' do
it 'should create an ahoy visit' do
debate = create(:debate)
sign_in create(:user)
get :show, id: debate.id
expect(Visit.count).to eq 1
expect(Visit.first.landing_page).to eq debate_url(debate)
end
end
describe 'GET index' do
it 'should create an ahoy visit' do
debate = create(:debate)
sign_in create(:user)
get :index
expect(Visit.count).to eq 1
expect(Visit.first.landing_page).to eq debates_url
end
end
describe 'POST create' do
it 'should create an ahoy event' do

View File

@@ -0,0 +1,45 @@
require 'rails_helper'
feature 'ActiveJob' do
include ActiveJob::TestHelper
let(:admin) { create(:administrator) }
scenario 'use queue to track visits' do
debate = create(:debate)
visit debate_path(debate)
expect(enqueued_jobs.size).to eq(1)
perform_enqueued_jobs { StatsJob.perform_now(enqueued_jobs.first) }
login_as(admin.user)
visit stats_path
expect(page).to have_content 'Visits (1)'
end
scenario "use queue to track new debates" do
user = create(:user)
login_as(user)
visit new_debate_path
create_a_debate
expect(enqueued_jobs.size).to eq(2)
expect(enqueued_jobs.first[:args][1]["name"]).to eq("event")
expect(enqueued_jobs.last[:args][1]["name"]).to eq("visit")
perform_enqueued_jobs do
enqueued_jobs.each { |job| StatsJob.perform_now(job) }
end
login_as(admin.user)
visit stats_path
expect(page).to have_content 'Debate Created (1)'
end
end

View File

@@ -34,6 +34,17 @@ module CommonActions
click_button 'Send me reset password instructions'
end
def create_a_debate
fill_in 'debate_title', with: 'Acabar con los desahucios'
fill_in 'debate_description', with: 'Esto es un tema muy importante porque...'
fill_in 'debate_captcha', with: correct_captcha_text
check 'debate_terms_of_service'
click_button 'Start a debate'
expect(page).to have_content 'Debate was successfully created.'
end
def comment_on(debate)
user = create(:user)