Address rubocop offenses.
This commit is contained in:
parent
870109833d
commit
8dde03012f
2 changed files with 32 additions and 31 deletions
|
@ -7,37 +7,39 @@ class UserContributedProjects < ActiveRecord::Base
|
||||||
|
|
||||||
CACHE_EXPIRY_TIME = 1.day
|
CACHE_EXPIRY_TIME = 1.day
|
||||||
|
|
||||||
def self.track(event)
|
class << self
|
||||||
# For events without a project, we simply don't care.
|
def track(event)
|
||||||
# An example of this is the creation of a snippet (which
|
# For events without a project, we simply don't care.
|
||||||
# is not related to any project).
|
# An example of this is the creation of a snippet (which
|
||||||
return unless event.project
|
# is not related to any project).
|
||||||
|
return unless event.project
|
||||||
|
|
||||||
# This is a precaution because the cache lookup
|
# This is a precaution because the cache lookup
|
||||||
# will work just fine without an author.
|
# will work just fine without an author.
|
||||||
#
|
#
|
||||||
# However, this should never happen (tm).
|
# However, this should never happen (tm).
|
||||||
raise 'event#author not present unexpectedly' unless event.author
|
raise 'event#author not present unexpectedly' unless event.author
|
||||||
|
|
||||||
attributes = {
|
attributes = {
|
||||||
project_id: event.project_id,
|
project_id: event.project_id,
|
||||||
user_id: event.author_id
|
user_id: event.author_id
|
||||||
}
|
}
|
||||||
|
|
||||||
cached_exists?(attributes) do
|
cached_exists?(attributes) do
|
||||||
begin
|
begin
|
||||||
find_or_create_by!(attributes)
|
find_or_create_by!(attributes)
|
||||||
true # not caching the whole record here for now
|
true # not caching the whole record here for now
|
||||||
rescue ActiveRecord::RecordNotUnique
|
rescue ActiveRecord::RecordNotUnique
|
||||||
retry
|
retry
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def self.cached_exists?(project_id:, user_id:, &block)
|
def cached_exists?(project_id:, user_id:, &block)
|
||||||
cache_key = "user_contributed_projects:#{project_id}:#{user_id}"
|
cache_key = "user_contributed_projects:#{project_id}:#{user_id}"
|
||||||
Rails.cache.fetch(cache_key, expires_in: CACHE_EXPIRY_TIME, &block)
|
Rails.cache.fetch(cache_key, expires_in: CACHE_EXPIRY_TIME, &block)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe UserContributedProjects do
|
describe UserContributedProjects do
|
||||||
|
|
||||||
describe '.track' do
|
describe '.track' do
|
||||||
subject { described_class.track(event) }
|
subject { described_class.track(event) }
|
||||||
let(:event) { build(:event) }
|
let(:event) { build(:event) }
|
||||||
|
@ -10,33 +9,33 @@ describe UserContributedProjects do
|
||||||
context "for all actions (event types)" do
|
context "for all actions (event types)" do
|
||||||
let(:event) { build(:event, action: action) }
|
let(:event) { build(:event, action: action) }
|
||||||
it 'creates a record' do
|
it 'creates a record' do
|
||||||
expect { subject }.to change { UserContributedProjects.count }.from(0).to(1)
|
expect { subject }.to change { described_class.count }.from(0).to(1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'sets project accordingly' do
|
it 'sets project accordingly' do
|
||||||
subject
|
subject
|
||||||
expect(UserContributedProjects.first.project).to eq(event.project)
|
expect(described_class.first.project).to eq(event.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'sets user accordingly' do
|
it 'sets user accordingly' do
|
||||||
subject
|
subject
|
||||||
expect(UserContributedProjects.first.user).to eq(event.author)
|
expect(described_class.first.user).to eq(event.author)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'only creates a record once per user/project' do
|
it 'only creates a record once per user/project' do
|
||||||
expect do
|
expect do
|
||||||
subject
|
subject
|
||||||
described_class.track(event)
|
described_class.track(event)
|
||||||
end.to change { UserContributedProjects.count }.from(0).to(1)
|
end.to change { described_class.count }.from(0).to(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'with an event without a project' do
|
describe 'with an event without a project' do
|
||||||
let(:event) { build(:event, project: nil) }
|
let(:event) { build(:event, project: nil) }
|
||||||
|
|
||||||
it 'ignores the event' do
|
it 'ignores the event' do
|
||||||
expect { subject }.not_to change { UserContributedProjects.count }
|
expect { subject }.not_to change { described_class.count }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue