otwarchive-symphonyarchive/spec/controllers/readings_controller_spec.rb
2026-03-11 22:22:11 +00:00

207 lines
7.9 KiB
Ruby

require "spec_helper"
describe ReadingsController do
include LoginMacros
include RedirectExpectationHelper
let(:user) { create(:user) }
describe "GET #index" do
context "with user params" do
context "when logged in as admin" do
it "redirects to login page with error" do
fake_login_admin(create(:admin))
get :index, params: { user_id: user }
it_redirects_to_with_error(new_user_session_path, "Sorry, you don't have permission to access the page you were trying to reach. Please log in.")
end
end
context "when logged out" do
it "redirects to login page with error" do
get :index, params: { user_id: user }
it_redirects_to_with_error(new_user_session_path, "Sorry, you don't have permission to access the page you were trying to reach. Please log in.")
end
end
context "when logged in as another user" do
it "redirects to requested user's dashboard with error" do
fake_login
get :index, params: { user_id: user }
it_redirects_to_with_error(user_path(user), "Sorry, you don't have permission to access the page you were trying to reach.")
end
end
context "when logged in as the user" do
it "includes user's readings sorted by last_viewed" do
reading1 = create(:reading, user: user, last_viewed: 2.days.ago)
reading2 = create(:reading, user: user, last_viewed: 1.hour.ago)
reading3 = create(:reading, user: user, last_viewed: 5.hours.ago)
reading4 = create(:reading)
fake_login_known_user(user)
get :index, params: { user_id: user }
expect(assigns(:readings)).to eq([reading2, reading3, reading1])
expect(assigns(:readings)).not_to include(reading4)
end
it "includes user's readings for restricted works" do
work = create(:work, restricted: true)
reading1 = create(:reading, user: user, work: work)
reading2 = create(:reading, work: work)
fake_login_known_user(user)
get :index, params: { user_id: user }
expect(assigns(:readings)).to include(reading1)
expect(assigns(:readings)).not_to include(reading2)
end
it "includes user's readings for deleted works" do
reading1 = create(:reading, :deleted_work, user: user)
reading2 = create(:reading, :deleted_work)
fake_login_known_user(user)
get :index, params: { user_id: user }
expect(assigns(:readings)).to include(reading1)
expect(assigns(:readings)).not_to include(reading2)
end
it "excludes user's readings for hidden works" do
work = create(:work, hidden_by_admin: true)
reading1 = create(:reading, user: user, work: work)
reading2 = create(:reading, work: work)
fake_login_known_user(user)
get :index, params: { user_id: user }
expect(assigns(:readings)).not_to include(reading1)
expect(assigns(:readings)).not_to include(reading2)
end
it "excludes user's readings for draft works" do
work = create(:draft)
reading1 = create(:reading, user: user, work: work)
reading2 = create(:reading, work: work)
fake_login_known_user(user)
get :index, params: { user_id: user }
expect(assigns(:readings)).not_to include(reading1)
expect(assigns(:readings)).not_to include(reading2)
end
context "with show=to-read params" do
it "includes user's toread readings sorted by last_viewed" do
reading1 = create(:reading, user: user, last_viewed: 2.days.ago, toread: true)
reading2 = create(:reading, user: user, last_viewed: 1.hour.ago, toread: true)
reading3 = create(:reading, user: user, last_viewed: 12.hours.ago)
reading4 = create(:reading, toread: true)
fake_login_known_user(user)
get :index, params: { user_id: user, show: "to-read" }
expect(assigns(:readings)).to eq([reading2, reading1])
expect(assigns(:readings)).not_to include(reading3)
expect(assigns(:readings)).not_to include(reading4)
end
it "includes user's toread readings for restricted works" do
work = create(:work, restricted: true)
reading1 = create(:reading, user: user, work: work, toread: true)
reading2 = create(:reading, work: work, toread: true)
fake_login_known_user(user)
get :index, params: { user_id: user, show: "to-read" }
expect(assigns(:readings)).to include(reading1)
expect(assigns(:readings)).not_to include(reading2)
end
it "includes user's toread readings for deleted works" do
reading1 = create(:reading, :deleted_work, user: user, toread: true)
reading2 = create(:reading, :deleted_work, toread: true)
fake_login_known_user(user)
get :index, params: { user_id: user, show: "to-read" }
expect(assigns(:readings)).to include(reading1)
expect(assigns(:readings)).not_to include(reading2)
end
it "excludes user's toread readings for hidden works" do
work = create(:work, hidden_by_admin: true)
reading1 = create(:reading, user: user, work: work, toread: true)
reading2 = create(:reading, work: work, toread: true)
fake_login_known_user(user)
get :index, params: { user_id: user, show: "to-read" }
expect(assigns(:readings)).not_to include(reading1)
expect(assigns(:readings)).not_to include(reading2)
end
it "excludes user's toread readings for draft works" do
work = create(:draft)
reading1 = create(:reading, user: user, work: work, toread: true)
reading2 = create(:reading, work: work, toread: true)
fake_login_known_user(user)
get :index, params: { user_id: user, show: "to-read" }
expect(assigns(:readings)).not_to include(reading1)
expect(assigns(:readings)).not_to include(reading2)
end
end
end
end
end
describe "POST #clear" do
context "when logged in as the user" do
let!(:reading1) { create(:reading, user: user) }
let!(:reading2) { create(:reading, user: user) }
before do
fake_login_known_user(user)
end
it "clears all readings and redirects with success notice" do
post :clear, params: { user_id: user }
it_redirects_to_with_notice(
user_readings_path(user),
"Your history is now cleared."
)
expect do
reading1.reload
end.to raise_error(ActiveRecord::RecordNotFound)
expect do
reading2.reload
end.to raise_error(ActiveRecord::RecordNotFound)
end
it "failure to clear readings sets flash error" do
allow_any_instance_of(Reading).to receive(:destroy!).and_raise(ActiveRecord::RecordNotDestroyed)
post :clear, params: { user_id: user }
it_redirects_to_with_error(
user_readings_path(user),
"There were problems deleting your history. Please try again later."
)
end
end
context "when logged out" do
it "redirects to login page with error" do
post :clear, params: { user_id: user }
it_redirects_to_with_error(new_user_session_path, "Sorry, you don't have permission to access the page you were trying to reach. Please log in.")
end
end
context "when logged in as another user" do
it "redirects to requested user's dashboard with error" do
fake_login
post :clear, params: { user_id: user }
it_redirects_to_with_error(user_path(user), "Sorry, you don't have permission to access the page you were trying to reach.")
end
end
end
end