def test_get_level(self):

        user = create_user(timezone="Australia/Sydney",
                           country="Australia",
                           region="xyz",
                           city="Sydney")
        achievement = create_achievement(
            achievement_name="invite_users_achievement",
            achievement_evaluation="weekly")

        achievement_date = Achievement.get_datetime_for_evaluation_type(
            evaluation_timezone=achievement.evaluation_timezone,
            evaluation_type="weekly")

        create_achievement_user(user, achievement, achievement_date, level=2)

        achievement.get_level(user.id, achievement["id"], achievement_date)
        level = achievement.get_level_int(user.id, achievement.id,
                                          achievement_date)

        achievement_date1 = Achievement.get_datetime_for_evaluation_type(
            evaluation_timezone=achievement.evaluation_timezone,
            evaluation_type="weekly",
            dt=achievement_date + datetime.timedelta(7))

        achievement.get_level(user.id, achievement["id"], achievement_date1)
        level1 = achievement.get_level_int(user.id, achievement.id,
                                           achievement_date1)

        # Test for get_level as integer
        print("level1:", level1)
        self.assertEqual(level, 2)
        self.assertEqual(level1, 0)
    def test_get_achievement_properties(self):

        achievement = create_achievement(achievement_maxlevel=3)

        achievementproperty = AchievementProperty()
        achievementproperty.name = "xp"
        DBSession.add(achievementproperty)
        DBSession.flush()

        achievements_achievementproperty = AchievementAchievementProperty()
        achievements_achievementproperty.achievement_id = achievement.id
        achievements_achievementproperty.property_id = achievementproperty.id
        achievements_achievementproperty.value = "5"
        achievements_achievementproperty.from_level = 2
        DBSession.add(achievements_achievementproperty)
        DBSession.flush()

        clear_all_caches()

        result1 = Achievement.get_achievement_properties(achievement.id, 4)
        print(result1)

        result2 = Achievement.get_achievement_properties(achievement.id, 1)
        print(result2)

        self.assertNotEqual(result1, [])
        self.assertEqual(result2, [])
Beispiel #3
0
    def test_evaluate_achievement_for_yearly_evaluation_case2(self):

        achievement = create_achievement(
            achievement_name="invite_users_achievement",
            achievement_relevance="friends",
            achievement_maxlevel=3,
            achievement_evaluation="yearly")

        user = create_user()

        achievement_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone, achievement["evaluation"])
        print(achievement_date)
        next_year = achievement_date + datetime.timedelta(534)
        print(next_year)

        create_achievement_user(user, achievement, achievement_date, level=1)

        create_variable("invite_users", variable_group="day")

        create_goals(achievement,
                     goal_goal="3*level",
                     goal_operator="geq",
                     goal_group_by_key=False)
        clear_all_caches()

        # Not achieved in first year but in the second year
        print("Yearly evaluation Case 2")

        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=5,
                             key=None,
                             at_datetime=achievement_date)
        achievement_result = Achievement.evaluate(user, achievement.id,
                                                  achievement_date)
        print("achievement result: ", achievement_result)

        next_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone,
            evaluation_type="yearly",
            dt=next_year + datetime.timedelta(10))

        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=15,
                             key=None,
                             at_datetime=next_date)
        achievement_result1 = Achievement.evaluate(user, achievement.id,
                                                   next_date)
        print("achievement result1: ", achievement_result1)

        self.assertEqual(achievement_result["achievement_date"],
                         achievement_date)
        self.assertEqual(achievement_result1["achievement_date"], next_date)
        self.assertNotEqual(next_year, next_date)
        self.assertIn('1', achievement_result["levels_achieved"])
        self.assertIn('1', achievement_result1["new_levels"])
        self.assertIn('2', achievement_result1["new_levels"])
        self.assertIn('3', achievement_result1["new_levels"])
    def test_evaluate_achievement_for_participate(self):

        achievement = create_achievement(
            achievement_name="participate_achievement",
            achievement_relevance="own",
            achievement_maxlevel=4)

        user = create_user()

        achievement_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone, achievement.evaluation)

        current_level = 1
        achievement_user = AchievementSubject()
        achievement_user.user_id = user.id
        achievement_user.achievement_id = achievement.id
        achievement_user.achievement_date = achievement_date
        achievement_user.level = current_level
        DBSession.add(achievement_user)
        DBSession.flush()

        variable = create_variable("participate", variable_group="day")
        Value.increase_value(variable_name=variable.name,
                             user=user,
                             value=1,
                             key="5")

        create_goals(
            achievement,
            goal_condition=
            """{"term": {"key": ["5","7"], "type": "literal", "key_operator": "IN", "variable": "participate"}}""",
            goal_group_by_key=True,
            goal_operator="geq",
            goal_goal="1*level")

        clear_all_caches()

        level = Achievement.evaluate(user, achievement.id,
                                     achievement_date).get("level")

        Value.increase_value(variable_name="participate",
                             user=user,
                             value=1,
                             key="7",
                             at_datetime=achievement_date)
        level2 = Achievement.evaluate(user, achievement.id,
                                      achievement_date).get("level")

        Value.increase_value(variable_name="participate",
                             user=user,
                             value=5,
                             key="5",
                             at_datetime=achievement_date)
        level1 = Achievement.evaluate(user, achievement.id,
                                      achievement_date).get("level")

        self.assertEqual(level, 1)
        self.assertEqual(level2, 1)
        self.assertEqual(level1, 4)
    def test_get_achievements_by_location_and_date(self):

        user = create_user()
        achievement1 = create_achievement(
            achievement_name="invite_users_achievement")
        achievement2 = create_achievement(
            achievement_name="participate_achievement")
        create_goals(achievement1)
        create_goals(achievement2)
        achievement_today = Achievement.get_achievements_by_user_for_today(
            user)
        print("achievement_today")
        print(achievement_today)

        self.assertEqual(achievement_today[0]["name"],
                         "invite_users_achievement")
        self.assertEqual(len(achievement_today), 2)
    def test_evaluate_achievement_for_invite_users(self):

        achievement = create_achievement(
            achievement_name="invite_users_achievement",
            achievement_relevance="friends",
            achievement_maxlevel=10)

        user = create_user()

        achievement_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone, achievement.evaluation)

        create_achievement_user(user=user,
                                achievement=achievement,
                                achievement_date=achievement_date,
                                level=1)

        update_connection().execute(t_values.delete())
        create_variable("invite_users", variable_group="day")
        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=1,
                             key=None,
                             at_datetime=achievement_date)

        create_goals(achievement,
                     goal_goal="1*level",
                     goal_operator="geq",
                     goal_group_by_key=False)
        clear_all_caches()

        level = Achievement.evaluate(user, achievement.id,
                                     achievement_date).get("level")
        print("level: ", level)

        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=8,
                             key=None,
                             at_datetime=achievement_date)
        level1 = Achievement.evaluate(user, achievement.id,
                                      achievement_date).get("level")
        print("level1 ", level1)

        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=5,
                             key=None,
                             at_datetime=achievement_date)
        level2 = Achievement.evaluate(user, achievement.id,
                                      achievement_date).get("level")
        print("level2: ", level2)

        self.assertEqual(level, 1)
        self.assertEqual(level1, 9)
        self.assertEqual(level2, 10)
    def test_get_reward_and_properties_for_achievement(self):

        user = create_user()

        achievement = create_achievement(
            achievement_name="invite_users_achievement",
            achievement_relevance="friends",
            achievement_maxlevel=3)

        achievementproperty = AchievementProperty()
        achievementproperty.name = "xp"
        DBSession.add(achievementproperty)
        DBSession.flush()

        achievements_achievementproperty = AchievementAchievementProperty()
        achievements_achievementproperty.achievement_id = achievement.id
        achievements_achievementproperty.property_id = achievementproperty.id
        achievements_achievementproperty.value = "5"
        achievements_achievementproperty.from_level = None
        DBSession.add(achievements_achievementproperty)
        DBSession.flush()

        create_achievement_rewards(achievement=achievement)

        achievement_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone, achievement.evaluation)

        create_achievement_user(user=user,
                                achievement=achievement,
                                achievement_date=achievement_date,
                                level=1)

        create_variable("invite_users", "none")
        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=4,
                             key="5",
                             at_datetime=achievement_date)

        create_goals(
            achievement=achievement,
            goal_condition=
            """{"term": {"type": "literal", "variable": "invite_users"}}""",
            goal_group_by_key=True,
            goal_operator="geq",
            goal_goal="1*level")

        clear_all_caches()
        result = Achievement.evaluate(user, achievement.id, achievement_date)
        print("reward_achievement_result:", result)

        self.assertEqual(len(result["new_levels"]["2"]["rewards"]), 0)
        self.assertEqual(len(result["new_levels"]["3"]["rewards"]), 1)
        self.assertEqual(len(result["new_levels"]["2"]["properties"]), 1)
        self.assertEqual(len(result["new_levels"]["3"]["properties"]), 1)
Beispiel #8
0
    def test_evaluate_achievement_for_weekly_evaluation_case3(self):

        achievement = create_achievement(
            achievement_name="invite_users_achievement",
            achievement_relevance="friends",
            achievement_maxlevel=3,
            achievement_evaluation="weekly")

        user = create_user()

        achievement_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone, achievement["evaluation"])

        create_achievement_user(user, achievement, achievement_date, level=1)

        create_variable("invite_users", variable_group="day")

        create_goals(achievement,
                     goal_goal="3*level",
                     goal_operator="geq",
                     goal_group_by_key=False)
        clear_all_caches()

        # User has not achieved in first week and achieved after few days in a same week
        print("Weekly evaluation Case 3")
        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=5,
                             key=None,
                             at_datetime=achievement_date)
        achievement_result = Achievement.evaluate(user, achievement.id,
                                                  achievement_date)
        print(achievement_result)

        next_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone,
            evaluation_type="weekly",
            dt=achievement_date + datetime.timedelta(3))
        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=10,
                             key=None,
                             at_datetime=next_date)
        achievement_result1 = Achievement.evaluate(user, achievement.id,
                                                   next_date)
        print("achievement result1: ", achievement_result1)

        self.assertEqual(achievement_result["achievement_date"],
                         achievement_date)
        self.assertEqual(achievement_result1["achievement_date"], next_date)
        self.assertEqual(achievement_date, next_date)
        self.assertIn('1', achievement_result["levels_achieved"])
        self.assertIn('2', achievement_result1["new_levels"])
        self.assertIn('3', achievement_result1["new_levels"])
Beispiel #9
0
    def test_get_goal_properties(self):

        achievement = create_achievement()
        goals = create_goals(achievement)

        create_goal_properties(goals.id)
        level = 4
        result = Goal.get_goal_properties(goals.id, level)
        print(result)

        level1 = 1
        result1 = Goal.get_goal_properties(goals.id, level1)
        print(result1)

        self.assertIsNot(result, [])
        self.assertEquals(result1, [])
    def test_get_rewards(self):

        achievement = create_achievement(achievement_maxlevel=3)
        create_achievement_rewards(achievement)
        clear_all_caches()
        rewardlist1 = Achievement.get_rewards(achievement.id, 1)
        print("rewardlist1", rewardlist1)

        rewardlist2 = Achievement.get_rewards(achievement.id, 5)
        print("rewardlist2", rewardlist2)

        rewardlist3 = Achievement.get_rewards(achievement.id, 3)
        print("rewardlist3", rewardlist3)

        self.assertEqual(rewardlist1, [])
        self.assertEqual(rewardlist2, [])
        self.assertNotEqual(rewardlist3, [])
Beispiel #11
0
    def test_evaluate_goal(self):

        user = create_user()
        create_variable(variable_name="invite_users", variable_group="day")
        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=6,
                             key=None)
        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=7,
                             key=None)

        create_variable(variable_name="participate", variable_group="day")
        Value.increase_value(variable_name="participate",
                             user=user,
                             value=6,
                             key="5")
        Value.increase_value(variable_name="participate",
                             user=user,
                             value=3,
                             key="7")
        Value.increase_value(variable_name="participate",
                             user=user,
                             value=5,
                             key="7")

        # Goal Participate with group_by = False
        achievement = create_achievement(
            achievement_name="participate_achievement")
        goal = create_goals(achievement,
                            goal_group_by_key=False,
                            goal_goal="3*level")
        achievement_date = Achievement.get_datetime_for_evaluation_type(
            User.get_user(user.id)["timezone"], achievement["evaluation"])

        evaluation_result = Goal.evaluate(goal,
                                          achievement,
                                          achievement_date,
                                          user,
                                          level=4,
                                          goal_eval_cache_before=False,
                                          execute_triggers=True)
        print(evaluation_result)
        # True cases
        self.assertGreaterEqual(evaluation_result["value"], 12)
        self.assertEqual(evaluation_result["achieved"], True)

        # Goal Participate with group_by = True
        goal2 = create_goals(achievement,
                             goal_group_by_key=True,
                             goal_goal="3*level")
        evaluation_result2 = Goal.evaluate(goal2,
                                           achievement,
                                           achievement_date,
                                           user,
                                           level=4,
                                           goal_eval_cache_before=False,
                                           execute_triggers=True)
        print(evaluation_result2)

        self.assertLessEqual(evaluation_result2["value"], 12)
        self.assertEqual(evaluation_result2["achieved"], False)

        # Goal invite_users
        achievement1 = create_achievement(
            achievement_name="invite_users_achievement")
        goal1 = create_goals(achievement1, goal_goal="4*level")
        achievement_date1 = Achievement.get_datetime_for_evaluation_type(
            User.get_user(user.id)["timezone"], achievement1["evaluation"])

        evaluation_result1 = Goal.evaluate(goal1,
                                           achievement1,
                                           achievement_date1,
                                           user,
                                           level=2,
                                           goal_eval_cache_before=False,
                                           execute_triggers=True)
        print(evaluation_result1)

        self.assertGreaterEqual(evaluation_result1["value"], 8)
        self.assertEqual(evaluation_result1["achieved"], True)
Beispiel #12
0
    def test_compute_progress(self):

        user = create_user()
        create_variable(variable_name="invite_users", variable_group="day")
        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=6,
                             key=None)
        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=7,
                             key=None)

        create_variable(variable_name="participate", variable_group="day")
        Value.increase_value(variable_name="participate",
                             user=user,
                             value=2,
                             key="5")
        Value.increase_value(variable_name="participate",
                             user=user,
                             value=3,
                             key="7")
        Value.increase_value(variable_name="participate",
                             user=user,
                             value=5,
                             key="7")

        achievement = create_achievement(
            achievement_name="invite_users_achievement")
        goal = create_goals(achievement)

        # goal is for invite_users, its group_by_key is false, progress is sum of all the values
        achievement_date = Achievement.get_datetime_for_evaluation_type(
            User.get_user(user.id)["timezone"], achievement["evaluation"])
        users_progress_goal = Goal.compute_progress(
            goal=goal,
            achievement=achievement,
            user=user,
            evaluation_date=achievement_date)
        goal_evaluation = {
            e["user_id"]: e["value"]
            for e in users_progress_goal
        }
        print(goal_evaluation)

        self.assertLessEqual(goal_evaluation.get(user.id), 13)

        # For goal1, since its group_by_key is True, it'll add the values of the same key
        achievement1 = create_achievement(
            achievement_name="participate_achievement")
        goal1 = create_goals(achievement1)
        achievement_date1 = Achievement.get_datetime_for_evaluation_type(
            User.get_user(user.id)["timezone"], achievement1["evaluation"])
        users_progress_goal1 = Goal.compute_progress(
            goal=goal1,
            achievement=achievement1,
            user=user,
            evaluation_date=achievement_date1)
        goal_evaluation1 = {
            e["user_id"]: e["value"]
            for e in users_progress_goal1
        }
        print(goal_evaluation1)

        self.assertLess(goal_evaluation1.get(user.id), 10)

        # Check with group_by_key for goals participate = False
        goal2 = create_goals(achievement1, goal_group_by_key=False)
        users_progress_goal1 = Goal.compute_progress(
            goal=goal2,
            achievement=achievement1,
            user=user,
            evaluation_date=achievement_date1)
        goal_evaluation2 = {
            e["user_id"]: e["value"]
            for e in users_progress_goal1
        }
        print(goal_evaluation2)
        self.assertLessEqual(goal_evaluation2.get(user.id), 10)
Beispiel #13
0
    def test_get_leaderboard(self):

        achievement = create_achievement(
            achievement_name="invite_users_achievement")
        goals = create_goals(achievement)

        # Create multiple users for a goal
        user1 = create_user()
        user2 = create_user(lat=85.59,
                            lng=65.75,
                            country="USA",
                            region="Lethal crosside",
                            city="New York",
                            timezone="US/Eastern",
                            language="en",
                            additional_public_data={
                                "first_name": "Michael",
                                "last_name": "Clarke"
                            })

        # Create Third user
        user3 = create_user(lat=12.1,
                            lng=12.2,
                            country="RO",
                            region="Transylvania",
                            city="Cluj-Napoca",
                            timezone="Europe/Bucharest",
                            language="en",
                            additional_public_data={
                                "first_name": "Rudolf",
                                "last_name": "Red Nose"
                            },
                            friends=[1, 2])

        # Create Fourth user
        user4 = create_user(lat=25.56,
                            lng=15.89,
                            country="AU",
                            region="Sydney",
                            city="New South Wales",
                            timezone="Australia/Sydney",
                            language="en",
                            additional_public_data={
                                "first_name": "Steve",
                                "last_name": "Waugh"
                            },
                            friends=[3])

        achievement_date_for_user1 = Achievement.get_datetime_for_evaluation_type(
            User.get_user(user1.id)["timezone"], achievement["evaluation"])
        achievement_date_for_user2 = Achievement.get_datetime_for_evaluation_type(
            User.get_user(user2.id)["timezone"], achievement["evaluation"])
        achievement_date_for_user3 = Achievement.get_datetime_for_evaluation_type(
            User.get_user(user3.id)["timezone"], achievement["evaluation"])
        achievement_date_for_user4 = Achievement.get_datetime_for_evaluation_type(
            User.get_user(user4.id)["timezone"], achievement["evaluation"])
        print(achievement_date_for_user4)

        create_goal_evaluation_cache(
            goal_id=goals.id,
            gec_achievement_date=achievement_date_for_user1,
            gec_user_id=user1.id,
            gec_value=22.00,
            gec_achieved=True)
        create_goal_evaluation_cache(
            goal_id=goals.id,
            gec_achievement_date=achievement_date_for_user2,
            gec_user_id=user2.id,
            gec_value=8.00,
            gec_achieved=True)
        create_goal_evaluation_cache(
            goal_id=goals.id,
            gec_achievement_date=achievement_date_for_user3,
            gec_user_id=user3.id,
            gec_value=15.00,
            gec_achieved=True)

        # Test for finding leaderboard in case where goal has been evaluated for all given users

        # First get list of friends (user_ids) of given user
        user_ids = Achievement.get_relevant_users_by_achievement_and_user(
            achievement, user3.id)

        # Get leaderboard
        positions = Goal.get_leaderboard(goals, achievement_date_for_user3,
                                         user_ids)
        print(positions)
        self.assertEqual(positions[0]["value"], 22.00)
        self.assertEqual(positions[1]["value"], 15.00)
        self.assertEqual(positions[2]["value"], 8.00)

        # Test for Goal is not evaluated for few user_ids
        create_variable(variable_name="invite_users", variable_group="day")
        Value.increase_value(variable_name="invite_users",
                             user=user4,
                             value=6,
                             key=None)
        Value.increase_value(variable_name="invite_users",
                             user=user4,
                             value=9,
                             key=None)

        user_ids = Achievement.get_relevant_users_by_achievement_and_user(
            achievement, user4.id)
        positions = Goal.get_leaderboard(goals, achievement_date_for_user4,
                                         user_ids)

        print(positions)
        self.assertEqual(positions[0]["value"], 15.00)
    def test_friends_leaderboard(self):

        user1 = create_user()

        # Create Second user
        user2 = create_user(
            lat=85.59,
            lng=65.75,
            #country="DE",
            #region="Roland",
            #city="New York",
            timezone="US/Eastern",
            language="en",
            additional_public_data={
                "first_name": "Michael",
                "last_name": "Clarke"
            })

        # Create Third user
        user3 = create_user(
            lat=12.1,
            lng=12.2,
            #country="RO",
            #region="Transylvania",
            #city="Cluj-Napoca",
            timezone="Europe/Bucharest",
            language="en",
            additional_public_data={
                "first_name": "Rudolf",
                "last_name": "Red Nose"
            },
            friends=[1, 2])

        # Create Fourth user
        user4 = create_user(
            lat=25.56,
            lng=15.89,
            #country="AU",
            #region="Sydney",
            #city="New South Wales",
            timezone="Australia/Sydney",
            language="en",
            additional_public_data={
                "first_name": "Steve",
                "last_name": "Waugh"
            },
            friends=[3])

        achievement = create_achievement(
            achievement_name="invite_users_achievement",
            achievement_relevance="friends",
            achievement_maxlevel=3,
            achievement_evaluation="weekly")

        print(achievement.evaluation_timezone)
        achievement_date1 = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone, achievement.evaluation)
        print("Achievement date for first user:"******"invite_users", variable_group="day")

        create_goals(achievement,
                     goal_goal=None,
                     goal_operator="geq",
                     goal_group_by_key=False)

        Value.increase_value(variable_name="invite_users",
                             user=user1,
                             value=12,
                             key=None,
                             at_datetime=achievement_date1)
        Value.increase_value(variable_name="invite_users",
                             user=user2,
                             value=2,
                             key=None,
                             at_datetime=achievement_date1)
        Value.increase_value(variable_name="invite_users",
                             user=user3,
                             value=11,
                             key=None,
                             at_datetime=achievement_date1)
        Value.increase_value(variable_name="invite_users",
                             user=user4,
                             value=6,
                             key=None,
                             at_datetime=achievement_date1)

        clear_all_caches()

        print("test for multiple users")

        # Evaluate achievement for friends of user 3
        achievement1 = Achievement.evaluate(user3, achievement.id,
                                            achievement_date1)
        print(achievement1["goals"][1]["leaderboard"])

        # user 3 has to friends: user 1 and user 2
        self.assertEqual(
            user1["id"],
            achievement1["goals"][1]["leaderboard"][0]["user"]["id"])
        self.assertEqual(
            user3["id"],
            achievement1["goals"][1]["leaderboard"][1]["user"]["id"])
        self.assertEqual(
            user2["id"],
            achievement1["goals"][1]["leaderboard"][2]["user"]["id"])

        self.assertEqual(12.0,
                         achievement1["goals"][1]["leaderboard"][0]["value"])
        self.assertEqual(11.0,
                         achievement1["goals"][1]["leaderboard"][1]["value"])
        self.assertEqual(2.0,
                         achievement1["goals"][1]["leaderboard"][2]["value"])
    def test_multiple_goals_of_same_achievement(self):

        user = create_user()

        achievement = create_achievement(
            achievement_name="participate_achievement", achievement_maxlevel=3)

        create_achievement_rewards(achievement=achievement)

        achievement_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone, achievement.evaluation)

        create_goals(
            achievement=achievement,
            goal_condition=
            """{"term": {"key": ["5","7"], "type": "literal", "key_operator": "IN", "variable": "participate_seminar"}}""",
            goal_group_by_key=False,
            goal_operator="geq",
            goal_goal="2*level",
            goal_name="goal_participate_seminar")

        create_goals(
            achievement=achievement,
            goal_condition=
            """{"term": {"type": "literal", "variable": "participate_talk"}}""",
            goal_group_by_key=False,
            goal_operator="geq",
            goal_goal="1*level",
            goal_name="goal_participate_talk")

        clear_all_caches()
        create_achievement_user(user=user,
                                achievement=achievement,
                                achievement_date=achievement_date,
                                level=1)

        variable1 = create_variable("participate_seminar", variable_group=None)
        variable2 = create_variable("participate_talk", variable_group=None)
        Value.increase_value(variable1.name,
                             user,
                             "2",
                             "5",
                             at_datetime=achievement_date)
        Value.increase_value(variable1.name,
                             user,
                             "3",
                             "7",
                             at_datetime=achievement_date)
        Value.increase_value(variable2.name,
                             user,
                             "3",
                             key=None,
                             at_datetime=achievement_date)

        result = Achievement.evaluate(user, achievement.id, achievement_date)
        print("multiple_goals_of_same_achievement:", result)
        Value.increase_value(variable1.name,
                             user,
                             "2",
                             "7",
                             at_datetime=achievement_date)
        result1 = Achievement.evaluate(user, achievement.id, achievement_date)
        print(result1)
        Value.increase_value(variable2.name,
                             user,
                             "2",
                             key=None,
                             at_datetime=achievement_date)
        result2 = Achievement.evaluate(user, achievement.id, achievement_date)
        print(result2)

        self.assertEqual(len(result["levels"]["3"]["rewards"]), 1)
        self.assertEqual(result["levels"]["1"]["goals"]["1"]["goal_goal"], 2)
        self.assertEqual(result["levels"]["3"]["goals"]["2"]["goal_goal"], 3)
        self.assertEqual(result1["levels"]["2"]["goals"]["1"]["goal_goal"], 4)
        self.assertEqual(result1["levels"]["3"]["goals"]["2"]["goal_goal"], 3)
        self.assertEqual(result2["levels"]["2"]["goals"]["1"]["goal_goal"], 4)
        self.assertEqual(result2["levels"]["3"]["goals"]["2"]["goal_goal"], 3)
    def test_get_relevant_users_by_achievement_friends_and_user(self):

        #Create First user
        user1 = create_user()

        # Create Second user
        user2 = create_user(lat=85.59,
                            lng=65.75,
                            country="DE",
                            region="Niedersachsen",
                            city="Osnabrück",
                            timezone="Europe/Berlin",
                            language="de",
                            additional_public_data={
                                "first_name": "Michael",
                                "last_name": "Clarke"
                            })

        # Create Third user
        user3 = create_user(lat=12.1,
                            lng=12.2,
                            country="RO",
                            region="Transylvania",
                            city="Cluj-Napoca",
                            timezone="Europe/Bukarest",
                            language="en",
                            additional_public_data={
                                "first_name": "Rudolf",
                                "last_name": "Red Nose"
                            },
                            friends=[1, 2])

        # Create Fourth user
        user4 = create_user(lat=25.56,
                            lng=15.89,
                            country="AU",
                            region="Sydney",
                            city="New South Wales",
                            timezone="Australia",
                            language="en",
                            additional_public_data={
                                "first_name": "Steve",
                                "last_name": "Waugh"
                            },
                            friends=[3])

        achievement = create_achievement()
        friendsOfuser1 = achievement.get_relevant_users_by_achievement_and_user(
            achievement, user1.id)
        friendsOfuser3 = achievement.get_relevant_users_by_achievement_and_user(
            achievement, user3.id)
        friendsOfuser4 = achievement.get_relevant_users_by_achievement_and_user(
            achievement, user4.id)

        self.assertIn(1, friendsOfuser1)
        self.assertIn(1, friendsOfuser3)
        self.assertIn(2, friendsOfuser3)
        self.assertIn(3, friendsOfuser4)

        # For the relevance global
        achievement1 = create_achievement(achievement_relevance="global")

        friendsOfuser1 = achievement.get_relevant_users_by_achievement_and_user(
            achievement1, user3.id)

        self.assertIn(1, friendsOfuser1)
        self.assertIn(2, friendsOfuser1)
        self.assertIn(3, friendsOfuser1)
        self.assertIn(4, friendsOfuser1)
Beispiel #17
0
    def test_evaluate_achievement_for_monthly_evaluation_case2(self):

        achievement = create_achievement(
            achievement_name="invite_users_achievement",
            achievement_relevance="friends",
            achievement_maxlevel=3,
            achievement_evaluation="monthly")

        user = create_user()

        achievement_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone, achievement["evaluation"])
        print(achievement_date)
        next_month = achievement_date + datetime.timedelta(31)
        print(next_month)

        create_achievement_user(user, achievement, achievement_date, level=1)

        create_variable("invite_users", variable_group="day")

        create_goals(achievement,
                     goal_goal="3*level",
                     goal_operator="geq",
                     goal_group_by_key=False)
        clear_all_caches()

        # User has NOT achieved in this month but in the next month
        print("Monthly evaluation Case 2")

        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=5,
                             key=None,
                             at_datetime=achievement_date)
        achievement_result = Achievement.evaluate(user, achievement.id,
                                                  achievement_date)
        print("achievement result: ", achievement_result)

        next_date = Achievement.get_datetime_for_evaluation_type(
            achievement.evaluation_timezone,
            evaluation_type="monthly",
            dt=next_month + datetime.timedelta(days=10))

        Value.increase_value(variable_name="invite_users",
                             user=user,
                             value=10,
                             key=None,
                             at_datetime=next_date)
        achievement_result1 = Achievement.evaluate(user, achievement.id,
                                                   next_date)
        print("achievement result1: ", achievement_result1)

        self.assertEqual(achievement_result["achievement_date"],
                         achievement_date)
        self.assertEqual(achievement_result1["achievement_date"], next_date)
        self.assertGreaterEqual(
            next_month,
            next_date)  # next_month can be the 1st, 2nd, 3rd of 4th (February)
        self.assertIn('1', achievement_result["levels_achieved"])
        self.assertIn('1', achievement_result1["new_levels"])
        self.assertIn('2', achievement_result1["new_levels"])
        self.assertIn('3', achievement_result1["new_levels"])