Add specs for caching commit author

This commit is contained in:
Stan Hu 2016-07-27 16:42:38 -07:00
parent 8a9fc2b67e
commit d27e36f35a
2 changed files with 35 additions and 7 deletions

View file

@ -178,14 +178,18 @@ class Commit
end
def author
key = "commit_author:#{author_email}"
# nil is a valid value since no author may exist in the system
unless RequestStore.store.has_key?(key)
RequestStore.store[key] = User.find_by_any_email(author_email.downcase)
if RequestStore.active?
key = "commit_author:#{author_email.downcase}"
# nil is a valid value since no author may exist in the system
if RequestStore.store.has_key?(key)
@author = RequestStore.store[key]
else
@author = find_author_by_any_email
RequestStore.store[key] = @author
end
else
@author ||= find_author_by_any_email
end
@author ||= RequestStore.store[key]
end
def committer
@ -313,6 +317,10 @@ class Commit
private
def find_author_by_any_email
User.find_by_any_email(author_email.downcase)
end
def repo_changes
changes = { added: [], modified: [], removed: [] }

View file

@ -13,6 +13,26 @@ describe Commit, models: true do
it { is_expected.to include_module(StaticModel) }
end
describe '#author' do
it 'looks up the author in a case-insensitive way' do
user = create(:user, email: commit.author_email.upcase)
expect(commit.author).to eq(user)
end
it 'caches the author' do
user = create(:user, email: commit.author_email)
expect(RequestStore).to receive(:active?).twice.and_return(true)
expect_any_instance_of(Commit).to receive(:find_author_by_any_email).and_call_original
expect(commit.author).to eq(user)
key = "commit_author:#{commit.author_email}"
expect(RequestStore.store[key]).to eq(user)
expect(commit.author).to eq(user)
RequestStore.store.clear
end
end
describe '#to_reference' do
it 'returns a String reference to the object' do
expect(commit.to_reference).to eq commit.id