# frozen_string_literal: true require "test_helper" class AnnouncementTest < ActiveSupport::TestCase test "should be valid with valid attributes" do announcement = Announcement.new(title: "Test Title", content: "Test content") assert announcement.valid? end test "should require title" do announcement = Announcement.new(content: "Test content") assert_not announcement.valid? assert_includes announcement.errors[:title], "can't be blank" end test "should require content" do announcement = Announcement.new(title: "Test Title") assert_not announcement.valid? assert_includes announcement.errors[:content], "can't be blank" end test "should validate content length" do long_title = "a" * 256 announcement = Announcement.new(title: long_title, content: "Test content") assert_not announcement.valid? assert_includes announcement.errors[:title], "is too long (maximum is 255 characters)" end test "should have rich text content" do announcement = Announcement.new(title: "Test", content: "Test content") assert_respond_to announcement, :content # ActionText creates a rich_text association assert_respond_to announcement, :rich_text_content end test "should create announcement with ActionText content" do announcement = Announcement.create!( title: "Test with Rich Text", content: "
This is bold text
" ) assert_not_nil announcement.content assert_equal "This is bold text
\n" assert_includes excerpt, "This is a very long announcement content" end test "published_at should return created_at" do announcement = Announcement.create!(title: "Test", content: "Test content") assert_equal announcement.created_at, announcement.published_at end test "latest scope should return announcements in reverse chronological order" do old_announcement = Announcement.create!(title: "Old", content: "Old content", created_at: 1.day.ago) new_announcement = Announcement.create!(title: "New", content: "New content") latest_announcements = Announcement.latest assert_equal new_announcement, latest_announcements.first assert_equal old_announcement, latest_announcements.last end test "current should return the featured announcement" do Announcement.create!(title: "Old", content: "Old content", featured: false) featured_announcement = Announcement.create!(title: "Featured", content: "Featured content", featured: true) Announcement.create!(title: "New", content: "New content", featured: false) assert_equal featured_announcement, Announcement.current end test "current should return nil when no announcement is featured" do Announcement.create!(title: "Old", content: "Old content", featured: false) assert_nil Announcement.current end test "current should return nil when no announcements exist" do assert_nil Announcement.current end test "should default featured to false" do announcement = Announcement.create!(title: "Test", content: "Test content") assert_equal false, announcement.featured end test "should allow setting featured to true" do announcement = Announcement.create!(title: "Test", content: "Test content", featured: true) assert_equal true, announcement.featured end test "should unfeature other announcements when one is featured" do announcement1 = Announcement.create!(title: "First", content: "First content", featured: true) announcement2 = Announcement.create!(title: "Second", content: "Second content", featured: true) announcement1.reload assert_equal false, announcement1.featured assert_equal true, announcement2.featured end test "should allow multiple announcements with featured false" do announcement1 = Announcement.create!(title: "First", content: "First content", featured: false) announcement2 = Announcement.create!(title: "Second", content: "Second content", featured: false) assert_equal false, announcement1.featured assert_equal false, announcement2.featured end test "should unfeature announcement when updating another to featured" do announcement1 = Announcement.create!(title: "First", content: "First content", featured: true) announcement2 = Announcement.create!(title: "Second", content: "Second content", featured: false) announcement2.update!(featured: true) announcement1.reload assert_equal false, announcement1.featured assert_equal true, announcement2.featured end end