
    	]j[                     R    d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	  G d de      Z
y)	zTest data_manager.api module functionality.

This file tests the TaskPagination class optimizations that prevent
loading heavy task.data fields during pagination.
    )	MagicMockpatch)TaskPagination)TestCase)PageNumberPaginationc                   (    e Zd ZdZd Zd Zd Zd Zy)$TestTaskPaginationMemoryOptimizationa  Test TaskPagination uses .only('id') to avoid loading heavy fields.

    The optimization prevents loading full task objects (with potentially
    multi-megabyte data fields) during pagination. Only task IDs are loaded;
    full task objects are loaded later with proper annotations.

    Critical validation: The queryset passed to the parent paginate_queryset
    must have .only('id') applied to defer loading of heavy fields.
    c                 h    t               | _        t               | _        ddd| j                  _        y)zSet up test fixtures.130)page	page_sizeN)r   
paginationr   mock_requestquery_params)selfs    R/root/env/lib/python3.12/site-packages/label_studio/data_manager/tests/test_api.pysetUpz*TestTaskPaginationMemoryOptimization.setUp   s)    (*%K25D)I&    c                    t               }t               }||j                  _        t        d      5 }t        d      5 }d|j                  j
                  j                  j                  _        d|j                  j
                  j                  j                  _        t        j                  t        dg       5 }| j                  j                  || j                         |j                  j                  d       |j                          |j                  }|d   d   |u sJ 	 d	d	d	       d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y	xY w)
a5  Test sync_paginate_queryset applies .only('id') optimization.

        This test validates:
        - The queryset passed to parent's paginate_queryset has .only('id') applied
        - Count queries still work with the original queryset
        - The optimization is always applied (no feature flag)
        data_manager.api.Predictiondata_manager.api.Annotation
      paginate_querysetreturn_valueidr   N)r   onlyr   r   objectsfiltercountobjectr   r   sync_paginate_querysetr   assert_called_once_withassert_called_once	call_args)r   mock_querysetmock_id_only_querysetmock_predictionmock_annotationmock_parent_paginater'   s          r   (test_sync_paginate_queryset_uses_only_idzMTestTaskPaginationMemoryOptimization.test_sync_paginate_queryset_uses_only_id   s@    " )*?'01 	D_45 DQS''..;;AANQR''..;;AAN \\"68KZ\] 	DauOO::=$J[J[\ "&&>>tD );;= 4 > >I$Q<?.CCCC	DD	D 	D	D 	DD D	D 	Ds<   EA;E8A*D<#E+E<EEE	EEc                    t               }t               }||j                  _        ddd|j                  j                  j                  _        t        j                  t        dg       5 }| j                  j                  || j                         |j                  j                  d       |j                          |j                  }|d   d   |u sJ 	 ddd       y# 1 sw Y   yxY w)	a  Test paginate_totals_queryset applies .only('id') optimization.

        This test validates:
        - The optimized path (with fflag_fix_back_optic_1407_optimize_tasks_api_pagination_counts)
          also uses .only('id')
        - Aggregate queries work correctly
        r   r   )total_annotationstotal_predictionsr   r   r   r   N)r   r   r   values	aggregater   r#   r   r   paginate_totals_querysetr   r%   r&   r'   )r   r(   r)   r,   r'   s        r   *test_paginate_totals_queryset_uses_only_idzOTestTaskPaginationMemoryOptimization.test_paginate_totals_queryset_uses_only_id<   s     " )*?'!#!"D
))33@
 \\.0CRTU 		<YmOO44]DDUDUV 66t< !335,66IQ<?&;;;;		< 		< 		<s   *A*CC'c                 z   t               }t               }||j                  _        t        d      5 }t        d      5 }d|j                  j
                  j                  j                  _        d|j                  j
                  j                  j                  _        t        j                  t        dg       5  | j                  j                  || j                         |j                  j
                  j                          |j                  j
                  j                  d   }|d   |u sJ |j                  j
                  j                          |j                  j
                  j                  d   }|d   |u sJ 	 d	d	d	       d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y	xY w)
a=  Test that count queries use the original queryset (for correct subqueries).

        This test validates:
        - Prediction count query uses the original queryset, not the .only('id') version
        - Annotation count query uses the original queryset
        - This ensures subquery counts work correctly
        r   r   r   r   r   r      task_id__inN)r   r   r   r   r    r!   r"   r#   r   r   r$   r   r&   r'   )r   r(   r)   r*   r+   prediction_filter_kwargsannotation_filter_kwargss          r   (test_count_queries_use_original_querysetzMTestTaskPaginationMemoryOptimization.test_count_queries_use_original_querysetW   s    " )*?'01 	T_45 TQS''..;;AANQR''..;;AAN\\"68KZ\] 
TOO::=$J[J[\ $++22EEG/>/F/F/M/M/W/WXY/Z,3MBmSSS#++22EEG/>/F/F/M/M/W/WXY/Z,3MBmSSS
T	T	T 	T

T 
T	T T	T 	Ts<   F1A;F%8CF F%F1F"F%%F.	*F11F:N)__name__
__module____qualname____doc__r   r-   r4   r:    r   r   r	   r	      s    JD<<6Tr   r	   N)r>   unittest.mockr   r   data_manager.apir   django.testr   rest_framework.paginationr   r	   r?   r   r   <module>rD      s(   
 + +   :eT8 eTr   