
    hxq                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
JrJr  S SKJr  S SKJr  S S	KJrJr  S S
KJrJr  S SKJr  S SKJr  S SKJr  S SKJrJrJ r J!r!J"r"J#r#J$r$  \S 5       r% " S S\5      r& " S S\5      r' " S S\'5      r( " S S\'5      r) " S S\'5      r* " S S\5      r+ " S S\\5      r, " S S\5      r- " S  S!\5      r. " S" S#\5      r/ " S$ S%\5      r0 " S& S'\5      r1g())    )contextmanager)mock)settings)User)call_command)
connectiontransaction)override_settings)CloneSchema)schema_migratedschema_migrate_message)
DummyModelModelWithFkToPublicUser)get_executor)TenantTestCase)BaseTestCase)tenant_contextschema_contextschema_existsget_tenant_modelget_public_schema_nameget_tenant_domain_modelschema_renamec              #      #    [         R                  " 5       nU R                  U5        Uv   U R                  U5        g7f)z1
Catch django signal and return the mocked call.
N)r   Mockconnect
disconnect)signalhandlers     S/var/www/html/env/lib/python3.13/site-packages/django_tenants/tests/test_tenants.pycatch_signalr!      s1     
 iikG
NN7
M
gs   =?c                      ^  \ rS rSrSr\U 4S j5       r\U 4S j5       rU 4S jrU 4S jr	S r
S rS	 rS
 rS r\" SS9S 5       rS rS rS rS rS rSrU =r$ )TenantDataAndSettingsTest    zo
Tests if the tenant model settings work properly and if data can be saved
and persisted to different tenants.
c                   > [         TU ]  5         S[        l        S[        l        [        R                  [        R                  -   [        l        U R                  5         [        5       " [        5       S9U l	        U R                  R                  5         [        5       " U R                  SS9U l        U R                  R                  5         g )N)django_tenants	customers)dts_test_appdjango.contrib.contenttypesdjango.contrib.authschema_nametest.comtenantdomain)super
setUpClassr   SHARED_APPSTENANT_APPSINSTALLED_APPSsync_sharedr   r   public_tenantsaver   public_domaincls	__class__s    r    r2   $TenantDataAndSettingsTest.setUpClass&   s     - 9 #+"6"69M9M"M,.;Q;ST 35S=N=NWab     c                    > U R                   R                  5         U R                  R                  5         [        TU ]  5         g N)r9   deleter7   r1   tearDownClassr:   s    r    rB   'TenantDataAndSettingsTest.tearDownClass6   s2      "  "r>   c                 0   > / U l         [        TU ]	  5         g r@   )createdr1   setUpselfr<   s    r    rF   TenantDataAndSettingsTest.setUp=   s    r>   c                    > SSK Jn  [        R                  " 5         U R                   H4  n[        X!5      (       a  UR                  SS9  M$  UR                  5         M6     [        TU ]!  5         g Nr   )TenantMixinT
force_drop	django_tenants.modelsrL   r   set_schema_to_publicrE   
isinstancerA   r1   tearDownrH   rL   cr<   s      r    rS   "TenantDataAndSettingsTest.tearDownB   O    5'')A!))D)
	  	r>   c                     [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         U R                  [	        UR
                  5      5        X!/U l        g)z6
When saving a tenant, it's schema should be created.
testr+   something.test.comr.   N)r   r8   r   
assertTruer   r,   rE   rH   r/   r0   s      r    test_tenant_schema_is_created7TenantDataAndSettingsTest.test_tenant_schema_is_createdO   sT     "#7(*&AUVf&8&89:'r>   c                 T  ^ ^^ [        5       n[        5       mSm[        R                  " 5       UUU 4S j5       nUS:X  a"  U" 5         T R	                  [        T5      5        gUS:X  a0  T R                  [        R                  5         U" 5         SSS5        gg! , (       d  f       g= f)zc
When saving a tenant, it's schema should be created.
This should work in atomic transactions too.
rY   c                  B   > T" TS9n U R                  5         U /Tl        g )Nr+   )r8   rE   )tTenantr,   rH   s    r    atomically_create_tenantdTenantDataAndSettingsTest.test_tenant_schema_is_created_atomically.<locals>.atomically_create_tenantg   s    ;/AFFH3DLr>   simplemultiprocessingN)r   r   r	   atomicr[   r   assertRaisesTransactionManagementError)rH   executorrc   rb   r,   s   `  @@r    (test_tenant_schema_is_created_atomicallyBTenantDataAndSettingsTest.test_tenant_schema_is_created_atomically]   s    
  >!#					 
	 x$&OOM+67** "";#I#IJ(* KJ + KJs   B
B'c                     [        5       " SS9nSUl        UR                  5         [        5       " USS9nUR                  5         U R	                  [        UR                  5      5        X!/U l        g)z~
When saving a tenant that has the flag auto_create_schema as
False, the schema should not be created when saving the tenant.
rY   r+   FrZ   r.   N)r   auto_create_schemar8   r   assertFalser   r,   rE   r\   s      r    test_non_auto_sync_tenant3TenantDataAndSettingsTest.test_non_auto_sync_tenantx   s^     "#7$)!(*&AUVv'9'9:;'r>   c                    [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         [        R                  " U5        [        SS9R                  5         [        SS9R                  5         [        R                  " 5         S/Ul        UR                  5         [        R                  " U5        U R                  [
        R                  R                  5       S	5        X!/U l        g
)z;
When editing an existing tenant, all data should be kept.
rY   r+   rZ   r.   Schemas arenameawesome!example.com   N)r   r8   r   r   
set_tenantr   rQ   domain_urlsassertEqualobjectscountrE   r\   s      r    test_sync_tenant*TenantDataAndSettingsTest.test_sync_tenant   s     "#7(*&AUV 	f% 	&++-
#((* 	'')+_f% 	++113Q7'r>   c                    [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         [        R                  " 5         [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         [        R
                  " U5        [        SS9R                  5         [        S	S9R                  5         U R                  S
5         [        U5         [        SS9R                  5         [        SS9R                  5         [        SS9R                  5         SSS5        SSS5        U R                  S5         U R                  S[        R                  R                  5       5        SSS5        U R                  S5         [        U5         U R                  S[        R                  R                  5       5        SSS5        SSS5        XBX1/U l        g! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       NS= f! , (       d  f       N\= f)zr
IMPORTANT: using schema_name with underscore here. See
https://github.com/django-tenants/django-tenants/pull/829
ztenant`1r+   rZ   r.   Tenant_2rw   rs   rt   rv      Man,testing	is great!Nrx      )r   r8   r   r   rQ   ry   r   assertNumQueriesr   r{   r|   r}   rE   rH   tenant1domain1tenant2domain2s        r    test_switching_search_path4TenantDataAndSettingsTest.test_switching_search_path   s   
 #$<)+7CWX'')"$<)+7=Q 	g& 	&++-
#((* ""1%(',,.	*//1,113	 ) & ""1%Q
 2 2 8 8 :; & ""1%(  J$6$6$<$<$>? ) &  '; )( &% &%
 )( &%sU   %H1AG57H/H H9,/H(H95
H	?H
H
H%(
H6	2H99
IT)TENANT_LIMIT_SET_CALLSc                 P   [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         [        R                  " 5         [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         U R                  S5         [        R                  " U5        S S S 5        U R                  S5         [        U5         [        S	S
9R                  5         [        SS
9R                  5         [        SS
9R                  5         S S S 5        S S S 5        U R                  S5         [        R                  " U5        S S S 5        U R                  S5         U R                  S[        R                  R                  5       5        S S S 5        U R                  S5         [        R                  " U5        S S S 5        U R                  S5         U R                  S[        R                  R                  5       5        S S S 5        XBX1/U l        g ! , (       d  f       GN|= f! , (       d  f       GN#= f! , (       d  f       GN-= f! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f)Nr   r+   rZ   r.   r   rw   r      r   rt   r   r   rx   r   )r   r8   r   r   rQ   r   ry   r   r   r{   r|   r}   rE   r   s        r    (test_switching_search_path_limited_callsBTenantDataAndSettingsTest.test_switching_search_path_limited_calls   s   "$;)+7CWX'')"$;)+7=Q ""1%!!'* &
 ""1%(',,.	*//1,113 ) & ""1%!!'* & ""1%Q
 2 2 8 8 :; & ""1%!!'* & ""1%Q
 2 2 8 8 :; &  ';7 &% )( &% &% &% &% &%sa   !H-IAH?#II#4/I5<J,/J-
H<?
I		I
I #
I25
J
J
J%c                    [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         S [        l        [        U5         [        SS9R                  5         S S S 5        S [        l        [        UR                  5         [        SS9R                  5         S S S 5        X!/U l	        g ! , (       d  f       NW= f! , (       d  f       N(= f)NrY   r+   rZ   r.   No exception pleasert   Survived it!)
r   r8   r   r   r/   r   r   r   r,   rE   r\   s      r    -test_switching_tenant_without_previous_tenantGTenantDataAndSettingsTest.test_switching_tenant_without_previous_tenant  s    !#7(*&AUV 
F#12779 $ !
F../N+002 0 ' $# 0/s   B=C=
C
Cc                 .   [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         S [        l        [        U5      S 5       nU" 5         S [        l        [        UR                  5      S 5       nU" 5         X!/U l        g )NrY   r+   rZ   r.   c                  2    [        SS9R                  5         g )Nr   rt   r   r8    r>   r    test_tenant_func[TenantDataAndSettingsTest.test_tenant_schema_behaves_as_decorator.<locals>.test_tenant_func  s    12779r>   c                  2    [        SS9R                  5         g )Nr   rt   r   r   r>   r    test_schema_func[TenantDataAndSettingsTest.test_tenant_schema_behaves_as_decorator.<locals>.test_schema_func#  s    N+002r>   )	r   r8   r   r   r/   r   r   r,   rE   )rH   r/   r0   r   r   s        r    'test_tenant_schema_behaves_as_decoratorATenantDataAndSettingsTest.test_tenant_schema_behaves_as_decorator  s    !#7(*&AUV 
			: 
 	: 	 
	**	+	3 
,	3 	'r>   c                     [        5       " SS9nUR                  5         U R                  [        UR                  5      5        U/U l        g )Nselectr+   r   r8   r[   r   r,   rE   rH   r/   s     r    1test_tenant_schema_creation_with_sql_keyword_nameKTenantDataAndSettingsTest.test_tenant_schema_creation_with_sql_keyword_name+  s8    !#9f&8&89:xr>   c                     [        5       " SS9nUR                  5         U R                  [        UR                  5      5        U/U l        g )N123r+   r   r   s     r    2test_tenant_schema_creation_with_only_numbers_nameLTenantDataAndSettingsTest.test_tenant_schema_creation_with_only_numbers_name3  s8    !#6f&8&89:xr>   c                     Sn[        5       nU H=  nU" US9nUR                  5         U R                  [        UR                  5      5        M?     g)z.Tests using special characters in schema name.)ztest-hyphenztest@atztest`backtick
country_BDr+   N)r   r8   r[   r   r,   )rH   schema_namesClientr,   r/   s        r    .test_tenant_schema_creation_with_special_charsHTenantDataAndSettingsTest.test_tenant_schema_creation_with_special_chars;  sC    P!#'K4FKKMOOM&*<*<=> (r>   rE   )__name__
__module____qualname____firstlineno____doc__classmethodr2   rB   rF   rS   r]   rk   rp   r~   r   r
   r   r   r   r   r   r   __static_attributes____classcell__r<   s   @r    r#   r#       s    
 ! !    
(+6("(:+<Z d3+< 4+<Z("(2  ? ?r>   r#   c                   N   ^  \ rS rSrSrSrSrSr\U 4S j5       r	U 4S jr
SrU =r$ )	BaseSyncTestiF  z
Tests if the shared apps and the tenant apps get synced correctly
depending on if the public schema or a tenant is being synced.
   r&   r'   r*   r)   django.contrib.sessionsc                    > [         TU ]  5         U R                  U R                  -   U l        U R                  [
        l        U R                  [
        l        U R                  [
        l        U R                  U l        g r@   )r1   r2   r3   r4   r5   r   available_appsr:   s    r    r2   BaseSyncTest.setUpClassS  sW     __s>"""%"4"4 //r>   c                   > [         TU ]  5         [        R                  " 5         [        R                  " 5        nUR                  S[        5       < S[        5       < S35        S S S 5        U R                  5         g ! , (       d  f       N= f)NzDROP SCHEMA z CASCADE; CREATE SCHEMA ;)r1   rF   r   rQ   cursorexecuter   r6   )rH   r   r<   s     r    rF   BaseSyncTest.setUp^  sc     	'') FNN468N8PT U ! 		 ! s   +A>>
Br   )r   r   r   r   r   MIGRATION_TABLE_SIZEr3   r4   r   r2   rF   r   r   r   s   @r    r   r   F  s:     4K 0K0 0	 	r>   r   c                        \ rS rSrS rS rSrg)TenantSyncTestij  c                     U R                  [        5       5      nU R                  SU R                  -   [	        U5      5        U R                  SU5        g)zX
Tests that if an app is in SHARED_APPS, it does not get synced to
the a tenant schema.
	   django_sessionN)get_tables_list_in_schemar   r{   r   lenassertNotIn)rH   shared_tabless     r    *test_shared_apps_does_not_sync_tenant_apps9TenantSyncTest.test_shared_apps_does_not_sync_tenant_appsk  sI    
 667M7OPT%>%>>M@RS)=9r>   c                    [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         U R                  UR                  5      nU R                  SU R                  -   [        U5      5        U R                  SU5        [        R                  " 5         UR                  5         UR                  SS9  g	)
zV
Tests that if an app is in TENANT_APPS, it does not get synced to
the public schema.
rY   r+   arbitrary.test.comr.   r   r   TrM   N)r   r8   r   r   r,   r{   r   r   assertInr   rQ   rA   )rH   r/   r0   tenant_tabless       r    *test_tenant_apps_does_not_sync_shared_apps9TenantSyncTest.test_tenant_apps_does_not_sync_shared_appst  s    
 "#7(*&AUV66v7I7IJT666M8JK&6'')&r>   r   N)r   r   r   r   r   r   r   r   r>   r    r   r   j  s    :'r>   r   c                   6   ^  \ rS rSrSrSrU 4S jrS rSrU =r	$ )TestSyncTenantsWithAuthi  )r&   r'   r*   r)   r   r   c                 B   > U R                  5         [        TU ]	  5         g r@   )r6   r1   
_pre_setuprG   s    r    r   "TestSyncTenantsWithAuth._pre_setup  s    r>   c                    [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         U R                  [	        5       5      nU R                  UR
                  5      nU R                  SU R                  -   [        U5      5        U R                  SU5        U R                  SU R                  -   [        U5      5        U R                  SU5        g)	z
Tests that both SHARED_APPS and TENANT_APPS can have apps in common.
In this case they should get synced to both tenant and public schemas.
rY   r+   r   r.   
   r   r   N
r   r8   r   r   r   r,   r{   r   r   r   rH   r/   r0   r   r   s        r    7test_tenant_apps_and_shared_apps_can_have_the_same_appsOTestSyncTenantsWithAuth.test_tenant_apps_and_shared_apps_can_have_the_same_apps  s    
 "#7(*&AUV667M7OP66v7I7IJ)B)BBCDVW&6T666M8JK&6r>   r   )
r   r   r   r   r3   r4   r   r   r   r   r   s   @r    r   r     s     0K
 0K7 7r>   r   c                   "    \ rS rSrSrSrS rSrg)TestSyncTenantsNoAuthi  )r&   r'   r)   r   c                    [        5       " SS9nUR                  5         [        5       " USS9nUR                  5         U R                  [	        5       5      nU R                  UR
                  5      nU R                  SU R                  -   [        U5      5        U R                  SU5        U R                  SU R                  -   [        U5      5        U R                  SU5        g)	zW
Tests that even if content types is in SHARED_APPS, it's
not required in TENANT_APPS.
rY   r+   rZ   r.   r   r   r   Nr   r   s        r    #test_content_types_is_not_mandatory9TestSyncTenantsNoAuth.test_content_types_is_not_mandatory  s    
 "#7(*&AUV667M7OP66v7I7IJ!:!::C<NO&6T666M8JK&6r>   r   N)r   r   r   r   r3   r4   r   r   r   r>   r    r   r     s    4K 0K7r>   r   c                   F   ^  \ rS rSrU 4S jrU 4S jrS rS rS rSr	U =r
$ )SharedAuthTesti  c                   > [         TU ]  5         S[        l        S[        l        [        R                  [        R                  -   [        l        U R                  5         [        5       " [        5       S9U l	        U R                  R                  5         [        5       " U R                  SS9U l        U R                  R                  5         [        5       " SS9U l        U R                  R                  5         [        5       " U R                  SS9U l        U R                  R                  5         [        [        5       5         [!        SS	S
9U l        U R"                  R                  5         [!        SSS
9U l        U R$                  R                  5         S S S 5        ['        U R                  5         [)        U R"                  S9U l        U R*                  R                  5         [)        U R$                  S9U l        U R,                  R                  5         S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   )r(   r+   r-   r.   r/   ztenant.test.comzarbitrary-1zarb1@test.com)usernameemailzarbitrary-2zarb2@test.com)user)r1   rF   r   r3   r4   r5   r6   r   r   r7   r8   r   r9   r/   r0   r   r   user1user2r   r   d1d2rG   s    r    rF   SharedAuthTest.setUp  s    A  2"*"6"69M9M"M-/<R<TU!46d>P>PYcd! '(X>-/t{{K\] 245}OLDJJJOO}OLDJJJOO	 6 DKK(-4::>DGGGLLN-4::>DGGGLLN	 )( 65 )(s   AH#5A%H4#
H14
Ic                   > [         R                  " 5         U R                  R                  5         U R                  R                  5         U R
                  R                  5         U R                  R                  SS9  [        TU ]!  5         g )NTrM   )	r   rQ   r9   rA   r7   r0   r/   r1   rS   rG   s    r    rS   SharedAuthTest.tearDown  sc    '')!!#!!#d+r>   c                    Sn[         R                  " 5       nUR                  U[        R                  R
                  U R                  R                  U R                  R                  45        UR                  5       nU R                  S[        U5      5        US   nU R                  [        R                  R
                  US   5        U R                  SUS   5        g)zT
Tests that a foreign key constraint gets created even for cross schema references.
a  
        SELECT
            tc.constraint_name, tc.table_name, kcu.column_name,
            ccu.table_name AS foreign_table_name,
            ccu.column_name AS foreign_column_name
        FROM
            information_schema.table_constraints AS tc
            JOIN information_schema.key_column_usage AS kcu
              ON tc.constraint_schema = kcu.constraint_schema AND tc.constraint_name = kcu.constraint_name
            JOIN information_schema.constraint_column_usage AS ccu
              ON tc.constraint_schema = ccu.constraint_schema AND ccu.constraint_name = tc.constraint_name
        WHERE
            constraint_type = 'FOREIGN KEY' AND
            tc.table_name=%s AND
            ccu.table_schema=%s AND
            ccu.constraint_schema=%s
        r   r   r   idr   N)r   r   r   r   _metadb_tabler7   r,   r/   fetchallr{   r   r   )rH   sqlr   fk_constraintsfks        r    )test_cross_schema_constraint_gets_created8SharedAuthTest.test_cross_schema_constraint_gets_created  s    " ""$'--66""..''	
  *C/0 A,,be4r!u%r>   c                 J   [        U R                  5         U R                  [        R                  R                  U R                  R                  S9[        R                  R                  U R                  R                  S9R                  5        U R                  [        R                  R                  U R                  R                  S9[        R                  R                  U R                  R                  S9R                  5        SSS5        g! , (       d  f       g= f)zj
Tests that a forward relationship through a foreign key to public from a model inside TENANT_APPS works.
pkN)r   r/   r{   r   r|   getr   r   r   r   r   r   r   rH   s    r    test_direct_relation_to_public-SharedAuthTest.test_direct_relation_to_public  s     DKK(T\\---?4<<@@DGGJJ@OTTVT\\---?4<<@@DGGJJ@OTTV )((s   C5D
D"c                    [        U R                  5         [        R                  R	                  5       R                  5       R                  S5      nU R                  [        R                  R                  U R                  R                  S9US   R                  R	                  5       SS R                  5       5        U R                  [        R                  R                  U R                  R                  S9US   R                  R	                  5       SS R                  5       5        SSS5        g! , (       d  f       g= f)zk
Tests that a reverse relationship through a foreign keys to public from a model inside TENANT_APPS works.
r   r  r   Nr   )r   r/   r   r|   allselect_relatedorder_byr{   r   r  r   r   modelwithfktopublicuser_setr   )rH   userss     r    test_reverse_relation_to_public.SharedAuthTest.test_reverse_relation_to_public  s     DKK(LL$$&557@@FE4<<@@DGGJJ@O"1XAAEEGKOOQS4<<@@DGGJJ@O"1XAAEEGKOOQS	 )((s   DD55
E)r   r   r0   r9   r7   r/   r   r   )r   r   r   r   rF   rS   r  r
  r  r   r   r   s   @r    r   r     s&    !F$&LV	S 	Sr>   r   c                   $    \ rS rSrSrS rS rSrg)TenantTestCaseTesti(  zP
Tests that the tenant created inside TenantTestCase persists on
all functions.
c                     U R                  S[        5       R                  R                  [        R
                  " 5       S9R                  5       5        g Nr   r+   r{   r   r|   filterr   get_test_schema_namer}   r	  s    r    "test_tenant_survives_after_method15TenantTestCaseTest.test_tenant_survives_after_method1.  A    ,.66==&;;= > 

%'	r>   c                     U R                  S[        5       R                  R                  [        R
                  " 5       S9R                  5       5        g r  r  r	  s    r    "test_tenant_survives_after_method25TenantTestCaseTest.test_tenant_survives_after_method24  r  r>   r   N)r   r   r   r   r   r  r  r   r   r>   r    r  r  (  s    
r>   r  c                       \ rS rSrSrS rSrg) TenantManagerMethodsTestCaseTesti;  z 
Tests manager's delete method.
c                    [        5       nSUl        U" SS9nUR                  5         U R                  [	        UR
                  5      5        [        5       " USS9nUR                  5         UR                  R                  UR                  S9R                  5         U R                  [	        UR
                  5      5        g )NTrY   r+   rZ   r.   r  )r   auto_drop_schemar8   r[   r   r,   r   r|   r  r  rA   ro   rH   r   r/   r0   s       r    "test_manager_method_deletes_schemaCTenantManagerMethodsTestCaseTest.test_manager_method_deletes_schema?  s    !#"&F+f&8&89:(*&AUV+224v'9'9:;r>   r   N)r   r   r   r   r   r&  r   r   r>   r    r"  r"  ;  s    <r>   r"  c                        \ rS rSrS rS rSrg)TenantRenameSchemaTestiM  c                    [        5       nU" SS9nUR                  5         U R                  [        UR                  5      5        [        5       " USS9nUR                  5         [        UR                  R                  UR                  S9R                  5       SS9  U R                  [        S5      5        U R                  [        S5      5        g )NrY   r+   rZ   r.   r  new_namer/   new_schema_namer   r8   r[   r   r,   r   r   r|   r  r  firstro   r%  s       r    test_rename_schema_ok,TenantRenameSchemaTest.test_rename_schema_okO  s    !#F+f&8&89:(*&AUVV^^22fii2@FFHZdev./j12r>   c                    [        5       nU" SS9nUR                  5         U R                  [        UR                  5      5        [        5       " USS9nUR                  5         [        UR                  R                  UR                  S9R                  5       SS9  U R                  [        S5      5        U R                  [        S5      5        g )N	1234_testr+   rZ   r.   r  4321_new_namer,  r.  r%  s       r    test_rename_schema_numbers1TenantRenameSchemaTest.test_rename_schema_numbersZ  s    !#K0f&8&89:(*&AUVV^^22fii2@FFHZij{34o67r>   r   N)r   r   r   r   r0  r5  r   r   r>   r    r)  r)  M  s    	3	8r>   r)  c                        \ rS rSrS rS rSrg)CloneSchemaTestif  c                 f   [        5       nU" SS9nUR                  5         U R                  [        UR                  5      5        [        5       " USS9nUR                  5         [        5       nUR                  SSS9  U R                  [        S5      5        U R                  [        S5      5        g )Nsourcer+   zsource.test.comr.   destinationbase_schema_namer-  )r   r8   r[   r   r,   r   r   clone_schemarH   r   r/   r0   r>  s        r    test_clone_schema!CloneSchemaTest.test_clone_schemag  s    !#H-f&8&89:(*&ARS"}!!8]![h/0m45r>   c                     [        5       nU" SS9nUR                  5         [        5       " USS9nUR                  5         U R                  [	        UR
                  5      5        [        U5         U R                  [        R                  R                  SS9R                  5       5        U R                  [        R                  R                  SS9R                  5       5        [        SS9R                  5         [        SS9R                  5         SSS5        [        5       nUR                  SS	S
9  U R                  [	        S5      5        [        S	5         U R                  [        R                  R                  SS9R                  5       5        U R                  [        R                  R                  SS9R                  5       5        [        SS9R                  5         SSS5        g! , (       d  f       N= f! , (       d  f       g= f)a  
Exercises the scenario where the source schema contains records in a shared app which
get cloned in the destination schema but the value of the PK column remains at 1 which
causes duplicate key errors.
See https://github.com/django-tenants/django-tenants/issues/831
s1r+   zs1.test.comr.   Administratorrt   TesterNr   r<  r;  	Moderator)r   r8   r   r[   r   r,   r   ro   r   r|   r  existsr   r>  r   r?  s        r    Otest_clone_schema_with_existing_records_and_add_new_records_to_resulting_schema_CloneSchemaTest.test_clone_schema_with_existing_records_and_add_new_records_to_resulting_schemau  s    "#D)(*&Of&8&89: F#Z//66O6LSSUVZ//66H6ELLNOO,113H%**,	 $ #}!!4!Nm45 D!OOJ..55?5KRRTUOOJ..5585DKKMNK(--/	 "! $# "!s   /B#G.BG?.
G<?
Hr   N)r   r   r   r   r@  rH  r   r   r>   r    r8  r8  f  s    60r>   r8  c                   F   ^  \ rS rSrU 4S jrU 4S jrS rS rS rSr	U =r
$ )SchemaMigratedSignalTesti  c                 P   > / U l         [        TU ]	  5         U R                  5         g r@   )rE   r1   rF   r6   rG   s    r    rF   SchemaMigratedSignalTest.setUp  s    r>   c                    > SSK Jn  [        R                  " 5         U R                   H4  n[        X!5      (       a  UR                  SS9  M$  UR                  5         M6     [        TU ]!  5         g rK   rO   rT   s      r    rS   !SchemaMigratedSignalTest.tearDown  rW   r>   c                     [        [        5       nU R                  5         SSS5        WR                  [	        5       [
        R                  [        S9  g! , (       d  f       N:= f)z`
Public schema always gets migrated in the current process,
even with executor multiprocessing.
Nr,   senderr   )r!   r   r6   assert_called_once_withr   r   ANY)rH   r   s     r    test_signal_on_sync_shared3SchemaMigratedSignalTest.test_signal_on_sync_shared  sM    
 /*g + 	''.088" 	( 	
 +*s   A
A#c                 t   [        5       n[        5       " SS9n[        [        5       nUR	                  5         SSS5        US:X  a$  WR                  S[        R                  [        S9  OUS:X  a  WR                  5         [        5       " USS9nUR	                  5         XB/U l
        g! , (       d  f       Nv= f)	zP
Since migrate gets called on creating of a tenant, check
the signal gets sent.
rY   r+   Nre   rQ  rf   rZ   r.   )r   r   r!   r   r8   rS  r   rT  assert_not_calledr   rE   )rH   rj   r/   r   r0   s        r    test_signal_on_tenant_create5SchemaMigratedSignalTest.test_signal_on_tenant_create  s    
  >!#7/*gKKM + x++"xx& , 
 ** %%'(*&AUV'! +*s   B))
B7c           	      :   [        5       n[        5       " SS9nUR                  5         [        5       " USS9nUR                  5         [	        [
        5       n[        SSSS9  S	S	S	5        US
:X  ah  WR                  [        R                  " [        5       [        R                  [
        S9[        R                  " S[        R                  [
        S9/5        g	US:X  a,  WR                  [        5       [        R                  [
        S9  g	g	! , (       d  f       N= f)z7
Check signals are sent on running of migrate_schemas.
rY   r+   rZ   r.   migrate_schemasFr   interactive	verbosityNre   rQ  rf   )r   r   r8   r   r!   r   r   assert_has_callsr   callr   rT  rS  )rH   rj   r/   r0   r   s        r    test_signal_on_migrate_schemas7SchemaMigratedSignalTest.test_signal_on_migrate_schemas  s      >!#7(*&AUV /*g*K + x$$		 6 888*
 		 &88*,
& 
 **++24xx& ,  + +*s   D
Dr   )r   r   r   r   rF   rS   rU  rY  rb  r   r   r   s   @r    rK  rK    s!    

(4   r>   rK  c                   :   ^  \ rS rSrU 4S jrU 4S jrS rSrU =r$ )MigrationOrderTestTesti  c                 h   > / U l         [        TU ]	  5         S/[        l        U R                  5         g )Nz-schema_name)rE   r1   rF   r   TENANT_MIGRATION_ORDERr6   rG   s    r    rF   MigrationOrderTestTest.setUp  s*    +9*:'r>   c                    > SSK Jn  [        R                  " 5         U R                   H4  n[        X!5      (       a  UR                  SS9  M$  UR                  5         M6     S [        l        [        TU ])  5         g rK   )rP   rL   r   rQ   rE   rR   rA   r   rg  r1   rS   rT   s      r    rS   MigrationOrderTestTest.tearDown  sW    5'')A!))D)
	  +/'r>   c           
         [        5       nUR                  S:w  a  g[        5       R                  R	                  SS9n[        5       R                  R	                  SS9n[        5       R                  R	                  USS9  [        5       R                  R	                  USS9  [        [        5       n[        S	S
SS9  SSS5        WR                  [        R                  " [        5       [        R                  [        S9[        R                  " S[        R                  [        S9[        R                  " S[        R                  [        S9/5        g! , (       d  f       N= f)zC
Test the migrate schemas is determined by TENANT_MIGRATION_ORDER.
standardNrY   r+   xtestzsomething1.test.comr.   zsomething2.test.comr\  Fr   r]  rQ  )r   codenamer   r|   creater   r!   r   r   r`  r   ra  r   rT  )rH   rj   r   r   r   s        r    test_migrate_schemas_order1MigrationOrderTestTest.test_migrate_schemas_order  s     >
*"$,,333G"$,,333H!))00#8 	1 	
 	 !))00#8 	1 	

 /*g*K + 	  		 6 888*
 		gdhhW		fTXXoV
	
 +*s   1E
E"r   )	r   r   r   r   rF   rS   rp  r   r   r   s   @r    re  re    s    
 
r>   re  N)2
contextlibr   unittestr   django.confr   django.contrib.auth.modelsr   django.core.managementr   	django.dbr   r	   django.test.utilsr
   django_tenants.cloner   django_tenants.signalsr   r   dts_test_app.modelsr   r   "django_tenants.migration_executorsr   django_tenants.test.casesr   django_tenants.tests.testcasesr   django_tenants.utilsr   r   r   r   r   r   r   r!   r#   r   r   r   r   r   r  r"  r)  r8  rK  re  r   r>   r    <module>r     s    %    + / - / , J C ; 4 7C C C  c? c?L	!< !H'\ '<7l 7>7L 70fS\ fSR~ &<| <$8\ 82.0l .0b\| \~7
\ 7
r>   