示例#1
0
 def test_db_insert(self):
     lb = Leaderboard('test')
     lb.clear_database()
     lb.add_score('TRIVIAL', 120, 'me')
     lb.add_score('NORMAL', 150, 'notme')
     val = lb.get_top('TRIVIAL')
     self.assertEqual(1, len(val))
     self.assertEqual(120, val[0]['time'])
     self.assertEqual('me', val[0]['name'])
示例#2
0
class LeaderboardOperations:
    """
        Proxy class between HTTP requests (see request_handler.RequestHandler) and leaderboard.Leaderboard.
        Parses the request and forwards it.
    """

    kStatus_ok = {"status": "OK"}
    kStatus_ko = {"status": "KO"}

    def __init__(self):
        self.leaderboard = Leaderboard()

    def get_top(self, path):
        """
            Retrieve top XX of the leaderboard
        """
        top_number = path.rsplit('/', 1).pop()
        try:
            sorted_list = self.leaderboard.get_top(int(top_number))
            return JSONResponse(200, sorted_list)
        except ValueError:
            raise RequestError(
                400,
                "Wrong parameter type expected int got {}".format(top_number))

    def get_partial(self, path):
        """
            Retrieve relative ranking around a position 
        """
        splitted = path.rsplit('/', 2)
        try:
            sorted_list = self.leaderboard.get_partial(int(splitted[1]),
                                                       int(splitted[2]))
            return JSONResponse(200, sorted_list)
        except ValueError:
            raise RequestError(
                400,
                "Wrong parameter type expected int got {}".format(splitted))

    def insert_or_update(self, parsed_req):
        """
            As updating a score in absolute "in this case" is equivalent to creating a new user we don't need separated operations
        """
        self.leaderboard.insert_user_or_update_user_score(parsed_req)
        return JSONResponse(200, self.kStatus_ok)

    def update(self, parsed_req):
        """
            Update the score of a specific user ,if exists otherwise rise RequestError
        """
        if not self.leaderboard.has_user(parsed_req['user']):
            raise RequestError(
                404, "User {} does not exist".format(parsed_req['user']))

        self.leaderboard.update_user_score(parsed_req)
        return JSONResponse(200, self.kStatus_ok)
示例#3
0
 def test_db_top5(self):
     lb = Leaderboard('test')
     lb.clear_database()
     lb.add_score('HARD', 120, 'a')
     lb.add_score('HARD', 118, 'b')
     lb.add_score('HARD', 122, 'c')
     lb.add_score('HARD', -3, 'd')
     lb.add_score('HARD', -8, 'e')
     lb.add_score('HARD', 2, 'f')
     val = lb.get_top('HARD')
     self.assertEqual(5, len(val))
     self.assertEqual(-8, val[0]['time'])
     self.assertEqual(120, val[4]['time'])