otwarchive-symphonyarchive/spec/controllers/series_controller_spec.rb

191 lines
6.9 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
require 'spec_helper'
describe SeriesController do
include LoginMacros
include RedirectExpectationHelper
let(:user) { create(:user) }
let(:series) { create(:series, authors: [user.default_pseud]) }
describe 'new' do
it 'assigns a series' do
get :new
expect(assigns(:series)).to be_a_new(Series)
end
end
describe 'edit' do
it 'redirects to orphan if there are no pseuds left' do
fake_login_known_user(user)
get :edit, params: { remove: "me", id: series }
it_redirects_to(new_orphan_path(series_id: series))
end
end
describe 'create' do
it 'renders new if the series is invalid' do
fake_login_known_user(user)
post :create, params: { series: {summary: ""} }
expect(response).to render_template('new')
end
it 'gives notice and redirects on a valid series' do
fake_login_known_user(user)
post :create, params: { series: { title: "test title", author_attributes: { ids: user.pseud_ids } } }
expect(flash[:notice]).to eq "Series was successfully created."
expect(response).to have_http_status :redirect
end
end
describe 'update' do
it "redirects and errors if removing the last author of a series" do
fake_login_known_user(user)
put :update, params: { series: { author_attributes: { ids: [""] } }, id: series }
expect(response).to render_template :edit
expect(assigns[:series].errors.full_messages).to \
include "You haven't selected any pseuds for this series."
end
it "allows you to change which of your pseuds is listed on the series" do
fake_login_known_user(user)
new_pseud = create(:pseud, user: user)
put :update, params: { series: { author_attributes: { ids: [new_pseud.id] } }, id: series }
it_redirects_to_with_notice(series_path(series), \
"Series was successfully updated.")
expect(series.pseuds.reload).to contain_exactly(new_pseud)
end
it "allows you to invite co-creators" do
fake_login_known_user(user)
co_creator = create(:user)
co_creator.preference.update!(allow_cocreator: true)
put :update, params: { series: { author_attributes: { byline: co_creator.login } }, id: series }
it_redirects_to_with_notice(series_path(series), \
"Series was successfully updated.")
expect(series.pseuds.reload).not_to include(co_creator.default_pseud)
expect(series.user_has_creator_invite?(co_creator)).to be_truthy
end
it "renders the edit template if the update fails" do
fake_login_known_user(user)
allow_any_instance_of(Series).to receive(:save) { false }
put :update, params: { series: { title: "foobar" }, id: series }
expect(response).to render_template('edit')
expect(series.reload.title).not_to eq("foobar")
end
end
describe 'update_positions' do
it 'updates the position and redirects' do
fake_login_known_user(user)
first_work = create(:serial_work, series: series)
second_work = create(:serial_work, series: series)
expect(first_work.position).to eq(1)
expect(second_work.position).to eq(2)
post :update_positions, params: { id: series.id, serial: [second_work, first_work], format: :json }
first_work.reload
second_work.reload
expect(first_work.position).to eq(2)
expect(second_work.position).to eq(1)
end
end
describe 'destroy' do
it 'on an exception gives an error and redirects' do
fake_login_known_user(user)
allow_any_instance_of(Series).to receive(:destroy) { false }
delete :destroy, params: { id: series }
it_redirects_to_with_error(series_path(series), \
"Sorry, we couldn't delete the series. Please try again.")
end
end
describe "index" do
context "without user_id parameter" do
it "redirects to the homepage with an error" do
get :index
it_redirects_to_with_error(root_path, "Whose series did you want to see?")
end
end
context "with user_id parameter" do
context "when user_id does not exist" do
context "without a pseud_id parameter" do
it "raises an error" do
expect do
get :index, params: { user_id: "nobody" }
end.to raise_error ActiveRecord::RecordNotFound
end
end
context "with pseud_id parameter" do
context "when pseud_id does not exist" do
it "raises an error" do
expect do
get :index, params: { user_id: "nobody", pseud_id: "nobody" }
end.to raise_error ActiveRecord::RecordNotFound
end
end
end
end
context "when user_id exists" do
context "without pseud_id parameter" do
it "renders the index template" do
get :index, params: { user_id: user }
expect(response).to render_template(:index)
end
end
context "with pseud_id parameter" do
context "when pseud_id does not exist" do
it "raises an error" do
expect do
get :index, params: { user_id: user, pseud_id: "nobody" }
end.to raise_error ActiveRecord::RecordNotFound
end
end
context "when pseud_id exists" do
it "renders the index template" do
get :index, params: { user_id: user, pseud_id: user.default_pseud }
expect(response).to render_template(:index)
end
end
end
end
end
end
describe "show" do
context "when series does not exist" do
it "raises an error" do
expect do
get :show, params: { id: "99999999" }
end.to raise_error ActiveRecord::RecordNotFound
end
end
it "assigns page title for series" do
work = create(:work, fandom_string: "Fandom", authors: [user.default_pseud])
create(:serial_work, work: work, series: series)
get :show, params: { id: series }
expect(assigns[:page_title]).to eq("#{series.title} - #{user.default_pseud.name} - Fandom [#{ArchiveConfig.APP_NAME}]")
end
it "assigns page title for anonymous series" do
anonymous_collection = create(:anonymous_collection)
anonymous_work = create(:work, fandom_string: "Fandom", collections: [anonymous_collection])
create(:serial_work, work: anonymous_work, series: series)
get :show, params: { id: series }
expect(assigns[:page_title]).to eq("#{series.title} - Anonymous - Fandom [#{ArchiveConfig.APP_NAME}]")
end
it "assigns page subtitle for unrevealed series" do
unrevealed_collection = create(:unrevealed_collection)
unrevealed_work = create(:work, collections: [unrevealed_collection])
create(:serial_work, work: unrevealed_work, series: series)
get :show, params: { id: series }
expect(assigns[:page_subtitle]).to eq("Mystery Series")
end
end
end