announcement_spec.rb 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. # frozen_string_literal: true
  2. require 'rails_helper'
  3. describe Announcement do
  4. describe 'Scopes' do
  5. context 'with published and unpublished records' do
  6. let!(:published) { Fabricate(:announcement, published: true) }
  7. let!(:unpublished) { Fabricate(:announcement, published: false, scheduled_at: 10.days.from_now) }
  8. describe '#unpublished' do
  9. it 'returns records with published false' do
  10. results = described_class.unpublished
  11. expect(results).to eq([unpublished])
  12. end
  13. end
  14. describe '#published' do
  15. it 'returns records with published true' do
  16. results = described_class.published
  17. expect(results).to eq([published])
  18. end
  19. end
  20. end
  21. context 'with timestamped announcements' do
  22. let!(:adam_announcement) { Fabricate(:announcement, starts_at: 100.days.ago, scheduled_at: 10.days.ago, published_at: 10.days.ago, ends_at: 5.days.from_now) }
  23. let!(:brenda_announcement) { Fabricate(:announcement, starts_at: 10.days.ago, scheduled_at: 100.days.ago, published_at: 10.days.ago, ends_at: 5.days.from_now) }
  24. let!(:clara_announcement) { Fabricate(:announcement, starts_at: 10.days.ago, scheduled_at: 10.days.ago, published_at: 100.days.ago, ends_at: 5.days.from_now) }
  25. let!(:darnelle_announcement) { Fabricate(:announcement, starts_at: 10.days.ago, scheduled_at: 10.days.ago, published_at: 10.days.ago, ends_at: 5.days.from_now, created_at: 100.days.ago) }
  26. describe '#chronological' do
  27. it 'orders the records correctly' do
  28. results = described_class.chronological
  29. expect(results).to eq(
  30. [
  31. adam_announcement,
  32. brenda_announcement,
  33. clara_announcement,
  34. darnelle_announcement,
  35. ]
  36. )
  37. end
  38. end
  39. describe '#reverse_chronological' do
  40. it 'orders the records correctly' do
  41. results = described_class.reverse_chronological
  42. expect(results).to eq(
  43. [
  44. darnelle_announcement,
  45. clara_announcement,
  46. brenda_announcement,
  47. adam_announcement,
  48. ]
  49. )
  50. end
  51. end
  52. end
  53. end
  54. describe 'Validations' do
  55. describe 'text' do
  56. it 'validates presence of attribute' do
  57. record = Fabricate.build(:announcement, text: nil)
  58. expect(record).to_not be_valid
  59. expect(record.errors[:text]).to be_present
  60. end
  61. end
  62. describe 'ends_at' do
  63. it 'validates presence when starts_at is present' do
  64. record = Fabricate.build(:announcement, starts_at: 1.day.ago)
  65. expect(record).to_not be_valid
  66. expect(record.errors[:ends_at]).to be_present
  67. end
  68. it 'does not validate presence when starts_at is missing' do
  69. record = Fabricate.build(:announcement, starts_at: nil)
  70. expect(record).to be_valid
  71. expect(record.errors[:ends_at]).to_not be_present
  72. end
  73. end
  74. end
  75. describe '#publish!' do
  76. it 'publishes an unpublished record' do
  77. announcement = Fabricate(:announcement, published: false, scheduled_at: 10.days.from_now)
  78. announcement.publish!
  79. expect(announcement).to be_published
  80. expect(announcement.published_at).to_not be_nil
  81. expect(announcement.scheduled_at).to be_nil
  82. end
  83. end
  84. describe '#unpublish!' do
  85. it 'unpublishes a published record' do
  86. announcement = Fabricate(:announcement, published: true)
  87. announcement.unpublish!
  88. expect(announcement).to_not be_published
  89. expect(announcement.scheduled_at).to be_nil
  90. end
  91. end
  92. describe '#reactions' do
  93. context 'with announcement_reactions present' do
  94. let!(:account) { Fabricate(:account) }
  95. let!(:announcement) { Fabricate(:announcement) }
  96. let!(:announcement_reaction) { Fabricate(:announcement_reaction, announcement: announcement, created_at: 10.days.ago) }
  97. let!(:announcement_reaction_account) { Fabricate(:announcement_reaction, announcement: announcement, created_at: 5.days.ago, account: account) }
  98. before do
  99. Fabricate(:announcement_reaction)
  100. end
  101. it 'returns the announcement reactions for the announcement' do
  102. results = announcement.reactions
  103. expect(results.first.name).to eq(announcement_reaction.name)
  104. expect(results.last.name).to eq(announcement_reaction_account.name)
  105. end
  106. it 'returns the announcement reactions for the announcement limited to account' do
  107. results = announcement.reactions(account)
  108. expect(results.first.name).to eq(announcement_reaction.name)
  109. end
  110. end
  111. end
  112. describe '#statuses' do
  113. let(:announcement) { Fabricate(:announcement, status_ids: status_ids) }
  114. context 'with empty status_ids' do
  115. let(:status_ids) { nil }
  116. it 'returns empty array' do
  117. results = announcement.statuses
  118. expect(results).to eq([])
  119. end
  120. end
  121. context 'with relevant status_ids' do
  122. let(:status) { Fabricate(:status, visibility: :public) }
  123. let(:direct_status) { Fabricate(:status, visibility: :direct) }
  124. let(:status_ids) { [status.id, direct_status.id] }
  125. it 'returns public and unlisted statuses' do
  126. results = announcement.statuses
  127. expect(results).to include(status)
  128. expect(results).to_not include(direct_status)
  129. end
  130. end
  131. end
  132. end