Files
growstuff/spec/models/like_spec.rb
T
Daniel O'Connorandgoogle-labs-jules[bot] a349ce784a Optimize Like lookups in Likeable concern (#4799)
- Update liked_by? to return false if member is nil and use likes.exists?(member_id: member.id) instead of allocating login name arrays.
- Simplify liked_by_members_names to use members.pluck(:login_name).
- Update app/views/photos/_likes.html.haml to use photo.liked_by?(current_member).
- Add unit tests for liked_by? in spec/models/like_spec.rb.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-09-20 13:46:02 +09:30

97 lines
2.4 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe Like do
let(:member) { create(:member) }
let(:post) { create(:post) }
let(:photo) { create(:photo) }
context 'existing like' do
before do
@like = Like.create(member:, likeable: post)
end
it 'is valid' do
expect(@like).to be_valid
end
it 'belongs to a member' do
expect(@like.member).to be_an_instance_of Member
end
it 'belongs to a likeable item' do
expect(@like).to respond_to :likeable
end
end
context 'invalid parameters' do
it 'is invalid without a member' do
like = Like.new
like.likeable = post
expect(like).not_to be_valid
end
it 'is invalid without a likeable item' do
like = Like.new
like.member = member
expect(like).not_to be_valid
end
end
it 'does not allow duplicate likes by the same member' do
Like.create(member:, likeable: post)
second_like = Like.new(member:, likeable: post)
expect(second_like).not_to be_valid
end
it 'destroys like if post no longer exists' do
like = Like.create(member:, likeable: post)
post.destroy
expect(Like.all).not_to include like
end
it 'destroys like if member no longer exists' do
like = Like.create(member:, likeable: post)
member.destroy
expect(Like.all).not_to include like
end
context "when the likeable author has blocked the member" do
let(:likeable_author) { create(:member) }
let(:post_author) { create(:member) }
let(:post) { create(:post, author: likeable_author) }
before do
likeable_author.blocks.create(blocked: member)
end
it "is not valid" do
like = build(:like, likeable: post, member: member)
expect(like).not_to be_valid
end
end
it 'liked_by?' do
expect(post.liked_by?(member)).to be false
expect(post.liked_by?(nil)).to be false
Like.create(member:, likeable: post)
expect(post.liked_by?(member)).to be true
expect(photo.liked_by?(member)).to be false
Like.create(member:, likeable: photo)
expect(photo.liked_by?(member)).to be true
end
it 'liked_by_members_names' do
expect(post.liked_by_members_names).to eq []
Like.create(member:, likeable: post)
expect(post.liked_by_members_names).to eq [member.login_name]
expect(photo.liked_by_members_names).to eq []
Like.create(member:, likeable: photo)
expect(photo.liked_by_members_names).to eq [member.login_name]
end
end