190 lines
6.9 KiB
Ruby
190 lines
6.9 KiB
Ruby
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
|