I try to test query object.
The controller looks like this:
class MoviesController < ApplicationController before_action :find_movie, except: [:index] def index @movies = FindMovies.new(Movie.all).call(movie_params) end private def movie_params params.permit(:recommendation, :page, :current_user) params.merge!(current_user: current_user) end Query object itself:
class FindMovies attr_accessor :initial_scope def initialize(initial_scope) @initial_scope = initial_scope end def call(params) scoped = @initial_scope if params[:recommendation] == 'recommended' scoped = recommended(scoped, params[:current_user]) elsif params[:recommendation] == 'not recommended' scoped = not_recommended(scoped, params[:current_user]) end scoped = paginate(scoped, params[:page]) [scoped, params[:recommendation] || 'all'] end private def recommended(scoped, current_user) Movie.where(id: current_user.votes.where(value: 1).pluck(:movie_id)) end def not_recommended(scoped, current_user) Movie.where(id: current_user.votes.where(value: -1).pluck(:movie_id)) end def paginate(scoped, page) scoped.order(:created_at).page(page).per(10) end end Test:
require 'rails_helper' describe 'Query tests' do let(:user) { create(:user) } let(:movie) { create(:movie) } let(:another_movie) { create(:movie, title: 'Gladiator', tmdb_id: 98) } let(:vote) { create(:vote, user_id: user.id, movie_id: movie.id) } let(:another_vote) { create(:vote, user_id: user.id, movie_id: another_movie.id, value: -1) } context 'find move' do it 'returns all' do movies = FindMovies.new(Movie.all).call({ current_user: user }) expect(movies.count).to eq(2) puts user.inspect expect(movies[1]).to eq('all') end it 'returns recommended' do movies = FindMovies.new(Movie.all).call({ current_user: user, recommendation: 'recommended' }) puts user.inspect expect(movies[1]).to eq('recommended') end it 'returns not recommended' do movies = FindMovies.new(Movie.all).call({ current_user: user, recommendation: 'not recommended' }) puts user.inspect expect(movies[1]).to eq('not recommended') end end end For some reason, in each test user is created again? When should it be created once in let, and then simply assigned to the current_user parameter?