activity_notification 0.0.8 → 0.0.9
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 +4 -4
- data/Gemfile.lock +11 -1
- data/README.md +63 -28
- data/activity_notification.gemspec +4 -2
- data/app/controllers/activity_notification/notifications_controller.rb +1 -1
- data/app/controllers/activity_notification/notifications_with_devise_controller.rb +10 -10
- data/app/views/activity_notification/notifications/default/_index.html.erb +9 -4
- data/lib/activity_notification.rb +7 -6
- data/lib/activity_notification/apis/notification_api.rb +14 -15
- data/lib/activity_notification/common.rb +15 -7
- data/lib/activity_notification/config.rb +2 -0
- data/lib/activity_notification/helpers/view_helpers.rb +5 -4
- data/lib/activity_notification/mailers/helpers.rb +9 -9
- data/lib/activity_notification/models.rb +16 -0
- data/lib/activity_notification/models/{notifiable.rb → concerns/notifiable.rb} +15 -10
- data/lib/activity_notification/models/{notifier.rb → concerns/notifier.rb} +6 -0
- data/lib/activity_notification/models/{target.rb → concerns/target.rb} +34 -17
- data/lib/activity_notification/renderable.rb +2 -1
- data/lib/activity_notification/roles/acts_as_notifiable.rb +38 -23
- data/lib/activity_notification/roles/acts_as_notifier.rb +11 -0
- data/lib/activity_notification/roles/acts_as_target.rb +9 -18
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/activity_notification/{migration → active_record}/migration_generator.rb +5 -4
- data/lib/generators/activity_notification/controllers_generator.rb +1 -1
- data/lib/generators/activity_notification/install_generator.rb +3 -6
- data/lib/generators/activity_notification/{notification → models}/notification_generator.rb +5 -4
- data/lib/generators/activity_notification/views_generator.rb +20 -22
- data/lib/generators/templates/active_record/migration.rb +1 -1
- data/lib/generators/templates/activity_notification.rb +13 -3
- data/{config → lib/generators/templates}/locales/en.yml +0 -0
- data/lib/generators/templates/notification/notification.rb +4 -1
- data/spec/concerns/{notification_api_spec.rb → apis/notification_api_spec.rb} +169 -45
- data/spec/concerns/common_spec.rb +150 -0
- data/spec/concerns/models/notifiable_spec.rb +435 -0
- data/spec/concerns/models/notifier_spec.rb +23 -0
- data/spec/concerns/models/target_spec.rb +579 -0
- data/spec/concerns/renderable_spec.rb +110 -0
- data/spec/controllers/notifications_controller_shared_examples.rb +457 -0
- data/spec/controllers/notifications_controller_spec.rb +12 -0
- data/spec/controllers/notifications_with_devise_controller_spec.rb +81 -0
- data/spec/factories/admins.rb +5 -0
- data/spec/factories/articles.rb +1 -1
- data/spec/factories/comments.rb +1 -1
- data/spec/factories/dummy/dummy_notifiable.rb +4 -0
- data/spec/factories/dummy/dummy_notifier.rb +4 -0
- data/spec/factories/dummy/dummy_target.rb +4 -0
- data/spec/factories/notifications.rb +1 -1
- data/spec/factories/users.rb +7 -1
- data/spec/generators/active_record/migration_generator_spec.rb +41 -0
- data/spec/generators/controllers_generator_spec.rb +62 -0
- data/spec/generators/install_generator_spec.rb +43 -0
- data/spec/generators/models/notification_generator_spec.rb +41 -0
- data/spec/generators/views_generator_spec.rb +111 -0
- data/spec/helpers/polymorphic_helpers_spec.rb +89 -0
- data/spec/helpers/view_helpers_spec.rb +258 -0
- data/spec/mailers/mailer_spec.rb +98 -0
- data/spec/models/dummy/dummy_notifiable_spec.rb +6 -0
- data/spec/models/dummy/dummy_notifier_spec.rb +6 -0
- data/spec/models/dummy/dummy_target_spec.rb +6 -0
- data/spec/models/notification_spec.rb +5 -4
- data/spec/rails_app/app/assets/javascripts/application.js +2 -0
- data/spec/rails_app/app/controllers/articles_controller.rb +62 -0
- data/spec/rails_app/app/controllers/comments_controller.rb +34 -0
- data/spec/rails_app/app/models/admin.rb +8 -0
- data/spec/rails_app/app/models/article.rb +6 -6
- data/spec/rails_app/app/models/comment.rb +2 -2
- data/spec/rails_app/app/models/dummy/dummy_base.rb +2 -0
- data/spec/rails_app/app/models/dummy/dummy_notifiable.rb +4 -0
- data/spec/rails_app/app/models/dummy/dummy_notifier.rb +4 -0
- data/spec/rails_app/app/models/dummy/dummy_target.rb +4 -0
- data/spec/rails_app/app/models/user.rb +5 -5
- data/spec/rails_app/app/views/activity_notification/notifications/default/custom/_path_test.html.erb +1 -0
- data/spec/rails_app/app/views/activity_notification/notifications/default/custom/_test.html.erb +1 -0
- data/spec/rails_app/app/views/activity_notification/notifications/users/_custom_index.html.erb +1 -0
- data/spec/rails_app/app/views/activity_notification/notifications/users/custom/_test.html.erb +1 -0
- data/spec/rails_app/app/views/articles/_form.html.erb +20 -0
- data/spec/rails_app/app/views/articles/edit.html.erb +6 -0
- data/spec/rails_app/app/views/articles/index.html.erb +67 -0
- data/spec/rails_app/app/views/articles/new.html.erb +5 -0
- data/spec/rails_app/app/views/articles/show.html.erb +38 -0
- data/spec/rails_app/app/views/layouts/_header.html.erb +8 -0
- data/spec/rails_app/app/views/layouts/application.html.erb +3 -4
- data/spec/rails_app/config/initializers/activity_notification.rb +13 -3
- data/spec/rails_app/config/initializers/devise.rb +274 -274
- data/spec/rails_app/config/locales/activity_notification.en.yml +20 -0
- data/spec/rails_app/config/locales/devise.en.yml +62 -0
- data/spec/rails_app/config/routes.rb +6 -2
- data/spec/rails_app/db/migrate/20160715050433_create_test_tables.rb +6 -2
- data/spec/rails_app/db/schema.rb +8 -0
- data/spec/rails_app/db/seeds.rb +43 -0
- data/spec/roles/acts_as_notifiable_spec.rb +32 -0
- data/spec/roles/acts_as_notifier_spec.rb +17 -0
- data/spec/roles/acts_as_target_spec.rb +40 -0
- data/spec/spec_helper.rb +18 -14
- metadata +136 -12
@@ -3,7 +3,7 @@ require 'rails/generators/base'
|
|
3
3
|
module ActivityNotification
|
4
4
|
module Generators
|
5
5
|
class ControllersGenerator < Rails::Generators::Base
|
6
|
-
CONTROLLERS =
|
6
|
+
CONTROLLERS = ['notifications', 'notifications_with_devise'].freeze
|
7
7
|
|
8
8
|
desc <<-DESC.strip_heredoc
|
9
9
|
Create inherited ActivityNotification controllers in your app/controllers folder.
|
@@ -6,7 +6,7 @@ module ActivityNotification
|
|
6
6
|
|
7
7
|
class InstallGenerator < Rails::Generators::Base
|
8
8
|
source_root File.expand_path("../../templates", __FILE__)
|
9
|
-
|
9
|
+
|
10
10
|
desc "Creates a ActivityNotification initializer and copy locale files to your application."
|
11
11
|
class_option :orm
|
12
12
|
|
@@ -14,7 +14,7 @@ module ActivityNotification
|
|
14
14
|
|
15
15
|
#TODO suport other orm e.g. mongoid
|
16
16
|
unless options[:orm] == :active_record
|
17
|
-
raise
|
17
|
+
raise TypeError, <<-ERROR.strip_heredoc
|
18
18
|
Currently ActivityNotification is only supported with Active Record ORM.
|
19
19
|
|
20
20
|
Be sure to have an Active Record ORM loaded in your
|
@@ -30,16 +30,13 @@ module ActivityNotification
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def copy_locale
|
33
|
-
|
33
|
+
template "locales/en.yml", "config/locales/activity_notification.en.yml"
|
34
34
|
end
|
35
35
|
|
36
36
|
def show_readme
|
37
37
|
readme "README" if behavior == :invoke
|
38
38
|
end
|
39
39
|
|
40
|
-
def rails_4?
|
41
|
-
Rails::VERSION::MAJOR == 4
|
42
|
-
end
|
43
40
|
end
|
44
41
|
end
|
45
42
|
end
|
@@ -6,11 +6,12 @@ module ActivityNotification
|
|
6
6
|
class NotificationGenerator < ActiveRecord::Generators::Base
|
7
7
|
source_root File.expand_path("../../../templates/notification", __FILE__)
|
8
8
|
|
9
|
-
argument :name, type: :string, default: '
|
9
|
+
argument :name, type: :string, default: 'Notification'
|
10
10
|
|
11
|
-
# Create model in
|
12
|
-
def
|
13
|
-
|
11
|
+
# Create model in application directory
|
12
|
+
def create_models
|
13
|
+
@model_name = name
|
14
|
+
template 'notification.rb', "app/models/#{name.underscore}.rb"
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
@@ -3,41 +3,39 @@ require 'rails/generators/base'
|
|
3
3
|
module ActivityNotification
|
4
4
|
module Generators
|
5
5
|
# Include this module in your generator to generate ActivityNotification views.
|
6
|
-
# `copy_views` is the main method and by default copies all views
|
7
|
-
# with forms.
|
6
|
+
# `copy_views` is the main method and by default copies all views of ActivityNotification.
|
8
7
|
class ViewsGenerator < Rails::Generators::Base
|
8
|
+
VIEWS = [:notifications, :mailer].freeze
|
9
|
+
|
9
10
|
source_root File.expand_path("../../../../app/views/activity_notification", __FILE__)
|
10
11
|
desc "Copies default ActivityNotification views to your application."
|
11
12
|
|
12
13
|
argument :target, required: false, default: nil,
|
13
|
-
|
14
|
-
class_option :views, aliases: "-v", type: :array,
|
14
|
+
desc: "The target to copy views to"
|
15
|
+
class_option :views, aliases: "-v", type: :array,
|
16
|
+
desc: "Select specific view directories to generate (notifications, mailer)"
|
15
17
|
public_task :copy_views
|
16
18
|
|
17
19
|
def copy_views
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
else
|
23
|
-
view_directory :notifications
|
24
|
-
view_directory :mailer
|
20
|
+
target_views = options[:views] || VIEWS
|
21
|
+
target_views.each do |directory|
|
22
|
+
view_directory directory.to_sym
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
26
|
protected
|
29
27
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
28
|
+
def view_directory(name, _target_path = nil)
|
29
|
+
directory "#{name.to_s}/default", _target_path || "#{target_path}/#{name}/#{plural_target || :default}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def target_path
|
33
|
+
@target_path ||= "app/views/activity_notification"
|
34
|
+
end
|
35
|
+
|
36
|
+
def plural_target
|
37
|
+
@plural_target ||= target.presence && target.to_s.underscore.pluralize
|
38
|
+
end
|
41
39
|
end
|
42
40
|
|
43
41
|
end
|
@@ -1,9 +1,17 @@
|
|
1
1
|
ActivityNotification.configure do |config|
|
2
2
|
|
3
|
-
#
|
3
|
+
# Configure if all activity notifications are enabled
|
4
|
+
# Set false when you want to turn off activity notifications
|
5
|
+
config.enabled = true
|
6
|
+
|
7
|
+
# Configure table name to store notification data
|
4
8
|
config.table_name = "notifications"
|
5
9
|
|
6
|
-
#
|
10
|
+
# Configure if email notification is enabled as default
|
11
|
+
# Note that you can configure them for each model by acts_as roles.
|
12
|
+
# Set true when you want to turn on email notifications as default
|
13
|
+
config.email_enabled = false
|
14
|
+
|
7
15
|
# Configure the e-mail address which will be shown in ActivityNotification::Mailer,
|
8
16
|
# note that it will be overwritten if you use your own mailer class with default "from" parameter.
|
9
17
|
config.mailer_sender = 'please-change-me-at-config-initializers-activity_notification@example.com'
|
@@ -13,6 +21,8 @@ ActivityNotification.configure do |config|
|
|
13
21
|
|
14
22
|
# Configure the parent class responsible to send e-mails.
|
15
23
|
# config.parent_mailer = 'ActionMailer::Base'
|
16
|
-
|
24
|
+
|
25
|
+
# Configure default limit number of opened notifications you can get from opened* scope
|
17
26
|
config.opened_limit = 10
|
27
|
+
|
18
28
|
end
|
File without changes
|
@@ -1,7 +1,7 @@
|
|
1
1
|
shared_examples_for :notification_api do
|
2
2
|
include ActiveJob::TestHelper
|
3
3
|
let(:test_class_name) { described_class.to_s.underscore.split('/').last.to_sym }
|
4
|
-
let(:test_instance) { create(test_class_name
|
4
|
+
let(:test_instance) { create(test_class_name) }
|
5
5
|
before do
|
6
6
|
ActiveJob::Base.queue_adapter = :test
|
7
7
|
ActivityNotification::Mailer.deliveries.clear
|
@@ -11,9 +11,9 @@ shared_examples_for :notification_api do
|
|
11
11
|
describe "as public class methods" do
|
12
12
|
before do
|
13
13
|
described_class.delete_all
|
14
|
-
@author_user = create(:
|
15
|
-
@user_1 = create(:
|
16
|
-
@user_2 = create(:
|
14
|
+
@author_user = create(:confirmed_user)
|
15
|
+
@user_1 = create(:confirmed_user)
|
16
|
+
@user_2 = create(:confirmed_user)
|
17
17
|
@article = create(:article, user: @author_user)
|
18
18
|
@comment_1 = create(:comment, article: @article, user: @user_1)
|
19
19
|
@comment_2 = create(:comment, article: @article, user: @user_2)
|
@@ -22,9 +22,22 @@ shared_examples_for :notification_api do
|
|
22
22
|
expect(@user_2.notifications.count).to eq(0)
|
23
23
|
end
|
24
24
|
|
25
|
-
describe "notify" do
|
25
|
+
describe "#notify" do
|
26
|
+
it "returns array of created notifications" do
|
27
|
+
notifications = described_class.notify(:users, @comment_2)
|
28
|
+
expect(notifications).to be_a Array
|
29
|
+
expect(notifications.size).to eq(2)
|
30
|
+
if notifications[0].target == @author_user
|
31
|
+
validate_expected_notification(notifications[0], @author_user, @comment_2)
|
32
|
+
validate_expected_notification(notifications[1], @user_1, @comment_2)
|
33
|
+
else
|
34
|
+
validate_expected_notification(notifications[0], @user_1, @comment_2)
|
35
|
+
validate_expected_notification(notifications[1], @author_user, @comment_2)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
26
39
|
it "creates notification records" do
|
27
|
-
described_class.notify(
|
40
|
+
described_class.notify(:users, @comment_2)
|
28
41
|
expect(@author_user.notifications.unopened_only.count).to eq(1)
|
29
42
|
expect(@user_1.notifications.unopened_only.count).to eq(1)
|
30
43
|
expect(@user_2.notifications.unopened_only.count).to eq(0)
|
@@ -34,7 +47,7 @@ shared_examples_for :notification_api do
|
|
34
47
|
it "sends notification email later" do
|
35
48
|
expect {
|
36
49
|
perform_enqueued_jobs do
|
37
|
-
described_class.notify(
|
50
|
+
described_class.notify(:users, @comment_2)
|
38
51
|
end
|
39
52
|
}.to change { ActivityNotification::Mailer.deliveries.size }.by(2)
|
40
53
|
expect(ActivityNotification::Mailer.deliveries.size).to eq(2)
|
@@ -44,14 +57,14 @@ shared_examples_for :notification_api do
|
|
44
57
|
|
45
58
|
it "sends notification email with active job queue" do
|
46
59
|
expect {
|
47
|
-
described_class.notify(
|
60
|
+
described_class.notify(:users, @comment_2)
|
48
61
|
}.to change(ActiveJob::Base.queue_adapter.enqueued_jobs, :size).by(2)
|
49
62
|
end
|
50
63
|
end
|
51
64
|
|
52
65
|
context "with send_later false" do
|
53
66
|
it "sends notification email now" do
|
54
|
-
described_class.notify(
|
67
|
+
described_class.notify(:users, @comment_2, send_later: false)
|
55
68
|
expect(ActivityNotification::Mailer.deliveries.size).to eq(2)
|
56
69
|
expect(ActivityNotification::Mailer.deliveries.first.to[0]).to eq(@user_1.email)
|
57
70
|
expect(ActivityNotification::Mailer.deliveries.last.to[0]).to eq(@author_user.email)
|
@@ -59,7 +72,15 @@ shared_examples_for :notification_api do
|
|
59
72
|
end
|
60
73
|
end
|
61
74
|
|
62
|
-
describe "notify_all" do
|
75
|
+
describe "#notify_all" do
|
76
|
+
it "returns array of created notifications" do
|
77
|
+
notifications = described_class.notify_all([@author_user, @user_1], @comment_2)
|
78
|
+
expect(notifications).to be_a Array
|
79
|
+
expect(notifications.size).to eq(2)
|
80
|
+
validate_expected_notification(notifications[0], @author_user, @comment_2)
|
81
|
+
validate_expected_notification(notifications[1], @user_1, @comment_2)
|
82
|
+
end
|
83
|
+
|
63
84
|
it "creates notification records" do
|
64
85
|
described_class.notify_all([@author_user, @user_1], @comment_2)
|
65
86
|
expect(@author_user.notifications.unopened_only.count).to eq(1)
|
@@ -96,7 +117,12 @@ shared_examples_for :notification_api do
|
|
96
117
|
end
|
97
118
|
end
|
98
119
|
|
99
|
-
describe "notify_to" do
|
120
|
+
describe "#notify_to" do
|
121
|
+
it "returns reated notification" do
|
122
|
+
notification = described_class.notify_to(@user_1, @comment_2)
|
123
|
+
validate_expected_notification(notification, @user_1, @comment_2)
|
124
|
+
end
|
125
|
+
|
100
126
|
it "creates notification records" do
|
101
127
|
described_class.notify_to(@user_1, @comment_2)
|
102
128
|
expect(@user_1.notifications.unopened_only.count).to eq(1)
|
@@ -276,7 +302,7 @@ shared_examples_for :notification_api do
|
|
276
302
|
end
|
277
303
|
end
|
278
304
|
|
279
|
-
describe "open_all_of" do
|
305
|
+
describe "#open_all_of" do
|
280
306
|
before do
|
281
307
|
described_class.notify_to(@user_1, @comment_2)
|
282
308
|
described_class.notify_to(@user_1, @comment_2)
|
@@ -284,6 +310,10 @@ shared_examples_for :notification_api do
|
|
284
310
|
expect(@user_1.notifications.opened_only!.count).to eq(0)
|
285
311
|
end
|
286
312
|
|
313
|
+
it "returns the number of opened notification records" do
|
314
|
+
expect(described_class.open_all_of(@user_1)).to eq(2)
|
315
|
+
end
|
316
|
+
|
287
317
|
it "opens all notifications of the target" do
|
288
318
|
described_class.open_all_of(@user_1)
|
289
319
|
expect(@user_1.notifications.unopened_only.count).to eq(0)
|
@@ -297,10 +327,10 @@ shared_examples_for :notification_api do
|
|
297
327
|
end
|
298
328
|
end
|
299
329
|
|
300
|
-
describe "group_member_exists?" do
|
330
|
+
describe "#group_member_exists?" do
|
301
331
|
context "when specified notifications have any group members" do
|
302
332
|
let(:owner_notifications) do
|
303
|
-
target = create(:
|
333
|
+
target = create(:confirmed_user)
|
304
334
|
group_owner = create(:notification, target: target, group_owner: nil)
|
305
335
|
create(:notification, target: target, group_owner: nil)
|
306
336
|
group_member = create(:notification, target: target, group_owner: group_owner)
|
@@ -315,7 +345,7 @@ shared_examples_for :notification_api do
|
|
315
345
|
|
316
346
|
context "when specified notifications have no group members" do
|
317
347
|
let(:owner_notifications) do
|
318
|
-
target = create(:
|
348
|
+
target = create(:confirmed_user)
|
319
349
|
group_owner = create(:notification, target: target, group_owner: nil)
|
320
350
|
create(:notification, target: target, group_owner: nil)
|
321
351
|
target.notifications.group_owners_only
|
@@ -328,8 +358,8 @@ shared_examples_for :notification_api do
|
|
328
358
|
end
|
329
359
|
end
|
330
360
|
|
331
|
-
describe "available_options" do
|
332
|
-
it "returns list of
|
361
|
+
describe "#available_options" do
|
362
|
+
it "returns list of available options in notify api" do
|
333
363
|
expect(described_class.available_options)
|
334
364
|
.to eq([:key, :group, :parameters, :notifier, :send_email, :send_later])
|
335
365
|
end
|
@@ -337,7 +367,7 @@ shared_examples_for :notification_api do
|
|
337
367
|
end
|
338
368
|
|
339
369
|
describe "as private class methods" do
|
340
|
-
describe "store_notification" do
|
370
|
+
describe "#store_notification" do
|
341
371
|
it "is defined as private method" do
|
342
372
|
expect(described_class.respond_to?(:store_notification)).to be_falsey
|
343
373
|
expect(described_class.respond_to?(:store_notification, true)).to be_truthy
|
@@ -346,7 +376,7 @@ shared_examples_for :notification_api do
|
|
346
376
|
end
|
347
377
|
|
348
378
|
describe "as public instance methods" do
|
349
|
-
describe "send_notification_email" do
|
379
|
+
describe "#send_notification_email" do
|
350
380
|
context "as default" do
|
351
381
|
it "sends notification email later" do
|
352
382
|
expect(ActivityNotification::Mailer.deliveries.size).to eq(0)
|
@@ -376,7 +406,20 @@ shared_examples_for :notification_api do
|
|
376
406
|
end
|
377
407
|
end
|
378
408
|
|
379
|
-
describe "open!" do
|
409
|
+
describe "#open!" do
|
410
|
+
before do
|
411
|
+
described_class.delete_all
|
412
|
+
end
|
413
|
+
|
414
|
+
it "returns the number of opened notification records" do
|
415
|
+
expect(test_instance.open!).to eq(1)
|
416
|
+
end
|
417
|
+
|
418
|
+
it "returns the number of opened notification records including group members" do
|
419
|
+
create(test_class_name, group_owner: test_instance, opened_at: nil)
|
420
|
+
expect(test_instance.open!).to eq(2)
|
421
|
+
end
|
422
|
+
|
380
423
|
context "as default" do
|
381
424
|
it "open notification with current time" do
|
382
425
|
expect(test_instance.opened_at.blank?).to be_truthy
|
@@ -386,6 +429,18 @@ shared_examples_for :notification_api do
|
|
386
429
|
expect(test_instance.opened_at).to eq(DateTime.now)
|
387
430
|
Timecop.return
|
388
431
|
end
|
432
|
+
|
433
|
+
#TODO
|
434
|
+
# it "open group member notifications with current time" do
|
435
|
+
# group_member = create(test_class_name, group_owner: test_instance)
|
436
|
+
# expect(group_member.opened_at.blank?).to be_truthy
|
437
|
+
# Timecop.freeze(DateTime.now)
|
438
|
+
# test_instance.open!
|
439
|
+
# group_member = group_member.reload
|
440
|
+
# expect(group_member.opened_at.blank?).to be_falsey
|
441
|
+
# expect(group_member.opened_at).to eq(DateTime.now)
|
442
|
+
# Timecop.return
|
443
|
+
# end
|
389
444
|
end
|
390
445
|
|
391
446
|
context "with an argument" do
|
@@ -396,10 +451,21 @@ shared_examples_for :notification_api do
|
|
396
451
|
expect(test_instance.opened_at.blank?).to be_falsey
|
397
452
|
expect(test_instance.opened_at).to eq(datetime)
|
398
453
|
end
|
454
|
+
|
455
|
+
#TODO
|
456
|
+
# it "open group member notifications with current time" do
|
457
|
+
# group_member = create(test_class_name, group_owner: test_instance)
|
458
|
+
# expect(group_member.opened_at.blank?).to be_truthy
|
459
|
+
# datetime = DateTime.now - 1.months
|
460
|
+
# test_instance.open!(datetime)
|
461
|
+
# group_member = group_member.reload
|
462
|
+
# expect(group_member.opened_at.blank?).to be_falsey
|
463
|
+
# expect(group_member.opened_at).to eq(datetime)
|
464
|
+
# end
|
399
465
|
end
|
400
466
|
end
|
401
467
|
|
402
|
-
describe "unopened?" do
|
468
|
+
describe "#unopened?" do
|
403
469
|
context "when opened_at is blank" do
|
404
470
|
it "returns true" do
|
405
471
|
expect(test_instance.unopened?).to be_truthy
|
@@ -414,7 +480,7 @@ shared_examples_for :notification_api do
|
|
414
480
|
end
|
415
481
|
end
|
416
482
|
|
417
|
-
describe "opened?" do
|
483
|
+
describe "#opened?" do
|
418
484
|
context "when opened_at is blank" do
|
419
485
|
it "returns false" do
|
420
486
|
expect(test_instance.opened?).to be_falsey
|
@@ -429,7 +495,7 @@ shared_examples_for :notification_api do
|
|
429
495
|
end
|
430
496
|
end
|
431
497
|
|
432
|
-
describe "group_owner?" do
|
498
|
+
describe "#group_owner?" do
|
433
499
|
context "when the notification is group owner" do
|
434
500
|
it "returns true" do
|
435
501
|
expect(test_instance.group_owner?).to be_truthy
|
@@ -444,7 +510,7 @@ shared_examples_for :notification_api do
|
|
444
510
|
end
|
445
511
|
end
|
446
512
|
|
447
|
-
describe "group_member?" do
|
513
|
+
describe "#group_member?" do
|
448
514
|
context "when the notification is group owner" do
|
449
515
|
it "returns false" do
|
450
516
|
expect(test_instance.group_member?).to be_falsey
|
@@ -459,7 +525,7 @@ shared_examples_for :notification_api do
|
|
459
525
|
end
|
460
526
|
end
|
461
527
|
|
462
|
-
describe "group_member_exists?" do
|
528
|
+
describe "#group_member_exists?" do
|
463
529
|
context "when the notification is group owner and has no group members" do
|
464
530
|
it "returns false" do
|
465
531
|
expect(test_instance.group_member_exists?).to be_falsey
|
@@ -481,46 +547,97 @@ shared_examples_for :notification_api do
|
|
481
547
|
end
|
482
548
|
end
|
483
549
|
|
484
|
-
describe "group_member_count" do
|
485
|
-
context "
|
486
|
-
|
487
|
-
|
550
|
+
describe "#group_member_count" do
|
551
|
+
context "for unopened notification" do
|
552
|
+
context "when the notification is group owner and has no group members" do
|
553
|
+
it "returns 0" do
|
554
|
+
expect(test_instance.group_member_count).to eq(0)
|
555
|
+
end
|
488
556
|
end
|
489
|
-
end
|
490
557
|
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
558
|
+
context "when the notification is group owner and has group members" do
|
559
|
+
it "returns member count" do
|
560
|
+
create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
561
|
+
create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
562
|
+
expect(test_instance.group_member_count).to eq(2)
|
563
|
+
end
|
564
|
+
end
|
565
|
+
|
566
|
+
context "when the notification belongs to group" do
|
567
|
+
it "returns member count" do
|
568
|
+
group_member = create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
569
|
+
create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
570
|
+
expect(group_member.group_member_count).to eq(2)
|
571
|
+
end
|
496
572
|
end
|
497
573
|
end
|
498
574
|
|
499
|
-
context "
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
575
|
+
context "for opened notification" do
|
576
|
+
context "when the notification is group owner and has no group members" do
|
577
|
+
it "returns 0" do
|
578
|
+
test_instance.open!
|
579
|
+
expect(test_instance.group_member_count).to eq(0)
|
580
|
+
end
|
581
|
+
end
|
582
|
+
|
583
|
+
context "as default" do
|
584
|
+
context "when the notification is group owner and has group members" do
|
585
|
+
it "returns member count" do
|
586
|
+
create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
587
|
+
create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
588
|
+
test_instance.open!
|
589
|
+
expect(test_instance.group_member_count).to eq(2)
|
590
|
+
end
|
591
|
+
end
|
592
|
+
|
593
|
+
context "when the notification belongs to group" do
|
594
|
+
it "returns member count" do
|
595
|
+
group_member = create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
596
|
+
create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
597
|
+
test_instance.open!
|
598
|
+
expect(group_member.group_member_count).to eq(2)
|
599
|
+
end
|
600
|
+
end
|
601
|
+
end
|
602
|
+
|
603
|
+
context "with limit" do
|
604
|
+
context "when the notification is group owner and has group members" do
|
605
|
+
it "returns member count by limit" do
|
606
|
+
create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
607
|
+
create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
608
|
+
test_instance.open!
|
609
|
+
expect(test_instance.group_member_count(0)).to eq(0)
|
610
|
+
end
|
611
|
+
end
|
612
|
+
|
613
|
+
context "when the notification belongs to group" do
|
614
|
+
it "returns member count by limit" do
|
615
|
+
group_member = create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
616
|
+
create(test_class_name, target: test_instance.target, group_owner: test_instance)
|
617
|
+
test_instance.open!
|
618
|
+
expect(group_member.group_member_count(0)).to eq(0)
|
619
|
+
end
|
620
|
+
end
|
504
621
|
end
|
505
622
|
end
|
506
623
|
end
|
507
624
|
|
508
|
-
describe "
|
625
|
+
describe "#notifiable_path" do
|
509
626
|
it "returns notifiable.notifiable_path" do
|
510
|
-
expect(test_instance.
|
627
|
+
expect(test_instance.notifiable_path).to eq(test_instance.notifiable.notifiable_path(test_instance.target_type))
|
511
628
|
end
|
512
629
|
end
|
513
630
|
end
|
514
631
|
|
515
|
-
describe "
|
516
|
-
describe "unopened_group_member_count" do
|
632
|
+
describe "as protected instance methods" do
|
633
|
+
describe "#unopened_group_member_count" do
|
517
634
|
it "is defined as protected method" do
|
518
635
|
expect(test_instance.respond_to?(:unopened_group_member_count)).to be_falsey
|
519
636
|
expect(test_instance.respond_to?(:unopened_group_member_count, true)).to be_truthy
|
520
637
|
end
|
521
638
|
end
|
522
639
|
|
523
|
-
describe "opened_group_member_count" do
|
640
|
+
describe "#opened_group_member_count" do
|
524
641
|
it "is defined as protected method" do
|
525
642
|
expect(test_instance.respond_to?(:opened_group_member_count)).to be_falsey
|
526
643
|
expect(test_instance.respond_to?(:opened_group_member_count, true)).to be_truthy
|
@@ -528,4 +645,11 @@ shared_examples_for :notification_api do
|
|
528
645
|
end
|
529
646
|
end
|
530
647
|
|
648
|
+
private
|
649
|
+
def validate_expected_notification(notification, target, notifiable)
|
650
|
+
expect(notification).to be_a described_class
|
651
|
+
expect(notification.target).to eq(target)
|
652
|
+
expect(notification.notifiable).to eq(notifiable)
|
653
|
+
end
|
654
|
+
|
531
655
|
end
|