diff --git a/app/models/post.rb b/app/models/post.rb index 13a4510..6b55839 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -7,6 +7,10 @@ class Post < ApplicationRecord validate :user, :limit_of_post_per_day + scope :by_user_follows, ->(user) { + where(user_id: user.following_ids) + } + def repost? kind == :quoted_post end diff --git a/app/models/user.rb b/app/models/user.rb index 1885014..15abd8e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -9,4 +9,9 @@ class User < ApplicationRecord } has_many :posts + + has_many :user_follows_following, class_name: 'UserFollow', foreign_key: :follower_id + has_many :user_follows_followers, class_name: 'UserFollow', foreign_key: :followed_id + has_many :following, through: :user_follows_following, source: :followed + has_many :followers, through: :user_follows_followers, source: :follower end diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb index 1cc7a85..3e88d15 100644 --- a/spec/models/post_spec.rb +++ b/spec/models/post_spec.rb @@ -1,6 +1,31 @@ require 'rails_helper' RSpec.describe Post, type: :model do + describe 'scopes' do + context '#by_user_follows' do + it 'returns only posts from user follows ' do + followed_user = create(:user) + not_followed_user = create(:user) + + post1 = create(:post, user: followed_user) + post2 = create(:post, user: followed_user) + create(:post, user: not_followed_user) + + following_user = create(:user) + create( + :user_follow, + follower_id: following_user.id, + followed_id: followed_user.id + ) + + expect(Post.by_user_follows(following_user)).to eq([ + post1, + post2 + ]) + end + end + end + describe '#kind' do context 'when post have other post reference and a content' do it 'returns :quoted_post' do diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 6650589..ec1c9b3 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -33,4 +33,32 @@ RSpec.describe User, type: :model do end end end + + context '#relations' do + context 'following' do + it do + user1 = create(:user) + user2 = create(:user) + user3 = create(:user) + + create(:user_follow, follower_id: user1.id, followed_id: user2.id) + create(:user_follow, follower_id: user3.id, followed_id: user1.id) + + expect(user1.following).to eq([user2]) + end + end + + context 'followers' do + it do + user1 = create(:user) + user2 = create(:user) + user3 = create(:user) + + create(:user_follow, follower_id: user1.id, followed_id: user2.id) + create(:user_follow, follower_id: user3.id, followed_id: user1.id) + + expect(user1.followers).to eq([user3]) + end + end + end end