From 7357e92865d001cd1631fd15a8512baa1248241c Mon Sep 17 00:00:00 2001 From: Karina Kwiatek Date: Thu, 30 Dec 2021 22:15:59 +0100 Subject: [PATCH 1/6] Eager load relationships for questions, answers and users --- app/controllers/answer_controller.rb | 2 +- app/controllers/discover_controller.rb | 8 ++++---- app/controllers/user_controller.rb | 4 ++-- app/models/user/answer_methods.rb | 1 + app/models/user/timeline_methods.rb | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/controllers/answer_controller.rb b/app/controllers/answer_controller.rb index e6abf19c..3e9bdd02 100644 --- a/app/controllers/answer_controller.rb +++ b/app/controllers/answer_controller.rb @@ -1,6 +1,6 @@ class AnswerController < ApplicationController def show - @answer = Answer.find(params[:id]) + @answer = Answer.find(params[:id]).include(comments: [:user], question: [:user]) @display_all = true if user_signed_in? diff --git a/app/controllers/discover_controller.rb b/app/controllers/discover_controller.rb index 3f7d0c41..7f415c78 100644 --- a/app/controllers/discover_controller.rb +++ b/app/controllers/discover_controller.rb @@ -8,10 +8,10 @@ class DiscoverController < ApplicationController top_x = 10 # only display the top X items - @popular_answers = Answer.where("created_at > ?", Time.now.ago(1.week)).order(:smile_count).reverse_order.limit(top_x) - @most_discussed = Answer.where("created_at > ?", Time.now.ago(1.week)).order(:comment_count).reverse_order.limit(top_x) - @popular_questions = Question.where("created_at > ?", Time.now.ago(1.week)).order(:answer_count).reverse_order.limit(top_x) - @new_users = User.where("asked_count > 0").order(:id).reverse_order.limit(top_x) + @popular_answers = Answer.where("created_at > ?", Time.now.ago(1.week)).order(:smile_count).reverse_order.limit(top_x).includes(:question, :user, :comments) + @most_discussed = Answer.where("created_at > ?", Time.now.ago(1.week)).order(:comment_count).reverse_order.limit(top_x).includes(:question, :user, :comments) + @popular_questions = Question.where("created_at > ?", Time.now.ago(1.week)).order(:answer_count).reverse_order.limit(top_x).includes(:user) + @new_users = User.where("asked_count > 0").order(:id).reverse_order.limit(top_x).includes(:profile) # .user = the user # .question_count = how many questions did the user ask diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index cd34728e..a31bc566 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -4,7 +4,7 @@ class UserController < ApplicationController before_action :authenticate_user!, only: %w(edit update edit_privacy update_privacy edit_theme update_theme preview_theme delete_theme data export begin_export edit_security update_2fa destroy_2fa reset_user_recovery_codes) def show - @user = User.where('LOWER(screen_name) = ?', params[:username].downcase).first! + @user = User.where('LOWER(screen_name) = ?', params[:username].downcase).includes(:profile).first! @answers = @user.cursored_answers(last_id: params[:last_id]) @answers_last_id = @answers.map(&:id).min @more_data_available = !@user.cursored_answers(last_id: @answers_last_id, size: 1).count.zero? @@ -99,7 +99,7 @@ class UserController < ApplicationController def friends @title = 'Following' @user = User.where('LOWER(screen_name) = ?', params[:username].downcase).first! - @users = @user.cursored_friends(last_id: params[:last_id]) + @users = @user.cursored_friends(last_id: params[:last_id]).includes(:profile) @users_last_id = @users.map(&:id).min @more_data_available = !@user.cursored_friends(last_id: @users_last_id, size: 1).count.zero? @type = :friend diff --git a/app/models/user/answer_methods.rb b/app/models/user/answer_methods.rb index 3955a8cb..90200c4d 100644 --- a/app/models/user/answer_methods.rb +++ b/app/models/user/answer_methods.rb @@ -9,5 +9,6 @@ module User::AnswerMethods answers .order(:created_at) .reverse_order + .includes(comments: [:user], question: [:user]) end end diff --git a/app/models/user/timeline_methods.rb b/app/models/user/timeline_methods.rb index 364d756f..38b5e0d0 100644 --- a/app/models/user/timeline_methods.rb +++ b/app/models/user/timeline_methods.rb @@ -7,6 +7,6 @@ module User::TimelineMethods # @return [Array] the users' timeline def timeline - Answer.where('user_id in (?) OR user_id = ?', friend_ids, id).order(:created_at).reverse_order + Answer.where('user_id in (?) OR user_id = ?', friend_ids, id).order(:created_at).reverse_order.includes(comments: [:user], question: [:user], user: [:profile]) end end From 32e6975c28ef4b32d266cbcfff00da422530dc43 Mon Sep 17 00:00:00 2001 From: Karina Kwiatek Date: Thu, 30 Dec 2021 23:21:46 +0100 Subject: [PATCH 2/6] Include smiles when eager loading answers --- app/controllers/answer_controller.rb | 2 +- app/models/user/answer_methods.rb | 2 +- app/models/user/timeline_methods.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/answer_controller.rb b/app/controllers/answer_controller.rb index 3e9bdd02..2748c0e2 100644 --- a/app/controllers/answer_controller.rb +++ b/app/controllers/answer_controller.rb @@ -1,6 +1,6 @@ class AnswerController < ApplicationController def show - @answer = Answer.find(params[:id]).include(comments: [:user], question: [:user]) + @answer = Answer.find(params[:id]).include(comments: [:user, :smiles], question: [:user], smiles: [:user]) @display_all = true if user_signed_in? diff --git a/app/models/user/answer_methods.rb b/app/models/user/answer_methods.rb index 90200c4d..172997d2 100644 --- a/app/models/user/answer_methods.rb +++ b/app/models/user/answer_methods.rb @@ -9,6 +9,6 @@ module User::AnswerMethods answers .order(:created_at) .reverse_order - .includes(comments: [:user], question: [:user]) + .includes(comments: [:user, :smiles], question: [:user], smiles: [:user]) end end diff --git a/app/models/user/timeline_methods.rb b/app/models/user/timeline_methods.rb index 38b5e0d0..34127835 100644 --- a/app/models/user/timeline_methods.rb +++ b/app/models/user/timeline_methods.rb @@ -7,6 +7,6 @@ module User::TimelineMethods # @return [Array] the users' timeline def timeline - Answer.where('user_id in (?) OR user_id = ?', friend_ids, id).order(:created_at).reverse_order.includes(comments: [:user], question: [:user], user: [:profile]) + Answer.where('user_id in (?) OR user_id = ?', friend_ids, id).order(:created_at).reverse_order.includes(comments: [:user, :smiles], question: [:user], user: [:profile], smiles: [:user]) end end From 7e57735b886453d3b428fcc8ea3b5a643b744611 Mon Sep 17 00:00:00 2001 From: Karina Kwiatek Date: Fri, 31 Dec 2021 13:59:08 +0100 Subject: [PATCH 3/6] Add basic test for answer & user show views --- app/controllers/answer_controller.rb | 2 +- spec/controllers/answer_controller_spec.rb | 22 ++++++++++++++++++++++ spec/controllers/user_controller_spec.rb | 16 +++++++++++++++- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 spec/controllers/answer_controller_spec.rb diff --git a/app/controllers/answer_controller.rb b/app/controllers/answer_controller.rb index 2748c0e2..f9398899 100644 --- a/app/controllers/answer_controller.rb +++ b/app/controllers/answer_controller.rb @@ -1,6 +1,6 @@ class AnswerController < ApplicationController def show - @answer = Answer.find(params[:id]).include(comments: [:user, :smiles], question: [:user], smiles: [:user]) + @answer = Answer.includes(comments: [:user, :smiles], question: [:user], smiles: [:user]).find(params[:id]) @display_all = true if user_signed_in? diff --git a/spec/controllers/answer_controller_spec.rb b/spec/controllers/answer_controller_spec.rb new file mode 100644 index 00000000..bca4b142 --- /dev/null +++ b/spec/controllers/answer_controller_spec.rb @@ -0,0 +1,22 @@ +require 'rails_helper' + +describe AnswerController do + let(:user) { FactoryBot.create :user, + otp_module: :disabled, + otp_secret_key: 'AAAAAAAA'} + let(:answer) { FactoryBot.create :answer, user: user } + + describe "#show" do + subject { get :show, params: { username: user.screen_name, id: answer.id } } + + context "user signed in" do + before(:each) { sign_in user } + + it "renders the answer/show template" do + subject + expect(assigns(:answer)).to eq(answer) + expect(response).to render_template("answer/show") + end + end + end +end diff --git a/spec/controllers/user_controller_spec.rb b/spec/controllers/user_controller_spec.rb index 8635d9d3..128d4e68 100644 --- a/spec/controllers/user_controller_spec.rb +++ b/spec/controllers/user_controller_spec.rb @@ -7,13 +7,27 @@ describe UserController, type: :controller do otp_module: :disabled, otp_secret_key: 'EJFNIJPYXXTCQSRTQY6AG7XQLAT2IDG5H7NGLJE3'} + describe "#show" do + subject { get :show, params: { username: user.screen_name } } + + context "user signed in" do + before(:each) { sign_in user } + + it "renders the user/show template" do + subject + expect(assigns(:user)).to eq(user) + expect(response).to render_template("user/show") + end + end + end + describe "#edit" do subject { get :edit } context "user signed in" do before(:each) { sign_in user } - it "renders the edit_profile_picture template" do + it "renders the user/edit template" do subject expect(response).to render_template("user/edit") end From 0da070c5ffb030709372947512134c450a11604c Mon Sep 17 00:00:00 2001 From: Karina Kwiatek Date: Fri, 31 Dec 2021 15:35:02 +0100 Subject: [PATCH 4/6] Move includes into `cursored_friends`/`cursored_followers` --- app/controllers/user_controller.rb | 8 ++++---- app/models/user/relationship_methods.rb | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index a31bc566..edf88087 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -84,7 +84,7 @@ class UserController < ApplicationController def followers @title = 'Followers' - @user = User.where('LOWER(screen_name) = ?', params[:username].downcase).first! + @user = User.where('LOWER(screen_name) = ?', params[:username].downcase).includes(:profile).first! @users = @user.cursored_followers(last_id: params[:last_id]) @users_last_id = @users.map(&:id).min @more_data_available = !@user.cursored_followers(last_id: @users_last_id, size: 1).count.zero? @@ -98,8 +98,8 @@ class UserController < ApplicationController def friends @title = 'Following' - @user = User.where('LOWER(screen_name) = ?', params[:username].downcase).first! - @users = @user.cursored_friends(last_id: params[:last_id]).includes(:profile) + @user = User.where('LOWER(screen_name) = ?', params[:username].downcase).includes(:profile).first! + @users = @user.cursored_friends(last_id: params[:last_id]) @users_last_id = @users.map(&:id).min @more_data_available = !@user.cursored_friends(last_id: @users_last_id, size: 1).count.zero? @type = :friend @@ -112,7 +112,7 @@ class UserController < ApplicationController def questions @title = 'Questions' - @user = User.where('LOWER(screen_name) = ?', params[:username].downcase).first! + @user = User.where('LOWER(screen_name) = ?', params[:username].downcase).includes(:profile).first! @questions = @user.cursored_questions(author_is_anonymous: false, last_id: params[:last_id]) @questions_last_id = @questions.map(&:id).min @more_data_available = !@user.cursored_questions(author_is_anonymous: false, last_id: @questions_last_id, size: 1).count.zero? diff --git a/app/models/user/relationship_methods.rb b/app/models/user/relationship_methods.rb index 8093b6bc..b527fe25 100644 --- a/app/models/user/relationship_methods.rb +++ b/app/models/user/relationship_methods.rb @@ -7,10 +7,10 @@ module User::RelationshipMethods define_cursor_paginator :cursored_followers, :ordered_followers def ordered_friends - friends.reverse_order + friends.reverse_order.includes(:profile) end def ordered_followers - followers.reverse_order + followers.reverse_order.includes(:profile) end end From 2f355d504145dab07e190a6dd5bb37855f330486 Mon Sep 17 00:00:00 2001 From: Karina Kwiatek Date: Fri, 31 Dec 2021 15:35:29 +0100 Subject: [PATCH 5/6] Add basic tests for followers & following in `UserController` --- spec/controllers/user_controller_spec.rb | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/spec/controllers/user_controller_spec.rb b/spec/controllers/user_controller_spec.rb index 128d4e68..032c5062 100644 --- a/spec/controllers/user_controller_spec.rb +++ b/spec/controllers/user_controller_spec.rb @@ -21,6 +21,34 @@ describe UserController, type: :controller do end end + describe "#followers" do + subject { get :followers, params: { username: user.screen_name } } + + context "user signed in" do + before(:each) { sign_in user } + + it "renders the user/show_follow template" do + subject + expect(assigns(:user)).to eq(user) + expect(response).to render_template("user/show_follow") + end + end + end + + describe "#friends" do + subject { get :friends, params: { username: user.screen_name } } + + context "user signed in" do + before(:each) { sign_in user } + + it "renders the user/show_follow template" do + subject + expect(assigns(:user)).to eq(user) + expect(response).to render_template("user/show_follow") + end + end + end + describe "#edit" do subject { get :edit } From 817c2215511606356b23b7539a25334be17a3030 Mon Sep 17 00:00:00 2001 From: Karina Kwiatek Date: Fri, 31 Dec 2021 15:56:15 +0100 Subject: [PATCH 6/6] Add basic test for user questions --- spec/controllers/user_controller_spec.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spec/controllers/user_controller_spec.rb b/spec/controllers/user_controller_spec.rb index 032c5062..050b64bd 100644 --- a/spec/controllers/user_controller_spec.rb +++ b/spec/controllers/user_controller_spec.rb @@ -49,6 +49,20 @@ describe UserController, type: :controller do end end + describe "#questions" do + subject { get :questions, params: { username: user.screen_name } } + + context "user signed in" do + before(:each) { sign_in user } + + it "renders the user/questions template" do + subject + expect(assigns(:user)).to eq(user) + expect(response).to render_template("user/questions") + end + end + end + describe "#edit" do subject { get :edit }