diff --git a/app/models/direct_message.rb b/app/models/direct_message.rb index 32cf6ac58..14083f2c7 100644 --- a/app/models/direct_message.rb +++ b/app/models/direct_message.rb @@ -1,4 +1,22 @@ class DirectMessage < ActiveRecord::Base belongs_to :sender, class_name: 'User', foreign_key: 'sender_id' belongs_to :receiver, class_name: 'User', foreign_key: 'receiver_id' + + validates :title, presence: true + validates :body, presence: true + validates :sender, presence: true + validates :receiver, presence: true + validate :max_per_day + + scope :today, lambda { where('DATE(created_at) = ?', Date.today) } + + def max_per_day + return if errors.any? + max = Setting[:direct_message_max_per_day] + + if sender.direct_messages_sent.today.count >= max.to_i + errors.add(:title, I18n.t('activerecord.errors.models.direct_message.attributes.max_per_day.invalid', max: max)) + end + end + end diff --git a/app/models/user.rb b/app/models/user.rb index a3b719859..7240c8929 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,7 +23,8 @@ class User < ActiveRecord::Base has_many :spending_proposals, foreign_key: :author_id has_many :failed_census_calls has_many :notifications - has_many :direct_messages + has_many :direct_messages_sent, class_name: 'DirectMessage', foreign_key: :sender_id + has_many :direct_messages_received, class_name: 'DirectMessage', foreign_key: :receiver_id belongs_to :geozone validates :username, presence: true, if: :username_required? diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml index 524c8906c..9b48c1fc2 100644 --- a/config/locales/activerecord.en.yml +++ b/config/locales/activerecord.en.yml @@ -78,6 +78,10 @@ en: attributes: tag_list: less_than_or_equal_to: "tags must be less than or equal to %{count}" + direct_message: + attributes: + max_per_day: + invalid: "You can only send a maximum of %{max} direct messages per day" proposal: attributes: tag_list: diff --git a/config/locales/activerecord.es.yml b/config/locales/activerecord.es.yml index 1999631ab..f14022255 100644 --- a/config/locales/activerecord.es.yml +++ b/config/locales/activerecord.es.yml @@ -78,6 +78,10 @@ es: attributes: tag_list: less_than_or_equal_to: "los temas deben ser menor o igual que %{count}" + direct_message: + attributes: + max_per_day: + invalid: "Sólo puedes enviar %{max} mensajes directos por día" proposal: attributes: tag_list: diff --git a/db/seeds.rb b/db/seeds.rb index 5a6db1574..5644fe493 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -77,3 +77,4 @@ Setting['banner-img.banner-img-three'] = "Banner image 3" # Proposal notifications Setting['proposal_notification_minimum_interval_in_days '] = 3 +Setting['direct_message_max_per_day '] = 3 \ No newline at end of file diff --git a/spec/features/direct_messages_spec.rb b/spec/features/direct_messages_spec.rb index 119cbe6de..76b7a150c 100644 --- a/spec/features/direct_messages_spec.rb +++ b/spec/features/direct_messages_spec.rb @@ -72,4 +72,33 @@ feature 'Direct messages' do expect(page).to have_content error_message end + context "Limits" do + + background do + Setting[:direct_message_max_per_day] = 3 + end + + scenario "Can only send a maximum number of direct messages per day" do + sender = create(:user, :level_two) + receiver = create(:user, :level_two) + + 3.times { create(:direct_message, sender: sender) } + + login_as(sender) + visit user_path(receiver) + + click_link "Send private message" + + expect(page).to have_content "Send private message to #{receiver.name}" + + fill_in 'direct_message_title', with: "Hey!" + fill_in 'direct_message_body', with: "How are you doing?" + click_button "Send message" + + expect(page).to have_content "You can only send a maximum of 3 direct messages per day" + expect(page).to_not have_content "You message has been sent successfully." + end + + end + end \ No newline at end of file diff --git a/spec/models/direct_message_spec.rb b/spec/models/direct_message_spec.rb new file mode 100644 index 000000000..e982f9e56 --- /dev/null +++ b/spec/models/direct_message_spec.rb @@ -0,0 +1,85 @@ +require 'rails_helper' + +describe DirectMessage do + + let(:direct_message) { build(:direct_message) } + + before(:each) do + Setting[:direct_message_max_per_day] = 3 + end + + it "should be valid" do + expect(direct_message).to be_valid + end + + it "should not be valid without a title" do + direct_message.title = nil + expect(direct_message).to_not be_valid + end + + it "should not be valid without a body" do + direct_message.body = nil + expect(direct_message).to_not be_valid + end + + it "should not be valid without an associated sender" do + direct_message.sender = nil + expect(direct_message).to_not be_valid + end + + it "should not be valid without an associated receiver" do + direct_message.receiver = nil + expect(direct_message).to_not be_valid + end + + describe "maximum number of direct messages per day" do + + it "should not be valid if above maximum" do + sender = create(:user) + direct_message1 = create(:direct_message, sender: sender) + direct_message2 = create(:direct_message, sender: sender) + direct_message3 = create(:direct_message, sender: sender) + + direct_message4 = build(:direct_message, sender: sender) + expect(direct_message4).to_not be_valid + end + + it "should be valid if below maximum" do + sender = create(:user) + direct_message1 = create(:direct_message, sender: sender) + direct_message2 = create(:direct_message, sender: sender) + + direct_message3 = build(:direct_message) + expect(direct_message).to be_valid + end + + it "should be valid if no direct_messages sent" do + direct_message = build(:direct_message) + + expect(direct_message).to be_valid + end + + end + + describe "scopes" do + + describe "today" do + it "should return direct messages created today" do + direct_message1 = create(:direct_message, created_at: Time.zone.now.beginning_of_day + 3.hours) + direct_message2 = create(:direct_message, created_at: Time.zone.now) + direct_message3 = create(:direct_message, created_at: Time.zone.now.end_of_day) + + expect(DirectMessage.today.count).to eq 3 + end + + it "should not return direct messages created another day" do + direct_message1 = create(:direct_message, created_at: 1.day.ago) + direct_message2 = create(:direct_message, created_at: 1.day.from_now) + + expect(DirectMessage.today.count).to eq 0 + end + end + + end + +end \ No newline at end of file