qalam_merit 4.0.4

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.
Files changed (138) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/CODE_OF_CONDUCT.md +84 -0
  4. data/Gemfile +10 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +358 -0
  7. data/RELEASING.md +16 -0
  8. data/Rakefile +44 -0
  9. data/TESTING.txt +12 -0
  10. data/config/locales/en.yml +5 -0
  11. data/lib/merit.rb +95 -0
  12. data/lib/merit/badge_rules_methods.rb +30 -0
  13. data/lib/merit/base_target_finder.rb +31 -0
  14. data/lib/merit/class_methods.rb +41 -0
  15. data/lib/merit/controller_extensions.rb +71 -0
  16. data/lib/merit/generators/active_record/install_generator.rb +40 -0
  17. data/lib/merit/generators/active_record/merit_generator.rb +25 -0
  18. data/lib/merit/generators/active_record/remove_generator.rb +30 -0
  19. data/lib/merit/generators/active_record/templates/add_merit_fields_to_model.erb +7 -0
  20. data/lib/merit/generators/active_record/templates/create_badges_sashes.erb +14 -0
  21. data/lib/merit/generators/active_record/templates/create_merit_actions.erb +16 -0
  22. data/lib/merit/generators/active_record/templates/create_merit_activity_logs.erb +12 -0
  23. data/lib/merit/generators/active_record/templates/create_merit_badges.erb +17 -0
  24. data/lib/merit/generators/active_record/templates/create_sashes.erb +8 -0
  25. data/lib/merit/generators/active_record/templates/create_scores_and_points.erb +16 -0
  26. data/lib/merit/generators/active_record/templates/remove_merit_fields_from_model.erb +7 -0
  27. data/lib/merit/generators/active_record/templates/remove_merit_tables.erb +12 -0
  28. data/lib/merit/generators/install_generator.rb +30 -0
  29. data/lib/merit/generators/merit_generator.rb +33 -0
  30. data/lib/merit/generators/remove_generator.rb +23 -0
  31. data/lib/merit/generators/templates/badge.erb +69 -0
  32. data/lib/merit/generators/templates/merit.erb +18 -0
  33. data/lib/merit/generators/templates/merit_badge_rules.erb +50 -0
  34. data/lib/merit/generators/templates/merit_point_rules.erb +31 -0
  35. data/lib/merit/generators/templates/merit_rank_rules.erb +32 -0
  36. data/lib/merit/generators/templates/qalam_badge_sash.erb +20 -0
  37. data/lib/merit/generators/templates/qalam_sash.erb +14 -0
  38. data/lib/merit/judge.rb +102 -0
  39. data/lib/merit/models/action_concern.rb +50 -0
  40. data/lib/merit/models/active_record/action.rb +11 -0
  41. data/lib/merit/models/active_record/activity_log.rb +11 -0
  42. data/lib/merit/models/active_record/badges_sash.rb +13 -0
  43. data/lib/merit/models/active_record/sash.rb +32 -0
  44. data/lib/merit/models/active_record/score.rb +25 -0
  45. data/lib/merit/models/badges_sash_concern.rb +13 -0
  46. data/lib/merit/models/base/badges_sash.rb +15 -0
  47. data/lib/merit/models/base/sash.rb +55 -0
  48. data/lib/merit/models/sash_concern.rb +53 -0
  49. data/lib/merit/point_rules_methods.rb +33 -0
  50. data/lib/merit/rank_rules_methods.rb +58 -0
  51. data/lib/merit/reputation_change_observer.rb +19 -0
  52. data/lib/merit/rule.rb +35 -0
  53. data/lib/merit/rules_matcher.rb +24 -0
  54. data/lib/merit/sash_finder.rb +15 -0
  55. data/lib/merit/target_finder.rb +43 -0
  56. data/qalam_merit.gemspec +23 -0
  57. data/test/dummy/Rakefile +7 -0
  58. data/test/dummy/app/controllers/admin/users_controller.rb +9 -0
  59. data/test/dummy/app/controllers/api/comments_controller.rb +5 -0
  60. data/test/dummy/app/controllers/api/users_controller.rb +5 -0
  61. data/test/dummy/app/controllers/application_controller.rb +7 -0
  62. data/test/dummy/app/controllers/comments_controller.rb +56 -0
  63. data/test/dummy/app/controllers/registrations_controller.rb +21 -0
  64. data/test/dummy/app/controllers/users_controller.rb +38 -0
  65. data/test/dummy/app/helpers/application_helper.rb +2 -0
  66. data/test/dummy/app/models/address.rb +3 -0
  67. data/test/dummy/app/models/comment.rb +13 -0
  68. data/test/dummy/app/models/dummy_observer.rb +3 -0
  69. data/test/dummy/app/models/merit/badge_rules.rb +66 -0
  70. data/test/dummy/app/models/merit/point_rules.rb +44 -0
  71. data/test/dummy/app/models/merit/rank_rules.rb +24 -0
  72. data/test/dummy/app/models/user.rb +23 -0
  73. data/test/dummy/app/views/admin/users/index.html.erb +26 -0
  74. data/test/dummy/app/views/comments/_form.html.erb +29 -0
  75. data/test/dummy/app/views/comments/edit.html.erb +6 -0
  76. data/test/dummy/app/views/comments/index.html.erb +35 -0
  77. data/test/dummy/app/views/comments/new.html.erb +5 -0
  78. data/test/dummy/app/views/comments/show.html.erb +23 -0
  79. data/test/dummy/app/views/layouts/application.html.erb +24 -0
  80. data/test/dummy/app/views/users/_form.html.erb +22 -0
  81. data/test/dummy/app/views/users/edit.html.erb +6 -0
  82. data/test/dummy/app/views/users/index.html.erb +27 -0
  83. data/test/dummy/app/views/users/new.html.erb +5 -0
  84. data/test/dummy/app/views/users/show.html.erb +18 -0
  85. data/test/dummy/config.ru +4 -0
  86. data/test/dummy/config/application.rb +26 -0
  87. data/test/dummy/config/application_api_only.rb +28 -0
  88. data/test/dummy/config/boot.rb +10 -0
  89. data/test/dummy/config/database.yml +22 -0
  90. data/test/dummy/config/environment.rb +5 -0
  91. data/test/dummy/config/environment_api_only.rb +7 -0
  92. data/test/dummy/config/environments/development.rb +24 -0
  93. data/test/dummy/config/environments/production.rb +51 -0
  94. data/test/dummy/config/environments/test.rb +36 -0
  95. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  96. data/test/dummy/config/initializers/inflections.rb +10 -0
  97. data/test/dummy/config/initializers/merit.rb +47 -0
  98. data/test/dummy/config/initializers/mime_types.rb +5 -0
  99. data/test/dummy/config/initializers/new_framework_defaults.rb +3 -0
  100. data/test/dummy/config/initializers/secret_token.rb +12 -0
  101. data/test/dummy/config/initializers/session_store.rb +8 -0
  102. data/test/dummy/config/locales/en.yml +5 -0
  103. data/test/dummy/config/mongoid.yml +13 -0
  104. data/test/dummy/config/routes.rb +16 -0
  105. data/test/dummy/db/migrate/20110421191249_create_users.rb +12 -0
  106. data/test/dummy/db/migrate/20110421191250_create_comments.rb +16 -0
  107. data/test/dummy/db/migrate/20120318022220_add_fields_to_users.rb +11 -0
  108. data/test/dummy/db/migrate/20130321082817_add_fields_to_comments.rb +11 -0
  109. data/test/dummy/db/migrate/20130329224406_create_merit_actions.rb +18 -0
  110. data/test/dummy/db/migrate/20130329224407_create_merit_activity_logs.rb +15 -0
  111. data/test/dummy/db/migrate/20130329224408_create_sashes.rb +11 -0
  112. data/test/dummy/db/migrate/20130329224409_create_badges_sashes.rb +16 -0
  113. data/test/dummy/db/migrate/20130329224410_create_scores_and_points.rb +20 -0
  114. data/test/dummy/db/migrate/20140211144001_create_addresses.rb +11 -0
  115. data/test/dummy/db/migrate/20140819133931_add_target_data_to_merit_actions.rb +5 -0
  116. data/test/dummy/db/schema.rb +89 -0
  117. data/test/dummy/db/seeds.rb +19 -0
  118. data/test/dummy/public/404.html +26 -0
  119. data/test/dummy/public/422.html +26 -0
  120. data/test/dummy/public/500.html +26 -0
  121. data/test/dummy/public/favicon.ico +0 -0
  122. data/test/dummy/public/rails.js +404 -0
  123. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  124. data/test/dummy/public/stylesheets/scaffold.css +56 -0
  125. data/test/dummy/script/rails +6 -0
  126. data/test/integration/navigation_test.rb +332 -0
  127. data/test/support/integration_case.rb +5 -0
  128. data/test/test_helper.rb +40 -0
  129. data/test/unit/action_test.rb +12 -0
  130. data/test/unit/base_target_finder_test.rb +64 -0
  131. data/test/unit/merit_unit_test.rb +33 -0
  132. data/test/unit/rule_unit_test.rb +57 -0
  133. data/test/unit/rules_matcher_test.rb +37 -0
  134. data/test/unit/sash_finder_test.rb +27 -0
  135. data/test/unit/sash_test.rb +104 -0
  136. data/test/unit/score_test.rb +13 -0
  137. data/test/unit/target_finder_test.rb +98 -0
  138. metadata +360 -0
File without changes
@@ -0,0 +1,56 @@
1
+ body { background-color: #fff; color: #333; }
2
+
3
+ body, p, ol, ul, td {
4
+ font-family: verdana, arial, helvetica, sans-serif;
5
+ font-size: 13px;
6
+ line-height: 18px;
7
+ }
8
+
9
+ pre {
10
+ background-color: #eee;
11
+ padding: 10px;
12
+ font-size: 11px;
13
+ }
14
+
15
+ a { color: #000; }
16
+ a:visited { color: #666; }
17
+ a:hover { color: #fff; background-color:#000; }
18
+
19
+ div.field, div.actions {
20
+ margin-bottom: 10px;
21
+ }
22
+
23
+ #notice {
24
+ color: green;
25
+ }
26
+
27
+ .field_with_errors {
28
+ padding: 2px;
29
+ background-color: red;
30
+ display: table;
31
+ }
32
+
33
+ #error_explanation {
34
+ width: 450px;
35
+ border: 2px solid red;
36
+ padding: 7px;
37
+ padding-bottom: 0;
38
+ margin-bottom: 20px;
39
+ background-color: #f0f0f0;
40
+ }
41
+
42
+ #error_explanation h2 {
43
+ text-align: left;
44
+ font-weight: bold;
45
+ padding: 5px 5px 5px 15px;
46
+ font-size: 12px;
47
+ margin: -7px;
48
+ margin-bottom: 0px;
49
+ background-color: #c00;
50
+ color: #fff;
51
+ }
52
+
53
+ #error_explanation ul li {
54
+ font-size: 12px;
55
+ list-style: square;
56
+ }
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,332 @@
1
+ require 'test_helper'
2
+
3
+ class NavigationTest < ActionDispatch::IntegrationTest
4
+ def teardown
5
+ DummyObserver.unstub(:update)
6
+ end
7
+
8
+ test 'user sign up should grant badge to itself' do
9
+ DummyObserver.any_instance.expects(:update).times(1).with do |hash|
10
+ hash[:description] == 'granted just-registered badge' &&
11
+ hash[:sash_id] == user('Jack').sash_id &&
12
+ hash[:granted_at].to_date == Time.now.utc.to_date
13
+ end
14
+
15
+ visit '/users/new'
16
+ fill_in 'Name', with: 'Jack'
17
+ assert_difference('Merit::ActivityLog.count') do
18
+ click_button('Create User')
19
+ end
20
+
21
+ just_registered = Merit::Badge.by_name('just-registered').first
22
+ assert_equal [just_registered], user('Jack').badges
23
+ end
24
+
25
+ test 'User#add_badge should add one badge, #rm_badge should delete one' do
26
+ DummyObserver.any_instance.expects(:update).times 0
27
+
28
+ user = User.create(name: 'test-user')
29
+ assert_equal [], user.badges
30
+
31
+ badge = Merit::Badge.first
32
+ user.add_badge badge.id
33
+ user.add_badge badge.id
34
+ assert_equal [badge, badge], user.badges
35
+ assert_equal [user], badge.users
36
+
37
+ user.rm_badge badge.id
38
+ assert_equal [badge], user.reload.badges
39
+
40
+ assert_raise NoMethodError do
41
+ user.add_badge badge
42
+ end
43
+
44
+ assert_raise NoMethodError do
45
+ user.rm_badge badge
46
+ end
47
+ end
48
+
49
+ test 'Remove inexistent badge should do nothing' do
50
+ DummyObserver.any_instance.expects(:update).times 0
51
+ user = User.create(name: 'test-user')
52
+ assert_equal [], user.badges
53
+ user.rm_badge 1
54
+ assert_equal [], user.badges
55
+ end
56
+
57
+ test 'users#index should grant badge multiple times' do
58
+ DummyObserver.any_instance.expects(:update).times(1).with do |hash|
59
+ hash[:description] == 'granted visited_admin badge' &&
60
+ hash[:sash_id] == user.sash_id
61
+ end
62
+ DummyObserver.any_instance.expects(:update).times(5).with do |hash|
63
+ hash[:description] == 'granted gossip badge' &&
64
+ hash[:sash_id] == user.sash_id
65
+ end
66
+ DummyObserver.any_instance.expects(:update).times(8).with do |hash|
67
+ hash[:description] == 'granted wildcard_badge badge' &&
68
+ hash[:sash_id] == user.sash_id
69
+ end
70
+
71
+ # Multiple rule
72
+ assert_difference 'badges_by_name(user, "gossip").count', 3 do
73
+ 3.times { visit '/users' }
74
+ end
75
+
76
+ # Namespaced controller
77
+ assert_no_difference 'badges_by_name(user, "visited_admin").count' do
78
+ visit '/users'
79
+ end
80
+ assert_difference 'badges_by_name(user, "visited_admin").count' do
81
+ visit '/admin/users'
82
+ end
83
+
84
+ # Wildcard controllers
85
+ assert_difference 'badges_by_name(user, "wildcard_badge").count', 3 do
86
+ visit '/admin/users'
87
+ visit '/api/users'
88
+ visit '/users'
89
+ end
90
+ end
91
+
92
+ test 'user workflow should grant some badges at some times' do
93
+ DummyObserver.any_instance.expects(:update).at_least_once
94
+ # Commented 9 times, no badges yet
95
+ user # creates user
96
+ # Create needed friend user object
97
+ friend = User.create(name: 'friend')
98
+
99
+ (1..9).each do |i|
100
+ Comment.create(
101
+ name: "Title #{i}",
102
+ comment: "Comment #{i}",
103
+ user_id: user.id,
104
+ votes: 8
105
+ )
106
+ end
107
+ assert user.badges.empty?, 'Should not have badges'
108
+
109
+ assert_equal 0, user.points
110
+ assert_equal 0, Merit::Score::Point.count
111
+ user.add_points 15
112
+ assert_equal 15, user.points
113
+ user.subtract_points 15
114
+ assert_equal 0, user.points
115
+ assert_equal 2, Merit::Score::Point.count
116
+
117
+ # Tenth comment with errors doesn't change reputation
118
+ badges = user.reload.badges
119
+ points = user.points
120
+ visit '/comments/new'
121
+ assert_no_difference('Merit::ActivityLog.count') do
122
+ click_button('Create Comment')
123
+ end
124
+ assert_equal badges, user.reload.badges
125
+ assert_equal points, user.points
126
+
127
+ # Tenth comment without errors, assert 10-commenter badge granted
128
+ fill_in 'Name', with: 'Hi!'
129
+ fill_in 'Comment', with: 'Hi bro!'
130
+ fill_in 'User', with: user.id
131
+ assert_difference('Merit::ActivityLog.count', 2) do
132
+ click_button('Create Comment')
133
+ end
134
+
135
+ assert_equal [Merit::Badge.by_name('commenter').by_level(10).first], user.reload.badges
136
+ assert_equal [Merit::Badge.by_name('has_commenter_friend').first], friend.reload.badges
137
+
138
+ # Vote (to 5) a user's comment, assert relevant-commenter badge granted
139
+ relevant_comment = user.comments.where(votes: 8).first
140
+ visit '/comments'
141
+ within("tr#c_#{relevant_comment.id}") do
142
+ click_link '2'
143
+ end
144
+
145
+ relevant_badge = Merit::Badge.by_name('relevant-commenter').first
146
+ assert user.badges.include?(relevant_badge), "User badges: #{user.badges.collect(&:name).inspect} should contain relevant-commenter badge."
147
+
148
+ # Edit user's name by long name
149
+ # tests ruby code in grant_on is being executed, and gives badge
150
+ visit "/users/#{user.id}/edit"
151
+ fill_in 'Name', with: 'long_name!'
152
+ click_button('Update User')
153
+
154
+ user = User.where(name: 'long_name!').first
155
+ autobiographer_badge = Merit::Badge.by_name('autobiographer').first
156
+ assert user.badges.include?(autobiographer_badge), "User badges: #{user.badges.collect(&:name).inspect} should contain autobiographer badge."
157
+
158
+ # Edit user's name by short name
159
+ # tests ruby code in grant_on is being executed, and removes badge
160
+ visit "/users/#{user.id}/edit"
161
+ fill_in 'Name', with: 'abc'
162
+ assert_difference('Merit::ActivityLog.count', 2) do
163
+ click_button('Update User')
164
+ end
165
+
166
+ # Check created Merit::ActivityLogs
167
+ assert_equal 'granted commenter badge', Merit::ActivityLog.all[0].description
168
+ assert_equal 'granted 20 points', Merit::ActivityLog.all[-1].description
169
+ assert_equal 'removed autobiographer badge', Merit::ActivityLog.all[-2].description
170
+
171
+ user = User.where(name: 'abc').first
172
+ assert !user.badges.include?(autobiographer_badge), "User badges: #{user.badges.collect(&:name).inspect} should remove autobiographer badge."
173
+ end
174
+
175
+ test 'user workflow should add up points at some times' do
176
+ DummyObserver.any_instance.expects(:update).at_least_once
177
+ User.delete_all
178
+ user = User.create(name: 'test-user')
179
+ assert_equal 0, user.points, 'User should start with 0 points'
180
+
181
+ visit "/users/#{user.id}/edit"
182
+ fill_in 'Name', with: 'a'
183
+ assert_difference('Merit::ActivityLog.count', 2) do
184
+ click_button('Update User')
185
+ end
186
+
187
+ user = User.where(name: 'a').first
188
+ assert_equal 20, user.points, 'Updating info should grant 20 points'
189
+
190
+ visit '/comments/new'
191
+ click_button('Create Comment')
192
+
193
+ user = User.where(name: 'a').first
194
+ assert_equal 20, user.points, 'Empty comment should grant no points'
195
+
196
+ visit '/comments/new'
197
+ fill_in 'Name', with: 'Hi!'
198
+ fill_in 'Comment', with: 'Hi bro!'
199
+ fill_in 'User', with: user.id
200
+ click_button('Create Comment')
201
+
202
+ user = User.where(name: 'a').first
203
+ assert_equal 20, user.points, 'Commenting should not grant 20 points if name.length <= 4'
204
+
205
+ visit '/comments/new'
206
+ fill_in 'Name', with: 'Hi there!'
207
+ fill_in 'Comment', with: 'Hi bro!'
208
+ fill_in 'User', with: user.id
209
+ click_button('Create Comment')
210
+
211
+ user = User.where(name: 'a').first
212
+ assert_equal 40, user.points, 'Commenting should grant 20 points if name.length > 4'
213
+
214
+ visit "/comments/#{Comment.last.id}/vote/4"
215
+ user = User.first
216
+ assert_equal 47, user.points, 'Voting comments should grant 5 points for
217
+ voted, and 1 point for voting twice (repeated rule)'
218
+ assert_equal 5, user.points(category: 'vote'), 'Voting comments should
219
+ grant 5 points for voted in vote category'
220
+
221
+ visit '/comments/new'
222
+ fill_in 'Name', with: 'Hi'
223
+ fill_in 'Comment', with: '4'
224
+ fill_in 'User', with: user.id
225
+ click_button('Create Comment')
226
+
227
+ user = User.where(name: 'a').first
228
+ assert_equal 51, user.points, 'Commenting should grant the integer in
229
+ comment points if comment is an integer'
230
+
231
+ # Destroying a comment should remove points from the comment creator.
232
+ comment_to_destroy = user.comments.last
233
+ visit '/comments'
234
+ assert_difference lambda { user.reload.points }, -5 do
235
+ within("tr#c_#{comment_to_destroy.id}") do
236
+ click_link 'Destroy'
237
+ end
238
+ end
239
+ end
240
+
241
+ test 'user workflow should grant levels at some times' do
242
+ DummyObserver.any_instance.expects(:update).at_least_once
243
+ user = User.create(name: 'test-user')
244
+ assert user.badges.empty?
245
+
246
+ # Edit user's name by 2 chars name
247
+ visit "/users/#{user.id}/edit"
248
+ fill_in 'Name', with: 'ab'
249
+ click_button('Update User')
250
+
251
+ user = User.where(name: 'ab').first
252
+ assert_equal 0, user.level, "User level should be 0."
253
+ Merit::RankRules.new.check_rank_rules
254
+ user.reload
255
+ assert_equal 2, user.level, "User level should be 2."
256
+
257
+ # Edit user's name by short name. Doesn't go back to previous rank.
258
+ visit "/users/#{user.id}/edit"
259
+ fill_in 'Name', with: 'a'
260
+ click_button('Update User')
261
+
262
+ user = User.where(name: 'a').first
263
+ Merit::RankRules.new.check_rank_rules
264
+ user.reload
265
+ assert_equal 2, user.level, "User level should be 2."
266
+
267
+ # Edit user's name by 5 chars name
268
+ visit "/users/#{user.id}/edit"
269
+ fill_in 'Name', with: 'abcde'
270
+ click_button('Update User')
271
+
272
+ user = User.where(name: 'abcde').first
273
+ Merit::RankRules.new.check_rank_rules
274
+ user.reload
275
+ assert_equal 5, user.level, "User level should be 5."
276
+ end
277
+
278
+ test 'assigning points to a group of records' do
279
+ DummyObserver.any_instance.expects(:update).times(2).with do |hash|
280
+ hash[:description] == 'granted 1 points' &&
281
+ hash[:sash_id] == user('commenter').sash_id
282
+ end
283
+ DummyObserver.any_instance.expects(:update).times(1).with do |hash|
284
+ hash[:description] == 'granted 2 points' &&
285
+ hash[:sash_id] == user('commenter').comments.first.sash_id
286
+ end
287
+ DummyObserver.any_instance.expects(:update).times(1).with do |hash|
288
+ hash[:description] == 'granted 2 points' &&
289
+ hash[:sash_id] == user('commenter').comments.last.sash_id
290
+ end
291
+ DummyObserver.any_instance.expects(:update).times(1).with do |hash|
292
+ hash[:description] == 'granted 5 points' &&
293
+ hash[:sash_id] == user('commenter').sash_id
294
+ end
295
+
296
+ comment_1 = user('commenter').comments.create(name: 'a', comment: 'a')
297
+ comment_2 = user('commenter').comments.create(name: 'b', comment: 'b')
298
+
299
+ visit comments_path
300
+ # Thanks for voting point, to voted user and it's comments
301
+ # (repeated rule, called twice)
302
+ assert_difference('Merit::ActivityLog.count', 5) do
303
+ within "tr#c_#{comment_2.id}" do
304
+ click_link '1'
305
+ end
306
+ end
307
+
308
+ _(comment_1.reload.points).must_be :==, 2
309
+ _(comment_2.reload.points).must_be :==, 2
310
+ end
311
+
312
+ test 'api/comments#show should grant 1 point to user' do
313
+ DummyObserver.any_instance.expects(:update).times(1).with do |hash|
314
+ hash[:description] == 'granted 1 points' &&
315
+ hash[:sash_id] == user.sash_id
316
+ end
317
+
318
+ assert_equal 0, user.points
319
+ comment = user.comments.create!(name: 'test-comment', comment: 'comment body')
320
+
321
+ visit "/api/comments/#{comment.id}"
322
+ assert_equal 1, user.points
323
+ end
324
+
325
+ def user(name = 'test-user')
326
+ User.where(name: name).first || User.create(name: name)
327
+ end
328
+
329
+ def badges_by_name(user, name)
330
+ user.reload.badges.select{|b| b.name == name }
331
+ end
332
+ end
@@ -0,0 +1,5 @@
1
+ # Define a bare test case to use with Capybara
2
+ class ActionDispatch::IntegrationTest < ActiveSupport::TestCase
3
+ include Capybara::DSL
4
+ include Rails.application.routes.url_helpers
5
+ end
@@ -0,0 +1,40 @@
1
+ # Configure Rails Envinronment
2
+ ENV['RAILS_ENV'] = 'test'
3
+ RUBYOPT = "-w $RUBYOPT".freeze
4
+
5
+ if ENV["COVERAGE"]
6
+ require 'coveralls'
7
+ require 'simplecov'
8
+
9
+ Coveralls.wear!('rails')
10
+
11
+ SimpleCov.adapters.define 'rubygem' do
12
+ # Add app to Merit group
13
+ # https://github.com/colszowka/simplecov/pull/104
14
+ add_group 'Merit', 'lib'
15
+ add_group 'DummyApp', 'test/dummy'
16
+ add_filter 'lib/generators'
17
+ add_filter 'test/dummy/config/initializers'
18
+ end
19
+ SimpleCov.start 'rubygem'
20
+ end
21
+
22
+ if ARGV.include?("-api-only")
23
+ require File.expand_path("dummy/config/environment_api_only.rb", __dir__)
24
+ else
25
+ require File.expand_path("dummy/config/environment.rb", __dir__)
26
+ end
27
+
28
+ require "rails/test_help"
29
+ require "minitest/rails"
30
+ require "mocha/minitest"
31
+
32
+ Rails.backtrace_cleaner.remove_silencers!
33
+
34
+ # Configure capybara for integration testing
35
+ require 'capybara/rails'
36
+ Capybara.default_driver = :rack_test
37
+ Capybara.default_selector = :css
38
+
39
+ # Load support files
40
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ describe Merit::Action do
4
+ it 'saves correctly with a serialised model' do
5
+ comment = Comment.new(name: 'the comment name')
6
+ action = Merit::Action.create(target_model: 'comment',
7
+ target_id: 2,
8
+ target_data: comment.to_yaml)
9
+ comment_yaml = Merit::Action.find(action.id).target_data
10
+ assert_equal comment.name, YAML::load(comment_yaml).name
11
+ end
12
+ end