Пример #1
0
    def testAddingAndRemovingStars(self):
        user = User.objects.get(name='user1')
        old_bank_account = bank.get_user_bank(user_id=user.obfuscated_id)

        # Add some stars
        bank_account = bank.add_to_bank(user_id=user.obfuscated_id, stars=config.DEFAULT_STARS)
        self.assertEqual(old_bank_account.stars + config.DEFAULT_STARS, bank_account.stars)

        # Remove some stars
        bank_account = bank.add_to_bank(user_id=user.obfuscated_id, stars=(-1 * config.DEFAULT_STARS))
        self.assertEqual(old_bank_account.stars, bank_account.stars)

        bank_account = bank.add_to_bank(user_id=user.obfuscated_id, stars=(-1 * config.DEFAULT_STARS))
        self.assertEqual(0, bank_account.stars)

        # Try removing more stars
        self.assertRaises(RemoteException, bank.add_to_bank, user_id=user.obfuscated_id, stars=-1)

        bank_account = bank.add_to_bank(user_id=user.obfuscated_id, stars=0)
        self.assertEqual(0, bank_account.stars)

        bank_account = bank.add_to_bank(user_id=user.obfuscated_id, stars=1)
        self.assertEqual(1, bank_account.stars)

        bank_account = bank.decrement_bank(user_id=user.obfuscated_id)
        self.assertEqual(0, bank_account.stars)

        self.assertRaises(RemoteException, bank.decrement_bank, user_id=user.obfuscated_id)

        # check still at 0
        bank_account = bank.get_user_bank(user_id=user.obfuscated_id)
        self.assertEqual(0, bank_account.stars)
Пример #2
0
def update(user_id):
    """
    Returns all the user's friends and games associated with friends
    """
    if user_id is None:
        raise RemoteException('User ID cannot be blank.')

    try:
        user = User.objects.get(obfuscated_id=user_id)
    except User.DoesNotExist:
        raise RemoteException("User doesn't exist")

    friends = friend.get_user_friends(user_id=user_id).friends

    bank_account = bank.get_user_bank(user_id=user_id)
    score_account = score.get_user_score(user_id=user_id)

    return Poll(friends=friends,
                bank_account=bank_account,
                score=score_account)
Пример #3
0
def get_new_word(user_id, game_id):
    """
    Get new word prompt
    """
    try:
        user = User.objects.get(obfuscated_id=user_id)
    except User.DoesNotExist:
        raise RemoteException('User does not exist')
    try:
        game = Game.objects.get(id=game_id)
    except Game.DoesNotExist:
        raise RemoteException('Game does not exist')

    friend_id = _get_friend_id(user_model=user, game_model=game)

    if friend_id is None:
        raise RemoteException('User ID and game ID combination not valid')

    if not game.active:
        raise RemoteException('Game is inactive')

    # Remove a star
    bank.decrement_bank(user_id=user_id)

    if int(user_id) != _get_curr_photographer(game_model=game):
        raise RemoteException('This user cannot get a new word prompt')

    words_seen = _get_words_played(game_id=game_id)

    new_word = _get_random_word()
    while (new_word.word in words_seen):
        new_word = _get_random_word()

    round_num = game.curr_round

    turn = Turn.objects.get(turn_num=round_num, game_id=game_id)
    old_word = WordPrompt.objects.get(id=turn.word_prompt_id).word

    words_seen.remove(old_word)

    turn.word_prompt_id = new_word.id
    turn.save()

    words_seen.append(new_word.word)

    friend_score = 0
    user_score = 0

    if game.user_id1 == user_id:
        user_score = game.user1_score
        friend_score = game.user2_score
    else:
        user_score = game.user2_score
        friend_score = game.user1_score

    return RemoteGame(game_id=game_id,
                      user_id=user_id,
                      friend_id=friend_id,
                      active=True,
                      curr_round=round_num,
                      user_score=user_score,
                      friend_score=friend_score,
                      words_seen=words_seen,
                      curr_word=new_word.word,
                      is_photographer=True,
                      is_turn=True,
                      bank_account=bank.get_user_bank(user_id=user_id))
Пример #4
0
def end_game(user_id, game_id, award_stars=True):
    """
    Ends a pre-existing game by setting it to inactive
    """
    if user_id is 0 or game_id is 0:
        raise RemoteException('User ID and game ID cannot be blank.')
    try:
        user = User.objects.get(obfuscated_id=user_id)
    except User.DoesNotExist:
        raise RemoteException('User does not exist')
    try:
        game = Game.objects.get(id=game_id)
    except Game.DoesNotExist:
        raise RemoteException('Game does not exist')

    if (game.active == False):
        raise RemoteException('Game is already inactive')

    friend_id = _get_friend_id(user_model=user, game_model=game)
    if (friend_id is None):
        raise RemoteException('User ID and game ID combination not valid')

    words_seen = _get_words_played(game_id=game_id)
    game.active = False
    game.save()

    # Remove picture if exists
    filename = config.FILE_PATH + ('%s_%s.jpg' %
                                   (str(game_id), str(game.curr_round)))

    if os.path.isfile(filename):
        os.remove(filename)

    if award_stars:
        # Award stars to users
        user1_stars = int(game.user1_score / config.SCORE_PER_STAR)
        user2_stars = int(game.user2_score / config.SCORE_PER_STAR)

        if game.user1_score > game.user2_score:
            user1_stars += config.WINNER_BONUS_STAR
        elif game.user1_score < game.user2_score:
            user2_stars += config.WINNER_BONUS_STAR
        else:
            user1_stars += config.TIE_BONUS_STAR
            user2_stars += config.TIE_BONUS_STAR

        bank.add_to_bank(user_id=game.user_id1, stars=user1_stars)
        bank.add_to_bank(user_id=game.user_id2, stars=user2_stars)

        # Award points to users also
        score.add_to_score(user_id=game.user_id1, points=game.user1_score)
        score.add_to_score(user_id=game.user_id2, points=game.user2_score)

    friend_score = 0
    user_score = 0

    if game.user_id1 == user_id:
        user_score = game.user1_score
        friend_score = game.user2_score
    else:
        user_score = game.user2_score
        friend_score = game.user1_score

    return RemoteGame(game_id=game_id,
                      user_id=user_id,
                      friend_id=friend_id,
                      active=False,
                      user_score=user_score,
                      friend_score=friend_score,
                      curr_round=game.curr_round,
                      words_seen=words_seen,
                      bank_account=bank.get_user_bank(user_id=user_id))
Пример #5
0
    def testGameFlow2(self):
        user1_id = User.objects.get(name='user1').obfuscated_id
        user2_id = User.objects.get(name='user2').obfuscated_id

        user1_score = score.get_user_score(user_id=user1_id).points
        user2_score = score.get_user_score(user_id=user2_id).points

        user1_game_score = 0
        user2_game_score = 0

        user1_stars = bank.get_user_bank(user_id=user1_id).stars
        user2_stars = bank.get_user_bank(user_id=user2_id).stars

        words_seen = []
        photo = config.BLANK_PICTURE

        game_remote = game.start_new_game(user_id=user1_id, friend_id=user2_id)
        game_id = game_remote.game_id

        words_seen.append(game_remote.curr_word)

        game_remote = game.send_picture(user_id=user1_id, game_id=game_id, photo=photo)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user2_id, game_remote.friend_id)
        self.assertTrue(game_remote.is_photographer)
        self.assertFalse(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user1_game_score, game_remote.user_score)

        # User 2 will see the picture and User 2 will try to guess after 10 seconds or so, scoring lowest points
        photo_remote = game.get_picture(user_id=user2_id, game_id=game_id)

        self.assertEqual(config.MAX_SCORE_GUESSING, photo_remote.current_score)
        self.assertEqual(photo, photo_remote.dataURL)

        time.sleep(10) # seconds

        # Client passes invalid score; the server will just use the actual score instead
        game_remote = game.validate_guess(user_id=user2_id, game_id=game_id, guess=game_remote.curr_word, score=config.MAX_SCORE_GUESSING)

        user1_game_score += config.SCORE_SENDING
        user2_game_score += config.MIN_SCORE_GUESSING

        words_seen.append(game_remote.curr_word)

        # User 2 sends a picture
        game.send_picture(user_id=user2_id, game_id=game_id, photo=photo)

        # User 1 should get the picture and do a correct guess after 10 seconds
        game.get_picture(user_id=user1_id, game_id=game_id)

        time.sleep(10) # seconds

        # Give up
        game_remote = game.give_up_turn(user_id=user1_id, game_id=game_id)

        # Game should be over at this point
        self.assertFalse(game_remote.active)

        # Calculate stars that each user should've gotten
        user1_game_stars = int(user1_game_score / config.SCORE_PER_STAR)
        user2_game_stars = int(user2_game_score / config.SCORE_PER_STAR)

        # User 2 won
        user2_game_stars += config.WINNER_BONUS_STAR
        
        user1_stars += user1_game_stars
        user2_stars += user2_game_stars

        # The actual score of users 1 and 2
        user1_score += user1_game_score
        user2_score += user2_game_score

        # check stars correct
        self.assertEqual(user1_stars, bank.get_user_bank(user_id=user1_id).stars)
        self.assertEqual(user2_stars, bank.get_user_bank(user_id=user2_id).stars)

        # check scores correct
        self.assertEqual(user1_score, score.get_user_score(user_id=user1_id).points)
        self.assertEqual(user2_score, score.get_user_score(user_id=user2_id).points)
Пример #6
0
    def testGameFlow1(self):
        user1_id = User.objects.get(name='user1').obfuscated_id
        user2_id = User.objects.get(name='user2').obfuscated_id

        user1_score = score.get_user_score(user_id=user1_id).points
        user2_score = score.get_user_score(user_id=user2_id).points

        user1_game_score = 0
        user2_game_score = 0

        user1_stars = bank.get_user_bank(user_id=user1_id).stars
        user2_stars = bank.get_user_bank(user_id=user2_id).stars

        words_seen = []
        photo = config.BLANK_PICTURE

        game_remote = game.start_new_game(user_id=user1_id, friend_id=user2_id)
        game_id = game_remote.game_id

        words_seen.append(game_remote.curr_word)

        game_remote = game.get_game_status(user_id=user1_id, friend_id=user2_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user2_id, game_remote.friend_id)
        self.assertTrue(game_remote.is_photographer)
        self.assertTrue(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user1_game_score, game_remote.user_score)

        game_remote = game.get_game_status(user_id=user2_id, friend_id=user1_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user1_id, game_remote.friend_id)
        self.assertFalse(game_remote.is_photographer)
        self.assertFalse(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user2_game_score, game_remote.user_score)

        self.assertRaises(RemoteException, game.send_picture, user_id=user2_id, game_id=game_id, photo=photo)
        self.assertRaises(RemoteException, game.send_picture, user_id=user1_id, game_id=game_id, photo=None)

        game_remote = game.send_picture(user_id=user1_id, game_id=game_id, photo=photo)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user2_id, game_remote.friend_id)
        self.assertTrue(game_remote.is_photographer)
        self.assertFalse(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user1_game_score, game_remote.user_score)

        game_remote = game.get_game_status(user_id=user1_id, friend_id=user2_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user2_id, game_remote.friend_id)
        self.assertTrue(game_remote.is_photographer)
        self.assertFalse(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user1_game_score, game_remote.user_score)

        game_remote = game.get_game_status(user_id=user2_id, friend_id=user1_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user1_id, game_remote.friend_id)
        self.assertFalse(game_remote.is_photographer)
        self.assertTrue(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user2_game_score, game_remote.user_score)

        # User 1 can't guess anyway
        self.assertRaises(RemoteException, game.validate_guess, user_id=user1_id, game_id=game_id, guess=game_remote.curr_word, score=config.MAX_SCORE_GUESSING)
        # User 2 has not received the picture yet, so he can't guess
        self.assertRaises(RemoteException, game.validate_guess, user_id=user2_id, game_id=game_id, guess=game_remote.curr_word, score=config.MAX_SCORE_GUESSING)

        # User 1 can't get picture
        self.assertRaises(RemoteException, game.get_picture, user_id=user1_id, game_id=game_id)
        # User 2 will see the picture and User 2 will try to guess after 10 seconds or so, scoring lowest points
        photo_remote = game.get_picture(user_id=user2_id, game_id=game_id)

        self.assertEqual(config.MAX_SCORE_GUESSING, photo_remote.current_score)
        self.assertEqual(photo, photo_remote.dataURL)

        game_remote = game.get_game_status(user_id=user1_id, friend_id=user2_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user2_id, game_remote.friend_id)
        self.assertTrue(game_remote.is_photographer)
        self.assertFalse(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user1_game_score, game_remote.user_score)

        game_remote = game.get_game_status(user_id=user2_id, friend_id=user1_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user1_id, game_remote.friend_id)
        self.assertFalse(game_remote.is_photographer)
        self.assertTrue(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertAlmostEqual(config.MAX_SCORE_GUESSING, game_remote.current_score, delta=10) # likely less than 1s has passed
        self.assertAlmostEqual(0, game_remote.elapsed_time, delta=1)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user2_game_score, game_remote.user_score)

        time.sleep(10) # seconds

        game_remote = game.get_game_status(user_id=user1_id, friend_id=user2_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user2_id, game_remote.friend_id)
        self.assertTrue(game_remote.is_photographer)
        self.assertFalse(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user1_game_score, game_remote.user_score)

        game_remote = game.get_game_status(user_id=user2_id, friend_id=user1_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user1_id, game_remote.friend_id)
        self.assertFalse(game_remote.is_photographer)
        self.assertTrue(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertEqual(config.MIN_SCORE_GUESSING, game_remote.current_score)
        self.assertAlmostEqual(10, game_remote.elapsed_time, delta=1)
        self.assertEqual(1, game_remote.curr_round)
        self.assertEqual(user2_game_score, game_remote.user_score)

        # User 1 can't guess anyway
        self.assertRaises(RemoteException, game.validate_guess, user_id=user1_id, game_id=game_id, guess=game_remote.curr_word, score=config.MIN_SCORE_GUESSING)
        # User 2 guesses. On a successful guess he gets the game for the next round
        self.assertRaises(RemoteException, game.validate_guess, user_id=user2_id, game_id=game_id, guess='bird', score=config.MIN_SCORE_GUESSING)
        game_remote = game.validate_guess(user_id=user2_id, game_id=game_id, guess=game_remote.curr_word, score=config.MIN_SCORE_GUESSING)

        user1_game_score += config.SCORE_SENDING
        user2_game_score += config.MIN_SCORE_GUESSING

        words_seen.append(game_remote.curr_word)

        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user1_id, game_remote.friend_id)
        self.assertTrue(game_remote.is_photographer)
        self.assertTrue(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(2, game_remote.curr_round)
        self.assertEqual(user2_game_score, game_remote.user_score)

        game_remote = game.get_game_status(user_id=user1_id, friend_id=user2_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user2_id, game_remote.friend_id)
        self.assertFalse(game_remote.is_photographer)
        self.assertFalse(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(2, game_remote.curr_round)
        self.assertEqual(user1_game_score, game_remote.user_score)

        game_remote = game.get_game_status(user_id=user2_id, friend_id=user1_id)
        self.assertEqual(game_id, game_remote.game_id)
        self.assertEqual(user1_id, game_remote.friend_id)
        self.assertTrue(game_remote.is_photographer)
        self.assertTrue(game_remote.is_turn)
        self.assertEqual(set(words_seen), set(game_remote.words_seen))
        self.assertIsNone(game_remote.current_score)
        self.assertIsNone(game_remote.elapsed_time)
        self.assertEqual(2, game_remote.curr_round)
        self.assertEqual(user2_game_score, game_remote.user_score)

        # User 2 sends a picture
        game.send_picture(user_id=user2_id, game_id=game_id, photo=photo)

        # User 1 should get the picture and do a correct guess after 10 seconds
        game.get_picture(user_id=user1_id, game_id=game_id)

        time.sleep(10) # seconds

        game_remote = game.validate_guess(user_id=user1_id, game_id=game_id, guess=game_remote.curr_word, score=config.MIN_SCORE_GUESSING)

        # Calculate points manually
        user1_game_score += config.MIN_SCORE_GUESSING
        user2_game_score += config.SCORE_SENDING

        # Game should be over at this point
        self.assertFalse(game_remote.active)
        self.assertEqual(user1_game_score, game_remote.user_score)
        self.assertEqual(user2_game_score, game_remote.friend_score)

        # Calculate stars that each user should've gotten
        user1_game_stars = int(user1_game_score / config.SCORE_PER_STAR)
        user2_game_stars = int(user2_game_score / config.SCORE_PER_STAR)

        # Since users tied, they both get bonus stars
        user1_game_stars += config.TIE_BONUS_STAR
        user2_game_stars += config.TIE_BONUS_STAR
        
        user1_stars += user1_game_stars
        user2_stars += user2_game_stars

        # The actual score of users 1 and 2
        user1_score += user1_game_score
        user2_score += user2_game_score

        # check stars correct
        self.assertEqual(user1_stars, bank.get_user_bank(user_id=user1_id).stars)
        self.assertEqual(user2_stars, bank.get_user_bank(user_id=user2_id).stars)

        # check scores correct
        self.assertEqual(user1_score, score.get_user_score(user_id=user1_id).points)
        self.assertEqual(user2_score, score.get_user_score(user_id=user2_id).points)
Пример #7
0
    def testGetUserBank(self):
        user = User.objects.get(name='user1')
        bank_account = bank.get_user_bank(user_id=user.obfuscated_id)
        bank_object = Bank.objects.get(user_id=user.obfuscated_id)

        self.assertEqual(bank_object.stars, bank_account.stars)