From 9e922ad08037efd1bc1cb6e29fbd4dfc4c17e7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Mon, 21 Sep 2015 15:39:33 +0200 Subject: [PATCH] adds activity model --- app/models/activity.rb | 22 ++++++++++++ spec/factories.rb | 6 ++++ spec/models/activity_spec.rb | 69 ++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 app/models/activity.rb create mode 100644 spec/models/activity_spec.rb diff --git a/app/models/activity.rb b/app/models/activity.rb new file mode 100644 index 000000000..87c68e556 --- /dev/null +++ b/app/models/activity.rb @@ -0,0 +1,22 @@ +class Activity < ActiveRecord::Base + + belongs_to :actionable, polymorphic: true + belongs_to :user + + VALID_ACTIONS = %w( hide block restore ) + + validates :action, inclusion: {in: VALID_ACTIONS} + + def self.log(user, action, actionable) + create(user: user, action: action.to_s, actionable: actionable) + end + + def self.on(actionable) + where(actionable_type: actionable.class.name, actionable_id: actionable.id) + end + + def self.by(user) + where(user: user) + end + +end diff --git a/spec/factories.rb b/spec/factories.rb index cda9c01a8..caec0d6d9 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -33,6 +33,12 @@ FactoryGirl.define do uid "MyString" end + factory :activity do + user + action "hide" + association :actionable, factory: :proposal + end + factory :verification_residence, class: Verification::Residence do user document_number '12345678Z' diff --git a/spec/models/activity_spec.rb b/spec/models/activity_spec.rb new file mode 100644 index 000000000..f1133dbd8 --- /dev/null +++ b/spec/models/activity_spec.rb @@ -0,0 +1,69 @@ +require 'rails_helper' + +describe Activity do + + it "should be valid for different actionables" do + expect(build(:activity, actionable: create(:proposal))).to be_valid + expect(build(:activity, actionable: create(:debate))).to be_valid + expect(build(:activity, actionable: create(:comment))).to be_valid + expect(build(:activity, actionable: create(:user))).to be_valid + end + + it "should be a valid only with allowed actions" do + expect(build(:activity, action: "hide")).to be_valid + expect(build(:activity, action: "block")).to be_valid + expect(build(:activity, action: "restore")).to be_valid + expect(build(:activity, action: "dissapear")).to_not be_valid + end + + describe "log" do + it "should create an activity entry" do + user = create(:user) + proposal = create(:proposal) + + expect{ Activity.log(user, :hide, proposal) }.to change { Activity.count }.by(1) + + activity = Activity.last + expect(activity.user_id).to eq(user.id) + expect(activity.action).to eq("hide") + expect(activity.actionable).to eq(proposal) + end + end + + describe "on" do + it "should list all activity on an actionable object" do + proposal = create(:proposal) + activity1 = create(:activity, action: "hide", actionable: proposal) + activity2 = create(:activity, action: "restore", actionable: proposal) + activity3 = create(:activity, action: "hide", actionable: proposal) + create(:activity, action: "restore", actionable: create(:debate)) + create(:activity, action: "hide", actionable: create(:proposal)) + create(:activity, action: "hide", actionable: create(:comment)) + create(:activity, action: "block", actionable: create(:user)) + + expect(Activity.on(proposal).size).to eq 3 + [activity1, activity2, activity3].each do |a| + expect(Activity.on(proposal)).to include(a) + end + end + end + + describe "by" do + it "should list all activity of a user" do + user1 = create(:user) + activity1 = create(:activity, user: user1) + activity2 = create(:activity, user: user1, action: "restore", actionable: create(:debate)) + activity3 = create(:activity, user: user1, action: "hide", actionable: create(:proposal)) + activity4 = create(:activity, user: user1, action: "hide", actionable: create(:comment)) + activity5 = create(:activity, user: user1, action: "block", actionable: create(:user)) + create_list(:activity, 3) + + expect(Activity.by(user1).size).to eq 5 + + [activity1, activity2, activity3, activity4, activity5].each do |a| + expect(Activity.by(user1)).to include(a) + end + end + end + +end