eventifier 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +7 -8
  4. data/Gemfile +1 -1
  5. data/README.textile +44 -3
  6. data/app/assets/images/eventifier/notifications-bell.png +0 -0
  7. data/app/assets/images/eventifier/notifications-tower.png +0 -0
  8. data/app/assets/javascripts/eventifier/notifications.coffee +196 -0
  9. data/app/assets/javascripts/eventifier/templates/dropdown.hamlc +10 -0
  10. data/app/assets/javascripts/eventifier/templates/settings.hamlc +11 -0
  11. data/app/assets/stylesheets/eventifier/notifications.scss +167 -0
  12. data/app/controllers/eventifier/application_controller.rb +4 -0
  13. data/app/controllers/eventifier/notifications_controller.rb +36 -0
  14. data/app/controllers/eventifier/preferences_controller.rb +19 -0
  15. data/app/helpers/eventifier/notification_helper.rb +87 -0
  16. data/app/helpers/eventifier/path_helper.rb +15 -0
  17. data/app/mailers/eventifier/mailer.rb +12 -0
  18. data/app/models/event_tracking.rb +3 -0
  19. data/app/models/eventifier/event.rb +22 -0
  20. data/app/models/eventifier/ghost.rb +21 -0
  21. data/app/models/eventifier/notification.rb +38 -0
  22. data/app/models/eventifier/notification_setting.rb +14 -0
  23. data/app/views/eventifier/_notification.haml +1 -0
  24. data/app/views/eventifier/email/_notification.haml +2 -0
  25. data/app/views/eventifier/mailer/notifications.haml +5 -0
  26. data/app/views/eventifier/notifications/index.jbuilder +6 -0
  27. data/config/routes.rb +7 -0
  28. data/config.ru +7 -0
  29. data/{lib/generators/eventifier/install/templates/migration.rb → db/migrate/1_eventifier_setup.rb} +2 -3
  30. data/db/migrate/2_eventifier_notification_settings.rb +11 -0
  31. data/db/migrate/3_notification_sent_status.rb +15 -0
  32. data/db/migrate/4_event_groupable.rb +19 -0
  33. data/eventifier.gemspec +12 -15
  34. data/lib/eventifier/delivery.rb +59 -0
  35. data/lib/eventifier/{railtie.rb → engine.rb} +4 -2
  36. data/lib/eventifier/event_subscriber.rb +44 -0
  37. data/lib/eventifier/event_tracking.rb +5 -58
  38. data/lib/eventifier/mailers/helpers.rb +70 -0
  39. data/lib/eventifier/notifier/notification_mapping.rb +34 -0
  40. data/lib/eventifier/notifier/notification_subscriber.rb +23 -0
  41. data/lib/eventifier/notifier/notifier.rb +21 -0
  42. data/lib/eventifier/preferences.rb +44 -0
  43. data/lib/eventifier/relationship.rb +36 -0
  44. data/lib/eventifier/trackable_class.rb +74 -0
  45. data/lib/eventifier/tracker.rb +18 -0
  46. data/lib/eventifier.rb +35 -11
  47. data/lib/generators/eventifier/install/install_generator.rb +2 -5
  48. data/lib/generators/eventifier/install/templates/events.en.yaml +1 -0
  49. data/lib/tasks/email.rake +8 -0
  50. data/spec/controllers/eventifier/notifications_controller_spec.rb +24 -0
  51. data/spec/controllers/eventifier/preferences_controller_spec.rb +56 -0
  52. data/spec/eventifier/delivery_spec.rb +110 -0
  53. data/spec/eventifier/preferences_spec.rb +69 -0
  54. data/spec/eventifier/relationship_spec.rb +33 -0
  55. data/spec/eventifier_spec.rb +6 -48
  56. data/spec/fabricators/fabricator.rb +11 -11
  57. data/spec/helpers/eventifier/notification_helper_spec.rb +169 -0
  58. data/spec/helpers/eventifier/path_helper_spec.rb +19 -0
  59. data/spec/integration/eventifier_spec.rb +113 -70
  60. data/spec/integration/internationalisation_spec.rb +39 -0
  61. data/spec/internal/app/controllers/application_controller.rb +3 -0
  62. data/spec/internal/app/lib/event_tracking.rb +12 -0
  63. data/spec/internal/app/models/category.rb +3 -0
  64. data/spec/internal/app/models/post.rb +8 -0
  65. data/spec/internal/app/models/subscription.rb +4 -0
  66. data/spec/internal/app/models/user.rb +4 -0
  67. data/spec/internal/app/views/eventifier/dropdown/_awesome_object.haml +0 -0
  68. data/spec/internal/config/database.yml +4 -0
  69. data/spec/internal/config/initializers/eventifier.rb +1 -0
  70. data/spec/internal/config/locales/events.en.yml +20 -0
  71. data/spec/internal/config/routes.rb +5 -0
  72. data/spec/internal/db/schema.rb +31 -0
  73. data/spec/internal/log/.gitignore +1 -0
  74. data/spec/internal/public/favicon.ico +0 -0
  75. data/spec/models/eventifier/event_spec.rb +23 -0
  76. data/spec/{ghost_spec.rb → models/eventifier/ghost_spec.rb} +3 -3
  77. data/spec/{notification_spec.rb → models/eventifier/notification_spec.rb} +1 -9
  78. data/spec/notification_mailer_spec.rb +8 -4
  79. data/spec/notifier/notification_mapping_spec.rb +28 -0
  80. data/spec/spec_helper.rb +14 -8
  81. data/spec/support/controller_helpers.rb +14 -0
  82. metadata +205 -128
  83. data/Gemfile.lock +0 -97
  84. data/lib/eventifier/active_record/event.rb +0 -10
  85. data/lib/eventifier/active_record/event_observer.rb +0 -8
  86. data/lib/eventifier/active_record/event_tracking.rb +0 -11
  87. data/lib/eventifier/active_record/ghost.rb +0 -9
  88. data/lib/eventifier/active_record/notification.rb +0 -13
  89. data/lib/eventifier/active_record_support.rb +0 -5
  90. data/lib/eventifier/event_helper.rb +0 -40
  91. data/lib/eventifier/event_mixin.rb +0 -45
  92. data/lib/eventifier/event_observer_mixin.rb +0 -44
  93. data/lib/eventifier/ghost_mixin.rb +0 -27
  94. data/lib/eventifier/helper_methods.rb +0 -36
  95. data/lib/eventifier/mongoid/event.rb +0 -16
  96. data/lib/eventifier/mongoid/event_observer.rb +0 -7
  97. data/lib/eventifier/mongoid/event_tracking.rb +0 -13
  98. data/lib/eventifier/mongoid/ghost.rb +0 -15
  99. data/lib/eventifier/mongoid/notification.rb +0 -19
  100. data/lib/eventifier/mongoid/user_patch.rb +0 -3
  101. data/lib/eventifier/mongoid_support.rb +0 -6
  102. data/lib/eventifier/notification_helper.rb +0 -42
  103. data/lib/eventifier/notification_mailer.rb +0 -18
  104. data/lib/eventifier/notification_mixin.rb +0 -50
  105. data/lib/eventifier/version.rb +0 -3
  106. data/spec/event_helper_spec.rb +0 -67
  107. data/spec/event_observer_spec.rb +0 -20
  108. data/spec/event_spec.rb +0 -39
  109. data/spec/helper_methods_spec.rb +0 -36
  110. data/spec/notification_helper_spec.rb +0 -65
  111. data/spec/support/action_mailer.rb +0 -3
  112. data/spec/support/database_cleaner.rb +0 -3
  113. data/spec/test_classes/active_record_support.rb +0 -72
  114. data/spec/test_classes/mongoid_support.rb +0 -34
@@ -0,0 +1,36 @@
1
+ class Eventifier::Relationship
2
+ def initialize(source, relation)
3
+ @source, @relation = source, relation
4
+ end
5
+
6
+ def key
7
+ key_from relation
8
+ end
9
+
10
+ def users
11
+ Array object.send(method)
12
+ end
13
+
14
+ private
15
+
16
+ attr_reader :relation, :source
17
+
18
+ def object
19
+ relation.is_a?(Hash) ? source.send(relation.keys.first) : source
20
+ end
21
+
22
+ def method
23
+ relation.is_a?(Hash) ? relation.values.first : relation
24
+ end
25
+
26
+ def key_from(object)
27
+ case object
28
+ when Hash
29
+ "#{object.keys.first}_#{key_from object.values.first}"
30
+ when Array
31
+ object.join('-')
32
+ else
33
+ object.to_s
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,74 @@
1
+ class Eventifier::TrackableClass
2
+ Eventifier::OBSERVER_CLASS = ActiveRecord::Observer
3
+
4
+ def self.track(klass, klass_methods, attributes)
5
+ self.new(klass, klass_methods, attributes).track
6
+ end
7
+
8
+ def initialize(klass, klass_methods, options)
9
+ @klass, @klass_methods = klass, klass_methods
10
+
11
+ @attributes = options.delete(:attributes) || {}
12
+ @owner = options.delete :owner
13
+ @group_by = options.delete :group_by
14
+ end
15
+
16
+ def track
17
+ add_relations
18
+ generate_observer_callbacks
19
+
20
+ observer.instance
21
+
22
+ Eventifier::EventSubscriber.subscribe_to_all @klass, @klass_methods
23
+ end
24
+
25
+ private
26
+
27
+ def add_relations
28
+ @klass.class_eval do
29
+ has_many :events, as: :eventable, class_name: 'Eventifier::Event',
30
+ dependent: :destroy
31
+ has_many :notifications, through: :events,
32
+ class_name: 'Eventifier::Notification'
33
+ end
34
+ end
35
+
36
+ def generate_observer_callbacks
37
+ methods, attributes, klass, owner, group_by =
38
+ @klass_methods, @attributes, @klass, @owner, @group_by
39
+
40
+ observer.class_eval do
41
+ methods.each do |method|
42
+ define_method "after_#{method}" do |object|
43
+ Rails.logger.debug "||ASN|| Instrument #{method}.#{klass.name.tableize}" if defined?(Rails)
44
+ ActiveSupport::Notifications.instrument(
45
+ "#{method}.#{klass.name.tableize}.event.eventifier",
46
+ event: method.to_sym,
47
+ object: object,
48
+ options: attributes,
49
+ user: owner,
50
+ group_by: group_by
51
+ ) if object.changed?
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ def observer
58
+ @observer ||= begin
59
+ observer_klass.observe @klass
60
+
61
+ observer_klass
62
+ end
63
+ end
64
+
65
+ def observer_klass
66
+ @observer_klass ||= if self.class.const_defined?("#{@klass}Observer")
67
+ self.class.const_get("#{@klass}Observer")
68
+ else
69
+ constant_name = "#{@klass}Observer"
70
+ klass = Class.new(Eventifier::OBSERVER_CLASS)
71
+ self.class.qualified_const_set(constant_name, klass)
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,18 @@
1
+ module Eventifier
2
+ class Tracker
3
+ def initialize klasses, methods, options
4
+ @klasses = klasses
5
+ methods = methods.kind_of?(Array) ? methods : [methods]
6
+ raise 'No events defined to track' if methods.compact.empty?
7
+
8
+ User.class_eval {
9
+ has_many :notifications, class_name: 'Eventifier::Notification'
10
+ } unless User.respond_to?(:notifications)
11
+
12
+ # set up each class with an observer and relationships
13
+ @klasses.each do |target_klass|
14
+ Eventifier::TrackableClass.track target_klass, methods, options
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/eventifier.rb CHANGED
@@ -16,27 +16,51 @@
16
16
 
17
17
  # class EventTracking
18
18
  # include Eventable::EventTracking
19
- #
19
+ #
20
20
  # def initialize
21
21
  # events_for Activity,
22
22
  # :on => [:create, :update, :destroy],
23
23
  # :attributes => { :except => %w(updated_at) }
24
24
  # end
25
- #
25
+ #
26
26
  # end
27
+
28
+ require 'multi_json'
27
29
  require 'action_mailer'
30
+ require 'haml-rails'
31
+
32
+ module Eventifier
33
+ mattr_accessor :mailer_sender
34
+ self.mailer_sender = nil
35
+
36
+ mattr_accessor :mailer_name
37
+ self.mailer_name = "::Eventifier::Mailer"
28
38
 
29
- if defined? Mongoid
30
- require 'eventifier/mongoid_support'
31
- elsif defined? ActiveRecord
32
- require 'eventifier/active_record_support'
39
+ def self.setup
40
+ yield self
41
+ end
42
+
43
+ def self.mailer
44
+ ActiveSupport::Dependencies.constantize(@@mailer_name)
45
+ end
46
+
47
+ def self.tracked_classes
48
+ @tracked_classes ||= []
49
+ end
33
50
  end
34
51
 
35
- require 'eventifier/helper_methods'
36
- require 'eventifier/notification_mailer'
37
- require 'eventifier/notification_helper'
38
- require 'eventifier/event_helper'
52
+ require 'eventifier/tracker'
53
+ require 'eventifier/delivery'
39
54
  require 'eventifier/event_tracking'
55
+ require 'eventifier/trackable_class'
56
+ require 'eventifier/event_subscriber'
57
+ require 'eventifier/preferences'
58
+ require 'eventifier/relationship'
59
+
60
+ require 'eventifier/notifier/notification_mapping'
61
+ require 'eventifier/notifier/notification_subscriber'
62
+ require 'eventifier/notifier/notifier'
40
63
 
41
- require 'eventifier/railtie' if defined?(Rails)
64
+ require 'eventifier/mailers/helpers'
42
65
 
66
+ require 'eventifier/engine' if defined?(Rails)
@@ -3,9 +3,6 @@ require 'rails/generators/active_record'
3
3
  module Eventifier
4
4
  module Generators
5
5
  class InstallGenerator < Rails::Generators::Base
6
- include Rails::Generators::Migration
7
- extend ActiveRecord::Generators::Migration
8
-
9
6
  source_root File.expand_path('../templates', __FILE__)
10
7
 
11
8
  def copy_event_tracking
@@ -16,8 +13,8 @@ module Eventifier
16
13
  copy_file "events.en.yaml", "config/locales/events.en.yaml"
17
14
  end
18
15
 
19
- def generate_migration
20
- migration_template "migration.rb", "db/migrate/eventifier_setup.rb" if defined?(ActiveRecord)
16
+ def add_routes
17
+ route %Q{mount Eventifier::Engine => '/'}
21
18
  end
22
19
 
23
20
  end
@@ -6,6 +6,7 @@ en:
6
6
  single: "{{user.name}} updated a {{object_type}}"
7
7
  multiple: "{{user.name}} made some changes to a {{object_type}}"
8
8
  notifications:
9
+ email_subject: "You have received a notification"
9
10
  default:
10
11
  create: "{{user.name}} created a <strong>{{object_type}}</strong>"
11
12
  update:
@@ -0,0 +1,8 @@
1
+ namespace :eventifier do
2
+ namespace :email do
3
+ desc 'Send Eventifier notification emails'
4
+ task :deliver => :environment do
5
+ Eventifier::Delivery.deliver
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Eventifier::NotificationsController do
4
+ describe '#touch' do
5
+ let(:user) { double 'User', :update_attribute => true }
6
+
7
+ before :each do
8
+ sign_in user
9
+ end
10
+
11
+ it "updates the current user's notifications last read at" do
12
+ user.should_receive(:update_attribute).
13
+ with(:notifications_last_read_at, anything)
14
+
15
+ post :touch
16
+ end
17
+
18
+ it "responds with JSON OK status" do
19
+ post :touch
20
+
21
+ response.body.should == {'status' => 'OK'}.to_json
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe Eventifier::PreferencesController do
4
+ let(:user) { double 'User' }
5
+
6
+ before :each do
7
+ sign_in user
8
+
9
+ Eventifier::Preferences.stub :new => preferences
10
+ end
11
+
12
+ describe '#show' do
13
+ let(:preferences) { double :to_hashes => [{'foo' => 'bar'}] }
14
+
15
+ it "returns the settings hashes" do
16
+ get :show
17
+
18
+ response.body.should == [{'foo' => 'bar'}].to_json
19
+ end
20
+ end
21
+
22
+ describe '#update' do
23
+ let(:preferences) { double to_hashes: [{:key => 'foo'}, {:key => 'bar'}] }
24
+ let(:settings) { double 'Settings', :preferences => {}, :save => true }
25
+
26
+ before :each do
27
+ Eventifier::NotificationSetting.stub :for_user => settings
28
+ end
29
+
30
+ it "updates the user's email preferences" do
31
+ put :update, :preferences => {'foo' => ''}
32
+
33
+ settings.preferences['email']['foo'].should be_true
34
+ settings.preferences['email']['bar'].should be_false
35
+ end
36
+
37
+ it "sets everything to false if no preferences are supplied" do
38
+ put :update
39
+
40
+ settings.preferences['email']['foo'].should be_false
41
+ settings.preferences['email']['bar'].should be_false
42
+ end
43
+
44
+ it 'saves the settings changes' do
45
+ settings.should_receive(:save)
46
+
47
+ put :update, :preferences => {'foo' => ''}
48
+ end
49
+
50
+ it "renders a JSON OK status" do
51
+ put :update, :preferences => {'foo' => ''}
52
+
53
+ response.body.should == {'status' => 'OK'}.to_json
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+
3
+ describe Eventifier::Delivery do
4
+ describe '#deliver' do
5
+ let(:delivery) { Eventifier::Delivery.new double, [notification] }
6
+ let(:notification) { double 'Notification', relations: [:subscribers], event: event, update_attribute: true }
7
+ let(:event) { double 'Event', verb: 'create',
8
+ eventable_type: 'Post' }
9
+ let(:email) { double 'Email', deliver: true }
10
+ let(:settings) { double 'Settings', preferences: {} }
11
+ let(:mailer) { double 'Mailer', notifications: email }
12
+
13
+ before :each do
14
+ Eventifier.stub mailer: mailer
15
+ Eventifier::NotificationSetting.stub for_user: settings
16
+ end
17
+
18
+ shared_examples_for 'a delivered email' do
19
+ it "sends the email" do
20
+ email.should_receive(:deliver)
21
+
22
+ delivery.deliver
23
+ end
24
+
25
+ it "updates the sent status of the notification" do
26
+ notification.should_receive(:update_attribute).with(:sent, true)
27
+
28
+ delivery.deliver
29
+ end
30
+ end
31
+
32
+ shared_examples_for 'a blocked email' do
33
+ it "does not send the email" do
34
+ email.should_not_receive(:deliver)
35
+
36
+ delivery.deliver
37
+ end
38
+
39
+ it "updates the sent status of the notification" do
40
+ notification.should_receive(:update_attribute).with(:sent, true)
41
+
42
+ delivery.deliver
43
+ end
44
+ end
45
+
46
+ context 'no settings' do
47
+ before :each do
48
+ settings.preferences['email'] = {}
49
+ end
50
+
51
+ it_should_behave_like 'a delivered email'
52
+ end
53
+
54
+ context "default is set to true" do
55
+ before :each do
56
+ settings.preferences['email'] = {'default' => true}
57
+ end
58
+
59
+ it_should_behave_like 'a delivered email'
60
+ end
61
+
62
+ context "default is set to false" do
63
+ before :each do
64
+ settings.preferences['email'] = {'default' => false}
65
+ end
66
+
67
+ it_should_behave_like 'a blocked email'
68
+ end
69
+
70
+ context "default and post are set to true" do
71
+ before :each do
72
+ settings.preferences['email'] = {
73
+ 'default' => true, 'create_posts_notify_subscribers' => true
74
+ }
75
+ end
76
+
77
+ it_should_behave_like 'a delivered email'
78
+ end
79
+
80
+ context "default is set to false but post is set to true" do
81
+ before :each do
82
+ settings.preferences['email'] = {
83
+ 'default' => false, 'create_posts_notify_subscribers' => true
84
+ }
85
+ end
86
+
87
+ it_should_behave_like 'a delivered email'
88
+ end
89
+
90
+ context "default is set to true but post is set to false" do
91
+ before :each do
92
+ settings.preferences['email'] = {
93
+ 'default' => true, 'create_posts_notify_subscribers' => false
94
+ }
95
+ end
96
+
97
+ it_should_behave_like 'a blocked email'
98
+ end
99
+
100
+ context "default and post are both set to false" do
101
+ before :each do
102
+ settings.preferences['email'] = {
103
+ 'default' => false, 'create_posts_notify_subscribers' => false
104
+ }
105
+ end
106
+
107
+ it_should_behave_like 'a blocked email'
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe Eventifier::Preferences do
4
+ let(:preferences) { Eventifier::Preferences.new double('User') }
5
+ let(:settings) { double 'Settings', :preferences => {} }
6
+
7
+ before :each do
8
+ Eventifier::NotificationMapping.stub :notification_mappings => {
9
+ 'create.posts' => [:readers],
10
+ 'create.comments' => [{:post => :readers}]
11
+ }
12
+ Eventifier::NotificationSetting.stub :for_user => settings
13
+ end
14
+
15
+ describe '#to_hashes' do
16
+ it "interprets each key" do
17
+ preferences.to_hashes.collect { |hash| hash[:key] }.should == [
18
+ 'default',
19
+ 'create_posts_notify_readers',
20
+ 'create_comments_notify_post_readers'
21
+ ]
22
+ end
23
+
24
+ it "sets values to true if unknown" do
25
+ preferences.to_hashes.collect { |hash| hash[:value] }.
26
+ should == [true, true, true]
27
+ end
28
+
29
+ it "sets values to true if known and true" do
30
+ settings.preferences['email'] = {}
31
+ settings.preferences['email']['create_posts_notify_readers'] = true
32
+
33
+ preferences.to_hashes.collect { |hash| hash[:value] }.
34
+ should == [true, true, true]
35
+ end
36
+
37
+ it "sets values to false if known and false" do
38
+ settings.preferences['email'] = {}
39
+ settings.preferences['email']['create_posts_notify_readers'] = false
40
+
41
+ preferences.to_hashes.collect { |hash| hash[:value] }.
42
+ should == [true, false, true]
43
+ end
44
+
45
+ it "returns keys if no translations available for labels" do
46
+ preferences.to_hashes.collect { |hash| hash[:label] }.should == [
47
+ 'default',
48
+ 'create_posts_notify_readers',
49
+ 'create_comments_notify_post_readers'
50
+ ]
51
+ end
52
+
53
+ it "matches translations for labels" do
54
+ I18n.backend.reload!
55
+ I18n.backend.store_translations :en, :events => {
56
+ :labels => {
57
+ :preferences => {
58
+ 'default' => 'All Events',
59
+ 'create_posts_notify_readers' => 'New Posts',
60
+ 'create_comments_notify_post_readers' => 'New Comments'
61
+ }
62
+ }
63
+ }
64
+
65
+ preferences.to_hashes.collect { |hash| hash[:label] }.
66
+ should == ['All Events', 'New Posts', 'New Comments']
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Eventifier::Relationship do
4
+ describe '#key' do
5
+ it "translates symbol relations to strings" do
6
+ Eventifier::Relationship.new(double, :mouse).key.should == 'mouse'
7
+ end
8
+
9
+ it "translates hash relations to period-separated strings" do
10
+ Eventifier::Relationship.new(double, :cat => :mouse).key.
11
+ should == 'cat_mouse'
12
+ end
13
+
14
+ it "translates array relations to hyphen-separated strings" do
15
+ Eventifier::Relationship.new(double, [:cat, :mouse]).key.
16
+ should == 'cat-mouse'
17
+ end
18
+ end
19
+
20
+ describe '#users' do
21
+ it "should call the string as a method when passed a string" do
22
+ object = double('object', :mouse => 5)
23
+
24
+ Eventifier::Relationship.new(object, :mouse).users.should == [5]
25
+ end
26
+
27
+ it "should string the methods when passed a hash" do
28
+ object = double('object', :cat => (cat = double('cat', :mouse => 5)))
29
+
30
+ Eventifier::Relationship.new(object, :cat => :mouse).users.should == [5]
31
+ end
32
+ end
33
+ end
@@ -37,8 +37,8 @@ describe Eventifier::EventTracking do
37
37
  before do
38
38
  object.stub(:user).and_return(user)
39
39
  event_tracker.events_for test_class,
40
- :track_on => [:create, :update, :destroy],
41
- :attributes => { :except => %w(updated_at) }
40
+ :track_on => [:create, :update, :destroy],
41
+ :attributes => { :except => %w(updated_at) }
42
42
  end
43
43
 
44
44
 
@@ -46,7 +46,7 @@ describe Eventifier::EventTracking do
46
46
  changes = { :foo => 'bar', :bar => 'baz' }
47
47
  object.stub(:changes).and_return(changes)
48
48
 
49
- Eventifier::Event.should_receive(:create).with(:user => user, :eventable => object, :verb => :create, :change_data => changes)
49
+ Eventifier::Event.should_receive(:create).with(:user => user, :eventable => object, :verb => :create, :change_data => changes, :groupable => object)
50
50
 
51
51
  subject
52
52
  end
@@ -54,39 +54,6 @@ describe Eventifier::EventTracking do
54
54
 
55
55
  end
56
56
 
57
- describe '#create_event' do
58
- let(:object) { double('object', :changes => changes, :user => double(User)) }
59
- let(:changes) { { :foo => 'bar', :bar => 'baz', :bob => 'blah' } }
60
- let(:options) { { } }
61
-
62
- subject { Eventifier::Event.create_event(:create, object, options) }
63
-
64
- describe "exclude" do
65
- let(:options) { { :except => ['foo'] } }
66
-
67
- it 'should exclude the right attrs' do
68
- Eventifier::Event.should_receive(:create) do |attrs|
69
- attrs[:change_data].should == { :bar => 'baz', :bob => 'blah' }
70
- end
71
- subject
72
- end
73
-
74
- end
75
- describe "only" do
76
- let(:options) { { :only => ['foo'] } }
77
-
78
- it 'should exclude the right attrs' do
79
- Eventifier::Event.should_receive(:create) do |attrs|
80
- attrs[:change_data].should == { :foo => 'bar' }
81
- end
82
- subject
83
- end
84
-
85
- end
86
-
87
- end
88
-
89
-
90
57
  context "block syntax" do
91
58
 
92
59
  context "tracking" do
@@ -106,7 +73,7 @@ describe Eventifier::EventTracking do
106
73
  track_on :update, :attributes => { :except => %w(updated_at) }
107
74
  end
108
75
 
109
- Eventifier::Event.should_receive(:create).with(:user => user, :eventable => object, :verb => :create, :change_data => changes)
76
+ Eventifier::Event.should_receive(:create).with(:user => user, :eventable => object, :verb => :create, :change_data => changes, :groupable => object)
110
77
 
111
78
  subject
112
79
  end
@@ -121,24 +88,15 @@ describe Eventifier::EventTracking do
121
88
  end
122
89
 
123
90
  context "notifying" do
124
- before do
125
- @event_observer_instance = Eventifier::EventObserver.instance
126
- Eventifier::EventObserver.any_instance.stub post_path: '/post'
127
- end
128
-
129
91
  describe "#add_notification" do
130
92
 
131
93
  it "should add the notification to the notification hash" do
132
- @event_observer_instance.should_receive(:add_notification).with(test_class, :user, :create)
133
-
134
- event_tracker.events_for test_class do
135
- track_on :create, :attributes => { :except => %w(updated_at) }
136
- notify :user, :on => :create
137
- end
138
94
  end
139
95
  end
140
96
 
141
97
  it "should notify users when passed a hash" do
98
+ pending
99
+
142
100
  subscriber = double('user')
143
101
 
144
102
  object.stub :category => double('category', :subscribers => [subscriber])
@@ -1,9 +1,9 @@
1
1
  require 'eventifier'
2
2
 
3
-
4
3
  Fabricator(:event, :class_name => Eventifier::Event) do
5
- user!
6
- eventable!(:fabricator => :post)
4
+ user
5
+ eventable(:fabricator => :post)
6
+ groupable(:fabricator => :post)
7
7
  verb :update
8
8
  change_data { { :date => [5.days.ago, 3.days.ago] } }
9
9
  end
@@ -15,17 +15,17 @@ Fabricator(:ghost, :class_name => Eventifier::Ghost) do
15
15
  end
16
16
 
17
17
  Fabricator(:notification, :class_name => Eventifier::Notification) do
18
- event! { Fabricate(:event) }
19
- user!
18
+ event { Fabricate(:event) }
19
+ user
20
20
  end
21
21
 
22
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) }
23
+ title { "My amazing blog post" }
24
+ body { "A deep and profound analysis of life" }
25
+ author { Fabricate(:user) }
26
26
  end
27
27
 
28
28
  Fabricator(:user, :class_name => User) do
29
- name { "Billy #{sequence(:name, 1)}" }
30
- email{ "billy#{sequence(:email, 1)}@email.com" }
31
- end
29
+ name { "Billy #{sequence(:name, 1)}" }
30
+ email { "billy#{sequence(:email, 1)}@email.com" }
31
+ end