예제 #1
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, [])
예제 #2
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"])
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
        def index(self):
            self._template_args['msgs'] = []
            self._template_args['clear_caches_form'] = self.clear_caches_form = ClearCacheForm(request.form)

            if request.method == 'POST':
                from gengine.app.cache import clear_all_caches
                if self.clear_caches_form.clear_check.data:
                    clear_all_caches()
                    self._template_args['msgs'].append("All caches cleared!")
            return self.render(template="admin_maintenance.html")
예제 #6
0
    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)
예제 #7
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"])
예제 #8
0
    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, [])
예제 #9
0
    def setUp(self):
        from gengine.app.cache import clear_all_caches
        clear_all_caches()

        if os.path.exists("/tmp/test_pgdata"):
            shutil.rmtree("/tmp/test_pgdata")

        self.db = testDB.db()
        dsn = self.db.dsn()
        self.engine =  create_engine(
            "postgresql://%(user)s@%(host)s:%(port)s/%(database)s" % {
                "user": dsn["user"],
                "host": dsn["host"],
                "port": dsn["port"],
                "database": dsn["database"],
            }
        )
        init_session(override_session=scoped_session(get_sessionmaker(bind=self.engine)), replace=True)
        from gengine.metadata import Base
        Base.metadata.bind = self.engine

        Base.metadata.drop_all(self.engine)
        self.engine.execute("DROP SCHEMA IF EXISTS public CASCADE")
        self.engine.execute("CREATE SCHEMA IF NOT EXISTS public")

        from alembic.config import Config
        from alembic import command

        alembic_cfg = Config(attributes={
            'engine': self.engine,
            'schema': 'public'
        })
        script_location = os.path.join(
            os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
            'app/alembic'
        )
        alembic_cfg.set_main_option("script_location", script_location)

        from gengine.app import model

        tables = [t for name, t in model.__dict__.items() if isinstance(t, Table)]
        Base.metadata.create_all(self.engine, tables=tables)

        command.stamp(alembic_cfg, "head")
    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"])
예제 #11
0
    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)
예제 #12
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"])