otwarchive-symphonyarchive/spec/models/challenge_assignment_spec.rb

168 lines
5.4 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
require 'spec_helper'
describe ChallengeAssignment do
describe "a challenge assignment" do
before do
@assignment = create(:challenge_assignment)
@collection = @assignment.collection
end
it "should initially be unposted and unfulfilled and undefaulted" do
expect(@assignment.posted?).to be_falsey
expect(@assignment.fulfilled?).to be_falsey
expect(@assignment.defaulted?).to be_falsey
expect(@collection.assignments.unstarted).to include(@assignment)
expect(@collection.assignments.unposted).to include(@assignment)
expect(@collection.assignments.unfulfilled).to include(@assignment)
end
it "should be unsent" do
expect(@collection.assignments.sent).not_to include(@assignment)
end
describe "after being sent" do
before do
@assignment.send_out
end
it "should be sent" do
expect(@collection.assignments.sent).to include(@assignment)
end
end
describe "when it has an unposted creation" do
before do
@assignment.send_out
@author = @assignment.offer_signup.pseud
# Setting challenge_assignment_ids only works if the authors are saved,
# or the current user owns the assignment in question.
User.current_user = @author.user
@work = create(:draft, authors: [@author], collection_names: @collection.name, challenge_assignment_ids: [@assignment.id])
@assignment.reload
end
it "should be started but not posted fulfilled or defaulted" do
expect(@assignment.started?).to be_truthy
expect(@assignment.posted?).to be_falsey
expect(@assignment.fulfilled?).to be_falsey
expect(@assignment.defaulted?).to be_falsey
end
describe "that gets posted" do
before do
@work.posted = true
@work.save
@assignment.reload
end
it "should be posted and fulfilled and undefaulted" do
# note: if this collection is moderated then fulfilled shouldn't be true
# until the item is approved
expect(@assignment.posted?).to be_truthy
expect(@assignment.fulfilled?).to be_truthy
expect(@assignment.defaulted?).to be_falsey
end
describe "that is destroyed" do
before do
@work.destroy
@assignment.reload
end
it "should be unposted and unfulfilled again" do
expect(@assignment.posted?).to be_falsey
expect(@assignment.fulfilled?).to be_falsey
expect(@assignment.defaulted?).to be_falsey
end
end
end
end
end
describe "request_signup_pseud=" do
let!(:collection) { create(:collection, challenge: create(:gift_exchange)) }
let(:assignment) { collection.assignments.build }
context "when a user has signed up with a pseud matching their login" do
let(:user) { create(:user) }
let!(:signup) do
create(:challenge_signup,
collection: collection,
pseud: user.default_pseud)
end
it "assigns the user's signup when entering the user's login" do
assignment.request_signup_pseud = user.login
expect(assignment.request_signup).to eq(signup)
end
context "when another user has signed up with the same pseud name" do
let(:ambiguous) { create(:pseud, name: user.login) }
let!(:ambiguous_signup) do
create(:challenge_signup,
collection: collection,
pseud: ambiguous)
end
it "assigns the first user's signup when entering the first user's login" do
assignment.request_signup_pseud = user.login
expect(assignment.request_signup).to eq(signup)
end
it "assigns the second user's signup when entering the full byline for the other user's pseud" do
assignment.request_signup_pseud = "#{ambiguous.name} (#{ambiguous.user.login})"
expect(assignment.request_signup).to eq(ambiguous_signup)
end
end
end
end
describe "offer_signup_pseud=" do
let!(:collection) { create(:collection, challenge: create(:gift_exchange)) }
let(:assignment) { collection.assignments.build }
context "when a user has signed up with a pseud matching their login" do
let(:user) { create(:user) }
let!(:signup) do
create(:challenge_signup,
collection: collection,
pseud: user.default_pseud)
end
it "assigns the user's signup when entering the user's login" do
assignment.offer_signup_pseud = user.login
expect(assignment.offer_signup).to eq(signup)
end
context "when another user has signed up with the same pseud name" do
let(:ambiguous) { create(:pseud, name: user.login) }
let!(:ambiguous_signup) do
create(:challenge_signup,
collection: collection,
pseud: ambiguous)
end
it "assigns the first user's signup when entering the first user's login" do
assignment.offer_signup_pseud = user.login
expect(assignment.offer_signup).to eq(signup)
end
it "assigns the second user's signup when entering the full byline for the other user's pseud" do
assignment.offer_signup_pseud = "#{ambiguous.name} (#{ambiguous.user.login})"
expect(assignment.offer_signup).to eq(ambiguous_signup)
end
end
end
end
end