
    	]j/                         d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ  e       Z G d d	e	      Z G d
 de	      Z G d de	      Zy)z6
Tests for Redis user activity caching functionality.
    )	timedelta)	MagicMockpatch)get_user_model)TestCase)timezone)SYNC_THRESHOLDUSER_ACTIVITY_COUNTER_KEY_bulk_update_user_activities_get_user_activity_keycleanup_redis_activity_dataclear_batch_user_idsget_activity_counterget_batch_user_idsget_user_last_activityincrement_activity_counterreset_activity_counterset_user_last_activityshould_sync_activitiesc                   .   e Zd ZdZd Zd Z edd       ed      d               Z edd	      d
        Z edd       ed      d               Z	 edd       ed      d               Z
 edd	      d        Z edd       ed      d               Z edd       ed      d               Z edd       ed      d               Z edd       ed      d               Z edd       ed      d               Z ed      d        Zd Zy)TestRedisActivityzTest Redis activity functions.c                     t         j                  j                  ddd      | _        t	        j
                         | _        y Nztest@example.comtestusertestpass123)emailusernamepassword)Userobjectscreate_useruserr   now	test_timeselfs    V/root/env/lib/python3.12/site-packages/label_studio/users/tests/test_redis_activity.pysetUpzTestRedisActivity.setUp!   s/    LL,,3EPZer,s	!    c                     t        dd      5  t        | j                  j                  h       t	                d d d        y # 1 sw Y   y xY w)N-users.functions.last_activity.redis_connectedTreturn_value)r   r   r"   idr   r%   s    r'   tearDownzTestRedisActivity.tearDown%   s;    BQUV 	%'7"$	% 	% 	%s   +AAr+   Tr,   z,users.functions.last_activity.get_connectionc                    t               }||_        d|j                  _        t        | j                  j
                  | j                        }| j                  |       |j                  j                          |j                  j                          | j                  |j                  j                  d       |j                  j                          y)z)Test successful setting of user activity.      N)r   r-   incrr   r"   r.   r$   
assertTruesetexassert_called_oncesaddassertEqualexpire
call_countr&   mock_get_connectionmock_redis_connectedmock_redis_clientresults        r'   #test_set_user_last_activity_successz5TestRedisActivity.test_set_user_last_activity_success+   s     &K+<(./+'		dnnE224113*11<<a@113r)   Fc                 z    t        | j                  j                  | j                        }| j	                  |       y)z1Test setting activity when Redis is disconnected.N)r   r"   r.   r$   assertFalser&   r=   r?   s      r'   .test_set_user_last_activity_redis_disconnectedz@TestRedisActivity.test_set_user_last_activity_redis_disconnected;   s*     (		dnnE r)   c                    t        dt                     5  t               }||_        | j                  j	                         j                  d      |j                  _        t        | j                  j                        }| j                  || j                         |j                  j                          ddd       y# 1 sw Y   yxY w)z&Test getting user activity from Redis.$users.functions.last_activity._rediszutf-8N)r   r   r-   r$   	isoformatencodegetr   r"   r.   r8   r6   r;   s        r'   &test_get_user_last_activity_from_redisz8TestRedisActivity.test_get_user_last_activity_from_redisA   s     99;G 	7 )/@,151I1I1K1R1RSZ1[!!.+DIILL9FVT^^4!!446	7 	7 	7s   BB==Cc                 .   t        dt                     5  t               }||_        d|j                  _        t	        | j
                  j                        }| j                  |       |j                  j                          ddd       y# 1 sw Y   yxY w)z<Test getting activity when Redis has no data (returns None).rF   N)	r   r   r-   rI   r   r"   r.   assertIsNoner6   r;   s        r'   )test_get_user_last_activity_no_redis_dataz;TestRedisActivity.test_get_user_last_activity_no_redis_dataO   sx     99;G 	7 )/@,15!!.+DIILL9Ff%!!446	7 	7 	7s   A-BBc                     t        dd      5  t        | j                  j                        }| j	                  |       ddd       y# 1 sw Y   yxY w)z@Test getting activity when Redis is disconnected (returns None).rF   N)r   r   r"   r.   rL   rC   s      r'   .test_get_user_last_activity_redis_disconnectedz@TestRedisActivity.test_get_user_last_activity_redis_disconnected]   sD     94@ 	&+DIILL9Ff%	& 	& 	&s   1AAc                     t               }||_        d|j                  _        t               }| j	                  |d       |j                  j                  t               |j                  j                          y)z#Test incrementing activity counter.   N)	r   r-   r3   r   r8   assert_called_withr
   r9   r6   r;   s        r'   test_increment_activity_counterz1TestRedisActivity.test_increment_activity_countere   sc     &K+<(./++-#112KL  335r)   c                     t               }||_        d|j                  _        t               }| j	                  |d       |j                  j                          y)zTest getting activity counter.s   10
   N)r   r-   rI   r   r8   r6   r;   s        r'   test_get_activity_counterz+TestRedisActivity.test_get_activity_counters   sN     &K+<(-2*%'$002r)   c                     t               }||_        t               }| j                  |       |j                  j                  t        d       |j                  j                          y)z Test resetting activity counter.r   N)	r   r-   r   r4   setassert_called_once_withr
   r9   r6   r;   s        r'   test_reset_activity_counterz-TestRedisActivity.test_reset_activity_counter   sS     &K+<(')556OQRS  335r)   c                     t               }||_        h d|j                  _        t               }| j	                  |h d       |j                  j                          y)zTest getting batch user IDs.>      1   2   3   r1   r2      N)r   r-   smembersr   r8   r6   r;   s        r'   test_get_batch_user_idsz)TestRedisActivity.test_get_batch_user_ids   sN     &K+<(2D""/#%+""557r)   c                     t               }||_        t        h d      }| j                  |       |j                  j                          y)zTest clearing batch user IDs.r_   N)r   r-   r   r4   sremr6   r;   s        r'   test_clear_batch_user_idsz+TestRedisActivity.test_clear_batch_user_ids   s=     &K+<(%i0113r)   z2users.functions.last_activity.get_activity_counterc                     t         dz
  |_        | j                  t                      t         |_        | j	                  t                      t         dz   |_        | j	                  t                      y)zTest sync threshold check.r1   N)r	   r-   rB   r   r4   )r&   mock_get_counters     r'   test_should_sync_activitiesz-TestRedisActivity.test_should_sync_activities   s_     )7(:%/12 )7%.01 )7(:%.01r)   c                     d| j                   j                   }t        | j                   j                        }| j                  ||       y)zTest Redis key generation.zuser_activity:N)r"   r.   r   r8   )r&   expected_keyr?   s      r'   test_get_user_activity_keyz,TestRedisActivity.test_get_user_activity_key   s8    '		~6'		5.r)   N)__name__
__module____qualname____doc__r(   r/   r   r@   rD   rJ   rM   rO   rS   rV   rZ   rb   re   rh   rk    r)   r'   r   r      s   ((% :N
9:4 ; O4 :O! P!
 :N
9:
7 ; O
7 :N
9:
7 ; O
7 :O& P& :N
9:
6 ; O
6 :N
9:	3 ; O	3 :N
9:	6 ; O	6 :N
9:	8 ; O	8 :N
9:4 ; O4 ?@2 A2/r)   r   c                       e Zd ZdZd Z ed       ed      d               Z ed      d        Z ed      d        Z ed      d	        Z	y
)TestUserLastActivityMixinz#Test UserLastActivityMixin methods.c                 R    t         j                  j                  ddd      | _        y r   r   r    r!   r"   r%   s    r'   r(   zTestUserLastActivityMixin.setUp   "    LL,,3EPZer,s	r)   z#users.models.set_user_last_activityz#users.models.schedule_activity_syncc                     d|_         | j                  j                          |j                          |j                          y)z/Test updating last activity with Redis success.TN)r-   r"   update_last_activityr6   )r&   mock_schedulemock_set_activitys      r'   'test_update_last_activity_redis_successzATestUserLastActivityMixin.test_update_last_activity_redis_success   s5     *.&		&&(,,.((*r)   c                    d|_         | j                  j                  }| j                  j                          |j	                          | j                  j                          | j                  | j                  j                  |       y)z@Test updating last activity with Redis failure (fallback to DB).FN)r-   r"   last_activityrw   r6   refresh_from_dbassertNotEqual)r&   ry   original_activitys      r'   'test_update_last_activity_redis_failurezATestUserLastActivityMixin.test_update_last_activity_redis_failure   sd     */& II33		&&(,,.		!!#DII335FGr)   z#users.models.get_user_last_activityc                     t        j                         }||_        | j                  j	                         }| j                  ||       |j                  | j                  j                         y)z"Test getting cached last activity.N)r   r#   r-   r"   get_last_activityr8   rY   r.   r&   mock_get_activityr$   r?   s       r'   test_get_last_activity_cachedz7TestUserLastActivityMixin.test_get_last_activity_cached   sP     LLN	)2&,,.+11$)),,?r)   c                     t        j                         }||_        | j                  j                  }| j                  ||       |j                  | j                  j                         y)z#Test last_activity_cached property.N)r   r#   r-   r"   last_activity_cachedr8   rY   r.   r   s       r'   "test_last_activity_cached_propertyz<TestUserLastActivityMixin.test_last_activity_cached_property   sM     LLN	)2&//+11$)),,?r)   N)
rl   rm   rn   ro   r(   r   rz   r   r   r   rp   r)   r'   rr   rr      s    -t 01
01+ 2 2+ 01
H 2
H 01@ 2@ 01@ 2@r)   rr   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestSyncTaskszTest synchronization tasks.c                 R    t         j                  j                  ddd      | _        y r   rt   r%   s    r'   r(   zTestSyncTasks.setUp   ru   r)   c                 r   t        j                         }| j                  j                  |dg}t	        |      }| j                  |d          | j                  |d   d       | j                  |d   d       | j                  j                          | j                  | j                  j                  |       y)z#Test bulk updating user activities.user_idr|   success	processedr1   errorsr   N)	r   r#   r"   r.   r   r4   r8   r}   r|   r&   r$   
activitiesr?   s       r'   (test_bulk_update_user_activities_successz6TestSyncTasks.test_bulk_update_user_activities_success   s    LLN	"&)),,KL
-j9y)*,a0)1- 			!!#00)<r)   c                     t        j                         }d|dg}t        |      }| j                  |d          | j	                  |d   d       | j	                  |d   d       y)	z(Test bulk update with non-existent user.i r   r   r   r   r   r1   N)r   r#   r   r4   r8   r   s       r'   1test_bulk_update_user_activities_nonexistent_userz?TestSyncTasks.test_bulk_update_user_activities_nonexistent_user  s_    LLN	"')DE
-j9y)*,a0)1-r)   c                 N   t        j                         t        d      z   }|| j                  _        | j                  j                          t        j                         t        d      z
  }| j                  j                  |dg}t        |      }| j                  |d          | j                  |d   d       | j                  |d   d       | j                  |d   d       | j                  j                          | j                  | j                  j                  |       y	)
z(Test bulk update with outdated activity.r1   )hoursr   r   r   r   r   updatedN)r   r#   r   r"   r|   saver.   r   r4   r8   r}   )r&   future_time	past_timer   r?   s        r'   2test_bulk_update_user_activities_outdated_activityz@TestSyncTasks.test_bulk_update_user_activities_outdated_activity  s     llnyq'99"-				 LLNYQ%77	"&)),,KL
-j9y)*,a0)1-	*A. 			!!#00+>r)   c                     t        g       }| j                  |d          | j                  |d   d       | j                  |d   d       y)z,Test bulk update with empty activities list.r   r   r   r   N)r   r4   r8   )r&   r?   s     r'   +test_bulk_update_user_activities_empty_listz9TestSyncTasks.test_bulk_update_user_activities_empty_list'  sG    -b1y)*,a0)1-r)   N)	rl   rm   rn   ro   r(   r   r   r   r   rp   r)   r'   r   r      s    %t=	.?,.r)   r   N)ro   datetimer   unittest.mockr   r   django.contrib.authr   django.testr   django.utilsr   users.functions.last_activityr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   rr   r   rp   r)   r'   <module>r      sc     * .   !     [/ [/|2@ 2@j<.H <.r)   