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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +21 -0
- data/README.md +358 -0
- data/RELEASING.md +16 -0
- data/Rakefile +44 -0
- data/TESTING.txt +12 -0
- data/config/locales/en.yml +5 -0
- data/lib/merit.rb +95 -0
- data/lib/merit/badge_rules_methods.rb +30 -0
- data/lib/merit/base_target_finder.rb +31 -0
- data/lib/merit/class_methods.rb +41 -0
- data/lib/merit/controller_extensions.rb +71 -0
- data/lib/merit/generators/active_record/install_generator.rb +40 -0
- data/lib/merit/generators/active_record/merit_generator.rb +25 -0
- data/lib/merit/generators/active_record/remove_generator.rb +30 -0
- data/lib/merit/generators/active_record/templates/add_merit_fields_to_model.erb +7 -0
- data/lib/merit/generators/active_record/templates/create_badges_sashes.erb +14 -0
- data/lib/merit/generators/active_record/templates/create_merit_actions.erb +16 -0
- data/lib/merit/generators/active_record/templates/create_merit_activity_logs.erb +12 -0
- data/lib/merit/generators/active_record/templates/create_merit_badges.erb +17 -0
- data/lib/merit/generators/active_record/templates/create_sashes.erb +8 -0
- data/lib/merit/generators/active_record/templates/create_scores_and_points.erb +16 -0
- data/lib/merit/generators/active_record/templates/remove_merit_fields_from_model.erb +7 -0
- data/lib/merit/generators/active_record/templates/remove_merit_tables.erb +12 -0
- data/lib/merit/generators/install_generator.rb +30 -0
- data/lib/merit/generators/merit_generator.rb +33 -0
- data/lib/merit/generators/remove_generator.rb +23 -0
- data/lib/merit/generators/templates/badge.erb +69 -0
- data/lib/merit/generators/templates/merit.erb +18 -0
- data/lib/merit/generators/templates/merit_badge_rules.erb +50 -0
- data/lib/merit/generators/templates/merit_point_rules.erb +31 -0
- data/lib/merit/generators/templates/merit_rank_rules.erb +32 -0
- data/lib/merit/generators/templates/qalam_badge_sash.erb +20 -0
- data/lib/merit/generators/templates/qalam_sash.erb +14 -0
- data/lib/merit/judge.rb +102 -0
- data/lib/merit/models/action_concern.rb +50 -0
- data/lib/merit/models/active_record/action.rb +11 -0
- data/lib/merit/models/active_record/activity_log.rb +11 -0
- data/lib/merit/models/active_record/badges_sash.rb +13 -0
- data/lib/merit/models/active_record/sash.rb +32 -0
- data/lib/merit/models/active_record/score.rb +25 -0
- data/lib/merit/models/badges_sash_concern.rb +13 -0
- data/lib/merit/models/base/badges_sash.rb +15 -0
- data/lib/merit/models/base/sash.rb +55 -0
- data/lib/merit/models/sash_concern.rb +53 -0
- data/lib/merit/point_rules_methods.rb +33 -0
- data/lib/merit/rank_rules_methods.rb +58 -0
- data/lib/merit/reputation_change_observer.rb +19 -0
- data/lib/merit/rule.rb +35 -0
- data/lib/merit/rules_matcher.rb +24 -0
- data/lib/merit/sash_finder.rb +15 -0
- data/lib/merit/target_finder.rb +43 -0
- data/qalam_merit.gemspec +23 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/controllers/admin/users_controller.rb +9 -0
- data/test/dummy/app/controllers/api/comments_controller.rb +5 -0
- data/test/dummy/app/controllers/api/users_controller.rb +5 -0
- data/test/dummy/app/controllers/application_controller.rb +7 -0
- data/test/dummy/app/controllers/comments_controller.rb +56 -0
- data/test/dummy/app/controllers/registrations_controller.rb +21 -0
- data/test/dummy/app/controllers/users_controller.rb +38 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/address.rb +3 -0
- data/test/dummy/app/models/comment.rb +13 -0
- data/test/dummy/app/models/dummy_observer.rb +3 -0
- data/test/dummy/app/models/merit/badge_rules.rb +66 -0
- data/test/dummy/app/models/merit/point_rules.rb +44 -0
- data/test/dummy/app/models/merit/rank_rules.rb +24 -0
- data/test/dummy/app/models/user.rb +23 -0
- data/test/dummy/app/views/admin/users/index.html.erb +26 -0
- data/test/dummy/app/views/comments/_form.html.erb +29 -0
- data/test/dummy/app/views/comments/edit.html.erb +6 -0
- data/test/dummy/app/views/comments/index.html.erb +35 -0
- data/test/dummy/app/views/comments/new.html.erb +5 -0
- data/test/dummy/app/views/comments/show.html.erb +23 -0
- data/test/dummy/app/views/layouts/application.html.erb +24 -0
- data/test/dummy/app/views/users/_form.html.erb +22 -0
- data/test/dummy/app/views/users/edit.html.erb +6 -0
- data/test/dummy/app/views/users/index.html.erb +27 -0
- data/test/dummy/app/views/users/new.html.erb +5 -0
- data/test/dummy/app/views/users/show.html.erb +18 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/application_api_only.rb +28 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +22 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environment_api_only.rb +7 -0
- data/test/dummy/config/environments/development.rb +24 -0
- data/test/dummy/config/environments/production.rb +51 -0
- data/test/dummy/config/environments/test.rb +36 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/merit.rb +47 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/new_framework_defaults.rb +3 -0
- data/test/dummy/config/initializers/secret_token.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/mongoid.yml +13 -0
- data/test/dummy/config/routes.rb +16 -0
- data/test/dummy/db/migrate/20110421191249_create_users.rb +12 -0
- data/test/dummy/db/migrate/20110421191250_create_comments.rb +16 -0
- data/test/dummy/db/migrate/20120318022220_add_fields_to_users.rb +11 -0
- data/test/dummy/db/migrate/20130321082817_add_fields_to_comments.rb +11 -0
- data/test/dummy/db/migrate/20130329224406_create_merit_actions.rb +18 -0
- data/test/dummy/db/migrate/20130329224407_create_merit_activity_logs.rb +15 -0
- data/test/dummy/db/migrate/20130329224408_create_sashes.rb +11 -0
- data/test/dummy/db/migrate/20130329224409_create_badges_sashes.rb +16 -0
- data/test/dummy/db/migrate/20130329224410_create_scores_and_points.rb +20 -0
- data/test/dummy/db/migrate/20140211144001_create_addresses.rb +11 -0
- data/test/dummy/db/migrate/20140819133931_add_target_data_to_merit_actions.rb +5 -0
- data/test/dummy/db/schema.rb +89 -0
- data/test/dummy/db/seeds.rb +19 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/rails.js +404 -0
- data/test/dummy/public/stylesheets/.gitkeep +0 -0
- data/test/dummy/public/stylesheets/scaffold.css +56 -0
- data/test/dummy/script/rails +6 -0
- data/test/integration/navigation_test.rb +332 -0
- data/test/support/integration_case.rb +5 -0
- data/test/test_helper.rb +40 -0
- data/test/unit/action_test.rb +12 -0
- data/test/unit/base_target_finder_test.rb +64 -0
- data/test/unit/merit_unit_test.rb +33 -0
- data/test/unit/rule_unit_test.rb +57 -0
- data/test/unit/rules_matcher_test.rb +37 -0
- data/test/unit/sash_finder_test.rb +27 -0
- data/test/unit/sash_test.rb +104 -0
- data/test/unit/score_test.rb +13 -0
- data/test/unit/target_finder_test.rb +98 -0
- 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
|
data/test/test_helper.rb
ADDED
|
@@ -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
|