otwarchive-symphonyarchive/spec/models/pseud_spec.rb

127 lines
3.9 KiB
Ruby
Raw Permalink Normal View History

2026-03-11 22:22:11 +00:00
require "spec_helper"
describe Pseud do
it { is_expected.to have_many(:gifts).conditions(rejected: false).dependent(:destroy) }
it { is_expected.to have_many(:rejected_gifts).conditions(rejected: true).dependent(:destroy) }
it "has a valid factory" do
expect(build(:pseud)).to be_valid
end
it "is invalid without a name" do
expect(build(:pseud, name: nil)).to be_invalid
end
it "is invalid if there are special characters" do
expect(build(:pseud, name: "*pseud*")).to be_invalid
end
describe "save" do
context "when the pseud is valid" do
let(:pseud) { build(:pseud) }
it "succeeds" do
expect(pseud).to be_valid_verbose
expect(pseud.save).to be_truthy
expect(pseud.errors).to be_empty
end
end
context "when the icon alt text is too long" do
let(:pseud) { build(:pseud, icon_alt_text: "a" * 251) }
it "fails" do
expect(pseud.save).to be_falsey
expect(pseud.errors[:icon_alt_text]).not_to be_empty
end
end
context "when the icon comment text is too long" do
let(:pseud) { build(:pseud, icon_comment_text: "a" * 51) }
it "fails" do
expect(pseud.save).to be_falsey
expect(pseud.errors[:icon_comment_text]).not_to be_empty
end
end
end
describe "touch_comments" do
let(:pseud) { create(:pseud) }
let!(:comment) { create(:comment, pseud: pseud) }
it "modifies the updated_at of associated comments" do
# Without this, the in-memory pseud has 0 comments and the test fails.
pseud.reload
travel(1.day)
expect do
pseud.update!(name: "New Name")
end.to change { comment.reload.updated_at }
end
end
describe ".default_alphabetical" do
let(:user) { create(:user, login: "Zaphod") }
let(:subject) { user.pseuds.default_alphabetical }
before do
create(:pseud, user: user, name: "Slartibartfast")
create(:pseud, user: user, name: "Agrajag")
create(:pseud, user: user, name: "Betelgeuse")
allow(ArchiveConfig).to receive(:ITEMS_PER_PAGE).and_return(3)
end
it "gets default pseud, then all pseuds in alphabetical order" do
expect(subject.map(&:name)).to eq(%w[Zaphod Agrajag Betelgeuse Slartibartfast])
end
end
describe ".abbreviated_list" do
let(:user) { create(:user, login: "Zaphod") }
let(:subject) { user.pseuds.abbreviated_list }
before do
create(:pseud, user: user, name: "Slartibartfast")
create(:pseud, user: user, name: "Agrajag")
create(:pseud, user: user, name: "Betelgeuse")
allow(ArchiveConfig).to receive(:ITEMS_PER_PAGE).and_return(3)
end
it "gets default pseud, then shortened alphabetical list of other pseuds" do
expect(subject.map(&:name)).to eq(%w[Zaphod Agrajag Betelgeuse])
expect(subject.map(&:name)).not_to include("Slartibartfast")
expect(subject.length).to eq(ArchiveConfig.ITEMS_PER_PAGE)
end
end
describe "#clear_icon" do
subject { create(:pseud, icon_alt_text: "icon alt", icon_comment_text: "icon comment") }
before do
subject.icon.attach(io: File.open(Rails.root.join("features/fixtures/icon.gif")), filename: "icon.gif", content_type: "image/gif")
end
context "when delete_icon is false" do
it "does not clear the icon, icon alt, or icon comment" do
subject.clear_icon
expect(subject.icon.attached?).to be(true)
expect(subject.icon_alt_text).to eq("icon alt")
expect(subject.icon_comment_text).to eq("icon comment")
end
end
context "when delete_icon is true" do
before do
subject.delete_icon = 1
end
it "clears the icon, icon alt, and icon comment" do
subject.clear_icon
expect(subject.icon.attached?).to be(false)
expect(subject.icon_alt_text).to be_nil
expect(subject.icon_comment_text).to be_nil
end
end
end
end