eventifier 0.0.7 → 0.0.8
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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +7 -8
- data/Gemfile +1 -1
- data/README.textile +44 -3
- data/app/assets/images/eventifier/notifications-bell.png +0 -0
- data/app/assets/images/eventifier/notifications-tower.png +0 -0
- data/app/assets/javascripts/eventifier/notifications.coffee +196 -0
- data/app/assets/javascripts/eventifier/templates/dropdown.hamlc +10 -0
- data/app/assets/javascripts/eventifier/templates/settings.hamlc +11 -0
- data/app/assets/stylesheets/eventifier/notifications.scss +167 -0
- data/app/controllers/eventifier/application_controller.rb +4 -0
- data/app/controllers/eventifier/notifications_controller.rb +36 -0
- data/app/controllers/eventifier/preferences_controller.rb +19 -0
- data/app/helpers/eventifier/notification_helper.rb +87 -0
- data/app/helpers/eventifier/path_helper.rb +15 -0
- data/app/mailers/eventifier/mailer.rb +12 -0
- data/app/models/event_tracking.rb +3 -0
- data/app/models/eventifier/event.rb +22 -0
- data/app/models/eventifier/ghost.rb +21 -0
- data/app/models/eventifier/notification.rb +38 -0
- data/app/models/eventifier/notification_setting.rb +14 -0
- data/app/views/eventifier/_notification.haml +1 -0
- data/app/views/eventifier/email/_notification.haml +2 -0
- data/app/views/eventifier/mailer/notifications.haml +5 -0
- data/app/views/eventifier/notifications/index.jbuilder +6 -0
- data/config/routes.rb +7 -0
- data/config.ru +7 -0
- data/{lib/generators/eventifier/install/templates/migration.rb → db/migrate/1_eventifier_setup.rb} +2 -3
- data/db/migrate/2_eventifier_notification_settings.rb +11 -0
- data/db/migrate/3_notification_sent_status.rb +15 -0
- data/db/migrate/4_event_groupable.rb +19 -0
- data/eventifier.gemspec +12 -15
- data/lib/eventifier/delivery.rb +59 -0
- data/lib/eventifier/{railtie.rb → engine.rb} +4 -2
- data/lib/eventifier/event_subscriber.rb +44 -0
- data/lib/eventifier/event_tracking.rb +5 -58
- data/lib/eventifier/mailers/helpers.rb +70 -0
- data/lib/eventifier/notifier/notification_mapping.rb +34 -0
- data/lib/eventifier/notifier/notification_subscriber.rb +23 -0
- data/lib/eventifier/notifier/notifier.rb +21 -0
- data/lib/eventifier/preferences.rb +44 -0
- data/lib/eventifier/relationship.rb +36 -0
- data/lib/eventifier/trackable_class.rb +74 -0
- data/lib/eventifier/tracker.rb +18 -0
- data/lib/eventifier.rb +35 -11
- data/lib/generators/eventifier/install/install_generator.rb +2 -5
- data/lib/generators/eventifier/install/templates/events.en.yaml +1 -0
- data/lib/tasks/email.rake +8 -0
- data/spec/controllers/eventifier/notifications_controller_spec.rb +24 -0
- data/spec/controllers/eventifier/preferences_controller_spec.rb +56 -0
- data/spec/eventifier/delivery_spec.rb +110 -0
- data/spec/eventifier/preferences_spec.rb +69 -0
- data/spec/eventifier/relationship_spec.rb +33 -0
- data/spec/eventifier_spec.rb +6 -48
- data/spec/fabricators/fabricator.rb +11 -11
- data/spec/helpers/eventifier/notification_helper_spec.rb +169 -0
- data/spec/helpers/eventifier/path_helper_spec.rb +19 -0
- data/spec/integration/eventifier_spec.rb +113 -70
- data/spec/integration/internationalisation_spec.rb +39 -0
- data/spec/internal/app/controllers/application_controller.rb +3 -0
- data/spec/internal/app/lib/event_tracking.rb +12 -0
- data/spec/internal/app/models/category.rb +3 -0
- data/spec/internal/app/models/post.rb +8 -0
- data/spec/internal/app/models/subscription.rb +4 -0
- data/spec/internal/app/models/user.rb +4 -0
- data/spec/internal/app/views/eventifier/dropdown/_awesome_object.haml +0 -0
- data/spec/internal/config/database.yml +4 -0
- data/spec/internal/config/initializers/eventifier.rb +1 -0
- data/spec/internal/config/locales/events.en.yml +20 -0
- data/spec/internal/config/routes.rb +5 -0
- data/spec/internal/db/schema.rb +31 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/internal/public/favicon.ico +0 -0
- data/spec/models/eventifier/event_spec.rb +23 -0
- data/spec/{ghost_spec.rb → models/eventifier/ghost_spec.rb} +3 -3
- data/spec/{notification_spec.rb → models/eventifier/notification_spec.rb} +1 -9
- data/spec/notification_mailer_spec.rb +8 -4
- data/spec/notifier/notification_mapping_spec.rb +28 -0
- data/spec/spec_helper.rb +14 -8
- data/spec/support/controller_helpers.rb +14 -0
- metadata +205 -128
- data/Gemfile.lock +0 -97
- data/lib/eventifier/active_record/event.rb +0 -10
- data/lib/eventifier/active_record/event_observer.rb +0 -8
- data/lib/eventifier/active_record/event_tracking.rb +0 -11
- data/lib/eventifier/active_record/ghost.rb +0 -9
- data/lib/eventifier/active_record/notification.rb +0 -13
- data/lib/eventifier/active_record_support.rb +0 -5
- data/lib/eventifier/event_helper.rb +0 -40
- data/lib/eventifier/event_mixin.rb +0 -45
- data/lib/eventifier/event_observer_mixin.rb +0 -44
- data/lib/eventifier/ghost_mixin.rb +0 -27
- data/lib/eventifier/helper_methods.rb +0 -36
- data/lib/eventifier/mongoid/event.rb +0 -16
- data/lib/eventifier/mongoid/event_observer.rb +0 -7
- data/lib/eventifier/mongoid/event_tracking.rb +0 -13
- data/lib/eventifier/mongoid/ghost.rb +0 -15
- data/lib/eventifier/mongoid/notification.rb +0 -19
- data/lib/eventifier/mongoid/user_patch.rb +0 -3
- data/lib/eventifier/mongoid_support.rb +0 -6
- data/lib/eventifier/notification_helper.rb +0 -42
- data/lib/eventifier/notification_mailer.rb +0 -18
- data/lib/eventifier/notification_mixin.rb +0 -50
- data/lib/eventifier/version.rb +0 -3
- data/spec/event_helper_spec.rb +0 -67
- data/spec/event_observer_spec.rb +0 -20
- data/spec/event_spec.rb +0 -39
- data/spec/helper_methods_spec.rb +0 -36
- data/spec/notification_helper_spec.rb +0 -65
- data/spec/support/action_mailer.rb +0 -3
- data/spec/support/database_cleaner.rb +0 -3
- data/spec/test_classes/active_record_support.rb +0 -72
- data/spec/test_classes/mongoid_support.rb +0 -34
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Eventifier::NotificationHelper do
|
|
4
|
+
before do
|
|
5
|
+
I18n.backend.store_translations :en, :notifications => {
|
|
6
|
+
:post => {
|
|
7
|
+
:create => "{{user.name}} just created an Post - you should check it out",
|
|
8
|
+
:destroy => "{{user.name}} just deleted an Post",
|
|
9
|
+
:update => {
|
|
10
|
+
:single => "{{user.name}} made a change to their Post",
|
|
11
|
+
:multiple => "{{user.name}} made some changes to their Post",
|
|
12
|
+
:attributes => {
|
|
13
|
+
:deleted_at => "{{user.name}} deleted their Post"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "#notification_message" do
|
|
21
|
+
it "should return the I18n message for that event" do
|
|
22
|
+
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :create)
|
|
23
|
+
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> just created an Post - you should check it out"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should return a message specific to a single change if only 1 change has been made" do
|
|
27
|
+
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :name => ["Fred", "Mike"] })
|
|
28
|
+
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> made a change to their Post"
|
|
29
|
+
end
|
|
30
|
+
it "should return a message specific to a particular field change if configuration is present" do
|
|
31
|
+
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :deleted_at => [nil, Time.now] })
|
|
32
|
+
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> deleted their Post"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should return a message specific to multiple changes if more than 1 change has been made" do
|
|
36
|
+
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :name => ["Fred", "Mike"], :age => [55, 65] })
|
|
37
|
+
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> made some changes to their Post"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should return the default I18n message if one doesn't exist" do
|
|
41
|
+
I18n.backend.reload!
|
|
42
|
+
@notification_strings = {
|
|
43
|
+
:default => {
|
|
44
|
+
:create => "{{user.name}} created a {{eventable_type}}",
|
|
45
|
+
:update => "{{user.name}} updated a {{eventable_type}}"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
I18n.backend.store_translations :test, :notifications => @notification_strings
|
|
49
|
+
I18n.with_locale("test") do
|
|
50
|
+
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :create)
|
|
51
|
+
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> created a <strong>Post</strong>"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe "replacing vars" do
|
|
57
|
+
|
|
58
|
+
class TestClass
|
|
59
|
+
def self.helper_method(*args); end
|
|
60
|
+
include Eventifier::NotificationHelper
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
let!(:helper) { TestClass.new }
|
|
64
|
+
|
|
65
|
+
describe ".replace_vars" do
|
|
66
|
+
let(:event) { Fabricate.build(:event)}
|
|
67
|
+
|
|
68
|
+
it "should replace {{stuff}} with awesome" do
|
|
69
|
+
message = "I'm really loving {{eventable.title}}"
|
|
70
|
+
helper.replace_vars(message, event).should == "I'm really loving <strong>#{event.eventable.title}</strong>"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "should replace multiple {{stuff}} with multiple awesome" do
|
|
74
|
+
message = "I'm really loving {{eventable.title}} and all {{eventable.class.name}}s"
|
|
75
|
+
helper.replace_vars(message, event).should == "I'm really loving <strong>#{event.eventable.title}</strong> and all <strong>Post</strong>s"
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe ".load_event_for_template" do
|
|
80
|
+
|
|
81
|
+
it "should add some handy methods to an event instance" do
|
|
82
|
+
event = Fabricate(:event)
|
|
83
|
+
event = helper.load_event_for_template event
|
|
84
|
+
event.object.should == event.eventable
|
|
85
|
+
event.object_type.should == event.eventable_type
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe ".event_message" do
|
|
92
|
+
let(:verb) { "update" }
|
|
93
|
+
let(:change_data) { { } }
|
|
94
|
+
let(:event) { double("Event", :verb => verb, :eventable_type => "Object", :change_data => change_data, :user => double("user", :name => "Willy")) }
|
|
95
|
+
let!(:helper) { TestClass.new }
|
|
96
|
+
|
|
97
|
+
before do
|
|
98
|
+
helper.stub :replace_vars => double("String", :html_safe => true)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
subject { helper.event_message event }
|
|
102
|
+
|
|
103
|
+
context "with event verb create" do
|
|
104
|
+
let(:verb) { "create" }
|
|
105
|
+
|
|
106
|
+
it "should hit the I18n verb definition for create & destroy" do
|
|
107
|
+
I18n.should_receive(:translate).with("events.object.create", :default => :"events.default.create", "user.name" => "Willy", :"event.type" => "Object")
|
|
108
|
+
|
|
109
|
+
subject
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "should pass the I18n translation to the replace_vars method" do
|
|
113
|
+
I18n.should_receive(:translate).with("events.object.create", :default => :"events.default.create", "user.name" => "Willy", :"event.type" => "Object").and_return("A message")
|
|
114
|
+
helper.should_receive(:replace_vars).with "A message", event
|
|
115
|
+
|
|
116
|
+
subject
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
context "with event verb update" do
|
|
121
|
+
let(:verb) { "update" }
|
|
122
|
+
|
|
123
|
+
context "multiple updates" do
|
|
124
|
+
let(:change_data) { { :name => ["Lol", "Omg Lol"] } }
|
|
125
|
+
|
|
126
|
+
it "should specify single on the verb for the I18n definition on update when there are just a single change" do
|
|
127
|
+
I18n.should_receive(:translate).with("events.object.update.single", :default => :"events.default.update", "user.name" => "Willy", :"event.type" => "Object")
|
|
128
|
+
|
|
129
|
+
subject
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
context "multiple updates" do
|
|
134
|
+
let(:change_data) { { :name => ["Lol", "Omg Lol"], :address => ["old", "new"] } }
|
|
135
|
+
|
|
136
|
+
it "should specify single on the verb for the I18n definition on update when there are just a single change" do
|
|
137
|
+
I18n.should_receive(:translate).with("events.object.update.multiple", :default => :"events.default.update", "user.name" => "Willy", :"event.type" => "Object")
|
|
138
|
+
|
|
139
|
+
subject
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
describe "replacing vars" do
|
|
146
|
+
describe ".replace_vars" do
|
|
147
|
+
let(:event) { Fabricate.build(:event)}
|
|
148
|
+
|
|
149
|
+
it "should replace {{stuff}} with awesome" do
|
|
150
|
+
message = "I'm really loving {{eventable.title}}"
|
|
151
|
+
helper.replace_vars(message, event).should == "I'm really loving <strong>#{event.eventable.title}</strong>"
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it "should replace multiple {{stuff}} with multiple awesome" do
|
|
155
|
+
message = "I'm really loving {{eventable.title}} and all {{eventable.class.name}}s"
|
|
156
|
+
helper.replace_vars(message, event).should == "I'm really loving <strong>#{event.eventable.title}</strong> and all <strong>Post</strong>s"
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
describe ".load_event_for_template" do
|
|
161
|
+
it "should add some handy methods to an event instance" do
|
|
162
|
+
event = Fabricate(:event)
|
|
163
|
+
event = helper.load_event_for_template event
|
|
164
|
+
event.object.should == event.eventable
|
|
165
|
+
event.object_type.should == event.eventable_type
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Eventifier::PathHelper do
|
|
4
|
+
let(:notification) { double(Eventifier::Notification, event: double(Eventifier::Event, eventable_type: 'AwesomeObject')) }
|
|
5
|
+
|
|
6
|
+
describe "partial_path" do
|
|
7
|
+
it "returns an app view path with context in the path" do
|
|
8
|
+
helper.partial_path(notification, :donkey).should == 'eventifier/donkey/notification'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "returns an app view if it's defined" do
|
|
12
|
+
helper.partial_path(notification, :dropdown).should == 'eventifier/dropdown/awesome_object'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "returns the default view if not defined" do
|
|
16
|
+
helper.partial_path(notification).should == 'eventifier/notification'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -1,108 +1,151 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Eventifier do
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
it "can list tracked classes" do
|
|
5
|
+
Object.new.extend(Eventifier::EventTracking).events_for Post do
|
|
6
|
+
track_on [:create, :update], :attributes => { :except => %w(updated_at) }
|
|
7
|
+
notify :readers, :on => [:create, :update]
|
|
8
|
+
end
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Eventifier.tracked_classes.should == [Post]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
11
13
|
|
|
14
|
+
describe 'event tracking' do
|
|
15
|
+
let(:owner) { Fabricate(:user) }
|
|
16
|
+
let(:reader1) { Fabricate(:user) }
|
|
17
|
+
let(:reader2) { Fabricate(:user) }
|
|
12
18
|
|
|
13
19
|
before do
|
|
14
|
-
|
|
15
|
-
|
|
20
|
+
ActionMailer::Base.deliveries.clear
|
|
21
|
+
|
|
22
|
+
post.readers = [owner, reader1, reader2]
|
|
16
23
|
|
|
17
|
-
|
|
24
|
+
Object.new.extend(Eventifier::EventTracking).events_for Post do
|
|
18
25
|
track_on [:create, :update], :attributes => { :except => %w(updated_at) }
|
|
19
26
|
notify :readers, :on => [:create, :update]
|
|
20
27
|
end
|
|
21
28
|
end
|
|
22
29
|
|
|
23
30
|
context 'a new post' do
|
|
24
|
-
let(:post)
|
|
31
|
+
let(:post) { Fabricate.build(:post, :author => owner) }
|
|
32
|
+
let(:event) {
|
|
33
|
+
Eventifier::Event.where(
|
|
34
|
+
:verb => :create, :user_id => owner.id,
|
|
35
|
+
:eventable_type => 'Post', :eventable_id => post.id
|
|
36
|
+
).first
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
it "logs an event" do
|
|
40
|
+
post.save
|
|
25
41
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
end
|
|
42
|
+
event.should be_present
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "does not store a notification for the post creator" do
|
|
31
46
|
post.save
|
|
47
|
+
|
|
48
|
+
Eventifier::Notification.where(
|
|
49
|
+
:event_id => event.id, :user_id => owner.id
|
|
50
|
+
).count.should == 0
|
|
32
51
|
end
|
|
33
|
-
end
|
|
34
52
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
args[:event].verb.should == :update
|
|
43
|
-
[reader1, reader2].should include(args[:user])
|
|
53
|
+
it "stores notifications for the reader" do
|
|
54
|
+
post.save
|
|
55
|
+
|
|
56
|
+
[reader1, reader2].each do |reader|
|
|
57
|
+
Eventifier::Notification.where(
|
|
58
|
+
:event_id => event.id, :user_id => reader.id
|
|
59
|
+
).count.should == 1
|
|
44
60
|
end
|
|
45
|
-
post.update_attribute(:title, 'something else')
|
|
46
61
|
end
|
|
47
62
|
|
|
48
|
-
it "
|
|
49
|
-
|
|
50
|
-
end
|
|
51
|
-
end
|
|
63
|
+
it "emails the readers with a notification" do
|
|
64
|
+
post.save
|
|
52
65
|
|
|
53
|
-
|
|
66
|
+
Eventifier::Delivery.deliver
|
|
54
67
|
|
|
55
|
-
|
|
56
|
-
|
|
68
|
+
[reader1, reader2].each do |reader|
|
|
69
|
+
ActionMailer::Base.deliveries.detect { |email|
|
|
70
|
+
email.to == [reader.email] &&
|
|
71
|
+
email.subject == 'You have received notifications'
|
|
72
|
+
}.should be_present
|
|
57
73
|
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "stores the post as the groupable object" do
|
|
77
|
+
post.save
|
|
58
78
|
|
|
59
|
-
|
|
79
|
+
event.groupable.should == post
|
|
60
80
|
end
|
|
61
81
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
82
|
+
it "deletes the event when the post is destroyed" do
|
|
83
|
+
post.save
|
|
84
|
+
post.destroy
|
|
85
|
+
|
|
86
|
+
Eventifier::Event.count.should be_zero
|
|
75
87
|
end
|
|
76
88
|
|
|
77
|
-
it "
|
|
78
|
-
|
|
79
|
-
|
|
89
|
+
it "deletes notifications belonging to an event" do
|
|
90
|
+
post.save
|
|
91
|
+
post.destroy
|
|
92
|
+
|
|
93
|
+
Eventifier::Notification.count.should be_zero
|
|
80
94
|
end
|
|
95
|
+
end
|
|
81
96
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
97
|
+
context 'an existing post' do
|
|
98
|
+
let(:post) { Fabricate(:post, :author => owner) }
|
|
99
|
+
let(:event) {
|
|
100
|
+
Eventifier::Event.where(
|
|
101
|
+
:verb => :update, :user_id => owner.id,
|
|
102
|
+
:eventable_type => 'Post', :eventable_id => post.id
|
|
103
|
+
).first
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
it "logs an event" do
|
|
107
|
+
post.update_attribute :title, 'somethang'
|
|
108
|
+
|
|
109
|
+
event.should be_present
|
|
85
110
|
end
|
|
86
111
|
|
|
87
|
-
it "
|
|
88
|
-
|
|
89
|
-
|
|
112
|
+
it "does not store a notification for the post creator" do
|
|
113
|
+
post.update_attribute(:title, 'something else')
|
|
114
|
+
|
|
115
|
+
Eventifier::Notification.where(
|
|
116
|
+
:event_id => event.id, :user_id => owner.id
|
|
117
|
+
).count.should == 0
|
|
90
118
|
end
|
|
91
119
|
|
|
92
|
-
it "
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
:
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
120
|
+
it "stores notifications for the reader" do
|
|
121
|
+
post.update_attribute(:title, 'something else')
|
|
122
|
+
|
|
123
|
+
[reader1, reader2].each do |reader|
|
|
124
|
+
Eventifier::Notification.where(
|
|
125
|
+
:event_id => event.id, :user_id => reader.id
|
|
126
|
+
).count.should == 1
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it "should create a notification for the reader when it's changed" do
|
|
131
|
+
post.update_attribute(:title, 'somethang')
|
|
132
|
+
|
|
133
|
+
[reader1, reader2].each do |reader|
|
|
134
|
+
reader.notifications.count.should == 1
|
|
104
135
|
end
|
|
105
136
|
end
|
|
106
|
-
end
|
|
107
137
|
|
|
108
|
-
|
|
138
|
+
it "emails the readers with a notification" do
|
|
139
|
+
post.update_attribute(:title, 'somethang')
|
|
140
|
+
|
|
141
|
+
Eventifier::Delivery.deliver
|
|
142
|
+
|
|
143
|
+
[reader1, reader2].each do |reader|
|
|
144
|
+
ActionMailer::Base.deliveries.detect { |email|
|
|
145
|
+
email.to == [reader.email] &&
|
|
146
|
+
email.subject == 'You have received notifications'
|
|
147
|
+
}.should be_present
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Internationalisation" do
|
|
4
|
+
class TestClass
|
|
5
|
+
include Eventifier::NotificationHelper
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
let!(:helper) { TestClass.new }
|
|
9
|
+
|
|
10
|
+
it "should return the I18n message for that event" do
|
|
11
|
+
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :create)
|
|
12
|
+
helper.event_message(event).should == "<strong class='user'>#{event.user.name}</strong> just created a new post - you should check it out"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should return a message specific to a single change if only 1 change has been made" do
|
|
16
|
+
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :name => ["Fred", "Mike"] })
|
|
17
|
+
helper.event_message(event).should == "<strong class='user'>#{event.user.name}</strong> made a change to their post"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should return a message specific to multiple changes if more than 1 change has been made" do
|
|
21
|
+
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :name => ["Fred", "Mike"], :age => [55, 65] })
|
|
22
|
+
helper.event_message(event).should == "<strong class='user'>#{event.user.name}</strong> made some changes to their post"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should return the default I18n message if one doesn't exist" do
|
|
26
|
+
I18n.backend.reload!
|
|
27
|
+
I18n.backend.store_translations :test, :events => {
|
|
28
|
+
:default => {
|
|
29
|
+
:create => "{{user.name}} created a {{eventable_type}}",
|
|
30
|
+
:update => "{{user.name}} updated a {{eventable_type}}"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
I18n.with_locale("test") do
|
|
35
|
+
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :create)
|
|
36
|
+
helper.event_message(event).should == "<strong class='user'>#{event.user.name}</strong> created a <strong>Post</strong>"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class EventTracking
|
|
2
|
+
include Eventifier::EventTracking
|
|
3
|
+
|
|
4
|
+
def initialize
|
|
5
|
+
# events_for Group do
|
|
6
|
+
# track_on [:create, :update, :destroy], :attributes => { :except => %w(updated_at) }
|
|
7
|
+
# notify :group => :members, :on => [:create, :update]
|
|
8
|
+
# end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
EventTracking.new
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Eventifier.mailer_sender = 'me@test.com'
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
en:
|
|
2
|
+
events:
|
|
3
|
+
default:
|
|
4
|
+
create: "{{user.name}} created a <strong>{{object_type}}</strong>"
|
|
5
|
+
update:
|
|
6
|
+
single: "{{user.name}} updated a {{object_type}}"
|
|
7
|
+
multiple: "{{user.name}} made some changes to a {{object_type}}"
|
|
8
|
+
post:
|
|
9
|
+
create: "{{user.name}} just created a new post - you should check it out"
|
|
10
|
+
destroy: "{{user.name}} just deleted a post"
|
|
11
|
+
update:
|
|
12
|
+
single: "{{user.name}} made a change to their post"
|
|
13
|
+
multiple: "{{user.name}} made some changes to their post"
|
|
14
|
+
notifications:
|
|
15
|
+
email_subject: "You have received notifications"
|
|
16
|
+
default:
|
|
17
|
+
create: "{{user.name}} created a <strong>{{object_type}}</strong>"
|
|
18
|
+
update:
|
|
19
|
+
single: "{{user.name}} updated a {{object_type}}"
|
|
20
|
+
multiple: "{{user.name}} made some changes to a {{object_type}}"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
ActiveRecord::Schema.define do
|
|
2
|
+
create_table :categories, :force => true do |t|
|
|
3
|
+
t.string :name
|
|
4
|
+
t.timestamps
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
create_table :ghosts, :force => true do |t|
|
|
8
|
+
t.string :ghost_class
|
|
9
|
+
t.integer :ghost_id
|
|
10
|
+
t.text :data_hash
|
|
11
|
+
|
|
12
|
+
t.timestamps
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
create_table :users, :force => true do |t|
|
|
16
|
+
t.column :name, :string
|
|
17
|
+
t.column :email, :string
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
create_table :posts, :force => true do |t|
|
|
21
|
+
t.column :title, :string
|
|
22
|
+
t.column :author_id, :integer
|
|
23
|
+
t.column :body, :text
|
|
24
|
+
t.column :category_id, :integer
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
create_table :subscriptions, :force => true do |t|
|
|
28
|
+
t.column :user_id, :integer
|
|
29
|
+
t.column :post_id, :integer
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*.log
|
|
File without changes
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Eventifier::Event do
|
|
4
|
+
let(:event) { Fabricate(:event) }
|
|
5
|
+
|
|
6
|
+
describe "#valid?" do
|
|
7
|
+
it_requires_a :user
|
|
8
|
+
it_requires_an :eventable
|
|
9
|
+
it_requires_a :verb
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe ".find_all_by_eventable" do
|
|
13
|
+
let(:eventable) { Fabricate(:user) }
|
|
14
|
+
let(:event) { Fabricate(:event, :eventable => eventable) }
|
|
15
|
+
|
|
16
|
+
it "should find the associated polymorphic eventable object" do
|
|
17
|
+
alpha = Fabricate :event, :eventable => eventable
|
|
18
|
+
beta = Fabricate :event, :eventable => Fabricate(:user)
|
|
19
|
+
|
|
20
|
+
Eventifier::Event.find_all_by_eventable(eventable).should == [alpha]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Eventifier::Ghost do
|
|
4
|
-
|
|
5
4
|
it_requires_a :ghost_class
|
|
6
5
|
it_requires_a :ghost_id
|
|
7
6
|
it_requires_a :data_hash
|
|
@@ -22,9 +21,10 @@ describe Eventifier::Ghost do
|
|
|
22
21
|
subject { Fabricate.build(:ghost, :data_hash => post.serializable_hash) }
|
|
23
22
|
|
|
24
23
|
it "should be an object with the attributes of the undeleted object" do
|
|
24
|
+
pending
|
|
25
|
+
|
|
25
26
|
subject.ghost.class.should == Post
|
|
26
27
|
subject.ghost.attributes.except("_type").should == post.serializable_hash
|
|
27
28
|
end
|
|
28
29
|
end
|
|
29
|
-
|
|
30
|
-
end
|
|
30
|
+
end
|
|
@@ -4,7 +4,7 @@ describe Eventifier::Notification do
|
|
|
4
4
|
let(:notification) { Fabricate(:notification) }
|
|
5
5
|
|
|
6
6
|
before do
|
|
7
|
-
Eventifier::
|
|
7
|
+
Eventifier::Mailer.any_instance.stub main_app: double('app', url_for: true)
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
describe '.expire_for_past_events!' do
|
|
@@ -47,14 +47,6 @@ describe Eventifier::Notification do
|
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
-
describe "#create" do
|
|
51
|
-
it "sends an email to the user" do
|
|
52
|
-
ActionMailer::Base.deliveries.clear
|
|
53
|
-
notification = Fabricate(:notification)
|
|
54
|
-
ActionMailer::Base.deliveries.count.should > 0
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
50
|
describe "#unread_for?" do
|
|
59
51
|
let(:user) { double(User, :notifications_last_read_at => last_read) }
|
|
60
52
|
subject { Fabricate.build(:notification, :created_at => Time.now).unread_for?(user) }
|