11from typing import Type
22from unittest import mock
3+ from unittest .mock import MagicMock
34
45import pytest
56from django .test import RequestFactory
67from django .utils import timezone
78from pytest_django .fixtures import SettingsWrapper
89from pytest_mock import MockerFixture
910from rest_framework .authtoken .models import Token
11+ from rest_framework .parsers import JSONParser
12+ from rest_framework .request import Request
13+ from rest_framework .test import APIRequestFactory
1014
1115from custom_auth .oauth .serializers import (
1216 GithubLoginSerializer ,
1317 GoogleLoginSerializer ,
1418 OAuthLoginSerializer ,
1519)
1620from organisations .invites .models import InviteLink
17- from users .models import FFAdminUser , SignUpType
21+ from users .models import FFAdminUser , HubspotTracker , SignUpType
1822
1923
24+ @pytest .mark .parametrize (
25+ "enable_hubspot_lead_tracking" ,
26+ (
27+ True ,
28+ False ,
29+ ),
30+ )
2031@mock .patch ("custom_auth.oauth.serializers.get_user_info" )
2132def test_create_oauth_login_serializer (
22- mock_get_user_info : mock .MagicMock , db : None
33+ mock_get_user_info : mock .MagicMock ,
34+ db : None ,
35+ settings : SettingsWrapper ,
36+ mocker : MagicMock ,
37+ enable_hubspot_lead_tracking : bool ,
2338) -> None :
2439 # Given
40+ settings .ENABLE_HUBSPOT_LEAD_TRACKING = enable_hubspot_lead_tracking
2541 access_token = "access-token"
2642 sign_up_type = "NO_INVITE"
27- data = {"access_token" : access_token , "sign_up_type" : sign_up_type }
28- rf = RequestFactory ()
29- request = rf .post ("/api/v1/auth/oauth/google/" )
43+ data = {
44+ "access_token" : access_token ,
45+ "sign_up_type" : sign_up_type ,
46+ "hubspotutk" : "test-hubspot-utk" ,
47+ "utm_data" : {"utm_source" : "test-utm-data" },
48+ }
49+ rf = APIRequestFactory ()
50+ django_request = rf .post ("/api/v1/auth/oauth/google/" , data = data , format = "json" )
51+ request = Request (django_request , parsers = [JSONParser ()])
3052 email = "testytester@example.com"
3153 first_name = "testy"
3254 last_name = "tester"
@@ -39,7 +61,9 @@ def test_create_oauth_login_serializer(
3961 "google_user_id" : google_user_id ,
4062 }
4163 serializer = OAuthLoginSerializer (data = data , context = {"request" : request }) # type: ignore[abstract]
42-
64+ mock_create_hubspot_contact_for_user = mocker .patch (
65+ "integrations.lead_tracking.hubspot.services.create_hubspot_contact_for_user"
66+ )
4367 # monkey patch the get_user_info method to return the mock user data
4468 serializer .get_user_info = lambda : mock_user_data # type: ignore[method-assign]
4569
@@ -48,7 +72,17 @@ def test_create_oauth_login_serializer(
4872 response = serializer .save ()
4973
5074 # Then
51- assert FFAdminUser .objects .filter (email = email , sign_up_type = sign_up_type ).exists ()
75+ user = FFAdminUser .objects .filter (email = email , sign_up_type = sign_up_type ).first ()
76+ assert user is not None
77+ hubspot_tracker = HubspotTracker .objects .get (user = user )
78+ assert hubspot_tracker .utm_data == {"utm_source" : "test-utm-data" }
79+ assert hubspot_tracker .hubspot_cookie == "test-hubspot-utk"
80+ if enable_hubspot_lead_tracking :
81+ mock_create_hubspot_contact_for_user .delay .assert_called_once_with (
82+ args = (user .id ,)
83+ )
84+ else :
85+ mock_create_hubspot_contact_for_user .delay .assert_not_called ()
5286 assert isinstance (response , Token )
5387 assert (timezone .now () - response .user .last_login ).seconds < 5
5488 assert response .user .email == email
@@ -103,16 +137,18 @@ def test_OAuthLoginSerializer_calls_is_authentication_method_valid_correctly_if_
103137):
104138 # Given
105139 settings .AUTH_CONTROLLER_INSTALLED = True
106-
107- request = rf .post ("/some-login/url" )
140+ rf = APIRequestFactory ()
141+ data = {"access_token" : "some_token" }
142+ django_request = rf .post ("/some-login/url" , data = data , format = "json" )
143+ request = Request (django_request , parsers = [JSONParser ()])
108144 user_email = "test_user@test.com"
109145 mocked_auth_controller = mocker .MagicMock ()
110146 mocker .patch .dict (
111147 "sys.modules" , {"auth_controller.controller" : mocked_auth_controller }
112148 )
113149
114150 serializer = OAuthLoginSerializer ( # type: ignore[abstract]
115- data = { "access_token" : "some_token" } , context = {"request" : request }
151+ data = data , context = {"request" : request }
116152 )
117153 # monkey patch the get_user_info method to return the mock user data
118154 serializer .get_user_info = lambda : {"email" : user_email } # type: ignore[method-assign]
@@ -139,16 +175,22 @@ def test_OAuthLoginSerializer_allows_registration_if_sign_up_type_is_invite_link
139175):
140176 # Given
141177 settings .ALLOW_REGISTRATION_WITHOUT_INVITE = False
142-
143- request = rf .post ("/api/v1/auth/users/" )
178+ data = {
179+ "access_token" : "some_token" ,
180+ "sign_up_type" : SignUpType .INVITE_LINK .value ,
181+ "invite_hash" : invite_link .hash ,
182+ }
183+ rf = APIRequestFactory ()
184+ django_request = rf .post (
185+ "/api/v1/auth/oauth/google/" ,
186+ data = data ,
187+ format = "json" ,
188+ )
189+ request = Request (django_request , parsers = [JSONParser ()])
144190 user_email = "test_user@test.com"
145191
146192 serializer = OAuthLoginSerializer ( # type: ignore[abstract]
147- data = {
148- "access_token" : "some_token" ,
149- "sign_up_type" : SignUpType .INVITE_LINK .value ,
150- "invite_hash" : invite_link .hash ,
151- },
193+ data = data ,
152194 context = {"request" : request },
153195 )
154196 # monkey patch the get_user_info method to return the mock user data
0 commit comments