Merge pull request #3130 from AndrewKvalheim/vote-cache-expiration

Expire voting fragment caches
This commit is contained in:
Henne Vogelsang 2023-04-19 13:23:05 +02:00 committed by GitHub
commit 86b8990d71
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 72 additions and 3 deletions

View file

@ -2,7 +2,7 @@
class Vote < ApplicationRecord
belongs_to :user
belongs_to :event
belongs_to :event, touch: true
validates :user_id, uniqueness: { scope: :event_id }

View file

@ -1,4 +1,4 @@
- cache ['admin', conference_id, program, event] do
- cache ['admin', conference_id, program, event, current_user] do
%tr{ id: "event-#{event.id}" }
%td
= event.id

View file

@ -1,4 +1,4 @@
- cache ['admin/event', @conference, @program, @event] do
- cache ['admin/event', @conference, @program, @event, current_user] do
.row
.col-md-12
%h3

View file

@ -50,6 +50,16 @@ FactoryBot.define do
end
end
factory :cfp_user do
transient do
resource { create(:resource) }
end
after :create do |user, evaluator|
user.add_role :cfp, evaluator.resource
end
end
trait :disabled do
is_disabled { true }
end

View file

@ -0,0 +1,59 @@
# frozen_string_literal: true
require 'spec_helper'
def have_rating(rating, max)
have_selector('.rating.bright', count: rating)
.and have_selector('.rating:not(.bright)', count: max - rating)
end
def cast_vote(rating, before:, after:)
# Index shows existing rating but not users vote
visit admin_conference_program_events_path(conference.short_title)
within("#event-#{event.id}") do
expect(page).to have_rating(before, 5)
expect(page).to have_text('Not rated')
end
# Event page shows existing rating but not users vote
click_on event.title
within('tr', text: 'Rating') { expect(page).to have_rating(before, 5) }
within('tr', text: 'Your vote') { expect(page).to have_rating(0, 5) }
# Voting dynamically updates the page
within('tr', text: 'Your vote') { page.find(".rating:nth-of-type(#{rating})").click }
within('tr', text: 'Rating') { expect(page).to have_rating(after, 5) }
within('tr', text: 'Your vote') { expect(page).to have_rating(rating, 5) }
# Index shows updated rating and vote
visit admin_conference_program_events_path(conference.short_title)
within("#event-#{event.id}") do
expect(page).to have_rating(after, 5)
expect(page).to have_text("You voted: #{rating}/5")
end
# Re-rendered event page shows updated rating and vote
click_on event.title
within('tr', text: 'Rating') { expect(page).to have_rating(after, 5) }
within('tr', text: 'Your vote') { expect(page).to have_rating(rating, 5) }
end
feature 'Voting' do
let(:conference) { create(:conference) }
let!(:event) { create(:event, program: conference.program) }
let(:voter1) { create(:cfp_user, resource: conference) }
let(:voter2) { create(:cfp_user, resource: conference) }
before :each do
conference.program.update_attribute :rating, 5
end
scenario 'multiple users casting votes', feature: true, js: true do
sign_in voter1
cast_vote 3, before: 0, after: 3
sign_out
sign_in voter2
cast_vote 5, before: 3, after: 4
end
end