user_notification 0.0.1
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/Gemfile +3 -0
- data/MIT-LICENSE +20 -0
- data/README.md +1 -0
- data/Rakefile +18 -0
- data/lib/generators/user_notification/migration/migration_generator.rb +17 -0
- data/lib/generators/user_notification/migration/templates/migration.rb +24 -0
- data/lib/generators/user_notification/notification/notification_generator.rb +17 -0
- data/lib/generators/user_notification/notification/templates/notification.rb +3 -0
- data/lib/generators/user_notification.rb +14 -0
- data/lib/user_notification/actions/creation.rb +15 -0
- data/lib/user_notification/actions/destruction.rb +15 -0
- data/lib/user_notification/actions/update.rb +15 -0
- data/lib/user_notification/activity.rb +6 -0
- data/lib/user_notification/common.rb +342 -0
- data/lib/user_notification/config.rb +63 -0
- data/lib/user_notification/models/activist.rb +9 -0
- data/lib/user_notification/models/adapter.rb +5 -0
- data/lib/user_notification/models/notification.rb +13 -0
- data/lib/user_notification/models/trackable.rb +9 -0
- data/lib/user_notification/orm/active_record/activist.rb +48 -0
- data/lib/user_notification/orm/active_record/adapter.rb +16 -0
- data/lib/user_notification/orm/active_record/notification.rb +24 -0
- data/lib/user_notification/orm/active_record/trackable.rb +15 -0
- data/lib/user_notification/orm/active_record.rb +5 -0
- data/lib/user_notification/orm/mongo_mapper/activist.rb +46 -0
- data/lib/user_notification/orm/mongo_mapper/adapter.rb +12 -0
- data/lib/user_notification/orm/mongo_mapper/notification.rb +33 -0
- data/lib/user_notification/orm/mongo_mapper/trackable.rb +11 -0
- data/lib/user_notification/orm/mongo_mapper.rb +4 -0
- data/lib/user_notification/orm/mongoid/activist.rb +45 -0
- data/lib/user_notification/orm/mongoid/adapter.rb +12 -0
- data/lib/user_notification/orm/mongoid/notification.rb +26 -0
- data/lib/user_notification/orm/mongoid/trackable.rb +11 -0
- data/lib/user_notification/orm/mongoid.rb +4 -0
- data/lib/user_notification/renderable.rb +118 -0
- data/lib/user_notification/roles/deactivatable.rb +42 -0
- data/lib/user_notification/roles/tracked.rb +183 -0
- data/lib/user_notification/utility/store_controller.rb +37 -0
- data/lib/user_notification/utility/view_helpers.rb +26 -0
- data/lib/user_notification/version.rb +4 -0
- data/lib/user_notification.rb +68 -0
- data/test/migrations/001_create_notifications.rb +24 -0
- data/test/migrations/002_create_articles.rb +11 -0
- data/test/migrations/003_create_users.rb +8 -0
- data/test/migrations/004_add_nonstandard_to_notifications.rb +7 -0
- data/test/mongo_mapper.yml +4 -0
- data/test/mongoid.yml +6 -0
- data/test/test_activist.rb +56 -0
- data/test/test_common.rb +168 -0
- data/test/test_controller_integration.rb +41 -0
- data/test/test_generators.rb +30 -0
- data/test/test_helper.rb +124 -0
- data/test/test_notification.rb +67 -0
- data/test/test_tracking.rb +378 -0
- data/test/test_view_helpers.rb +36 -0
- data/test/views/layouts/_notification.erb +1 -0
- data/test/views/user_notification/_test.erb +8 -0
- metadata +260 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
module UserNotification
|
2
|
+
# @private
|
3
|
+
@@controllers = Hash.new
|
4
|
+
# Lambda called after the thread is destroyed.
|
5
|
+
Finalizer = lambda { |id|
|
6
|
+
@@controllers.delete id
|
7
|
+
}
|
8
|
+
|
9
|
+
class << self
|
10
|
+
# Setter for remembering controller instance
|
11
|
+
def set_controller(controller)
|
12
|
+
unless @@controllers.has_key?(Thread.current.object_id)
|
13
|
+
ObjectSpace.define_finalizer Thread.current, Finalizer
|
14
|
+
end if RUBY_VERSION != "1.9.3"
|
15
|
+
@@controllers[Thread.current.object_id] = controller
|
16
|
+
end
|
17
|
+
|
18
|
+
# Getter for accessing the controller instance
|
19
|
+
def get_controller
|
20
|
+
@@controllers[Thread.current.object_id]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Module included in controllers to allow p_a access to controller instance
|
25
|
+
module StoreController
|
26
|
+
extend ActiveSupport::Concern
|
27
|
+
|
28
|
+
included do
|
29
|
+
before_filter :store_controller_for_user_notification
|
30
|
+
end
|
31
|
+
|
32
|
+
# Before filter executed to remember current controller
|
33
|
+
def store_controller_for_user_notification
|
34
|
+
UserNotification.set_controller(self)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Provides a shortcut from views to the rendering method.
|
2
|
+
module UserNotification
|
3
|
+
# Module extending ActionView::Base and adding `render_notification` helper.
|
4
|
+
module ViewHelpers
|
5
|
+
# View helper for rendering an notification, calls {UserNotification::Notification#render} internally.
|
6
|
+
def render_notification notifications, options = {}
|
7
|
+
if notifications.is_a? UserNotification::Notification
|
8
|
+
notifications.render self, options
|
9
|
+
elsif notifications.respond_to?(:map)
|
10
|
+
# depend on ORMs to fetch as needed
|
11
|
+
# maybe we can support Postgres streaming with this?
|
12
|
+
notifications.map {|notification| notification.render self, options.dup }.join.html_safe
|
13
|
+
end
|
14
|
+
end
|
15
|
+
alias_method :render_notifications, :render_notification
|
16
|
+
|
17
|
+
# Helper for setting content_for in notification partial, needed to
|
18
|
+
# flush remains in between partial renders.
|
19
|
+
def single_content_for(name, content = nil, &block)
|
20
|
+
@view_flow.set(name, ActiveSupport::SafeBuffer.new)
|
21
|
+
content_for(name, content, &block)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
ActionView::Base.class_eval { include ViewHelpers }
|
26
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'action_view'
|
3
|
+
# +user_notification+ keeps track of changes made to models
|
4
|
+
# and allows you to display them to the users.
|
5
|
+
#
|
6
|
+
# Check {UserNotification::Tracked::ClassMethods#tracked} for more details about customizing and specifying
|
7
|
+
# ownership to users.
|
8
|
+
module UserNotification
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
extend ActiveSupport::Autoload
|
11
|
+
|
12
|
+
autoload :Notification, 'user_notification/models/notification'
|
13
|
+
autoload :Activist, 'user_notification/models/activist'
|
14
|
+
autoload :Adapter, 'user_notification/models/adapter'
|
15
|
+
autoload :Trackable, 'user_notification/models/trackable'
|
16
|
+
autoload :Common
|
17
|
+
autoload :Config
|
18
|
+
autoload :Creation, 'user_notification/actions/creation.rb'
|
19
|
+
autoload :Deactivatable,'user_notification/roles/deactivatable.rb'
|
20
|
+
autoload :Destruction, 'user_notification/actions/destruction.rb'
|
21
|
+
autoload :Renderable
|
22
|
+
autoload :Tracked, 'user_notification/roles/tracked.rb'
|
23
|
+
autoload :Update, 'user_notification/actions/update.rb'
|
24
|
+
autoload :VERSION
|
25
|
+
|
26
|
+
# Switches UserNotification on or off.
|
27
|
+
# @param value [Boolean]
|
28
|
+
# @since 0.5.0
|
29
|
+
def self.enabled=(value)
|
30
|
+
UserNotification.config.enabled = value
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns `true` if UserNotification is on, `false` otherwise.
|
34
|
+
# Enabled by default.
|
35
|
+
# @return [Boolean]
|
36
|
+
# @since 0.5.0
|
37
|
+
def self.enabled?
|
38
|
+
!!UserNotification.config.enabled
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns UserNotification's configuration object.
|
42
|
+
# @since 0.5.0
|
43
|
+
def self.config
|
44
|
+
@@config ||= UserNotification::Config.instance
|
45
|
+
end
|
46
|
+
|
47
|
+
# Method used to choose which ORM to load
|
48
|
+
# when UserNotification::Notification class is being autoloaded
|
49
|
+
def self.inherit_orm(model="Notification")
|
50
|
+
orm = UserNotification.config.orm
|
51
|
+
require "user_notification/orm/#{orm.to_s}"
|
52
|
+
"UserNotification::ORM::#{orm.to_s.classify}::#{model}".constantize
|
53
|
+
end
|
54
|
+
|
55
|
+
# Module to be included in ActiveRecord models. Adds required functionality.
|
56
|
+
module Model
|
57
|
+
extend ActiveSupport::Concern
|
58
|
+
included do
|
59
|
+
include Common
|
60
|
+
include Deactivatable
|
61
|
+
include Tracked
|
62
|
+
include Activist # optional associations by recipient|owner
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
require 'user_notification/utility/store_controller'
|
68
|
+
require 'user_notification/utility/view_helpers'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Migration responsible for creating a table with notifications
|
2
|
+
class CreateNotifications < ActiveRecord::Migration
|
3
|
+
# Create table
|
4
|
+
def self.up
|
5
|
+
create_table :notifications do |t|
|
6
|
+
t.belongs_to :trackable, :polymorphic => true
|
7
|
+
t.belongs_to :owner, :polymorphic => true
|
8
|
+
t.string :key
|
9
|
+
t.text :parameters
|
10
|
+
t.belongs_to :recipient, :polymorphic => true
|
11
|
+
t.boolwan :read, default: false
|
12
|
+
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
|
16
|
+
add_index :notifications, [:trackable_id, :trackable_type]
|
17
|
+
add_index :notifications, [:owner_id, :owner_type]
|
18
|
+
add_index :notifications, [:recipient_id, :recipient_type]
|
19
|
+
end
|
20
|
+
# Drop table
|
21
|
+
def self.down
|
22
|
+
drop_table :notifications
|
23
|
+
end
|
24
|
+
end
|
data/test/mongoid.yml
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe UserNotification::Activist do
|
4
|
+
it 'adds owner association' do
|
5
|
+
klass = article
|
6
|
+
klass.must_respond_to :activist
|
7
|
+
klass.activist
|
8
|
+
klass.new.must_respond_to :notifications
|
9
|
+
case ENV["PA_ORM"]
|
10
|
+
when "active_record"
|
11
|
+
klass.reflect_on_association(:notifications_as_owner).options[:as].must_equal :owner
|
12
|
+
when "mongoid"
|
13
|
+
klass.reflect_on_association(:notifications_as_owner).options[:inverse_of].must_equal :owner
|
14
|
+
when "mongo_mapper"
|
15
|
+
klass.associations[:notifications_as_owner].options[:as].must_equal :owner
|
16
|
+
end
|
17
|
+
|
18
|
+
if ENV["PA_ORM"] == "mongo_mapper"
|
19
|
+
klass.associations[:notifications_as_owner].options[:class_name].must_equal "::UserNotification::Notification"
|
20
|
+
else
|
21
|
+
klass.reflect_on_association(:notifications_as_owner).options[:class_name].must_equal "::UserNotification::Notification"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'returns notifications from association' do
|
26
|
+
case UserNotification::Config.orm
|
27
|
+
when :active_record
|
28
|
+
class ActivistUser < ActiveRecord::Base
|
29
|
+
include UserNotification::Model
|
30
|
+
self.table_name = 'users'
|
31
|
+
activist
|
32
|
+
end
|
33
|
+
when :mongoid
|
34
|
+
class ActivistUser
|
35
|
+
include Mongoid::Document
|
36
|
+
include UserNotification::Model
|
37
|
+
activist
|
38
|
+
|
39
|
+
field :name, type: String
|
40
|
+
end
|
41
|
+
when :mongo_mapper
|
42
|
+
class ActivistUser
|
43
|
+
include MongoMapper::Document
|
44
|
+
include UserNotification::Model
|
45
|
+
activist
|
46
|
+
|
47
|
+
key :name, String
|
48
|
+
end
|
49
|
+
end
|
50
|
+
owner = ActivistUser.create(:name => "Peter Pan")
|
51
|
+
a = article(owner: owner).new
|
52
|
+
a.save
|
53
|
+
|
54
|
+
owner.notifications_as_owner.length.must_equal 1
|
55
|
+
end
|
56
|
+
end
|
data/test/test_common.rb
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe UserNotification::Common do
|
4
|
+
before do
|
5
|
+
@owner = User.create(:name => "Peter Pan")
|
6
|
+
@recipient = User.create(:name => "Bruce Wayne")
|
7
|
+
@options = {:params => {:author_name => "Peter",
|
8
|
+
:summary => "Default summary goes here..."},
|
9
|
+
:owner => @owner, :recipient => @recipient}
|
10
|
+
end
|
11
|
+
subject { article(@options).new }
|
12
|
+
|
13
|
+
it 'prioritizes parameters passed to #create_notification' do
|
14
|
+
subject.save
|
15
|
+
subject.create_notification(:test, params: {author_name: 'Pan'}).parameters[:author_name].must_equal 'Pan'
|
16
|
+
subject.create_notification(:test, parameters: {author_name: 'Pan'}).parameters[:author_name].must_equal 'Pan'
|
17
|
+
subject.create_notification(:test, params: {author_name: nil}).parameters[:author_name].must_be_nil
|
18
|
+
subject.create_notification(:test, parameters: {author_name: nil}).parameters[:author_name].must_be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'prioritizes owner passed to #create_notification' do
|
22
|
+
subject.save
|
23
|
+
subject.create_notification(:test, owner: @recipient).owner.must_equal @recipient
|
24
|
+
subject.create_notification(:test, owner: nil).owner.must_be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'prioritizes recipient passed to #create_notification' do
|
28
|
+
subject.save
|
29
|
+
subject.create_notification(:test, recipient: @owner).recipient.must_equal @owner
|
30
|
+
subject.create_notification(:test, recipient: nil).recipient.must_be_nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'uses global fields' do
|
34
|
+
subject.save
|
35
|
+
notification = subject.notifications.last
|
36
|
+
notification.parameters.must_equal @options[:params]
|
37
|
+
notification.owner.must_equal @owner
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'allows custom fields' do
|
41
|
+
subject.save
|
42
|
+
subject.create_notification :with_custom_fields, nonstandard: "Custom allowed"
|
43
|
+
subject.notifications.last.nonstandard.must_equal "Custom allowed"
|
44
|
+
end
|
45
|
+
|
46
|
+
it '#create_notification returns a new notification object' do
|
47
|
+
subject.save
|
48
|
+
subject.create_notification("some.key").wont_be_nil
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'allows passing owner through #create_notification' do
|
52
|
+
article = article().new
|
53
|
+
article.save
|
54
|
+
notification = article.create_notification("some.key", :owner => @owner)
|
55
|
+
notification.owner.must_equal @owner
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'allows resolving custom fields' do
|
59
|
+
subject.name = "Resolving is great"
|
60
|
+
subject.published = true
|
61
|
+
subject.save
|
62
|
+
subject.create_notification :with_custom_fields, nonstandard: :name
|
63
|
+
subject.notifications.last.nonstandard.must_equal "Resolving is great"
|
64
|
+
subject.create_notification :with_custom_fields_2, nonstandard: proc {|_, model| model.published.to_s}
|
65
|
+
subject.notifications.last.nonstandard.must_equal "true"
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'inherits instance parameters' do
|
69
|
+
subject.notification :params => {:author_name => "Michael"}
|
70
|
+
subject.save
|
71
|
+
notification = subject.notifications.last
|
72
|
+
|
73
|
+
notification.parameters[:author_name].must_equal "Michael"
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'accepts instance recipient' do
|
77
|
+
subject.notification :recipient => @recipient
|
78
|
+
subject.save
|
79
|
+
subject.notifications.last.recipient.must_equal @recipient
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'accepts instance owner' do
|
83
|
+
subject.notification :owner => @owner
|
84
|
+
subject.save
|
85
|
+
subject.notifications.last.owner.must_equal @owner
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'accepts owner as a symbol' do
|
89
|
+
klass = article(:owner => :user)
|
90
|
+
@article = klass.new(:user => @owner)
|
91
|
+
@article.save
|
92
|
+
notification = @article.notifications.last
|
93
|
+
|
94
|
+
notification.owner.must_equal @owner
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '#extract_key' do
|
98
|
+
describe 'for class#notification_key method' do
|
99
|
+
before do
|
100
|
+
@article = article(:owner => :user).new(:user => @owner)
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'assigns key to value of notification_key if set' do
|
104
|
+
def @article.notification_key; "my_custom_key" end
|
105
|
+
|
106
|
+
@article.extract_key(:create, {}).must_equal "my_custom_key"
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'assigns key based on class name as fallback' do
|
110
|
+
def @article.notification_key; nil end
|
111
|
+
|
112
|
+
@article.extract_key(:create).must_equal "article.create"
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'assigns key value from options hash' do
|
116
|
+
@article.extract_key(:create, :key => :my_custom_key).must_equal "my_custom_key"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe 'for camel cased classes' do
|
121
|
+
before do
|
122
|
+
class CamelCase < article(:owner => :user)
|
123
|
+
def self.name; 'CamelCase' end
|
124
|
+
end
|
125
|
+
@camel_case = CamelCase.new
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'assigns generates key from class name' do
|
129
|
+
@camel_case.extract_key(:create, {}).must_equal "camel_case.create"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe 'for namespaced classes' do
|
134
|
+
before do
|
135
|
+
module ::MyNamespace;
|
136
|
+
class CamelCase < article(:owner => :user)
|
137
|
+
def self.name; 'MyNamespace::CamelCase' end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
@namespaced_camel_case = MyNamespace::CamelCase.new
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'assigns key value from options hash' do
|
144
|
+
@namespaced_camel_case.extract_key(:create, {}).must_equal "my_namespace_camel_case.create"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# no key implicated or given
|
150
|
+
specify { ->{subject.prepare_settings}.must_raise UserNotification::NoKeyProvided }
|
151
|
+
|
152
|
+
describe 'resolving values' do
|
153
|
+
it 'allows procs with models and controllers' do
|
154
|
+
context = mock('context')
|
155
|
+
context.expects(:accessor).times(2).returns(5)
|
156
|
+
controller = mock('controller')
|
157
|
+
controller.expects(:current_user).returns(:cu)
|
158
|
+
UserNotification.set_controller(controller)
|
159
|
+
p = proc {|controller, model|
|
160
|
+
assert_equal :cu, controller.current_user
|
161
|
+
assert_equal 5, model.accessor
|
162
|
+
}
|
163
|
+
UserNotification.resolve_value(context, p)
|
164
|
+
UserNotification.resolve_value(context, :accessor)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class StoringController < ActionView::TestCase::TestController
|
4
|
+
include UserNotification::StoreController
|
5
|
+
include ActionController::Testing::ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
describe UserNotification::StoreController do
|
9
|
+
it 'stores controller' do
|
10
|
+
controller = StoringController.new
|
11
|
+
UserNotification.set_controller(controller)
|
12
|
+
controller.must_be_same_as UserNotification.instance_eval { class_variable_get(:@@controllers)[Thread.current.object_id] }
|
13
|
+
controller.must_be_same_as UserNotification.get_controller
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'stores controller with a filter in controller' do
|
17
|
+
controller = StoringController.new
|
18
|
+
controller._process_action_callbacks.select {|c| c.kind == :before}.map(&:filter).must_include :store_controller_for_user_notification
|
19
|
+
controller.instance_eval { store_controller_for_user_notification }
|
20
|
+
controller.must_be_same_as UserNotification.class_eval { class_variable_get(:@@controllers)[Thread.current.object_id] }
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'stores controller in a threadsafe way' do
|
24
|
+
reset_controllers
|
25
|
+
UserNotification.set_controller(1)
|
26
|
+
UserNotification.get_controller.must_equal 1
|
27
|
+
|
28
|
+
a = Thread.new {
|
29
|
+
UserNotification.set_controller(2)
|
30
|
+
UserNotification.get_controller.must_equal 2
|
31
|
+
}
|
32
|
+
|
33
|
+
UserNotification.get_controller.must_equal 1
|
34
|
+
# cant really test finalizers though
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def reset_controllers
|
39
|
+
UserNotification.class_eval { class_variable_set(:@@controllers, {}) }
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
if ENV["PA_ORM"] == "active_record"
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'rails/generators/test_case'
|
5
|
+
require 'generators/user_notification/notification/notification_generator'
|
6
|
+
require 'generators/user_notification/migration/migration_generator'
|
7
|
+
|
8
|
+
class TestNotificationGenerator < Rails::Generators::TestCase
|
9
|
+
tests UserNotification::Generators::NotificationGenerator
|
10
|
+
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
11
|
+
setup :prepare_destination
|
12
|
+
|
13
|
+
def test_generating_notification_model
|
14
|
+
run_generator
|
15
|
+
assert_file "app/models/notification.rb"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class TestMigrationGenerator < Rails::Generators::TestCase
|
20
|
+
tests UserNotification::Generators::MigrationGenerator
|
21
|
+
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
22
|
+
setup :prepare_destination
|
23
|
+
|
24
|
+
def test_generating_notification_model
|
25
|
+
run_generator
|
26
|
+
assert_migration "db/migrate/create_notifications.rb"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler"
|
3
|
+
Bundler.setup(:default, :test)
|
4
|
+
|
5
|
+
unless ENV['NOCOV']
|
6
|
+
require 'simplecov'
|
7
|
+
SimpleCov.start do
|
8
|
+
add_filter "/test/"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
$:.unshift File.expand_path('../../lib/', __FILE__)
|
12
|
+
require 'active_support/testing/setup_and_teardown'
|
13
|
+
require 'user_notification'
|
14
|
+
require 'minitest/autorun'
|
15
|
+
require 'minitest/pride' if ENV['WITH_PRIDE'] or ENV['PRIDE']
|
16
|
+
|
17
|
+
UserNotification::Config.orm = (ENV['PA_ORM'] || :active_record)
|
18
|
+
|
19
|
+
case UserNotification::Config.orm
|
20
|
+
when :active_record
|
21
|
+
require 'active_record'
|
22
|
+
require 'active_record/connection_adapters/sqlite3_adapter'
|
23
|
+
require 'stringio' # silence the output
|
24
|
+
$stdout = StringIO.new # from migrator
|
25
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
26
|
+
ActiveRecord::Migrator.migrate(File.expand_path('../migrations', __FILE__))
|
27
|
+
$stdout = STDOUT
|
28
|
+
|
29
|
+
def article(options = {})
|
30
|
+
klass = Class.new(ActiveRecord::Base) do
|
31
|
+
self.table_name = 'articles'
|
32
|
+
include UserNotification::Model
|
33
|
+
tracked options
|
34
|
+
belongs_to :user
|
35
|
+
|
36
|
+
def self.name
|
37
|
+
"Article"
|
38
|
+
end
|
39
|
+
|
40
|
+
if ::ActiveRecord::VERSION::MAJOR < 4
|
41
|
+
attr_accessible :name, :published, :user
|
42
|
+
end
|
43
|
+
end
|
44
|
+
klass
|
45
|
+
end
|
46
|
+
class User < ActiveRecord::Base; end
|
47
|
+
|
48
|
+
if ::ActiveRecord::VERSION::MAJOR < 4
|
49
|
+
UserNotification::Notification.class_eval do
|
50
|
+
attr_accessible :nonstandard
|
51
|
+
end
|
52
|
+
end
|
53
|
+
when :mongoid
|
54
|
+
require 'mongoid'
|
55
|
+
|
56
|
+
Mongoid.load!(File.expand_path("test/mongoid.yml"), :test)
|
57
|
+
|
58
|
+
class User
|
59
|
+
include Mongoid::Document
|
60
|
+
include Mongoid::Timestamps
|
61
|
+
|
62
|
+
has_many :articles
|
63
|
+
|
64
|
+
field :name, type: String
|
65
|
+
end
|
66
|
+
|
67
|
+
class Article
|
68
|
+
include Mongoid::Document
|
69
|
+
include Mongoid::Timestamps
|
70
|
+
include UserNotification::Model
|
71
|
+
|
72
|
+
belongs_to :user
|
73
|
+
|
74
|
+
field :name, type: String
|
75
|
+
field :published, type: Boolean
|
76
|
+
end
|
77
|
+
|
78
|
+
def article(options = {})
|
79
|
+
Article.class_eval do
|
80
|
+
set_user_notification_class_defaults
|
81
|
+
tracked options
|
82
|
+
end
|
83
|
+
Article
|
84
|
+
end
|
85
|
+
|
86
|
+
when :mongo_mapper
|
87
|
+
require 'mongo_mapper'
|
88
|
+
|
89
|
+
config = YAML.load(File.read("test/mongo_mapper.yml"))
|
90
|
+
MongoMapper.setup(config, :test)
|
91
|
+
|
92
|
+
class User
|
93
|
+
include MongoMapper::Document
|
94
|
+
|
95
|
+
has_many :articles
|
96
|
+
|
97
|
+
key :name, String
|
98
|
+
timestamps!
|
99
|
+
end
|
100
|
+
|
101
|
+
class Article
|
102
|
+
include MongoMapper::Document
|
103
|
+
include UserNotification::Model
|
104
|
+
|
105
|
+
belongs_to :user
|
106
|
+
|
107
|
+
key :name, String
|
108
|
+
key :published, Boolean
|
109
|
+
end
|
110
|
+
|
111
|
+
def article(options = {})
|
112
|
+
Article.class_eval do
|
113
|
+
set_user_notification_class_defaults
|
114
|
+
tracked options
|
115
|
+
end
|
116
|
+
Article
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
class ViewSpec < MiniTest::Spec
|
121
|
+
include ActiveSupport::Testing::SetupAndTeardown
|
122
|
+
include ActionView::TestCase::Behavior
|
123
|
+
end
|
124
|
+
MiniTest::Spec.register_spec_type(/Rendering$/, ViewSpec)
|