Beispiel #1
0
 def setUp(self):
     """
     Sets up the test data and create a backend
     """
     # reset the DB data
     vprint("We clean the test databases.")
     getPlayersColl().drop()
     getGamesColl().drop()
     # initialize a backend
     return Backend()
Beispiel #2
0
 def setUp(self, gameIDNone=True):
     # Connection to the MongoDB server / players collection
     playersColl = getPlayersColl()
     # populate db with test data about players
     playersColl.drop()
     for pp in refPlayers():
         if gameIDNone:
             playersColl.insert_one({
                 '_id': pp['playerID'],
                 'nickname': pp['nickname'],
                 #'password': pp['password'],
                 'passwordHash': pp['passwordHash'],
                 'totalScore': pp['totalScore'],
                 'gameID': None
             })
         else:
             playersColl.insert_one({
                 '_id': pp['playerID'],
                 'nickname': pp['nickname'],
                 #'password': pp['password'],
                 'passwordHash': pp['passwordHash'],
                 'totalScore': pp['totalScore'],
                 'gameID': pp['gameID']
             })
     return playersColl
Beispiel #3
0
 def __init__(self):
     """
     Links with the relevant collection in the Mongo database.
     """
     # initiates the players collections and the 'in memory' list
     self.playersColl = getPlayersColl()
     """
Beispiel #4
0
 def test_isNicknameAvailable(self):
     """
     Test players.isNicknameAvailable
     """
     # test that the new player is actually added both in memory and in DB
     vbar()
     print("Test players.isNicknameAvailable")
     vbar()
     vprint(
         "We register players and check that their nickname are not available anymore."
     )
     # empty the database
     playersColl = getPlayersColl()
     playersColl.drop()
     # setup the test data
     players = Players()
     for pp in refPlayers():
         # test that the nickname is available
         vprint("   > " + pp['nickname'] + ":")
         answer = players.isNicknameAvailable(pp['nickname'])
         self.assertEqual(answer['status'], "ok")
         vprint("         * nickname is available")
         # register the player and test that the nickname is not available anymore.
         players.register(pp['nickname'], pp['passwordHash'])
         vprint("         * register " + pp['nickname'])
         answer = players.isNicknameAvailable(pp['nickname'])
         self.assertEqual(answer['status'], "ko")
         vprint("         * nickname is not available anymore")
Beispiel #5
0
 def test_delistPlayer(self):
     """
     Test backend.delistPlayer
     """
     vbar()
     print("test backend.delistPlayer")
     vbar()
     # initiate a backend and register reference players
     backend = self.setUp()
     vprint("We register the reference test players:")
     backend.ForTestOnly_RegisterRefPlayers()
     pp_test = refPlayers(True)
     # enlist a team of 5 players: it should succeed
     list_pid = [{'playerID': pp_test[0]['playerID']}, 
                 {'playerID': pp_test[1]['playerID']},
                 {'playerID': pp_test[2]['playerID']},
                 {'playerID': pp_test[3]['playerID']},
                 {'playerID': pp_test[4]['playerID']}]
     result = backend.enlistTeam(list_pid)
     vprint("Enlist 5 players: " + str(result['status']) 
            + " (" + str(result['gameID']) + ")")
     # delist all players one after the other
     playersColl = getPlayersColl()
     vprint("Now, we delist the players one after the other:")
     for pp in pp_test:
         backend.delistPlayer(pp['playerID'])
         # check that the player is still registered in the database
         result = playersColl.find_one({'_id': pp['playerID']})
         self.assertEqual(pp['playerID'], result['_id'])
         self.assertEqual(pp['nickname'], result['nickname'])
         # check that the player is not anymore listed in the game
         result = backend.games[0].getPlayer(pp['playerID'])
         self.assertEqual(result['status'], "ko")
         vprint("    > " + pp['nickname'] + ": was delisted but is still registered")
Beispiel #6
0
 def test_registerPlayer(self):
     """
     Test backend.registerPlayer
     """
     vbar()
     print("test backend.registerPlayer")
     vbar()
     # initiate a backend
     backend = self.setUp()
     # register reference players
     vprint("Initiate a backend and register reference players:")
     for pp in refPlayers(True):
         result = backend.registerPlayer(pp['nickname'], pp['passwordHash'])
         self.assertEqual(result['status'], "ok")
         vprint("    - register " + pp['nickname'] + ": " + str(result['playerID']))
         pp_db = getPlayersColl().find_one({'nickname': pp['nickname']})
         self.assertEqual(result['playerID'], str(pp_db['_id']))
     # re-register the same players => should fail
     vprint("Re-register the same players: it should fail")
     for pp in refPlayers(True):
         result = backend.registerPlayer(pp['nickname'], pp['passwordHash'])
         vprint("    - register " + pp['nickname'] + ": " + result['status'] +
                " - " + result['reason'])
         self.assertEqual(result['status'], "ko")
         self.assertEqual(result['reason'], "invalid nickname")
Beispiel #7
0
 def reset(self):
     """
     ths method is used for test purposes: it enables 'test_setserver' to 
     reset the server's variables and ensure that all tests will run in a
     clean context.
     It is an alternative to endlessly stopping and restarting the server.
     """
     # connect to the players collection, and empty it
     getPlayersColl().drop()
     # connect to the games collection and empty it
     getGamesColl().drop()
     # voluntarily, we do NOT empty the log collection
     # initialize again all generic variables
     self.games = []
     self.players = Players()
     self.playersWaitingList = []
     self.nextGameID = None
     # returns status update answer
     return {'status': "reset"}
Beispiel #8
0
def isPlayerIDValid(playerID):
    """
    This method checks that the playerID is valid (ie. it is a valid 
    ObjectId and the corresponding player exists in the DB).
    It return 'True' in this case, or 'False' in any other case.
    """
    playersColl = getPlayersColl()
    result = False
    if oidIsValid(playerID):
        pp = playersColl.find_one({'_id': playerID})
        result = (pp != None)
    return result
Beispiel #9
0
 def test_getGameID(self):
     """
     Test backend.getGameID
     """
     vbar()
     print("test backend.getGameID")
     vbar()
     # initiate a backend and register reference players
     backend = self.setUp()
     vprint("We register the reference test players:")
     backend.ForTestOnly_RegisterRefPlayers()
     pp_test = refPlayers(True)
     playersColl = getPlayersColl()
     # enlist a team of 6 players (in which 1 duplicate): it should succeed
     vprint("We enlist 5 players.") 
     list_pid = [{'playerID': pp_test[0]['playerID']}, 
                 {'playerID': pp_test[1]['playerID']},
                 {'playerID': pp_test[2]['playerID']},
                 {'playerID': pp_test[3]['playerID']},
                 {'playerID': pp_test[4]['playerID']}]
     result = backend.enlistTeam(list_pid)
     # check the gameID for all players
     vprint("We now check that their gameID is compliant:")
     for i in range(0,5):
         playerID = pp_test[i]['playerID']
         pp_db = playersColl.find_one({'_id': playerID})
         gameID_db = pp_db['gameID']
         result = backend.getGameID(playerID)
         self.assertEqual(result['status'], "ok")
         self.assertEqual(result['gameID'], gameID_db)
         vprint("    > " + pp_test[i]['nickname'] + ": compliant")
     result = backend.getGameID(pp_test[5]['playerID'])
     self.assertEqual(result['status'], "ok")
     self.assertEqual(result['gameID'], None)
     vprint("    > Daisy: compliant")
     # check the gameID for an unknown playerID
     result = backend.getGameID(ObjectId())
     self.assertEqual(result['status'], "ko")
     self.assertEqual(result['reason'], "unknown playerID")
     vprint("    > unknown playerID: compliant")
     # check the gameID for an invalid playerID
     result = backend.getGameID("invalidplayerID")
     self.assertEqual(result['status'], "ko")
     self.assertEqual(result['reason'], "invalid playerID")
     vprint("    > invalid playerID: compliant")
Beispiel #10
0
 def test_deRegisterPlayer(self):
     """
     Test backend.deRegisterPlayer
     """
     vbar()
     print("test backend.deRegisterPlayer")
     vbar()
     # initiate a backend and register reference players
     backend = self.setUp()
     vprint("We register the reference test players:")
     backend.ForTestOnly_RegisterRefPlayers()
     pp_test = refPlayers(True)
     playersColl = getPlayersColl()
     # enlist a team of 5 players: it should succeed
     list_pid = [{'playerID': pp_test[0]['playerID']}, 
                 {'playerID': pp_test[1]['playerID']},
                 {'playerID': pp_test[2]['playerID']},
                 {'playerID': pp_test[3]['playerID']},
                 {'playerID': pp_test[4]['playerID']}]
     result = backend.enlistTeam(list_pid)
     vprint("Enlist 5 players: " + str(result['status']) 
            + " (" + str(result['gameID']) + ")")
     # deregister an invalid playerID
     vprint("Try de-registering an invalid playerID:")
     result = backend.deRegisterPlayer("thisisnotavalidobjectid")
     self.assertEqual(result['status'], "ko")
     self.assertEqual(result['reason'], "invalid playerID")
     vprint("    > could not de-register: " + result['reason'])
     # deregister an unknown playerID
     vprint("Try de-registering an unknown playerID:")
     result = backend.deRegisterPlayer(ObjectId())
     self.assertEqual(result['status'], "ko")
     self.assertEqual(result['reason'], "unknown playerID")
     vprint("    > could not de-register: " + result['reason'])
     # deregister all players one after the other
     vprint("Now, we de-register the players one after the other:")
     for pp in pp_test:
         backend.deRegisterPlayer(pp['playerID'])
         # check that the player is not anymore listed n the database
         result = playersColl.find_one({'_id': pp['playerID']})
         self.assertEqual(result, None)
         # check that the player is not anymore listed in the game
         result = backend.games[0].getPlayer(pp['playerID'])
         self.assertEqual(result['status'], "ko")
         vprint("    > " + pp['nickname'] + ": was de-registered")
Beispiel #11
0
 def ForTestOnly_RegisterRefPlayers(self):
     """
     FOR TEST PURPOSE ONLY.
     This method register 6 reference test players.
     """
     # connects straight to the Mongo database
     playersColl = getPlayersColl()
     playersColl.drop()
     # now register the reference players straight to the DB (bypassing the
     # normal process = call to the setserver 'register' API)
     for pp in refPlayers(True):
         playersColl.insert_one( {
             '_id': pp['playerID'], 
             'nickname': pp['nickname'],
             'passwordHash': pp['passwordHash'],
             'totalScore': 0,
             'gameID': None } )
     return {'status': "ok"}
Beispiel #12
0
 def tearDown(self):
     # reset the DB data
     vprint("We clean the test databases.")
     getPlayersColl().drop()
     getGamesColl().drop()
Beispiel #13
0
    def test__init__(self):
        """
        Test game.__init__
        """
        vbar()
        print("Test game.__init__")
        vbar()
        # first try to initialize a game with wrong playerIDs
        # populate the DB with reference players
        playersColl = getPlayersColl()
        playersColl.drop()
        for pp in refPlayers():
            playersColl.insert_one({
                '_id': pp['playerID'],
                'nickname': pp['nickname'],
                'totalScore': pp['totalScore'],
                'gameID': None
            })
        # try to initiate a game with different players + 1 wrong player
        players = []
        pp = refPlayers()[0]
        players.append({
            'playerID': pp['playerID'],
            'nickname': pp['nickname']
        })
        pp = refPlayers()[2]
        players.append({
            'playerID': pp['playerID'],
            'nickname': pp['nickname']
        })
        pp = refPlayers()[3]
        players.append({
            'playerID': pp['playerID'],
            'nickname': pp['nickname']
        })
        pp = refPlayers()[4]
        players.append({
            'playerID': pp['playerID'],
            'nickname': pp['nickname']
        })
        players.append({'playerID': ObjectId(), 'nickname': "batman"})
        try:
            partie = Game(players)
        except invalidPlayerID:
            vprint("    - could not initialize a game: playerIDs are invadid.")
        # second initialize successfully a game and test various values
        # build the reference starting for the game from the test data
        test_data_index = 0
        partie = self.setup(test_data_index)
        cards_ref = refCardsets()[test_data_index]
        steps_ref = refSteps()[test_data_index]
        vprint(
            "We start with a first iteration: we push one set and compare the")
        vprint("full status of the game with target:")
        # compare status with target
        ref_gameID = ObjectId(refGameHeader_start()[test_data_index]['gameID'])
        result = (partie.gameID == ref_gameID)
        vprint("  >  gameID is compliant: " + str(result))
        self.assertTrue(result)
        result = cardset_equality(partie.cards, cards_ref)
        vprint("  > cardset is compliant: " + str(result))
        self.assertTrue(result)

        # we can compare with reference test data only steps which are in a
        # 'definitive' status (i.e. a valid Set has been proposed, the game took
        # it to build the next Step (here: Step 1) and store the Step 0 in its
        # 'final' status. Our reference data enable to compare Step only in
        # their 'final' status'.
        # Here, we have proposed a valid set and the game built the Step 1:
        #  - Step 0 is in a 'final' status => we compare it with reference data
        #  - Step 1 is in an intermediate status: cannot be compared yet.

        # We fetch from reference data the next player and the next Set:
        nextset_dict = refGames_Dict()[test_data_index]['steps'][0]['set']
        next_set = []
        for ss in nextset_dict:
            next_set.append(int(ss))
        next_playerID = refGames_Dict(
        )[test_data_index]['steps'][0]['playerID']
        next_playerID = ObjectId(next_playerID)
        # The player proposes the Set:
        partie.receiveSetProposal(next_playerID, next_set)
        # We now can compare Step 0 with reference test data.
        result = step_equality(partie.steps[0], steps_ref[0])
        vprint("  > Step[0] is compliant: " + str(result))
        self.assertTrue(result)