Add tests for `TimelineController`
This commit is contained in:
parent
d794a69729
commit
a39960d269
|
@ -61,6 +61,6 @@ module ApplicationHelper::TitleMethods
|
|||
end
|
||||
|
||||
def list_title(list)
|
||||
generate_title list.name
|
||||
generate_title list.display_name
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,125 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "rails_helper"
|
||||
|
||||
describe TimelineController do
|
||||
let(:user) { FactoryBot.create(:user) }
|
||||
|
||||
let!(:followed_users) { FactoryBot.create_list(:user, 3) }
|
||||
let!(:followed_user_answers) { followed_users.map { |u| FactoryBot.create_list(:answer, 5, user: u) }.flatten }
|
||||
|
||||
let!(:unfollowed_users) { FactoryBot.create_list(:user, 3) }
|
||||
let!(:unfollowed_user_answers) { unfollowed_users.map { |u| FactoryBot.create_list(:answer, 5, user: u) }.flatten }
|
||||
|
||||
let!(:listed_users) { [followed_users[0], unfollowed_users[0], unfollowed_users[1]] }
|
||||
let!(:listed_user_answers) { listed_users.map(&:answers).flatten }
|
||||
let(:list) { FactoryBot.create(:list, user: user, members: listed_users, display_name: "Test List") }
|
||||
|
||||
before do
|
||||
sign_in(user)
|
||||
|
||||
followed_users.each { |u| user.follow(u) }
|
||||
stub_const("APP_CONFIG", {
|
||||
"site_name" => "Specspring",
|
||||
"hostname" => "test.host",
|
||||
"https" => false,
|
||||
"items_per_page" => 10
|
||||
})
|
||||
end
|
||||
|
||||
shared_examples_for "paginates" do |answer_set, last_page_start_index = 5, expected_last_page_size = 5, should_test_single_page = true|
|
||||
context "can't display all answers on one page" do
|
||||
let(:last_id) { nil }
|
||||
|
||||
it { should have_http_status(200) }
|
||||
|
||||
it "paginates" do
|
||||
subject
|
||||
expect(assigns(:more_data_available)).to eq(true)
|
||||
expect(assigns(:timeline).length).to eq(10)
|
||||
end
|
||||
end
|
||||
|
||||
context "fetching the last page" do
|
||||
let(:last_id) do
|
||||
if answer_set.is_a?(Symbol)
|
||||
public_send(answer_set).sort_by(&:id)[last_page_start_index].id
|
||||
else
|
||||
answer_set.sort_by(&:id)[last_page_start_index].id
|
||||
end
|
||||
end
|
||||
|
||||
it "loads the last page" do
|
||||
subject
|
||||
expect(assigns(:more_data_available)).to eq(false)
|
||||
expect(assigns(:timeline).length).to eq(expected_last_page_size)
|
||||
end
|
||||
end
|
||||
|
||||
if should_test_single_page
|
||||
context "can display all answers on one page" do
|
||||
before do
|
||||
if answer_set.is_a?(Symbol)
|
||||
public_send(answer_set).last(6).each(&:destroy!)
|
||||
else
|
||||
answer_set.last(6).each(&:destroy!)
|
||||
end
|
||||
end
|
||||
|
||||
it { should have_http_status(200) }
|
||||
|
||||
it "does not paginate" do
|
||||
subject
|
||||
expect(assigns(:more_data_available)).to eq(false)
|
||||
expect(assigns(:timeline).length).to eq(9)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples_for "assigns title" do |expected_prefix|
|
||||
it "assigns the list and title to an instance variable" do
|
||||
subject
|
||||
expect(assigns(:title)).to eq("#{expected_prefix} | Specspring")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#index" do
|
||||
subject { get :index, params: params }
|
||||
|
||||
let(:params) { { last_id: last_id } }
|
||||
let(:last_id) { nil }
|
||||
|
||||
it { should have_http_status(200) }
|
||||
it_behaves_like "paginates", :followed_user_answers
|
||||
end
|
||||
|
||||
describe "#list" do
|
||||
subject { get :list, params: params }
|
||||
|
||||
context "viewing a list" do
|
||||
let(:params) { { list_name: list.name, last_id: last_id } }
|
||||
let(:last_id) { nil }
|
||||
|
||||
it_behaves_like "paginates", :listed_user_answers
|
||||
it_behaves_like "assigns title", "Test List"
|
||||
|
||||
it "assigns the list to an instance variable" do
|
||||
subject
|
||||
expect(assigns(:list)).to eq(list)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#public" do
|
||||
subject { get :public, params: params }
|
||||
|
||||
context "viewing public timeline" do
|
||||
let(:params) { { last_id: last_id } }
|
||||
let(:last_id) { nil }
|
||||
|
||||
it_behaves_like "paginates", Answer.all.order(created_at: :desc), 10, 10, false
|
||||
it_behaves_like "assigns title", "Public Timeline"
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue