require "rails_helper" describe ProposalNotification do let(:notification) { build(:proposal_notification) } it "is valid" do expect(notification).to be_valid end it "is not valid without a title" do notification.title = nil expect(notification).not_to be_valid end it "is not valid without a body" do notification.body = nil expect(notification).not_to be_valid end it "is not valid without an associated proposal" do notification.proposal = nil expect(notification).not_to be_valid end describe "public_for_api scope" do it "returns proposal notifications" do notification = create(:proposal_notification, proposal: create(:proposal)) expect(ProposalNotification.public_for_api).to eq [notification] end it "blocks proposal notifications whose proposal is hidden" do create(:proposal_notification, proposal: create(:proposal, :hidden)) expect(ProposalNotification.public_for_api).to be_empty end it "blocks proposal notifications without proposal" do build(:proposal_notification, proposal: nil).save!(validate: false) expect(ProposalNotification.public_for_api).to be_empty end end describe "minimum interval between notifications" do before do Setting[:proposal_notification_minimum_interval_in_days] = 3 end it "is not valid if below minimum interval" do proposal = create(:proposal) notification1 = create(:proposal_notification, proposal: proposal) notification2 = build(:proposal_notification, proposal: proposal) proposal.reload expect(notification2).not_to be_valid end it "is valid if notifications above minimum interval" do proposal = create(:proposal) notification1 = create(:proposal_notification, proposal: proposal, created_at: 4.days.ago) notification2 = build(:proposal_notification, proposal: proposal) proposal.reload expect(notification2).to be_valid end it "is valid if no notifications sent" do notification1 = build(:proposal_notification) expect(notification1).to be_valid end end describe "notifications in-app" do let(:notifiable) { create(model_name(ProposalNotification)) } let(:proposal) { notifiable.proposal } describe "#notification_title" do it "returns the proposal title" do notification = create(:notification, notifiable: notifiable) expect(notification.notifiable_title).to eq notifiable.proposal.title end end describe "#notification_action" do it "returns the correct action" do notification = create(:notification, notifiable: notifiable) expect(notification.notifiable_action).to eq "proposal_notification" end end describe "notifiable_available?" do it "returns true when the proposal is available" do notification = create(:notification, notifiable: notifiable) expect(notification.notifiable_available?).to be(true) end it "returns false when the proposal is not available" do notification = create(:notification, notifiable: notifiable) notifiable.proposal.destroy expect(notification.notifiable_available?).to be(false) end end describe "check_availability" do it "returns true if the resource is present, not hidden, nor retired" do notification = create(:notification, notifiable: notifiable) expect(notification.check_availability(proposal)).to be(true) end it "returns false if the resource is not present" do notification = create(:notification, notifiable: notifiable) notifiable.proposal.really_destroy! expect(notification.check_availability(proposal)).to be(false) end it "returns false if the resource is hidden" do notification = create(:notification, notifiable: notifiable) notifiable.proposal.hide expect(notification.check_availability(proposal)).to be(false) end it "returns false if the resource is retired" do notification = create(:notification, notifiable: notifiable) notifiable.proposal.update(retired_at: Time.current, retired_explanation: "Unfeasible reason explanation", retired_reason: "unfeasible") expect(notification.check_availability(proposal)).to be(false) end end describe "#moderate_system_email" do let(:admin) { create(:administrator) } let(:proposal) { create(:proposal) } let(:proposal_notification) { build(:proposal_notification, proposal: proposal) } let(:notification) { create(:notification, notifiable: proposal_notification) } it "removes all notifications related to the proposal notification" do proposal_notification.moderate_system_email(admin.user) expect(Notification.all.count).to be(0) end it "records the moderation action in the Activity table" do proposal_notification.moderate_system_email(admin.user) expect(Activity.last.actionable_type).to eq("ProposalNotification") end end end end