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