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, [])
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_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 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")
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)
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"])
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, [])
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"])
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_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"])