--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014-2015 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Test module for `listener.nit`
+module test_listener is test_suite
+
+import test_helper
+import reactors
+import achievements
+import events_generator
+
+private class DummyListener
+ super NitrpgTestHelper
+
+ var reactors = new Array[GameReactor]
+
+ fun apply_event(event: GithubEvent, db: MongoDb) do
+ var game = load_game(event.repo.full_name, db)
+ for reactor in reactors do
+ reactor.react_event(game, event)
+ end
+ end
+
+ fun add_reactor(reactors: GameReactor...) do self.reactors.add_all reactors
+end
+
+class TestListener
+ super NitrpgTestHelper
+
+ var generator = new EventsGenerator(api)
+
+ var repo: Repo is lazy do return load_repo("Morriar/nit")
+
+ fun test_game_issue_stats do
+ var db = load_db("test_game_issue_stats")
+ var l = new DummyListener
+ l.add_reactor(new StatisticsReactor)
+
+ var issue = api.load_issue(repo, 322)
+ assert issue != null
+
+ l.apply_event(generator.issue_open(issue), db)
+ var game = load_game("Morriar/nit", db)
+ assert game.stats.overall["issues"] == 1
+ assert game.stats.overall["issues_open"] == 1
+ l.apply_event(generator.issue_close(issue), db)
+ game = load_game("Morriar/nit", db)
+ assert game.stats.overall["issues"] == 1
+ assert game.stats.overall["issues_open"] == 0
+ l.apply_event(generator.issue_reopen(issue), db)
+ game = load_game("Morriar/nit", db)
+ assert game.stats.overall["issues"] == 1
+ assert game.stats.overall["issues_open"] == 1
+ db.drop
+ end
+
+ fun test_player_issue_stats do
+ var db = load_db("test_player_issue_stats")
+ var game = load_game("Morriar/nit", db)
+ var l = new DummyListener
+ l.add_reactor(new StatisticsReactor)
+
+ var issue = api.load_issue(repo, 322)
+ assert issue != null
+
+ l.apply_event(generator.issue_open(issue), db)
+ var player = new Player(game, "Morriar")
+ assert player.stats.overall["issues"] == 1
+ assert player.stats.overall["issues_open"] == 1
+ l.apply_event(generator.issue_close(issue), db)
+ player = new Player(game, "Morriar")
+ assert player.stats.overall["issues"] == 1
+ assert player.stats.overall["issues_open"] == 0
+ l.apply_event(generator.issue_reopen(issue), db)
+ player = new Player(game, "Morriar")
+ assert player.stats.overall["issues"] == 1
+ assert player.stats.overall["issues_open"] == 1
+ db.drop
+ end
+
+ fun test_game_pr_stats do
+ var db = load_db("test_game_pr_stats")
+ var l = new DummyListener
+ l.add_reactor(new StatisticsReactor)
+
+ var pr = api.load_pull(repo, 275)
+ assert pr != null
+
+ l.apply_event(generator.pull_open(pr), db)
+ var game = load_game("Morriar/nit", db)
+ assert game.stats.overall["pulls"] == 1
+ assert game.stats.overall["pulls_open"] == 1
+ assert game.stats.overall["commits"] == 0
+ pr.merged = false
+ l.apply_event(generator.pull_close(pr), db)
+ game = load_game("Morriar/nit", db)
+ assert game.stats.overall["pulls"] == 1
+ assert game.stats.overall["pulls_open"] == 0
+ assert game.stats.overall["commits"] == 0
+ l.apply_event(generator.pull_reopen(pr), db)
+ game = load_game("Morriar/nit", db)
+ assert game.stats.overall["pulls"] == 1
+ assert game.stats.overall["pulls_open"] == 1
+ assert game.stats.overall["commits"] == 0
+ pr.merged = true
+ l.apply_event(generator.pull_close(pr), db)
+ game = load_game("Morriar/nit", db)
+ assert game.stats.overall["pulls"] == 1
+ assert game.stats.overall["pulls_open"] == 0
+ assert game.stats.overall["commits"] == 2
+ db.drop
+ end
+
+ fun test_game_issue_comment_stats do
+ var db = load_db("test_game_issue_comment_stats")
+ var l = new DummyListener
+ l.add_reactor(new StatisticsReactor)
+
+ var issue = api.load_issue(repo, 322)
+ assert issue != null
+ var comment = api.load_issue_comment(repo, 76119442)
+ assert comment != null
+
+ comment.body = "foo bar"
+ l.apply_event(generator.issue_comment_event(issue, comment), db)
+ var game = load_game("Morriar/nit", db)
+ assert game.stats.overall["comments"] == 1
+ assert game.stats.overall["reviews"] == 0
+ comment.body = "foo +1 bar"
+ l.apply_event(generator.issue_comment_event(issue, comment), db)
+ game = load_game("Morriar/nit", db)
+ assert game.stats.overall["comments"] == 2
+ assert game.stats.overall["reviews"] == 1
+ db.drop
+ end
+
+ fun test_player_pull_reactor do
+ var db = load_db("test_player_pull_reactor")
+ var game = load_game("Morriar/nit", db)
+ var l = new DummyListener
+ l.add_reactor(new PlayerReactor)
+
+ var pull = api.load_pull(repo, 275)
+ assert pull != null
+
+ l.apply_event(generator.pull_open(pull), db)
+ var player = new Player(game, "itch76")
+ assert player.stats.overall["nitcoins"] == 10
+ pull.merged = false
+ l.apply_event(generator.pull_close(pull), db)
+ player = new Player(game, "itch76")
+ assert player.stats.overall["nitcoins"] == 0
+ l.apply_event(generator.pull_reopen(pull), db)
+ player = new Player(game, "itch76")
+ assert player.stats.overall["nitcoins"] == 10
+ pull.merged = true
+ l.apply_event(generator.pull_close(pull), db)
+ player = new Player(game, "itch76")
+ assert player.stats.overall["nitcoins"] == 12
+ db.drop
+ end
+
+ fun test_player_review_reactor do
+ var db = load_db("test_player_review_reactor")
+ var game = load_game("Morriar/nit", db)
+ var l = new DummyListener
+ l.add_reactor(new PlayerReactor)
+
+ var pull = api.load_pull(repo, 275)
+ assert pull != null
+ var comment = api.load_issue_comment(repo, 36961230)
+ assert comment != null
+
+ # TODO handle multiple review by the same user
+
+ # no review in opened issue
+ pull.state = "open"
+ comment.body = "foo bar"
+ l.apply_event(generator.issue_comment_event(pull, comment), db)
+ var player = new Player(game, "Morriar")
+ assert player.stats.overall["nitcoins"] == 0
+
+ # review in opened issue
+ pull.state = "open"
+ comment.body = "foo +1 bar"
+ l.apply_event(generator.issue_comment_event(pull, comment), db)
+ player = new Player(game, "Morriar")
+ print player.stats.overall["nitcoins"]
+ assert player.stats.overall["nitcoins"] == 2
+
+ # review in closed issue
+ pull.state = "closed"
+ comment.body = "foo +1 bar"
+ l.apply_event(generator.issue_comment_event(pull, comment), db)
+ player = new Player(game, "Morriar")
+ assert player.stats.overall["nitcoins"] == 2
+
+ # review in reopened issue
+ pull.state = "open"
+ comment.body = "foo +1 bar"
+ l.apply_event(generator.issue_comment_event(pull, comment), db)
+ player = new Player(game, "Morriar")
+ assert player.stats.overall["nitcoins"] == 4
+ db.drop
+ end
+
+ fun test_X_issues_achievements do
+ var db = load_db("test_X_issues_achievements")
+ var game = load_game("Morriar/nit", db)
+ var l = new DummyListener
+ l.add_reactor(new StatisticsReactor)
+ l.add_reactor(new Player1Issue, new Player100Issues, new Player1KIssues)
+
+ var issue = api.load_issue(repo, 322)
+ assert issue != null
+
+ for i in [0, 99, 999] do
+ var id = "player_{i + 1}_issue"
+ if i > 0 then id = "{id}s"
+ var player = new Player(game, "Morriar")
+ player.stats["issues"] = i
+ player.save
+ l.apply_event(generator.issue_open(issue), db)
+ assert player.load_achievements.has_key(id)
+ end
+ var player = new Player(game, "Morriar")
+ assert player.stats.overall["nitcoins"] == 1110
+ db.drop
+ end
+
+ fun test_X_pulls_achievements do
+ var db = load_db("test_X_pulls_achievements")
+ var game = load_game("Morriar/nit", db)
+ var l = new DummyListener
+ l.add_reactor(new StatisticsReactor)
+ l.add_reactor(new Player1Pull, new Player100Pulls, new Player1KPulls)
+
+ var pull = api.load_pull(repo, 275)
+ assert pull != null
+
+ for i in [0, 99, 999] do
+ var id = "player_{i + 1}_pull"
+ if i > 0 then id = "{id}s"
+ var player = new Player(game, "itch76")
+ player.stats["pulls"] = i
+ player.save
+ l.apply_event(generator.pull_open(pull), db)
+ assert player.load_achievements.has_key(id)
+ end
+ var player = new Player(game, "itch76")
+ assert player.stats.overall["nitcoins"] == 1110
+ db.drop
+ end
+
+ fun test_X_commits_achievements do
+ var db = load_db("test_X_commits_achievements")
+ var game = load_game("Morriar/nit", db)
+ var l = new DummyListener
+ l.add_reactor(new StatisticsReactor)
+ l.add_reactor(new Player1Commit, new Player100Commits)
+ l.add_reactor(new Player1KCommits, new Player10KCommits)
+
+ var pull = api.load_pull(repo, 275)
+ assert pull != null
+ pull.state = "closed"
+ pull.merged = true
+
+ for i in [0, 99, 999, 9999] do
+ var id = "player_{i + 1}_commit"
+ if i > 0 then id = "{id}s"
+ var player = new Player(game, "itch76")
+ player.stats["commits"] = i
+ player.save
+ l.apply_event(generator.pull_close(pull), db)
+ assert player.load_achievements.has_key(id)
+ end
+ var player = new Player(game, "itch76")
+ assert player.stats.overall["nitcoins"] == 11110
+ db.drop
+ end
+
+ fun test_X_comments_achievements do
+ var db = load_db("test_X_comments_achievements")
+ var game = load_game("Morriar/nit", db)
+ var l = new DummyListener
+ l.add_reactor(new StatisticsReactor)
+ l.add_reactor(new Player1Comment, new Player100Comments, new Player1KComments)
+
+ var pull = api.load_pull(repo, 275)
+ assert pull != null
+ var comment = api.load_issue_comment(repo, 36961230)
+ assert comment != null
+
+ for i in [0, 99, 999] do
+ var id = "player_{i + 1}_comment"
+ if i > 0 then id = "{id}s"
+ var player = new Player(game, "Morriar")
+ player.stats["comments"] = i
+ player.save
+ l.apply_event(generator.issue_comment_event(pull, comment), db)
+ assert player.load_achievements.has_key(id)
+ end
+ var player = new Player(game, "Morriar")
+ assert player.stats.overall["nitcoins"] == 1110
+ db.drop
+ end
+
+ fun test_issues_achievements do
+ var db = load_db("test_issues_achievements")
+ var game = load_game("Morriar/nit", db)
+ var l = new DummyListener
+ l.add_reactor(new IssueAboutNitdoc, new IssueAboutFFI)
+
+ var issue = api.load_issue(repo, 322)
+ assert issue != null
+
+ issue.title = "nitdoc ffi"
+ l.apply_event(generator.issue_open(issue), db)
+ var player = new Player(game, "Morriar")
+ assert player.load_achievements.has_key("issue_about_nitdoc")
+ assert player.load_achievements.has_key("issue_about_ffi")
+ assert player.stats.overall["nitcoins"] == 20
+ db.drop
+ end
+
+ fun test_comments_reactor do
+ var db = load_db("test_comments_reactor")
+ var game = load_game("Morriar/nit", db)
+ var l = new DummyListener
+ l.add_reactor(new PlayerPingGod, new PlayerFirstReview, new PlayerSaysNitcoin)
+
+ var pull = api.load_pull(repo, 275)
+ assert pull != null
+ var comment = api.load_issue_comment(repo, 36961230)
+ assert comment != null
+
+ comment.body = "@{game.repo.owner.login}"
+ l.apply_event(generator.issue_comment_event(pull, comment), db)
+ var player = new Player(game, "Morriar")
+ assert player.load_achievements.has_key("player_ping_god")
+ assert player.stats.overall["nitcoins"] == 50
+
+ comment.body = "+1"
+ l.apply_event(generator.issue_comment_event(pull, comment), db)
+ player = new Player(game, "Morriar")
+ assert player.load_achievements.has_key("player_first_review")
+ assert player.stats.overall["nitcoins"] == 60
+
+ comment.body = "Nitcoins"
+ l.apply_event(generator.issue_comment_event(pull, comment), db)
+ player = new Player(game, "Morriar")
+ assert player.load_achievements.has_key("player_says_nitcoin")
+ assert player.stats.overall["nitcoins"] == 70
+ db.drop
+ end
+end