model: remove a warning :p
[nit.git] / contrib / nitrpg / src / test_listener.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2014-2015 Alexandre Terrasa <alexandre@moz-code.org>
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 # Test module for `listener.nit`
18 module test_listener is test_suite
19
20 import test_helper
21 import reactors
22 import achievements
23 import events_generator
24
25 private class DummyListener
26 super NitrpgTestHelper
27
28 var reactors = new Array[GameReactor]
29
30 fun apply_event(event: GithubEvent, db: MongoDb) do
31 var game = load_game(event.repo.full_name, db)
32 for reactor in reactors do
33 reactor.react_event(game, event)
34 end
35 end
36
37 fun add_reactor(reactors: GameReactor...) do self.reactors.add_all reactors
38 end
39
40 class TestListener
41 super NitrpgTestHelper
42
43 var generator = new EventsGenerator(api)
44
45 var repo: Repo is lazy do return load_repo("Morriar/nit")
46
47 fun test_game_issue_stats do
48 var db = gen_test_db
49 var l = new DummyListener
50 l.add_reactor(new StatisticsReactor)
51
52 var issue = api.load_issue(repo, 322)
53 assert issue != null
54
55 l.apply_event(generator.issue_open(repo, issue), db)
56 var game = load_game("Morriar/nit", db)
57 assert game.stats.overall["issues"] == 1
58 assert game.stats.overall["issues_open"] == 1
59 l.apply_event(generator.issue_close(repo, issue), db)
60 game = load_game("Morriar/nit", db)
61 assert game.stats.overall["issues"] == 1
62 assert game.stats.overall["issues_open"] == 0
63 l.apply_event(generator.issue_reopen(repo, issue), db)
64 game = load_game("Morriar/nit", db)
65 assert game.stats.overall["issues"] == 1
66 assert game.stats.overall["issues_open"] == 1
67 end
68
69 fun test_player_issue_stats do
70 var db = gen_test_db
71 var game = load_game("Morriar/nit", db)
72 var l = new DummyListener
73 l.add_reactor(new StatisticsReactor)
74
75 var issue = api.load_issue(repo, 322)
76 assert issue != null
77
78 l.apply_event(generator.issue_open(repo, issue), db)
79 var player = new Player(game, "Morriar")
80 assert player.stats.overall["issues"] == 1
81 assert player.stats.overall["issues_open"] == 1
82 l.apply_event(generator.issue_close(repo, issue), db)
83 player = new Player(game, "Morriar")
84 assert player.stats.overall["issues"] == 1
85 assert player.stats.overall["issues_open"] == 0
86 l.apply_event(generator.issue_reopen(repo, issue), db)
87 player = new Player(game, "Morriar")
88 assert player.stats.overall["issues"] == 1
89 assert player.stats.overall["issues_open"] == 1
90 end
91
92 fun test_game_pr_stats do
93 var db = gen_test_db
94 var l = new DummyListener
95 l.add_reactor(new StatisticsReactor)
96
97 var pr = api.load_pull(repo, 275)
98 assert pr != null
99
100 l.apply_event(generator.pull_open(repo, pr), db)
101 var game = load_game("Morriar/nit", db)
102 assert game.stats.overall["pulls"] == 1
103 assert game.stats.overall["pulls_open"] == 1
104 assert game.stats.overall["commits"] == 0
105 pr.merged = false
106 l.apply_event(generator.pull_close(repo, pr), db)
107 game = load_game("Morriar/nit", db)
108 assert game.stats.overall["pulls"] == 1
109 assert game.stats.overall["pulls_open"] == 0
110 assert game.stats.overall["commits"] == 0
111 l.apply_event(generator.pull_reopen(repo, pr), db)
112 game = load_game("Morriar/nit", db)
113 assert game.stats.overall["pulls"] == 1
114 assert game.stats.overall["pulls_open"] == 1
115 assert game.stats.overall["commits"] == 0
116 pr.merged = true
117 l.apply_event(generator.pull_close(repo, pr), db)
118 game = load_game("Morriar/nit", db)
119 assert game.stats.overall["pulls"] == 1
120 assert game.stats.overall["pulls_open"] == 0
121 assert game.stats.overall["commits"] == 2
122 end
123
124 fun test_game_issue_comment_stats do
125 var db = gen_test_db
126 var l = new DummyListener
127 l.add_reactor(new StatisticsReactor)
128
129 var issue = api.load_issue(repo, 322)
130 assert issue != null
131 var comment = api.load_issue_comment(repo, 76119442)
132 assert comment != null
133
134 comment.body = "foo bar"
135 l.apply_event(generator.issue_comment_event(repo, issue, comment), db)
136 var game = load_game("Morriar/nit", db)
137 assert game.stats.overall["comments"] == 1
138 assert game.stats.overall["reviews"] == 0
139 comment.body = "foo +1 bar"
140 l.apply_event(generator.issue_comment_event(repo, issue, comment), db)
141 game = load_game("Morriar/nit", db)
142 assert game.stats.overall["comments"] == 2
143 assert game.stats.overall["reviews"] == 1
144 end
145
146 fun test_player_pull_reactor do
147 var db = gen_test_db
148 var game = load_game("Morriar/nit", db)
149 var l = new DummyListener
150 l.add_reactor(new PlayerReactor)
151
152 var pull = api.load_pull(repo, 275)
153 assert pull != null
154
155 l.apply_event(generator.pull_open(repo, pull), db)
156 var player = new Player(game, "itch76")
157 assert player.stats.overall["nitcoins"] == 10
158 pull.merged = false
159 l.apply_event(generator.pull_close(repo, pull), db)
160 player = new Player(game, "itch76")
161 assert player.stats.overall["nitcoins"] == 0
162 l.apply_event(generator.pull_reopen(repo, pull), db)
163 player = new Player(game, "itch76")
164 assert player.stats.overall["nitcoins"] == 10
165 pull.merged = true
166 l.apply_event(generator.pull_close(repo, pull), db)
167 player = new Player(game, "itch76")
168 assert player.stats.overall["nitcoins"] == 12
169 end
170
171 fun test_player_review_reactor do
172 var db = gen_test_db
173 var game = load_game("Morriar/nit", db)
174 var l = new DummyListener
175 l.add_reactor(new PlayerReactor)
176
177 var pull = api.load_pull(repo, 275)
178 assert pull != null
179 var comment = api.load_issue_comment(repo, 36961230)
180 assert comment != null
181
182 # TODO handle multiple review by the same user
183
184 # no review in opened issue
185 pull.state = "open"
186 comment.body = "foo bar"
187 l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
188 var player = new Player(game, "Morriar")
189 assert player.stats.overall["nitcoins"] == 0
190
191 # review in opened issue
192 pull.state = "open"
193 comment.body = "foo +1 bar"
194 l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
195 player = new Player(game, "Morriar")
196 print player.stats.overall["nitcoins"]
197 assert player.stats.overall["nitcoins"] == 2
198
199 # review in closed issue
200 pull.state = "closed"
201 comment.body = "foo +1 bar"
202 l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
203 player = new Player(game, "Morriar")
204 assert player.stats.overall["nitcoins"] == 2
205
206 # review in reopened issue
207 pull.state = "open"
208 comment.body = "foo +1 bar"
209 l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
210 player = new Player(game, "Morriar")
211 assert player.stats.overall["nitcoins"] == 4
212 end
213
214 fun test_X_issues_achievements do
215 var db = gen_test_db
216 var game = load_game("Morriar/nit", db)
217 var l = new DummyListener
218 l.add_reactor(new StatisticsReactor)
219 l.add_reactor(new Player1Issue, new Player100Issues, new Player1KIssues)
220
221 var issue = api.load_issue(repo, 322)
222 assert issue != null
223
224 for i in [0, 99, 999] do
225 var id = "player_{i + 1}_issue"
226 if i > 0 then id = "{id}s"
227 var player = new Player(game, "Morriar")
228 player.stats["issues"] = i
229 player.save
230 l.apply_event(generator.issue_open(repo, issue), db)
231 assert player.load_achievements.has_key(id)
232 end
233 var player = new Player(game, "Morriar")
234 assert player.stats.overall["nitcoins"] == 1110
235 end
236
237 fun test_X_pulls_achievements do
238 var db = gen_test_db
239 var game = load_game("Morriar/nit", db)
240 var l = new DummyListener
241 l.add_reactor(new StatisticsReactor)
242 l.add_reactor(new Player1Pull, new Player100Pulls, new Player1KPulls)
243
244 var pull = api.load_pull(repo, 275)
245 assert pull != null
246
247 for i in [0, 99, 999] do
248 var id = "player_{i + 1}_pull"
249 if i > 0 then id = "{id}s"
250 var player = new Player(game, "itch76")
251 player.stats["pulls"] = i
252 player.save
253 l.apply_event(generator.pull_open(repo, pull), db)
254 assert player.load_achievements.has_key(id)
255 end
256 var player = new Player(game, "itch76")
257 assert player.stats.overall["nitcoins"] == 1110
258 end
259
260 fun test_X_commits_achievements do
261 var db = gen_test_db
262 var game = load_game("Morriar/nit", db)
263 var l = new DummyListener
264 l.add_reactor(new StatisticsReactor)
265 l.add_reactor(new Player1Commit, new Player100Commits)
266 l.add_reactor(new Player1KCommits, new Player10KCommits)
267
268 var pull = api.load_pull(repo, 275)
269 assert pull != null
270 pull.state = "closed"
271 pull.merged = true
272
273 for i in [0, 99, 999, 9999] do
274 var id = "player_{i + 1}_commit"
275 if i > 0 then id = "{id}s"
276 var player = new Player(game, "itch76")
277 player.stats["commits"] = i
278 player.save
279 l.apply_event(generator.pull_close(repo, pull), db)
280 assert player.load_achievements.has_key(id)
281 end
282 var player = new Player(game, "itch76")
283 assert player.stats.overall["nitcoins"] == 11110
284 end
285
286 fun test_X_comments_achievements do
287 var db = gen_test_db
288 var game = load_game("Morriar/nit", db)
289 var l = new DummyListener
290 l.add_reactor(new StatisticsReactor)
291 l.add_reactor(new Player1Comment, new Player100Comments, new Player1KComments)
292
293 var pull = api.load_pull(repo, 275)
294 assert pull != null
295 var comment = api.load_issue_comment(repo, 36961230)
296 assert comment != null
297
298 for i in [0, 99, 999] do
299 var id = "player_{i + 1}_comment"
300 if i > 0 then id = "{id}s"
301 var player = new Player(game, "Morriar")
302 player.stats["comments"] = i
303 player.save
304 l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
305 assert player.load_achievements.has_key(id)
306 end
307 var player = new Player(game, "Morriar")
308 assert player.stats.overall["nitcoins"] == 1110
309 end
310
311 fun test_issues_achievements do
312 var db = gen_test_db
313 var game = load_game("Morriar/nit", db)
314 var l = new DummyListener
315 l.add_reactor(new IssueAboutNitdoc, new IssueAboutFFI)
316
317 var issue = api.load_issue(repo, 322)
318 assert issue != null
319
320 issue.title = "nitdoc ffi"
321 l.apply_event(generator.issue_open(repo, issue), db)
322 var player = new Player(game, "Morriar")
323 assert player.load_achievements.has_key("issue_about_nitdoc")
324 assert player.load_achievements.has_key("issue_about_ffi")
325 assert player.stats.overall["nitcoins"] == 20
326 end
327
328 fun test_comments_reactor do
329 var db = gen_test_db
330 var game = load_game("Morriar/nit", db)
331 var l = new DummyListener
332 l.add_reactor(new PlayerPingGod, new PlayerFirstReview, new PlayerSaysNitcoin)
333
334 var pull = api.load_pull(repo, 275)
335 assert pull != null
336 var comment = api.load_issue_comment(repo, 36961230)
337 assert comment != null
338
339 comment.body = "@{game.repo.owner.login}"
340 l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
341 var player = new Player(game, "Morriar")
342 assert player.load_achievements.has_key("player_ping_god")
343 assert player.stats.overall["nitcoins"] == 50
344
345 comment.body = "+1"
346 l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
347 player = new Player(game, "Morriar")
348 assert player.load_achievements.has_key("player_first_review")
349 assert player.stats.overall["nitcoins"] == 60
350
351 comment.body = "Nitcoins"
352 l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
353 player = new Player(game, "Morriar")
354 assert player.load_achievements.has_key("player_says_nitcoin")
355 assert player.stats.overall["nitcoins"] == 70
356 end
357 end