merit 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/Gemfile +13 -1
  2. data/README.md +10 -10
  3. data/UPGRADING.md +14 -0
  4. data/app/models/merit/action.rb +9 -10
  5. data/app/models/merit/badge.rb +9 -6
  6. data/lib/generators/merit/templates/merit.rb +6 -2
  7. data/lib/merit.rb +3 -2
  8. data/lib/merit/controller_extensions.rb +10 -9
  9. data/lib/merit/judge.rb +9 -15
  10. data/lib/merit/model_additions.rb +6 -6
  11. data/lib/merit/models/active_record/merit/action.rb +4 -2
  12. data/lib/merit/models/active_record/merit/activity_log.rb +3 -1
  13. data/lib/merit/models/active_record/merit/badges_sash.rb +6 -2
  14. data/lib/merit/models/active_record/merit/sash.rb +8 -8
  15. data/lib/merit/models/active_record/merit/score.rb +7 -3
  16. data/lib/merit/models/mongo_mapper/merit/action.rb +1 -1
  17. data/lib/merit/models/mongo_mapper/sash.rb +1 -0
  18. data/lib/merit/models/mongoid/merit/action.rb +4 -4
  19. data/lib/merit/models/mongoid/sash.rb +1 -1
  20. data/lib/merit/observer.rb +13 -0
  21. data/lib/merit/rule.rb +1 -1
  22. data/lib/merit/rules_badge_methods.rb +2 -2
  23. data/lib/merit/rules_matcher.rb +24 -0
  24. data/lib/merit/rules_rank_methods.rb +12 -8
  25. data/lib/merit/target_finder.rb +12 -9
  26. data/merit.gemspec +2 -5
  27. data/test/dummy/app/controllers/api/users_controller.rb +5 -0
  28. data/test/dummy/app/controllers/comments_controller.rb +15 -49
  29. data/test/dummy/app/controllers/registrations_controller.rb +7 -1
  30. data/test/dummy/app/controllers/users_controller.rb +11 -40
  31. data/test/dummy/app/models/comment.rb +3 -1
  32. data/test/dummy/app/models/merit/badge_rules.rb +11 -8
  33. data/test/dummy/app/models/merit/point_rules.rb +4 -4
  34. data/test/dummy/app/models/merit/rank_rules.rb +1 -1
  35. data/test/dummy/app/models/user.rb +3 -1
  36. data/test/dummy/app/views/admin/users/index.html.erb +1 -1
  37. data/test/dummy/app/views/comments/index.html.erb +1 -1
  38. data/test/dummy/app/views/users/index.html.erb +1 -1
  39. data/test/dummy/config/application.rb +1 -1
  40. data/test/dummy/config/environments/development.rb +2 -3
  41. data/test/dummy/config/environments/production.rb +2 -0
  42. data/test/dummy/config/environments/test.rb +2 -3
  43. data/test/dummy/config/initializers/merit.rb +27 -24
  44. data/test/dummy/config/initializers/secret_token.rb +6 -1
  45. data/test/dummy/config/routes.rb +5 -2
  46. data/test/integration/navigation_test.rb +67 -55
  47. data/test/test_helper.rb +5 -20
  48. data/test/{base_target_finder_test.rb → unit/base_target_finder_test.rb} +1 -1
  49. data/test/{merit_unit_test.rb → unit/merit_unit_test.rb} +14 -32
  50. data/test/unit/rule_unit_test.rb +44 -0
  51. data/test/{sash_finder_test.rb → unit/sash_finder_test.rb} +1 -1
  52. data/test/{target_finder_test.rb → unit/target_finder_test.rb} +5 -5
  53. metadata +12 -41
  54. data/Gemfile.lock +0 -146
@@ -8,15 +8,15 @@ module Merit
8
8
 
9
9
  def initialize
10
10
  # Thanks for voting point
11
- score 1, :on => 'comments#vote'
11
+ score 1, on: 'comments#vote'
12
12
 
13
13
  # All user's comments earn points
14
- score 2, :to => :user_comments, :on => 'comments#vote'
14
+ score 2, to: :user_comments, on: 'comments#vote'
15
15
 
16
16
  # Points to voted user
17
- score 5, :to => :user, :on => 'comments#vote'
17
+ score 5, to: :user, on: 'comments#vote'
18
18
 
19
- score 20, :on => [
19
+ score 20, on: [
20
20
  'comments#create',
21
21
  'registrations#update'
22
22
  ] do |object|
@@ -15,7 +15,7 @@ module Merit
15
15
  def initialize
16
16
  # i stars for i chars name
17
17
  (1..5).each do |i|
18
- set_rank :level => i, :to => User do |user|
18
+ set_rank level: i, to: User do |user|
19
19
  user.name.length == i
20
20
  end
21
21
  end
@@ -3,7 +3,9 @@ class User < ActiveRecord::Base
3
3
 
4
4
  has_many :comments
5
5
 
6
- attr_accessible :name
6
+ if Rails.version < '4'
7
+ attr_accessible :name
8
+ end
7
9
 
8
10
  def show_badges
9
11
  badges_uniq = Badge.find_by_id(badge_ids)
@@ -16,7 +16,7 @@
16
16
  <td><%= user.points %></td>
17
17
  <td><%= link_to 'Show', user %>
18
18
  - <%= link_to 'Edit', edit_user_path(user) %>
19
- - <%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method => :delete %></td>
19
+ - <%= link_to 'Destroy', user, data: { :confirm => 'Are you sure?' }, :method => :delete %></td>
20
20
  </tr>
21
21
  <% end %>
22
22
  </table>
@@ -25,7 +25,7 @@
25
25
  </td>
26
26
  <td><%= link_to 'Show', comment %></td>
27
27
  <td><%= link_to 'Edit', edit_comment_path(comment) %></td>
28
- <td><%= link_to 'Destroy', comment, :confirm => 'Are you sure?', :method => :delete %></td>
28
+ <td><%= link_to 'Destroy', comment, data: { :confirm => 'Are you sure?' }, :method => :delete %></td>
29
29
  </tr>
30
30
  <% end %>
31
31
  </table>
@@ -16,7 +16,7 @@
16
16
  <td><%= user.points %></td>
17
17
  <td><%= link_to 'Show', user %>
18
18
  - <%= link_to 'Edit', edit_user_path(user) %>
19
- - <%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method => :delete %></td>
19
+ - <%= link_to 'Destroy', user, data: { :confirm => 'Are you sure?' }, :method => :delete %></td>
20
20
  </tr>
21
21
  <% end %>
22
22
  </table>
@@ -14,7 +14,7 @@ module Dummy
14
14
  # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
15
15
  # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
16
16
  # config.i18n.default_locale = :de
17
- config.active_record.whitelist_attributes = true
17
+ # config.active_record.whitelist_attributes = true
18
18
 
19
19
  # Configure the default encoding used in templates for Ruby 1.9.
20
20
  config.encoding = "utf-8"
@@ -6,9 +6,6 @@ Dummy::Application.configure do
6
6
  # since you don't have to restart the webserver when you make code changes.
7
7
  config.cache_classes = false
8
8
 
9
- # Log error messages when you accidentally call methods on nil.
10
- config.whiny_nils = true
11
-
12
9
  # Show full error reports and disable caching
13
10
  config.consider_all_requests_local = true
14
11
  config.action_controller.perform_caching = false
@@ -21,5 +18,7 @@ Dummy::Application.configure do
21
18
 
22
19
  # Only use best-standards-support built into browsers
23
20
  config.action_dispatch.best_standards_support = :builtin
21
+
22
+ config.eager_load = false
24
23
  end
25
24
 
@@ -46,4 +46,6 @@ Dummy::Application.configure do
46
46
 
47
47
  # Send deprecation notices to registered listeners
48
48
  config.active_support.deprecation = :notify
49
+
50
+ config.eager_load = true
49
51
  end
@@ -7,9 +7,6 @@ Dummy::Application.configure do
7
7
  # and recreated between test runs. Don't rely on the data there!
8
8
  config.cache_classes = true
9
9
 
10
- # Log error messages when you accidentally call methods on nil.
11
- config.whiny_nils = true
12
-
13
10
  # Show full error reports and disable caching
14
11
  config.consider_all_requests_local = true
15
12
  config.action_controller.perform_caching = false
@@ -32,4 +29,6 @@ Dummy::Application.configure do
32
29
 
33
30
  # Print deprecation notices to the stderr
34
31
  config.active_support.deprecation = :stderr
32
+
33
+ config.eager_load = false
35
34
  end
@@ -3,43 +3,46 @@ Merit.setup do |config|
3
3
  # Check rules on each request or in background
4
4
  # config.checks_on_each_request = true
5
5
 
6
- # Define ORM. Could be :active_record (default), :mongo_mapper and :mongoid
6
+ # Define ORM. Could be:active_record (default), :mongo_mapper and :mongoid
7
7
  # config.orm = :active_record
8
8
  end
9
9
 
10
10
  # Create application badges (uses https://github.com/norman/ambry)
11
11
  badge_id = 0
12
12
  [{
13
- :id => (badge_id = badge_id+1),
14
- :name => 'commenter',
15
- :description => 'You\'ve participated good in our boards! (level 10)',
16
- :level => 10
13
+ id: (badge_id = badge_id+1),
14
+ name: 'commenter',
15
+ description: 'You\'ve participated good in our boards! (level 10)',
16
+ level: 10
17
17
  }, {
18
- :id => (badge_id = badge_id+1),
19
- :name => 'commenter',
20
- :description => 'You\'ve participated great in our boards!'
18
+ id: (badge_id = badge_id+1),
19
+ name: 'commenter',
20
+ description: 'You\'ve participated great in our boards!'
21
21
  }, {
22
- :id => (badge_id = badge_id+1),
23
- :name => 'visited_admin',
24
- :description => 'You sneaked in!'
22
+ id: (badge_id = badge_id+1),
23
+ name: 'visited_admin',
24
+ description: 'You sneaked in!'
25
25
  }, {
26
- :id => (badge_id = badge_id+1),
27
- :name => 'has_commenter_friend',
28
- :description => 'Testing badge granting in more than one rule per action, with different targets'
26
+ id: (badge_id = badge_id+1),
27
+ name: 'has_commenter_friend',
28
+ description: 'Testing badge granting in more than one rule per action, with different targets'
29
29
  }, {
30
- :id => (badge_id = badge_id+1),
31
- :name => 'relevant-commenter',
32
- :description => 'You\'ve received 5 votes on a comment.'
30
+ id: (badge_id = badge_id+1),
31
+ name: 'relevant-commenter',
32
+ description: 'You\'ve received 5 votes on a comment.'
33
33
  }, {
34
- :id => (badge_id = badge_id+1),
35
- :name => 'autobiographer',
36
- :description => 'You\'ve edited your name and it\'s above 4 characters! (?)'
34
+ id: (badge_id = badge_id+1),
35
+ name: 'autobiographer',
36
+ description: 'You\'ve edited your name and it\'s above 4 characters! (?)'
37
37
  }, {
38
- :id => (badge_id = badge_id+1),
39
- :name => 'just-registered'
38
+ id: (badge_id = badge_id+1),
39
+ name: 'just-registered'
40
40
  }, {
41
- :id => (badge_id = badge_id+1),
42
- :name => 'gossip'
41
+ id: (badge_id = badge_id+1),
42
+ name: 'wildcard_badge'
43
+ }, {
44
+ id: (badge_id = badge_id+1),
45
+ name: 'gossip'
43
46
  }].each do |badge|
44
47
  Merit::Badge.create! badge
45
48
  end
@@ -4,4 +4,9 @@
4
4
  # If you change this key, all old signed cookies will become invalid!
5
5
  # Make sure the secret is at least 30 characters and all random,
6
6
  # no regular words or you'll be exposed to dictionary attacks.
7
- Dummy::Application.config.secret_token = 'f00fe8e4404331c84a9f1d877217c57399e0429ed948843f5d0b5db642cb2ab2c1dc28a17ef7daeecf64b1a4f2b61f7ae4886ab993fb0d7cf65d7b64ba5fbcb1'
7
+
8
+ if Rails.version < '4'
9
+ Dummy::Application.config.secret_token = 'f00fe8e4404331c84a9f1d877217c57399e0429ed948843f5d0b5db642cb2ab2c1dc28a17ef7daeecf64b1a4f2b61f7ae4886ab993fb0d7cf65d7b64ba5fbcb1'
10
+ else
11
+ Dummy::Application.config.secret_key_base = 'f00fe8e4404331c84a9f1d877217c57399e0429ed948843f5d0b5db642cb2ab2c1dc28a17ef7daeecf64b1a4f2b61f7ae4886ab993fb0d7cf65d7b64ba5fbcb1'
12
+ end
@@ -1,12 +1,15 @@
1
1
  Dummy::Application.routes.draw do
2
2
  namespace :admin do
3
- match '/users' => 'users#index'
3
+ get '/users' => 'users#index'
4
+ end
5
+ namespace :api do
6
+ get '/users' => 'users#index'
4
7
  end
5
8
  resources :users, :except => :update
6
9
  resources :registrations, :only => :update, :as => :registrations_user
7
10
  resources :comments
8
11
 
9
- match '/comments/:id/vote/:value' => 'comments#vote', :id => /\d+/, :value => /\d+/
12
+ get '/comments/:id/vote/:value' => 'comments#vote', :id => /\d+/, :value => /\d+/
10
13
 
11
14
  root :to => 'users#index'
12
15
  end
@@ -3,17 +3,17 @@ require 'test_helper'
3
3
  class NavigationTest < ActiveSupport::IntegrationCase
4
4
  test 'user sign up should grant badge to itself' do
5
5
  visit '/users/new'
6
- fill_in 'Name', :with => 'Jack'
6
+ fill_in 'Name', with: 'Jack'
7
7
  assert_difference('Merit::ActivityLog.count') do
8
8
  click_button('Create User')
9
9
  end
10
10
 
11
- user = User.where(:name => 'Jack').first
11
+ user = User.where(name: 'Jack').first
12
12
  assert_equal [Merit::Badge.by_name('just-registered').first], user.badges
13
13
  end
14
14
 
15
15
  test 'User#add_badge should add one badge, #rm_badge should delete one' do
16
- user = User.create(:name => 'test-user')
16
+ user = User.create(name: 'test-user')
17
17
  assert_equal [], user.badges
18
18
 
19
19
  badge = Merit::Badge.first
@@ -27,40 +27,48 @@ class NavigationTest < ActiveSupport::IntegrationCase
27
27
  end
28
28
 
29
29
  test 'Remove inexistent badge should do nothing' do
30
- user = User.create(:name => 'test-user')
30
+ user = User.create(name: 'test-user')
31
31
  assert_equal [], user.badges
32
32
  user.rm_badge 1
33
33
  assert_equal [], user.badges
34
34
  end
35
35
 
36
36
  test 'users#index should grant badge multiple times' do
37
- user = User.create(:name => 'test-user')
38
- visit '/users'
39
- visit '/users'
40
- visit '/users'
41
- gossip = Merit::Badge.by_name('gossip').first
42
- assert_equal 3, User.first.badges.count
43
- assert_equal [gossip, gossip, gossip], User.first.badges
44
-
45
- # Testing with namespaced controllers
46
- visit '/admin/users'
47
- visited_admin = Merit::Badge.by_name('visited_admin').first
48
- assert_equal 4, User.first.badges.count
49
- assert User.first.badges.include?(visited_admin)
37
+ user = User.create(name: 'test-user')
38
+
39
+ # Multiple rule
40
+ assert_difference 'badges_by_name(user, "gossip").count', 3 do
41
+ 3.times { visit '/users' }
42
+ end
43
+
44
+ # Namespaced controller
45
+ assert_no_difference 'badges_by_name(user, "visited_admin").count' do
46
+ visit '/users'
47
+ end
48
+ assert_difference 'badges_by_name(user, "visited_admin").count' do
49
+ visit '/admin/users'
50
+ end
51
+
52
+ # Wildcard controllers
53
+ assert_difference 'badges_by_name(user, "wildcard_badge").count', 3 do
54
+ visit '/admin/users'
55
+ visit '/api/users'
56
+ visit '/users'
57
+ end
50
58
  end
51
59
 
52
60
  test 'user workflow should grant some badges at some times' do
53
61
  # Commented 9 times, no badges yet
54
- user = User.create(:name => 'test-user')
62
+ user = User.create(name: 'test-user')
55
63
  # Create needed friend user object
56
- friend = User.create(:name => 'friend')
64
+ friend = User.create(name: 'friend')
57
65
 
58
66
  (1..9).each do |i|
59
67
  Comment.create(
60
- :name => "Title #{i}",
61
- :comment => "Comment #{i}",
62
- :user_id => user.id,
63
- :votes => 8
68
+ name: "Title #{i}",
69
+ comment: "Comment #{i}",
70
+ user_id: user.id,
71
+ votes: 8
64
72
  )
65
73
  end
66
74
  assert user.badges.empty?, 'Should not have badges'
@@ -75,9 +83,9 @@ class NavigationTest < ActiveSupport::IntegrationCase
75
83
 
76
84
  # Make tenth comment, assert 10-commenter badge granted
77
85
  visit '/comments/new'
78
- fill_in 'Name', :with => 'Hi!'
79
- fill_in 'Comment', :with => 'Hi bro!'
80
- fill_in 'User', :with => user.id
86
+ fill_in 'Name', with: 'Hi!'
87
+ fill_in 'Comment', with: 'Hi bro!'
88
+ fill_in 'User', with: user.id
81
89
  assert_difference('Merit::ActivityLog.count', 2) do
82
90
  click_button('Create Comment')
83
91
  end
@@ -86,79 +94,79 @@ class NavigationTest < ActiveSupport::IntegrationCase
86
94
  assert_equal [Merit::Badge.by_name('has_commenter_friend').first], friend.reload.badges
87
95
 
88
96
  # Vote (to 5) a user's comment, assert relevant-commenter badge granted
89
- relevant_comment = user.comments.where(:votes => 8).first
97
+ relevant_comment = user.comments.where(votes: 8).first
90
98
  visit '/comments'
91
99
  within("tr#c_#{relevant_comment.id}") do
92
100
  click_link '2'
93
101
  end
94
102
 
95
103
  relevant_badge = Merit::Badge.by_name('relevant-commenter').first
96
- user_badges = User.where(:name => 'test-user').first.badges
104
+ user_badges = User.where(name: 'test-user').first.badges
97
105
  assert user_badges.include?(relevant_badge), "User badges: #{user.badges.collect(&:name).inspect} should contain relevant-commenter badge."
98
106
 
99
107
  # Edit user's name by long name
100
108
  # tests ruby code in grant_on is being executed, and gives badge
101
- user = User.where(:name => 'test-user').first
109
+ user = User.where(name: 'test-user').first
102
110
  user_badges = user.badges
103
111
 
104
112
  visit "/users/#{user.id}/edit"
105
- fill_in 'Name', :with => 'long_name!'
113
+ fill_in 'Name', with: 'long_name!'
106
114
  click_button('Update User')
107
115
 
108
- user = User.where(:name => 'long_name!').first
116
+ user = User.where(name: 'long_name!').first
109
117
  autobiographer_badge = Merit::Badge.by_name('autobiographer').first
110
118
  assert user.badges.include?(autobiographer_badge), "User badges: #{user.badges.collect(&:name).inspect} should contain autobiographer badge."
111
119
 
112
120
  # Edit user's name by short name
113
121
  # tests ruby code in grant_on is being executed, and removes badge
114
122
  visit "/users/#{user.id}/edit"
115
- fill_in 'Name', :with => 'abc'
123
+ fill_in 'Name', with: 'abc'
116
124
  assert_difference('Merit::ActivityLog.count', 2) do
117
125
  click_button('Update User')
118
126
  end
119
127
  # Last one is point granting, previous one is badge removing
120
128
  assert_equal 'removed', Merit::ActivityLog.all[-2].description
121
129
 
122
- user = User.where(:name => 'abc').first
130
+ user = User.where(name: 'abc').first
123
131
  assert !user.badges.include?(autobiographer_badge), "User badges: #{user.badges.collect(&:name).inspect} should remove autobiographer badge."
124
132
  end
125
133
 
126
134
  test 'user workflow should add up points at some times' do
127
135
  User.delete_all
128
- user = User.create(:name => 'test-user')
136
+ user = User.create(name: 'test-user')
129
137
  assert_equal 0, user.points, 'User should start with 0 points'
130
138
 
131
139
  visit "/users/#{user.id}/edit"
132
- fill_in 'Name', :with => 'a'
140
+ fill_in 'Name', with: 'a'
133
141
  assert_difference('Merit::ActivityLog.count', 2) do
134
142
  click_button('Update User')
135
143
  end
136
144
 
137
- user = User.where(:name => 'a').first
145
+ user = User.where(name: 'a').first
138
146
  assert_equal 20, user.points, 'Updating info should grant 20 points'
139
147
 
140
148
  visit '/comments/new'
141
149
  click_button('Create Comment')
142
150
 
143
- user = User.where(:name => 'a').first
151
+ user = User.where(name: 'a').first
144
152
  assert_equal 20, user.points, 'Empty comment should grant no points'
145
153
 
146
154
  visit '/comments/new'
147
- fill_in 'Name', :with => 'Hi!'
148
- fill_in 'Comment', :with => 'Hi bro!'
149
- fill_in 'User', :with => user.id
155
+ fill_in 'Name', with: 'Hi!'
156
+ fill_in 'Comment', with: 'Hi bro!'
157
+ fill_in 'User', with: user.id
150
158
  click_button('Create Comment')
151
159
 
152
- user = User.where(:name => 'a').first
160
+ user = User.where(name: 'a').first
153
161
  assert_equal 20, user.points, 'Commenting should not grant 20 points if name.length <= 4'
154
162
 
155
163
  visit '/comments/new'
156
- fill_in 'Name', :with => 'Hi there!'
157
- fill_in 'Comment', :with => 'Hi bro!'
158
- fill_in 'User', :with => user.id
164
+ fill_in 'Name', with: 'Hi there!'
165
+ fill_in 'Comment', with: 'Hi bro!'
166
+ fill_in 'User', with: user.id
159
167
  click_button('Create Comment')
160
168
 
161
- user = User.where(:name => 'a').first
169
+ user = User.where(name: 'a').first
162
170
  assert_equal 40, user.points, 'Commenting should grant 20 points if name.length > 4'
163
171
 
164
172
  visit "/comments/#{Comment.last.id}/vote/4"
@@ -167,15 +175,15 @@ class NavigationTest < ActiveSupport::IntegrationCase
167
175
  end
168
176
 
169
177
  test 'user workflow should grant levels at some times' do
170
- user = User.create(:name => 'test-user')
178
+ user = User.create(name: 'test-user')
171
179
  assert user.badges.empty?
172
180
 
173
181
  # Edit user's name by 2 chars name
174
182
  visit "/users/#{user.id}/edit"
175
- fill_in 'Name', :with => 'ab'
183
+ fill_in 'Name', with: 'ab'
176
184
  click_button('Update User')
177
185
 
178
- user = User.where(:name => 'ab').first
186
+ user = User.where(name: 'ab').first
179
187
  assert_equal 0, user.level, "User level should be 0."
180
188
  Merit::RankRules.new.check_rank_rules
181
189
  user.reload
@@ -183,29 +191,29 @@ class NavigationTest < ActiveSupport::IntegrationCase
183
191
 
184
192
  # Edit user's name by short name. Doesn't go back to previous rank.
185
193
  visit "/users/#{user.id}/edit"
186
- fill_in 'Name', :with => 'a'
194
+ fill_in 'Name', with: 'a'
187
195
  click_button('Update User')
188
196
 
189
- user = User.where(:name => 'a').first
197
+ user = User.where(name: 'a').first
190
198
  Merit::RankRules.new.check_rank_rules
191
199
  user.reload
192
200
  assert_equal 2, user.level, "User level should be 2."
193
201
 
194
202
  # Edit user's name by 5 chars name
195
203
  visit "/users/#{user.id}/edit"
196
- fill_in 'Name', :with => 'abcde'
204
+ fill_in 'Name', with: 'abcde'
197
205
  click_button('Update User')
198
206
 
199
- user = User.where(:name => 'abcde').first
207
+ user = User.where(name: 'abcde').first
200
208
  Merit::RankRules.new.check_rank_rules
201
209
  user.reload
202
210
  assert_equal 5, user.level, "User level should be 5."
203
211
  end
204
212
 
205
213
  test 'assigning points to a group of records' do
206
- commenter = User.create(:name => 'commenter')
207
- comment_1 = commenter.comments.create(:name => 'comment_1', :comment => 'a')
208
- comment_2 = commenter.comments.create(:name => 'comment_2', :comment => 'b')
214
+ commenter = User.create(name: 'commenter')
215
+ comment_1 = commenter.comments.create(name: 'comment_1', comment: 'a')
216
+ comment_2 = commenter.comments.create(name: 'comment_2', comment: 'b')
209
217
 
210
218
  visit comments_path
211
219
  # Thanks for voting point, to voted user and it's comments
@@ -218,4 +226,8 @@ class NavigationTest < ActiveSupport::IntegrationCase
218
226
  comment_1.reload.points.must_be :==, 2
219
227
  comment_2.reload.points.must_be :==, 2
220
228
  end
229
+
230
+ def badges_by_name(user, name)
231
+ user.reload.badges.select{|b| b.name == name }
232
+ end
221
233
  end