diff --git a/app/helpers/application_helper/title_methods.rb b/app/helpers/application_helper/title_methods.rb index 28f0efd3..b80deee3 100644 --- a/app/helpers/application_helper/title_methods.rb +++ b/app/helpers/application_helper/title_methods.rb @@ -61,6 +61,6 @@ module ApplicationHelper::TitleMethods end def list_title(list) - generate_title list.name + generate_title list.display_name end end diff --git a/spec/controllers/timeline_controller_spec.rb b/spec/controllers/timeline_controller_spec.rb new file mode 100644 index 00000000..44bc3d26 --- /dev/null +++ b/spec/controllers/timeline_controller_spec.rb @@ -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