Repository: watchdogpolska/small_eod

Issue:
Testowanie bez OAuth
> Przy okazji mam pytanie co do lokalnego testowania aplikacji. Z tego co rozumiem, opis w readme już nie jest do końca aktualny - nie wystarczy zalogować się na konto admina, żeby uzyskać dostęp do aplikacji. Prawdopodobnie ta sztuczka przestała działać (o ile czegoś nie mylę) w momencie dodania oauth.
Pytanie moje brzmi - w jaki sposób aplikacja jest testowana lokalnie? Póki co załatwiam to przez postawienie lokalnego serwera udającego oauth i drobne zmiany w kodzie pythona, ale może jest jakiś ładniejszy sposób (@MichalKarol - może masz jakieś sugestie?)?
Jeśli własny prosty serwer to faktycznie najprostsze wyjście, to mogę przy okazji spróbować trochę to moje rozwiązanie uporządkować, dodać do repo i zaktualizować dokumentację, ale najpierw chciałem się dowiedzieć czy jest lepszy sposób.

_Originally posted by @rwakulszowa in https://github.com/watchdogpolska/small_eod/issues/993#issuecomment-863313423_


Discussion:
@rwakulszowa, wyciągnąłem do osobnego zagadnienia, bo muszę small-eod uruchomić i sprawdzić, a chciałbym #993 wcielić, bo nie mam do niego żadnych wątpliwości.

Resolving patch:
diff --git a/backend-project/config/settings/base.py b/backend-project/config/settings/base.py
--- a/backend-project/config/settings/base.py
+++ b/backend-project/config/settings/base.py
@@ -173,6 +173,7 @@
     "https://www.googleapis.com/auth/userinfo.email",
     "https://www.googleapis.com/auth/userinfo.profile",
 ]
+SOCIAL_AUTH_USE_FAKE_OAUTH = env("SOCIAL_AUTH_USE_FAKE_OAUTH", default=False)
 
 MINIO_ACCESS_KEY = env("MINIO_ACCESS_KEY")
 MINIO_SECRET_KEY = env("MINIO_SECRET_KEY")
diff --git a/backend-project/small_eod/users/providers.py b/backend-project/small_eod/users/providers.py
--- a/backend-project/small_eod/users/providers.py
+++ b/backend-project/small_eod/users/providers.py
@@ -1,3 +1,5 @@
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
 from requests_oauthlib import OAuth2Session
 
 
@@ -31,3 +33,41 @@ def exchange(self, request):
         )
         resp = google.get(self.userinfo_url)
         return resp.json()
+
+
+class FakeProvider:
+    base_url = "https://localhost:5678"
+
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def callback_url(self, request):
+        # Hardcode localhost - the provider is expected to be used only in local
+        # deployments.
+        # `build_absolute_uri` doesn't work, because it produces a docker
+        # friendly url.
+        redirect_uri = "http://localhost:8000/login/callback"
+        return f"{self.base_url}?redirect_uri={redirect_uri}", None
+
+    def exchange(self, request):
+        # Hardcoded values.
+        # Simple, but working.
+        return {
+            "email": "email@example.com",
+            "given_name": "GivenName",
+            "family_name": "FamilyName",
+        }
+
+
+def get_provider_cls():
+    flag_value = settings.SOCIAL_AUTH_USE_FAKE_OAUTH
+    if flag_value is True:
+        if not settings.DEBUG:
+            raise ImproperlyConfigured("Fake oauth may only be used in DEBUG mode")
+        return FakeProvider
+    elif flag_value is False:
+        return GoogleProvider
+    else:
+        raise ImproperlyConfigured(
+            f"Fake oauth must be either True or False, is {flag_value}"
+        )
diff --git a/backend-project/small_eod/users/views.py b/backend-project/small_eod/users/views.py
--- a/backend-project/small_eod/users/views.py
+++ b/backend-project/small_eod/users/views.py
@@ -10,7 +10,7 @@
 from rest_framework_simplejwt.tokens import RefreshToken
 
 from .filterset import UserFilterSet
-from .providers import GoogleProvider
+from .providers import get_provider_cls
 from .serializers import (
     RefreshTokenRequestSerializer,
     RequestSerializer,
@@ -27,7 +27,7 @@ class UserViewSet(viewsets.ModelViewSet):
 
     queryset = User.objects.all()
     serializer_class = UserSerializer
-    provider = GoogleProvider(
+    provider = get_provider_cls()(
         client_id=settings.SOCIAL_AUTH_GOOGLE_OAUTH2_KEY,
         client_secret=settings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET,
         scopes=settings.SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE,


Test patch: