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