Repository: vas3k/vas3k.club

Issue:
Возможность локально создавать дополнительных тестовых юзеров
Заводится по результатам обсуждений в #241 

Есть необходимость для тестирования решений различных issues создавать дополнительных "обычных" юзеров, чтобы проверить взаимодействие между ними (сейчас можно только самому зайти через _godmode_).

"Можно сделать эндпоинт, чтобы на каждый вызов заводил случайного юзера и логинил под ним, типа `/godmode/dev_login/random/`" - Vas3k.


Discussion:
Беру 👌
@seankalejs у меня только вопрос: а как вы это тестили без такой фичи? На проде?! :)
*Или где-то есть зеркало «прода» для тестов?
Сделаю красиво и передам право ответа @vas3k 😅
Никак не тестили, раньше всем хватало одного юзера

Resolving patch:
diff --git a/auth/views/auth.py b/auth/views/auth.py
--- a/auth/views/auth.py
+++ b/auth/views/auth.py
@@ -1,3 +1,4 @@
+import random
 from datetime import datetime, timedelta
 
 from django.conf import settings
@@ -80,3 +81,48 @@ def debug_dev_login(request):
         secure=False,
     )
     return response
+
+
+def debug_random_login(request):
+    if not settings.DEBUG:
+        raise AccessDenied(title="Эта фича доступна только при DEBUG=true")
+
+    slug = "random_" + random_string()
+    user, is_created = User.objects.get_or_create(
+        slug=slug,
+        defaults=dict(
+            membership_platform_type=User.MEMBERSHIP_PLATFORM_PATREON,
+            membership_platform_id="DUMMY_" + random_string(),
+            email=slug + "@random.dev",
+            full_name="%s %d y.o. Developer" % (random.choice(["Максим", "Олег"]), random.randint(18, 101)),
+            company="Acme Corp.",
+            position=random.choice(["Подниматель пингвинов", "Опускатель серверов", "Коллектор пивных бутылок"]),
+            balance=10000,
+            membership_started_at=datetime.utcnow(),
+            membership_expires_at=datetime.utcnow() + timedelta(days=365 * 100),
+            created_at=datetime.utcnow(),
+            updated_at=datetime.utcnow(),
+            is_email_verified=True,
+            moderation_status=User.MODERATION_STATUS_APPROVED,
+        ),
+    )
+
+    if is_created:
+        Post.upsert_user_intro(user, "Интро как интро, аппрув прошло :Р", is_visible=True)
+
+    session = Session.objects.create(
+        user=user,
+        token=random_string(length=32),
+        created_at=datetime.utcnow(),
+        expires_at=datetime.utcnow() + timedelta(days=365 * 100),
+    )
+
+    response = redirect("profile", user.slug)
+    response.set_cookie(
+        key="token",
+        value=session.token,
+        max_age=settings.SESSION_COOKIE_AGE,
+        httponly=True,
+        secure=False,
+    )
+    return response
diff --git a/club/urls.py b/club/urls.py
--- a/club/urls.py
+++ b/club/urls.py
@@ -3,7 +3,7 @@
 from django.contrib.sitemaps.views import sitemap
 
 from auth.helpers import auth_switch
-from auth.views.auth import login, logout, debug_dev_login
+from auth.views.auth import login, logout, debug_dev_login, debug_random_login
 from auth.views.patreon import patreon_login, patreon_oauth_callback
 from bot.views import webhook_telegram, link_telegram
 from comments.views import create_comment, edit_comment, delete_comment, show_comment, upvote_comment, pin_comment
@@ -80,6 +80,7 @@
 
     path("godmode/", god_settings, name="god_settings"),
     path("godmode/dev_login/", debug_dev_login, name="debug_dev_login"),
+    path("godmode/random_login/", debug_random_login, name="debug_random_login"),
 
     path("search/", search, name="search"),
     path("room/<slug:topic_slug>/", feed, name="feed_topic"),


Test patch: