283 lines
11 KiB
Ruby
283 lines
11 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe ChallengeSignupsController do
|
|
include LoginMacros
|
|
include RedirectExpectationHelper
|
|
let(:user) { create(:user) }
|
|
|
|
let(:closed_challenge) { create(:gift_exchange, :closed) }
|
|
let(:closed_collection) { create(:collection, challenge: closed_challenge) }
|
|
let(:closed_signup) { create(:gift_exchange_signup, collection_id: closed_collection.id) }
|
|
let(:closed_collection_owner) { User.find(closed_collection.all_owners.first.user_id) }
|
|
let(:closed_signup_owner) { Pseud.find(closed_signup.pseud_id).user }
|
|
|
|
let(:open_challenge) { create(:gift_exchange, :open) }
|
|
let(:open_collection) { create(:collection, challenge: open_challenge) }
|
|
let(:open_signup) { create(:gift_exchange_signup, collection_id: open_collection.id) }
|
|
let(:open_collection_owner) { User.find(open_collection.all_owners.first.user_id) }
|
|
let(:open_signup_owner) { Pseud.find(open_signup.pseud_id).user }
|
|
|
|
describe "new" do
|
|
context "when sign-ups are closed" do
|
|
it "redirects and errors" do
|
|
fake_login
|
|
get :new, params: { collection_id: closed_collection.name }
|
|
it_redirects_to_with_error(collection_path(closed_collection),
|
|
"Sign-up is currently closed: please contact a moderator for help.")
|
|
end
|
|
end
|
|
|
|
context "when sign-ups are open" do
|
|
it "redirects to edit page with notice if user is already signed up" do
|
|
fake_login_known_user(open_signup_owner)
|
|
get :new, params: { collection_id: open_collection.name, pseud: user.pseuds.first }
|
|
it_redirects_to_with_notice(edit_collection_signup_path(open_collection, open_signup),
|
|
"You are already signed up for this challenge. You can edit your sign-up below.")
|
|
end
|
|
end
|
|
|
|
context "when collection has no challenge" do
|
|
let(:plain_collection) { create(:collection) }
|
|
|
|
it "redirects and errors" do
|
|
fake_login
|
|
get :new, params: { collection_id: plain_collection }
|
|
it_redirects_to_with_error(collection_path(plain_collection),
|
|
"What challenge did you want to sign up for?")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "show" do
|
|
# TODO: AO3-5552
|
|
xit "redirects and errors if there is no sign-up with that id" do
|
|
fake_login
|
|
get :show, params: { id: 0, collection_id: closed_collection.name }
|
|
it_redirects_to_with_error(collection_path(closed_collection),
|
|
"What sign-up did you want to work on?")
|
|
end
|
|
|
|
it "redirects and errors if the user does not own the sign-up or the collection" do
|
|
fake_login
|
|
get :show, params: { id: closed_signup, collection_id: closed_collection.name }
|
|
it_redirects_to_with_error(collection_path(closed_collection),
|
|
"Sorry, you're not allowed to do that.")
|
|
end
|
|
|
|
context "when the sign-up is from another collection" do
|
|
it "redirects and errors" do
|
|
fake_login_known_user(closed_collection_owner)
|
|
get :show, params: { collection_id: closed_collection.name,
|
|
id: open_signup.id }
|
|
it_redirects_to_with_error(closed_collection,
|
|
"Sorry, that sign-up isn't associated with that collection.")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "index" do
|
|
it "redirects and errors if the current user is not allowed to see the specified user's sign-ups" do
|
|
fake_login
|
|
get :index, params: { user_id: closed_signup_owner }
|
|
it_redirects_to_with_error(root_path,
|
|
"You aren't allowed to see that user's sign-ups.")
|
|
end
|
|
|
|
it "redirects and errors if the current user is not allowed to see the CSV" do
|
|
fake_login
|
|
get :index, params: { collection_id: closed_collection.name, format: :csv }
|
|
it_redirects_to_with_error(closed_collection,
|
|
"You aren't allowed to see the CSV summary.")
|
|
end
|
|
end
|
|
|
|
describe "destroy" do
|
|
context "when sign-ups are open" do
|
|
it "deletes the sign-up and redirects with notice" do
|
|
fake_login_known_user(open_signup_owner)
|
|
delete :destroy, params: { id: open_signup, collection_id: open_collection.name }
|
|
it_redirects_to_with_notice(collection_path(open_collection),
|
|
"Challenge sign-up was deleted.")
|
|
end
|
|
end
|
|
context "when sign-ups are closed" do
|
|
it "redirects and errors" do
|
|
fake_login_known_user(closed_signup_owner)
|
|
delete :destroy, params: { id: closed_signup, collection_id: closed_collection.name }
|
|
it_redirects_to_with_error(collection_path(closed_collection),
|
|
"You cannot delete your sign-up after sign-ups are closed. Please contact a moderator for help.")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "update" do
|
|
context "when sign-ups are open" do
|
|
let(:params) do
|
|
{
|
|
challenge_signup: { pseud_id: open_signup_owner.pseuds.first.id },
|
|
id: open_signup,
|
|
collection_id: open_collection.name
|
|
}
|
|
end
|
|
|
|
it "renders edit if update fails" do
|
|
fake_login_known_user(open_signup_owner)
|
|
allow_any_instance_of(ChallengeSignup).to receive(:update).and_return(false)
|
|
put :update, params: params
|
|
allow_any_instance_of(ChallengeSignup).to receive(:update).and_call_original
|
|
expect(response).to render_template :edit
|
|
end
|
|
|
|
it "redirects and errors if the current user can't edit the sign-up" do
|
|
fake_login_known_user(user)
|
|
put :update, params: params
|
|
it_redirects_to_with_error(open_collection,
|
|
"You can't edit someone else's sign-up!")
|
|
end
|
|
end
|
|
|
|
context "when sign-ups are closed" do
|
|
let(:params) do
|
|
{
|
|
challenge_signup: { pseud_id: closed_signup_owner.pseuds.first.id },
|
|
id: closed_signup,
|
|
collection_id: closed_collection.name
|
|
}
|
|
end
|
|
|
|
it "redirects and errors without updating the sign-up" do
|
|
fake_login_known_user(closed_signup_owner)
|
|
put :update, params: params
|
|
it_redirects_to_with_error(closed_collection,
|
|
"Sign-up is currently closed: please contact a moderator for help.")
|
|
end
|
|
|
|
it "redirects and errors if the current user can't edit the sign-up" do
|
|
fake_login_known_user(user)
|
|
put :update, params: params
|
|
it_redirects_to_with_error(closed_collection,
|
|
"You can't edit someone else's sign-up!")
|
|
end
|
|
end
|
|
|
|
context "when the sign-up is from another collection" do
|
|
let(:params) do
|
|
{
|
|
challenge_signup: { pseud_id: open_signup.pseud_id },
|
|
id: open_signup,
|
|
collection_id: closed_collection.name
|
|
}
|
|
end
|
|
|
|
it "redirects and errors" do
|
|
fake_login_known_user(closed_collection_owner)
|
|
put :update, params: params
|
|
it_redirects_to_with_error(closed_collection,
|
|
"Sorry, that sign-up isn't associated with that collection.")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "edit" do
|
|
context "when the sign-up is from another collection" do
|
|
it "redirects and errors" do
|
|
fake_login_known_user(closed_collection_owner)
|
|
get :edit, params: { collection_id: closed_collection.name,
|
|
id: open_signup.id }
|
|
it_redirects_to_with_error(closed_collection,
|
|
"Sorry, that sign-up isn't associated with that collection.")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "gift_exchange_to_csv" do
|
|
let(:collection) { create(:collection, challenge: create(:gift_exchange)) }
|
|
let(:signup) { create(:gift_exchange_signup, collection_id: collection.id) }
|
|
|
|
before do
|
|
challenge = collection.challenge
|
|
challenge.offer_restriction.update!(title_allowed: true)
|
|
challenge.request_restriction.update!(title_allowed: true)
|
|
|
|
signup_offer = signup.offers.first
|
|
signup_offer.description = ""
|
|
signup_offer.tag_set = create(:tag_set)
|
|
signup_offer.save
|
|
|
|
signup_request = signup.requests.first
|
|
signup_request.description = ""
|
|
signup_request.tag_set = create(:tag_set)
|
|
signup_request.save
|
|
end
|
|
|
|
it "generates a CSV with all the challenge information" do
|
|
controller.instance_variable_set(:@challenge, collection.challenge)
|
|
controller.instance_variable_set(:@collection, collection)
|
|
expect(controller.send(:gift_exchange_to_csv))
|
|
.to eq([["Pseud", "Email", "Sign-up URL", "Request 1 Tags", "Request 1 Title", "Request 1 Description", "Offer 1 Tags", "Offer 1 Title", "Offer 1 Description"],
|
|
[signup.pseud.name, signup.pseud.user.email, collection_signup_url(collection, signup),
|
|
signup.requests.first.tag_set.tags.first.name, "", "", signup.offers.first.tag_set.tags.first.name, "", ""]])
|
|
end
|
|
end
|
|
|
|
describe "prompt_meme_to_csv" do
|
|
let(:collection) { create(:collection, challenge: create(:prompt_meme)) }
|
|
let(:signup) { create(:prompt_meme_signup, collection_id: collection.id) }
|
|
let(:challenge) { collection.challenge }
|
|
let(:prompt) { signup.prompts.first }
|
|
|
|
before do
|
|
prompt.description = ""
|
|
prompt.tag_set = create(:tag_set)
|
|
prompt.save
|
|
|
|
controller.instance_variable_set(:@challenge, collection.challenge)
|
|
controller.instance_variable_set(:@collection, collection)
|
|
end
|
|
|
|
it "generates a CSV with all the challenge information" do
|
|
expect(controller.send(:prompt_meme_to_csv))
|
|
.to eq([["Pseud", "Sign-up URL", "Tags", "Description"],
|
|
[signup.pseud.name, collection_signup_url(collection, signup),
|
|
signup.requests.first.tag_set.tags.first.name, ""]])
|
|
end
|
|
|
|
context "when title is allowed" do
|
|
before do
|
|
challenge.request_restriction.update!(title_allowed: true)
|
|
end
|
|
|
|
it "includes title in CSV" do
|
|
expect(controller.send(:prompt_meme_to_csv))
|
|
.to eq([["Pseud", "Sign-up URL", "Tags", "Title", "Description"],
|
|
[signup.pseud.name, collection_signup_url(collection, signup),
|
|
signup.requests.first.tag_set.tags.first.name, "", ""]])
|
|
end
|
|
end
|
|
|
|
context "when description is not allowed" do
|
|
before do
|
|
challenge.request_restriction.update!(description_allowed: false)
|
|
end
|
|
|
|
it "omits description from CSV" do
|
|
expect(controller.send(:prompt_meme_to_csv))
|
|
.to eq([["Pseud", "Sign-up URL", "Tags"],
|
|
[signup.pseud.name, collection_signup_url(collection, signup),
|
|
signup.requests.first.tag_set.tags.first.name]])
|
|
end
|
|
end
|
|
|
|
context "when prompt is anonymous" do
|
|
before do
|
|
prompt.update!(anonymous: true)
|
|
end
|
|
|
|
it "omits the anonymous prompt's pseud and sign-up URL from CSV" do
|
|
expect(controller.send(:prompt_meme_to_csv))
|
|
.to eq([["Pseud", "Sign-up URL", "Tags", "Description"],
|
|
["(Anonymous)", "", signup.requests.first.tag_set.tags.first.name, ""]])
|
|
end
|
|
end
|
|
end
|
|
end
|