eventifier 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +14 -0
  3. data/Gemfile.lock +17 -3
  4. data/README.textile +7 -2
  5. data/Rakefile +1 -8
  6. data/eventifier.gemspec +7 -3
  7. data/lib/eventifier/active_record/event.rb +9 -0
  8. data/lib/eventifier/active_record/event_observer.rb +8 -0
  9. data/lib/eventifier/active_record/event_tracking.rb +11 -0
  10. data/lib/eventifier/active_record/ghost.rb +9 -0
  11. data/lib/eventifier/active_record/notification.rb +13 -0
  12. data/lib/eventifier/active_record_support.rb +5 -0
  13. data/lib/eventifier/event_mixin.rb +45 -0
  14. data/lib/eventifier/event_observer_mixin.rb +44 -0
  15. data/lib/eventifier/event_tracking.rb +29 -18
  16. data/lib/eventifier/ghost_mixin.rb +27 -0
  17. data/lib/eventifier/helper_methods.rb +2 -0
  18. data/lib/eventifier/mongoid/event.rb +16 -0
  19. data/lib/eventifier/mongoid/event_observer.rb +7 -0
  20. data/lib/eventifier/mongoid/event_tracking.rb +13 -0
  21. data/lib/eventifier/mongoid/ghost.rb +15 -0
  22. data/lib/eventifier/mongoid/notification.rb +19 -0
  23. data/lib/eventifier/mongoid/user_patch.rb +3 -0
  24. data/lib/eventifier/mongoid_support.rb +6 -0
  25. data/lib/eventifier/notification_helper.rb +4 -13
  26. data/lib/eventifier/notification_mailer.rb +5 -1
  27. data/lib/eventifier/notification_mixin.rb +42 -0
  28. data/lib/eventifier/version.rb +1 -1
  29. data/lib/eventifier.rb +8 -10
  30. data/lib/generators/eventifier/install/install_generator.rb +1 -1
  31. data/spec/event_helper_spec.rb +45 -35
  32. data/spec/event_observer_spec.rb +1 -6
  33. data/spec/event_spec.rb +16 -5
  34. data/spec/event_tracking_spec.rb +20 -0
  35. data/spec/eventifier_spec.rb +48 -52
  36. data/spec/fabricators/fabricator.rb +31 -0
  37. data/spec/ghost_spec.rb +30 -0
  38. data/spec/helper_methods_spec.rb +2 -2
  39. data/spec/integration/eventifier_spec.rb +85 -44
  40. data/spec/notification_helper_spec.rb +13 -6
  41. data/spec/notification_mailer_spec.rb +6 -1
  42. data/spec/notification_spec.rb +9 -11
  43. data/spec/spec_helper.rb +11 -2
  44. data/spec/support/database_cleaner.rb +3 -0
  45. data/spec/support/model_helpers.rb +36 -0
  46. data/spec/{support → test_classes}/active_record_support.rb +9 -0
  47. data/spec/test_classes/mongoid_support.rb +34 -0
  48. metadata +94 -24
  49. data/lib/eventifier/event.rb +0 -35
  50. data/lib/eventifier/event_observer.rb +0 -35
  51. data/lib/eventifier/notification.rb +0 -40
  52. data/spec/support/blueprints.rb +0 -24
data/lib/eventifier.rb CHANGED
@@ -4,14 +4,10 @@
4
4
  # Consider implementing with http://www.ruby-doc.org/stdlib-1.9.3/libdoc/observer/rdoc/Observable.html
5
5
 
6
6
 
7
-
8
7
  # init.rb
9
8
  # require 'eventifer'
10
9
 
11
10
 
12
-
13
-
14
-
15
11
  # Todo
16
12
  # - Notifications
17
13
 
@@ -28,15 +24,17 @@
28
24
  # end
29
25
  #
30
26
  # end
31
-
32
- require 'active_record'
33
27
  require 'action_mailer'
34
28
 
35
- require 'eventifier/event'
29
+ if defined? Mongoid
30
+ require 'eventifier/mongoid_support'
31
+ elsif defined? ActiveRecord
32
+ require 'eventifier/active_record_support'
33
+ end
34
+
36
35
  require 'eventifier/helper_methods'
37
- require 'eventifier/notification'
38
36
  require 'eventifier/notification_mailer'
39
37
  require 'eventifier/notification_helper'
40
38
  require 'eventifier/event_helper'
41
- require 'eventifier/event_observer'
42
- require 'eventifier/event_tracking'
39
+ require 'eventifier/event_tracking'
40
+
@@ -17,7 +17,7 @@ module Eventifier
17
17
  end
18
18
 
19
19
  def generate_migration
20
- migration_template "migration.rb", "db/migrate/eventifier_setup.rb"
20
+ migration_template "migration.rb", "db/migrate/eventifier_setup.rb" if defined?(ActiveRecord)
21
21
  end
22
22
 
23
23
  end
@@ -3,55 +3,65 @@ require 'spec_helper'
3
3
  describe Eventifier::EventHelper do
4
4
 
5
5
  class TestClass
6
- def self.helper_method(*args); end
6
+ def self.helper_method(*args)
7
+ end
8
+
7
9
  include Eventifier::EventHelper
8
10
  end
9
11
 
12
+ let(:verb) { "update" }
13
+ let(:change_data) { { } }
14
+ let(:event) { double("Event", :verb => verb, :eventable_type => "Object", :change_data => change_data, :user => double("user", :name => "Willy")) }
10
15
  let!(:helper) { TestClass.new }
11
16
 
12
17
  before do
13
- @event_strings = {
14
- :post => {
15
- :create => "{{user.name}} just created a new post - you should check it out",
16
- :destroy => "{{user.name}} just deleted a post",
17
- :update => {
18
- :single => "{{user.name}} made a change to their post",
19
- :multiple => "{{user.name}} made some changes to their post"
20
- }
21
- }
22
- }
23
- I18n.backend.store_translations :en, :events => @event_strings
18
+ helper.stub :replace_vars => double("String", :html_safe => true)
24
19
  end
25
20
 
26
21
  describe ".event_message" do
27
- it "should return the I18n message for that event" do
28
- event = Eventifier::Event.make! :eventable => Post.make!, :verb => :create
29
- helper.event_message(event).should == "<strong>#{event.user.name}</strong> just created a new post - you should check it out"
30
- end
22
+ subject { helper.event_message event }
31
23
 
32
- it "should return a message specific to a single change if only 1 change has been made" do
33
- event = Eventifier::Event.make! :eventable => Post.make!, :verb => :update, :change_data => { :name => ["Fred", "Mike"] }
34
- helper.event_message(event).should == "<strong>#{event.user.name}</strong> made a change to their post"
35
- end
24
+ context "with event verb create" do
25
+ let(:verb) { "create" }
26
+
27
+ it "should hit the I18n verb definition for create & destroy" do
28
+ I18n.should_receive(:translate).with("events.object.create", :default => :"events.default.create", "user.name" => "Willy", :"event.type" => "Object")
36
29
 
37
- it "should return a message specific to multiple changes if more than 1 change has been made" do
38
- event = Eventifier::Event.make! :eventable => Post.make!, :verb => :update, :change_data => { :name => ["Fred", "Mike"], :age => [55, 65] }
39
- helper.event_message(event).should == "<strong>#{event.user.name}</strong> made some changes to their post"
30
+ subject
31
+ end
32
+
33
+ it "should pass the I18n translation to the replace_vars method" do
34
+ I18n.should_receive(:translate).with("events.object.create", :default => :"events.default.create", "user.name" => "Willy", :"event.type" => "Object").and_return("A message")
35
+ helper.should_receive(:replace_vars).with "A message", event
36
+
37
+ subject
38
+ end
40
39
  end
41
40
 
42
- it "should return the default I18n message if one doesn't exist" do
43
- I18n.backend.reload!
44
- @event_strings = {
45
- :default => {
46
- :create => "{{user.name}} created a {{eventable_type}}",
47
- :update => "{{user.name}} updated a {{eventable_type}}"
48
- }
49
- }
50
- I18n.backend.store_translations :test, :events => @event_strings
51
- I18n.with_locale("test") do
52
- event = Eventifier::Event.make! :eventable => Post.make!, :verb => :create
53
- helper.event_message(event).should == "<strong>#{event.user.name}</strong> created a <strong>Post</strong>"
41
+ context "with event verb update" do
42
+ let(:verb) { "update" }
43
+
44
+ context "multiple updates" do
45
+ let(:change_data) { { :name => ["Lol", "Omg Lol"] } }
46
+
47
+ it "should specify single on the verb for the I18n definition on update when there are just a single change" do
48
+ I18n.should_receive(:translate).with("events.object.update.single", :default => :"events.default.update", "user.name" => "Willy", :"event.type" => "Object")
49
+
50
+ subject
51
+ end
52
+ end
53
+
54
+ context "multiple updates" do
55
+ let(:change_data) { { :name => ["Lol", "Omg Lol"], :address => ["old", "new"] } }
56
+
57
+ it "should specify single on the verb for the I18n definition on update when there are just a single change" do
58
+ I18n.should_receive(:translate).with("events.object.update.multiple", :default => :"events.default.update", "user.name" => "Willy", :"event.type" => "Object")
59
+
60
+ subject
61
+ end
62
+
54
63
  end
55
64
  end
65
+
56
66
  end
57
67
  end
@@ -1,14 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Eventifier::EventObserver do
4
-
5
- describe "#add_notification" do
6
- pending
7
- end
4
+ subject { Eventifier::EventObserver.instance }
8
5
 
9
6
  describe "#method_from_relation" do
10
- subject { Eventifier::EventObserver.instance }
11
-
12
7
  it "should call the string as a method when passed a string" do
13
8
  object = double('object', :mouse => 5)
14
9
 
data/spec/event_spec.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Eventifier::Event do
4
- let(:event) { Eventifier::Event.make! }
4
+ let(:event) { Fabricate(:event) }
5
5
 
6
6
  describe "#valid?" do
7
7
  pending
@@ -10,14 +10,25 @@ describe Eventifier::Event do
10
10
  #it_requires_a :verb
11
11
  end
12
12
 
13
- describe ".find_all_by_eventable" do
13
+ describe '.add_url' do
14
+ it "should send add_url to each of it's observers with params" do
15
+ url_proc = -> activity { [activity.group, activity] }
16
+ observer = double('Observer')
17
+ Eventifier::Event.stub :observer_instances => [observer]
18
+
19
+ observer.should_receive(:add_url).with(Object, url_proc)
20
+
21
+ Eventifier::Event.add_url Object, url_proc
22
+ end
23
+ end
14
24
 
15
- let!(:eventable) {Post.make!}
16
- let(:event) {Eventifier::Event.make! :eventable => eventable}
25
+ describe ".find_all_by_eventable" do
26
+ let!(:eventable) { Fabricate(:post) }
27
+ let(:event) { Fabricate(:event, :eventable => eventable) }
17
28
 
18
29
  it "should find the associated polymorphic eventable object" do
19
30
  lambda do
20
- Eventifier::Event.make! :eventable => Post.make!
31
+ Fabricate(:event, :eventable => Fabricate(:post))
21
32
  event
22
33
  end.should change(Eventifier::Event, :count).by(2)
23
34
 
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ class Activity; end
4
+
5
+ describe Eventifier::EventTracking do
6
+ let(:event_tracker) { Object.new.extend(Eventifier::EventTracking) }
7
+
8
+ describe ".url" do
9
+ it "should at the url form to a hash" do
10
+ url_proc = -> activity { [activity.group, activity] }
11
+ event_tracker.instance_variable_set(:@klasses, [Activity])
12
+
13
+ event_tracker.url url_proc
14
+
15
+ Eventifier::EventTracking.url_mappings[:activity].should == url_proc
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -1,16 +1,11 @@
1
1
  require 'spec_helper'
2
-
3
2
  describe Eventifier::EventTracking do
4
3
 
5
- let(:user) { User.make }
4
+ let(:user) { Fabricate(:user) }
6
5
  let(:test_class) { Post }
7
- let(:object) { test_class.make }
6
+ let(:object) { Fabricate.build(:post) }
8
7
  let(:event_tracker) { Object.new.extend(Eventifier::EventTracking) }
9
8
 
10
- after :all do
11
- Post.observers.disable :all
12
- end
13
-
14
9
  describe ".initialize" do
15
10
 
16
11
  it "should start" do
@@ -48,7 +43,7 @@ describe Eventifier::EventTracking do
48
43
 
49
44
 
50
45
  it "should create an event with the relevant info" do
51
- changes = {:foo => 'bar', :bar => 'baz'}
46
+ changes = { :foo => 'bar', :bar => 'baz' }
52
47
  object.stub(:changes).and_return(changes)
53
48
 
54
49
  Eventifier::Event.should_receive(:create).with(:user => user, :eventable => object, :verb => :create, :change_data => changes)
@@ -61,28 +56,28 @@ describe Eventifier::EventTracking do
61
56
 
62
57
  describe '#create_event' do
63
58
  let(:object) { double('object', :changes => changes, :user => double(User)) }
64
- let(:changes) { {:foo => 'bar', :bar => 'baz', :bob => 'blah'} }
65
- let(:options) { {} }
59
+ let(:changes) { { :foo => 'bar', :bar => 'baz', :bob => 'blah' } }
60
+ let(:options) { { } }
66
61
 
67
62
  subject { Eventifier::Event.create_event(:create, object, options) }
68
63
 
69
64
  describe "exclude" do
70
- let(:options) { {:except => ['foo']} }
65
+ let(:options) { { :except => ['foo'] } }
71
66
 
72
67
  it 'should exclude the right attrs' do
73
68
  Eventifier::Event.should_receive(:create) do |attrs|
74
- attrs[:change_data].should == {:bar => 'baz', :bob => 'blah'}
69
+ attrs[:change_data].should == { :bar => 'baz', :bob => 'blah' }
75
70
  end
76
71
  subject
77
72
  end
78
73
 
79
74
  end
80
75
  describe "only" do
81
- let(:options) { {:only => ['foo']} }
76
+ let(:options) { { :only => ['foo'] } }
82
77
 
83
78
  it 'should exclude the right attrs' do
84
79
  Eventifier::Event.should_receive(:create) do |attrs|
85
- attrs[:change_data].should == {:foo => 'bar'}
80
+ attrs[:change_data].should == { :foo => 'bar' }
86
81
  end
87
82
  subject
88
83
  end
@@ -104,11 +99,11 @@ describe Eventifier::EventTracking do
104
99
  end
105
100
 
106
101
  it "should create an event with the relevant info" do
107
- changes = {:foo => 'bar', :bar => 'baz'}
102
+ changes = { :foo => 'bar', :bar => 'baz' }
108
103
  object.stub(:changes).and_return(changes)
109
104
  event_tracker.events_for test_class do
110
- track_on [:create, :destroy], :attributes => {:except => %w(updated_at)}
111
- track_on :update, :attributes => {:except => %w(updated_at)}
105
+ track_on [:create, :destroy], :attributes => { :except => %w(updated_at) }
106
+ track_on :update, :attributes => { :except => %w(updated_at) }
112
107
  end
113
108
 
114
109
  Eventifier::Event.should_receive(:create).with(:user => user, :eventable => object, :verb => :create, :change_data => changes)
@@ -120,60 +115,61 @@ describe Eventifier::EventTracking do
120
115
  event_tracker.should_receive(:track_on).exactly(2).times
121
116
 
122
117
  event_tracker.events_for test_class do
123
- track_on [:create, :destroy], :attributes => {:except => %w(updated_at)}
124
- track_on :update, :attributes => {:except => %w(updated_at)}
118
+ track_on [:create, :destroy], :attributes => { :except => %w(updated_at) }
119
+ track_on :update, :attributes => { :except => %w(updated_at) }
125
120
  end
126
121
  end
127
- end
128
122
 
129
- context "notifying" do
130
- before do
131
- @event_observer_instance = Eventifier::EventObserver.instance
132
- end
123
+ context "notifying" do
124
+ before do
125
+ @event_observer_instance = Eventifier::EventObserver.instance
126
+ Eventifier::EventObserver.any_instance.stub post_path: '/post'
127
+ end
133
128
 
134
- describe "#add_notification" do
129
+ describe "#add_notification" do
135
130
 
136
- it "should add the notification to the notification hash" do
137
- @event_observer_instance.should_receive(:add_notification).with(test_class, :user, :create)
131
+ it "should add the notification to the notification hash" do
132
+ @event_observer_instance.should_receive(:add_notification).with(test_class, :user, :create)
138
133
 
139
- event_tracker.events_for test_class do
140
- track_on :create, :attributes => {:except => %w(updated_at)}
141
- notify :user, :on => :create
134
+ event_tracker.events_for test_class do
135
+ track_on :create, :attributes => { :except => %w(updated_at) }
136
+ notify :user, :on => :create
137
+ end
142
138
  end
143
139
  end
144
- end
145
140
 
146
- it "should notify users when passed a hash" do
147
- subscriber = double('user')
141
+ it "should notify users when passed a hash" do
142
+ subscriber = double('user')
148
143
 
149
- object.stub :category => double('category', :subscribers => [subscriber])
144
+ object.stub :category => double('category', :subscribers => [subscriber])
150
145
 
151
- Eventifier::Notification.should_receive(:create) do |args|
152
- args[:user].should == subscriber
153
- args[:event].eventable.should == object
154
- end
146
+ Eventifier::Notification.should_receive(:create) do |args|
147
+ args[:user].should == subscriber
148
+ args[:event].eventable.should == object
149
+ end
155
150
 
156
- event_tracker.events_for test_class do
157
- track_on :create, :attributes => {:except => %w(updated_at)}
158
- notify :category => :subscribers, :on => :create
151
+ event_tracker.events_for test_class do
152
+ track_on :create, :attributes => { :except => %w(updated_at) }
153
+ notify :category => :subscribers, :on => :create
154
+ end
155
+
156
+ object.save
159
157
  end
160
158
 
161
- object.save
162
- end
163
159
 
160
+ it "should create a notification" do
161
+ Eventifier::Notification.should_receive(:create)
162
+ object.stub(:readers => [Fabricate.build(:user)])
163
+ event_tracker.events_for test_class do
164
+ track_on :create, :attributes => { :except => %w(updated_at) }
165
+ notify :readers, :on => :create
166
+ end
164
167
 
165
- it "should create a notification" do
166
- Eventifier::Notification.should_receive(:create)
167
- object.stub(:users => [User.make])
168
- event_tracker.events_for test_class do
169
- track_on :create, :attributes => {:except => %w(updated_at)}
170
- notify :readers, :on => :create
168
+ object.save
171
169
  end
172
170
 
173
- object.save
174
171
  end
175
-
176
172
  end
177
- end
178
173
 
174
+ end
179
175
  end
@@ -0,0 +1,31 @@
1
+ require 'eventifier'
2
+
3
+
4
+ Fabricator(:event, :class_name => Eventifier::Event) do
5
+ user!
6
+ eventable!(:fabricator => :post)
7
+ verb :update
8
+ change_data { { :date => [5.days.ago, 3.days.ago] } }
9
+ end
10
+
11
+ Fabricator(:ghost, :class_name => Eventifier::Ghost) do
12
+ ghost_class { "Post" }
13
+ ghost_id { 123 }
14
+ data_hash { Fabricate.attributes_for(:post) }
15
+ end
16
+
17
+ Fabricator(:notification, :class_name => Eventifier::Notification) do
18
+ event! { Fabricate(:event) }
19
+ user!
20
+ end
21
+
22
+ Fabricator(:post, :class_name => Post) do
23
+ title { "My amazing blog post" }
24
+ body { "A deep and profound analysis of life" }
25
+ author! { Fabricate(:user) }
26
+ end
27
+
28
+ Fabricator(:user, :class_name => User) do
29
+ name { "Billy #{sequence(:name, 1)}" }
30
+ email{ "billy#{sequence(:email, 1)}@email.com" }
31
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Eventifier::Ghost do
4
+
5
+ it_requires_a :ghost_class
6
+ it_requires_a :ghost_id
7
+ it_requires_a :data_hash
8
+
9
+ describe ".create_from_object" do
10
+ subject { Eventifier::Ghost }
11
+ let(:post) { Fabricate(:post) }
12
+
13
+ it "should create a ghost when passed an object" do
14
+ subject.should_receive(:create).with(:ghost_class => "Post", :ghost_id => post.id, :data_hash => post.serializable_hash)
15
+
16
+ subject.create_from_object(post)
17
+ end
18
+ end
19
+
20
+ describe "#ghost" do
21
+ let(:post) { Fabricate.build(:post, :id => 123) }
22
+ subject { Fabricate.build(:ghost, :data_hash => post.serializable_hash) }
23
+
24
+ it "should be an object with the attributes of the undeleted object" do
25
+ subject.ghost.class.should == Post
26
+ subject.ghost.attributes.except("_type").should == post.serializable_hash
27
+ end
28
+ end
29
+
30
+ end
@@ -10,7 +10,7 @@ describe Eventifier::EventHelper do
10
10
  let!(:helper) { TestClass.new }
11
11
 
12
12
  describe ".replace_vars" do
13
- let(:event) { Eventifier::Event.make }
13
+ let(:event) { Fabricate.build(:event)}
14
14
 
15
15
  it "should replace {{stuff}} with awesome" do
16
16
  message = "I'm really loving {{eventable.title}}"
@@ -26,7 +26,7 @@ describe Eventifier::EventHelper do
26
26
  describe ".load_event_for_template" do
27
27
 
28
28
  it "should add some handy methods to an event instance" do
29
- event = Eventifier::Event.make!
29
+ event = Fabricate(:event)
30
30
  event = helper.load_event_for_template event
31
31
  event.object.should == event.eventable
32
32
  event.object_type.should == event.eventable_type
@@ -1,67 +1,108 @@
1
+ require 'spec_helper'
1
2
 
2
3
  describe Eventifier do
3
- let(:post) { mock_model('Post', :group => group) }
4
- let(:group) { double('group', :user => owner,
5
- :members => [owner, member]) }
6
- let(:owner) { User.make! }
7
- let(:member) { double('member') }
8
-
9
- before :each do
10
- Eventifier::Notification.stub :create => true
11
- end
4
+ let(:post) { Fabricate(:post, :author => owner) }
5
+ let(:owner) { Fabricate(:user) }
6
+ let(:reader1) { Fabricate(:user) }
7
+ let(:reader2) { Fabricate(:user) }
12
8
 
13
- context 'a new post' do
14
- let(:event) { Eventifier::Event.new :eventable => post, :verb => :create,
15
- :user => owner }
16
-
17
- it "notifies the members of the group" do
18
- Eventifier::Notification.should_receive(:create).
19
- with(:user => member, :event => event)
20
- ActiveRecord::Observer.with_observers(Eventifier::EventObserver) do
21
- event.save
22
- end
9
+
10
+ let(:event_tracker) { Object.new.extend(Eventifier::EventTracking) }
11
+
12
+
13
+ before do
14
+ Eventifier::NotificationMailer.any_instance.stub main_app: double('app', url_for: true)
15
+ post.stub(:readers => [owner, reader1, reader2])
16
+
17
+ event_tracker.events_for Post do
18
+ track_on [:create, :update], :attributes => { :except => %w(updated_at) }
19
+ notify :readers, :on => [:create, :update]
23
20
  end
21
+ end
24
22
 
25
- it "does not notify the person initiating the event" do
26
- Eventifier::Notification.should_not_receive(:create).
27
- with(:user => owner, :event => event)
23
+ context 'a new post' do
24
+ let(:post) { Fabricate.build(:post, :author => owner) }
28
25
 
29
- event.save
26
+ it "notifies only the readers of the post" do
27
+ Eventifier::Notification.should_receive(:create).twice do |args|
28
+ args[:event].verb.should == :create
29
+ [reader1, reader2].should include(args[:user])
30
+ end
31
+ post.save
30
32
  end
31
33
  end
32
34
 
33
35
  context 'an existing post' do
36
+ let(:post) { Fabricate(:post, :author => owner) }
34
37
  let(:event) { Eventifier::Event.new :eventable => post, :verb => :update,
35
- :user => owner }
36
- let(:guest) { double('guest') }
38
+ :user => owner }
37
39
 
38
- before :each do
39
- post.group.stub :members => [owner, guest]
40
+ it "notifies the readers of the post" do
41
+ Eventifier::Notification.should_receive(:create).twice do |args|
42
+ args[:event].verb.should == :update
43
+ [reader1, reader2].should include(args[:user])
44
+ end
45
+ post.update_attribute(:title, 'something else')
40
46
  end
41
47
 
42
- it "notifies the members of the post" do
43
- Eventifier::Notification.should_receive(:create).
44
- with(:user => guest, :event => event)
45
- ActiveRecord::Observer.with_observers(Eventifier::EventObserver) do
46
- event.save
47
- end
48
+ it "should create a notification for readers of a post when it's changed" do
49
+ lambda { post.update_attribute(:title, 'somethang') }.should change(reader1.notifications, :count).by(1)
48
50
  end
51
+ end
49
52
 
50
- it "does not notify the person initiating the event" do
51
- Eventifier::Notification.should_not_receive(:create).
52
- with(:user => owner, :event => event)
53
+ context "helper method" do
53
54
 
54
- ActiveRecord::Observer.with_observers(Eventifier::EventObserver) do
55
- event.save
55
+ class TestClass
56
+ def self.helper_method(*args)
56
57
  end
58
+
59
+ include Eventifier::EventHelper
60
+ end
61
+
62
+ let!(:helper) { TestClass.new }
63
+ before do
64
+ @event_strings = {
65
+ :post => {
66
+ :create => "{{user.name}} just created a new post - you should check it out",
67
+ :destroy => "{{user.name}} just deleted a post",
68
+ :update => {
69
+ :single => "{{user.name}} made a change to their post",
70
+ :multiple => "{{user.name}} made some changes to their post"
71
+ }
72
+ }
73
+ }
74
+ I18n.backend.store_translations :en, :events => @event_strings
75
+ end
76
+
77
+ it "should return the I18n message for that event" do
78
+ event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :create)
79
+ helper.event_message(event).should == "<strong>#{event.user.name}</strong> just created a new post - you should check it out"
57
80
  end
58
- end
59
-
60
- it "should create a notification for users of a post when it's changed" do
61
- post = event.eventable
62
- user = User.make!
63
81
 
64
- lambda { post.update_attribute :date, 5.days.from_now }.should change(user.notifications, :count).by(1)
82
+ it "should return a message specific to a single change if only 1 change has been made" do
83
+ event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :name => ["Fred", "Mike"] })
84
+ helper.event_message(event).should == "<strong>#{event.user.name}</strong> made a change to their post"
85
+ end
86
+
87
+ it "should return a message specific to multiple changes if more than 1 change has been made" do
88
+ event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :name => ["Fred", "Mike"], :age => [55, 65] })
89
+ helper.event_message(event).should == "<strong>#{event.user.name}</strong> made some changes to their post"
90
+ end
91
+
92
+ it "should return the default I18n message if one doesn't exist" do
93
+ I18n.backend.reload!
94
+ @event_strings = {
95
+ :default => {
96
+ :create => "{{user.name}} created a {{eventable_type}}",
97
+ :update => "{{user.name}} updated a {{eventable_type}}"
98
+ }
99
+ }
100
+ I18n.backend.store_translations :test, :events => @event_strings
101
+ I18n.with_locale("test") do
102
+ event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :create)
103
+ helper.event_message(event).should == "<strong>#{event.user.name}</strong> created a <strong>Post</strong>"
104
+ end
105
+ end
65
106
  end
66
107
 
67
108
  end