Commit 8dde0301 authored by Andreas Brandl's avatar Andreas Brandl

Address rubocop offenses.

parent 87010983
...@@ -7,37 +7,39 @@ class UserContributedProjects < ActiveRecord::Base ...@@ -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
# will work just fine without an author. # This is a precaution because the cache lookup
# # will work just fine without an author.
# However, this should never happen (tm). #
raise 'event#author not present unexpectedly' unless event.author # However, this should never happen (tm).
raise 'event#author not present unexpectedly' unless event.author
attributes = {
project_id: event.project_id, attributes = {
user_id: event.author_id project_id: event.project_id,
} user_id: event.author_id
}
cached_exists?(attributes) do
begin cached_exists?(attributes) do
find_or_create_by!(attributes) begin
true # not caching the whole record here for now find_or_create_by!(attributes)
rescue ActiveRecord::RecordNotUnique true # not caching the whole record here for now
retry rescue ActiveRecord::RecordNotUnique
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
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 ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment