Skip to content

Commit

Permalink
logic bugfix
Browse files Browse the repository at this point in the history
  • Loading branch information
holohup committed Apr 3, 2024
1 parent 0aacced commit c8556aa
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 2 deletions.
7 changes: 5 additions & 2 deletions backend/utils/achievements.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,15 +135,18 @@ def _update_database(self):
"""Обновляем БД по списку новых ачивок.
Логика следующая:
- для одноразовых ачивок создается запись в UserAchievement
- для многоразовых ачивок если записи нет, создается, если есть, обновляется дата"""
- для многоразовых ачивок если записи нет, создается, если есть, пересоздается."""

if not self._new_achievements:
return
user_achievements = [
UserAchievement(user_id=self._user, achievement_id=achievement) for achievement in self._new_achievements
]
achievements = [ua.achievement_id for ua in user_achievements]
with transaction.atomic():
UserAchievement.objects.filter(user_id=self._user).exclude(achievement_id__recurring=False).delete()
UserAchievement.objects.filter(user_id=self._user, achievement_id__in=achievements).exclude(
achievement_id__recurring=False
).delete()
UserAchievement.objects.bulk_create(user_achievements)

def _check_for_new_backend_achievements(self):
Expand Down
39 changes: 39 additions & 0 deletions test/api_tests/history_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
url = reverse("history")


def achievement_title_in_response(response: list[dict], title: str):
for achievement in response:
if title in achievement["title"]:
return True
return False


@pytest.fixture
def training_end_data():
return {
Expand Down Expand Up @@ -86,3 +93,35 @@ def test_recurring_non_ios_achievement_is_not_duplicated(
training_end_data["training_end"] = add_1_day_to_str(training_end_data["training_end"])
assert response.status_code == status.HTTP_201_CREATED
assert user_achievement_count_by_id(user, 21) == 1


@pytest.mark.django_db
def test_recurring_non_ios_achievement_does_not_delete_old_recurring_ios(
user, user_client, load_achievement_fixtures, training_end_data
):
achievements = (21, 22, 26) # Турист, Путешественник, Афтердарк
for a in achievements:
assert user_achievement_count_by_id(user, a) == 0

training_end_data["achievements"] = [26]
training_end_data["cities"] = ["1", "2", "3", "4"]
response = user_client.post(url, training_end_data, format="json").data

assert achievement_title_in_response(response, "Путешественник")
assert achievement_title_in_response(response, "Афтердарк")
assert user_achievement_count_by_id(user, 26) == 1
assert user_achievement_count_by_id(user, 22) == 1
assert user_achievement_count_by_id(user, 21) == 0

training_end_data["training_start"] = add_1_day_to_str(training_end_data["training_start"])
training_end_data["training_end"] = add_1_day_to_str(training_end_data["training_end"])
training_end_data["training_day"] += 1
training_end_data["cities"] = ["5"]
response = user_client.post(url, training_end_data, format="json").data

assert achievement_title_in_response(response, "Афтердарк")
assert achievement_title_in_response(response, "Турист")
assert not achievement_title_in_response(response, "Путешественник")

for a in achievements:
assert user_achievement_count_by_id(user, a) == 1

0 comments on commit c8556aa

Please sign in to comment.