
    P1i[                     6   d Z ddlZddlmZ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 dd	lmZ dd
lmZ ddlmZmZ ddlmZmZ ddlmZ  e	       Z G d de      Z G d de      Z G d de      Z G d de      Z  G d de      Z! G d de      Z"y)ah  
Comprehensive test suite for AdminAIAnalysis functionality.

This test suite covers:

1. **Model Tests** (AdminAIAnalysisModelTestCase):
   - Model creation and field validation
   - Default values and string representation
   - Provider choices and status updates
   - Model field constraints

2. **Permission Tests** (AdminAIAnalysisPermissionTestCase):
   - Permission-based access control for different user types
   - Superuser access (with/without explicit permission)
   - Staff user access (with/without permission)
   - Regular user access (with/without permission)
   - URL-level access control testing

3. **Admin Interface Tests** (AdminAIAnalysisAdminTestCase):
   - List display configuration
   - Search and filter functionality
   - Readonly fields configuration
   - Fieldsets organization
   - AJAX model selection endpoint
   - Context data for dynamic model selection
   - User assignment on model save

4. **Form Tests** (AdminAIAnalysisFormTestCase):
   - Form initialization for new and existing instances
   - Dynamic model choice preservation
   - CSS class assignment for JavaScript targeting
   - Form validation (valid and invalid data)
   - Required field validation

5. **LLM Inference Tests** (AdminLLMInferenceTestCase):
   - Successful inference with Groq provider
   - Successful inference with OpenAI provider
   - Error handling for API failures
   - Unsupported provider handling
   - Status updates during inference

6. **Integration Tests** (AIProviderConfigIntegrationTestCase):
   - Model availability retrieval for different providers
   - Provider validation
   - Model list structure validation

The test suite uses mocking to avoid actual LLM API calls and focuses on
testing the business logic, permission system, and admin interface functionality
without external dependencies.

Total: 32 tests covering all aspects of the AdminAIAnalysis feature.
    N)patchMock)TestCaseClient)get_user_model)
Permission)ContentType)reverse)	AdminSite)JsonResponse)AdminAIAnalysisAIProviderConfig)AdminAIAnalysisAdminAdminAIAnalysisAdminForm)run_admin_llm_inferencec                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	AdminAIAnalysisModelTestCasez3Test cases for AdminAIAnalysis model functionality.c                 T    t         j                  j                  dddd      | _        y )N
1234567890ztest@example.comtestpass123Tphoneemailpasswordis_staffUserobjectscreate_useruserselfs    A/home/cursorai/projects/iching/ai/tests/test_admin_ai_analysis.pysetUpz"AdminAIAnalysisModelTestCase.setUpJ   s)    LL,,$"	 - 
	    c                 0   t         j                  j                  dddd| j                        }| j	                  |j
                  d       | j	                  |j                  d       | j	                  |j                  d       | j	                  |j                  d       | j	                  |j                  d       | j	                  |j                  | j                         | j                  |j                         | j                  |j                         y)zTest basic model creation.Test AnalysisTest promptgroqllama-3.3-70b-versatiletitlepromptprovidermodel
created_bypendingN)r   r   creater    assertEqualr,   r-   r.   r/   statusr0   assertIsNotNone
created_at
updated_atr"   analysiss     r#   test_model_creationz0AdminAIAnalysisModelTestCase.test_model_creationR   s    "**11! +yy 2 
 	9-8**F3)BC)4,,dii8X001X001r%   c                     t         j                  j                  dddd| j                        }d}| j	                  t        |      |       y)zTest model __str__ method.r'   r(   r)   r*   r+   N)r   r   r2   r    r3   str)r"   r9   expecteds      r#    test_model_string_representationz=AdminAIAnalysisModelTestCase.test_model_string_representatione   sK    "**11! +yy 2 
 #X1r%   c                    t         j                  j                  dddd| j                        }| j	                  |j
                  d       | j	                  |j                  i        | j                  |j                         y)zTest model field defaults.r'   r(   r)   r*   r+   r1   N)	r   r   r2   r    r3   r4   metaassertIsNoneresponser8   s     r#   test_model_defaultsz0AdminAIAnalysisModelTestCase.test_model_defaultsq   sn    "**11! +yy 2 
 	)4+(++,r%   c                 f    dD ],  }t        dd|d| j                        }|j                          . y)z,Test that only valid providers are accepted.)r)   openaiTestz
test-modelr+   N)r   r    
full_clean)r"   r.   r9   s      r#   test_provider_choicesz2AdminAIAnalysisModelTestCase.test_provider_choices   s9     +H&!"99H ! +r%   c                 ,   t         j                  j                  dddd| j                        }d|_        d|_        |j                          |j                          | j                  |j                  d       | j                  |j
                  d       y)	zTest status field updates.r'   r(   r)   r*   r+   	completedzTest responseN)	r   r   r2   r    r4   rB   saverefresh_from_dbr3   r8   s     r#   test_status_updatesz0AdminAIAnalysisModelTestCase.test_status_updates   s    "**11! +yy 2 
 &+  "+6**O<r%   N)
__name__
__module____qualname____doc__r$   r:   r>   rC   rH   rM    r%   r#   r   r   G   s#    =
2&
2-"=r%   r   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)!AdminAIAnalysisPermissionTestCasez/Test cases for permission-based access control.c                    t         j                  j                  ddddd      | _        t         j                  j                  dddd      | _        t         j                  j                  d	d
dd      | _        t        j                  j                  t              }	 t        j                  j                  d|      | _        t               | _        t!        t        | j                        | _        t%               | _        y # t        j                  $ r* t        j                  j                  dd|      | _        Y zw xY w)Nadmin123admin@example.comr   Tr   r   r   r   is_superuserstaff123zstaff@example.comr   user123zuser@example.comFcan_send_admin_llm_analysis)codenamecontent_typezCan send admin LLM analysis)r]   namer^   )r   r   r   
admin_user
staff_userregular_userr	   get_for_modelr   r   get
permissionDoesNotExistr2   r   siter   admin_instancer   client)r"   r^   s     r#   r$   z'AdminAIAnalysisPermissionTestCase.setUp   s#   ,,22%" 3 
 ,,22%"	 3 
 !LL44$"	 5 
 #**88I
	(00446) 5 DO K	2?DIINh && 	(007762) 8 DO	s   &D :D?>D?c                    t               }| j                  |_        | j                  | j                  j                  |             | j                  | j                  j                  |             | j                  | j                  j                  |             | j                  | j                  j                  |             y)z@Test that superuser has access even without explicit permission.N)	r   r`   r    
assertTruerh   has_module_permissionhas_view_permissionhas_add_permissionhas_change_permissionr"   requests     r#   test_superuser_has_accessz;AdminAIAnalysisPermissionTestCase.test_superuser_has_access   s     &++AA'JK++??HI++>>wGH++AA'JKr%   c                    t               }| j                  |_        | j                  | j                  j                  |             | j                  | j                  j                  |             | j                  | j                  j                  |             | j                  | j                  j                  |             y)z6Test that staff user without permission has no access.N)	r   ra   r    assertFalserh   rl   rm   rn   ro   rp   s     r#   'test_staff_without_permission_no_accesszIAdminAIAnalysisPermissionTestCase.test_staff_without_permission_no_access   s    &,,BB7KL,,@@IJ,,??HI,,BB7KLr%   c                    | j                   j                  j                  | j                         t	               }| j                   |_        | j                  | j                  j                  |             | j                  | j                  j                  |             | j                  | j                  j                  |             | j                  | j                  j                  |             y)z0Test that staff user with permission has access.N)ra   user_permissionsaddre   r   r    rk   rh   rl   rm   rn   ro   rp   s     r#   %test_staff_with_permission_has_accesszGAdminAIAnalysisPermissionTestCase.test_staff_with_permission_has_access   s     	((,,T__=&++AA'JK++??HI++>>wGH++AA'JKr%   c                     t               }| j                  |_        | j                  | j                  j                  |             y)z8Test that regular user has no access without permission.N)r   rb   r    rt   rh   rl   rp   s     r#   test_regular_user_no_accessz=AdminAIAnalysisPermissionTestCase.test_regular_user_no_access   s9     &(( 	,,BB7KLr%   c                     | j                   j                  j                  | j                         t	               }| j                   |_        | j                  | j                  j                  |             y)z@Test that regular user with permission has access to the module.N)	rb   rw   rx   re   r   r    rk   rh   rl   rp   s     r#   ,test_regular_user_with_permission_has_accesszNAdminAIAnalysisPermissionTestCase.test_regular_user_with_permission_has_access   sU     	**..t?&(( 	++AA'JKr%   c                 
   | j                   j                  j                  | j                         | j                  j                  dd       | j                  j                  d      }| j                  |j                  d       y)z.Test admin URL access with proper permissions.rZ   r   r   r   /admin/ai/adminaianalysis/   N)	ra   rw   rx   re   ri   loginrd   r3   status_coder"   rB   s     r#   %test_admin_url_access_with_permissionzGAdminAIAnalysisPermissionTestCase.test_admin_url_access_with_permission  sb     	((,,T__=
]C ;;??#?@--s3r%   c                     | j                   j                  dd       | j                   j                  d      }| j                  |j                  d       y)z3Test admin URL access without permission is denied.rZ   r   r   r   i  N)ri   r   rd   r3   r   r   s     r#   (test_admin_url_access_without_permissionzJAdminAIAnalysisPermissionTestCase.test_admin_url_access_without_permission  sF     	
]C ;;??#?@--s3r%   N)rN   rO   rP   rQ   r$   rr   ru   ry   r{   r}   r   r   rR   r%   r#   rT   rT      s3    9*X	LMLM
L44r%   rT   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)AdminAIAnalysisAdminTestCasez*Test cases for the Django admin interface.c                 
   t         j                  j                  ddddd      | _        t	               | _        t        t        | j
                        | _        t               | _
        | j                  j                  dd       y )NrV   rW   r   TrX   r   )r   r   r   r    r   rg   r   r   rh   r   ri   r   r!   s    r#   r$   z"AdminAIAnalysisAdminTestCase.setUp  sj    LL,,%" - 
	 K	2?DIINh
]Cr%   c                 T    d}| j                  | j                  j                  |       y)z,Test that list display shows correct fields.)r,   r.   r/   r4   r0   r6   N)r3   rh   list_displayr"   expected_fieldss     r#   test_list_display_fieldsz5AdminAIAnalysisAdminTestCase.test_list_display_fields-  s#    ^,,99?Kr%   c                 T    d}| j                  | j                  j                  |       y)zTest search functionality.)r,   r-   rB   N)r3   rh   search_fieldsr   s     r#   test_search_fieldsz/AdminAIAnalysisAdminTestCase.test_search_fields2  s#    9,,::OLr%   c                 T    d}| j                  | j                  j                  |       y)zTest list filter functionality.)r.   r/   r4   r6   N)r3   rh   list_filterr   s     r#   test_list_filter_fieldsz4AdminAIAnalysisAdminTestCase.test_list_filter_fields7  s#    G,,88/Jr%   c                 T    d}| j                  | j                  j                  |       y)z#Test readonly fields configuration.)rB   r4   r0   r6   r7   N)r3   rh   readonly_fieldsr   s     r#   test_readonly_fieldsz1AdminAIAnalysisAdminTestCase.test_readonly_fields<  s#    Z,,<<oNr%   c                     | j                   j                  }| j                  t        |      d       |d   d   d   }| j                  |d       |d   d   d   }| j                  |d       y)zTest fieldsets configuration.   r      fieldsr,   r-   r.   r/   )rB   r4   r@   N)rh   	fieldsetsr3   len)r"   r   main_fieldsresults_fieldss       r#   test_fieldsets_configurationz9AdminAIAnalysisAdminTestCase.test_fieldsets_configurationA  sq    ''11	Y+  l1oh/&NO #1a2)GHr%   c                    t               }| j                  |_        | j                  j                  |d      }| j	                  |t
               t        j                  |j                        }| j                  |d          | j                  d|       | j	                  |d   t               |d   r-|d   d   }| j                  d|       | j                  d|       yy)zTest the AJAX get models view.r)   successmodelsr   idr_   N)r   r    rh   get_models_viewassertIsInstancer   jsonloadscontentrk   assertInlist)r"   rq   rB   response_datar/   s        r#   test_get_models_viewz1AdminAIAnalysisAdminTestCase.test_get_models_viewN  s    &yy &&66wGh5 

8#3#34i01h.mH5t< "!(+A.EMM$&MM&%( #r%   c                 .   t               }| j                  |_        | j                  j                  |d      }| j	                  |t
               t        j                  |j                        }| j                  |d          | j                  |d   g        y)z+Test get models view with invalid provider.invalid_providerr   r   N)r   r    rh   r   r   r   r   r   r   rk   r3   )r"   rq   rB   r   s       r#   %test_get_models_view_invalid_providerzBAdminAIAnalysisAdminTestCase.test_get_models_view_invalid_providerc  sw    &yy&&66w@RSh5

8#3#34i01x0"5r%   c                 V   t               }| j                  |_        t        dddd      }t               }t        d      5 }| j                  j                  |||d       | j                  |j                  | j                         |j                  |       ddd       y# 1 sw Y   yxY w)	z5Test that save_model sets created_by to current user.r'   r(   r)   r*   r   z ai.admin.run_admin_llm_inferenceFN)	r   r    r   r   rh   
save_modelr3   r0   assert_called_once_with)r"   rq   r9   formmock_inferences        r#   test_save_model_sets_created_byz<AdminAIAnalysisAdminTestCase.test_save_model_sets_created_byo  s    &yy"! +	
 v 56.**7HdEJX00$))<228< 766s    ABB(c                    i }i }t         j                  D ]  \  }}t        j                  |      ||<    t	        j
                  |      |d<   | j                  d|       t	        j                  |d         }| j                  d|       | j                  d|       | j                  |d   t               | j                  |d   t               y)z8Test that context data is properly added to admin views.provider_models_jsonr)   rE   N)
r   PROVIDER_CHOICESr   get_available_modelsr   dumpsr   r   r   r   )r"   extra_contextprovider_modelsprovider_codeprovider_nameprovider_datas         r#   test_context_data_in_viewsz7AdminAIAnalysisAdminTestCase.test_context_data_in_views  s      ,;,L,L(M=-=-R-RS`-aOM* -M 15

?0K,- 	,m<

=1G#HIfm,h.mF3T:mH5t<r%   N)rN   rO   rP   rQ   r$   r   r   r   r   r   r   r   r   r   rR   r%   r#   r   r     s=    4D L
M
K
O
I)*
6=,=r%   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)AdminAIAnalysisFormTestCasezTest cases for the admin form.c                 T    t         j                  j                  dddd      | _        y NrV   rW   r   Tr   r   r!   s    r#   r$   z!AdminAIAnalysisFormTestCase.setUp  )    LL,,%"	 - 
	r%   c                    t               }| j                  d|j                  d   j                  j                  d          | j                  d|j                  d   j                  j                  d          |j                  d   j                  j
                  }| j                  t        |      d       | j                  |d   d       y	)
z*Test form initialization for new instance.zprovider-selectr.   classzmodel-selectr/   r   r   ) z	---------N)r   r   r   widgetattrschoicesr3   r   )r"   r   model_choicess      r#   %test_form_initialization_new_instancezAAdminAIAnalysisFormTestCase.test_form_initialization_new_instance  s    ') 	'Z)@)G)G)M)Mg)VWndkk'&:&A&A&G&G&PQ G,33;;]+Q/q)+<=r%   c                     t         j                  j                  dddd| j                        }t	        |      }t        |j                  d   j                  j                        }| j                  d|       y)	z/Test form initialization for existing instance.r'   r(   r)   r*   r+   )instancer/   N)
r   r   r2   r    r   dictr   r   r   r   )r"   r9   r   r   s       r#   *test_form_initialization_existing_instancezFAdminAIAnalysisFormTestCase.test_form_initialization_existing_instance  sl    "**11! +yy 2 
 (: T[[188@@A/?r%   c                 l    ddddddd}t        |      }| j                  |j                                y	)
zTest form validation.r'   r(   r)   r*   z{}r1   )r,   r-   r.   r/   r@   r4   dataN)r   rk   is_validr"   	form_datar   s      r#   test_form_validationz0AdminAIAnalysisFormTestCase.test_form_validation  s;     %#.
	 (Y7(r%   c                     ddddd}t        |      }| j                  |j                                | j                  d|j                         y)	z2Test form validation with missing required fields.r   r(   r)   r*   r   r   r,   N)r   rt   r   r   errorsr   s      r#   ,test_form_validation_missing_required_fieldszHAdminAIAnalysisFormTestCase.test_form_validation_missing_required_fields  sI     #.	
	 (Y7)gt{{+r%   N)	rN   rO   rP   rQ   r$   r   r   r   r   rR   r%   r#   r   r     s    (
>@ ),r%   r   c                   p    e Zd ZdZd Z ed      d        Z ed      d        Z ed      d        Zd Z	y	)
AdminLLMInferenceTestCasez+Test cases for LLM inference functionality.c                 T    t         j                  j                  dddd      | _        y r   r   r!   s    r#   r$   zAdminLLMInferenceTestCase.setUp  r   r%   zai.utils.admin_llm.GroqServicec                    t               }d|j                  _        ||_        t        j                  j                  dddd| j                        }t        |       |j                          | j                  |j                  d       | j                  |j                  d       |j                  d       |j                  j                  d       y	)
z1Test successful LLM inference with Groq provider.zTest response from Groqr'   r(   r)   r*   r+   rJ   r/   Nr   get_completionreturn_valuer   r   r2   r    r   rL   r3   r4   rB   r   r"   mock_groq_servicemock_service_instancer9   s       r#   test_llm_inference_groq_successz9AdminLLMInferenceTestCase.test_llm_inference_groq_success  s     !%<U,,9)>&"**11! +yy 2 
 	 )  "+6**,EF 	118Q1R,,DD]Sr%   z ai.utils.admin_llm.OpenAIServicec                    t               }d|j                  _        ||_        t        j                  j                  dddd| j                        }t        |       |j                          | j                  |j                  d       | j                  |j                  d       |j                  d       |j                  j                  d       y	)
z3Test successful LLM inference with OpenAI provider.zTest response from OpenAIr'   r(   rE   zgpt-4or+   rJ   r   Nr   )r"   mock_openai_servicer   r9   s       r#   !test_llm_inference_openai_successz;AdminLLMInferenceTestCase.test_llm_inference_openai_success  s     !%<W,,9+@("**11! yy 2 
 	 )  "+6**,GH 	33(3C,,DD]Sr%   c                 \   t               }t        d      |j                  _        ||_        t
        j                  j                  dddd| j                        }t        |       |j                          | j                  |j                  d       | j                  |j                  d       y)	z"Test LLM inference error handling.z	API Errorr'   r(   r)   r*   r+   errorN)r   	Exceptionr   side_effectr   r   r   r2   r    r   rL   r3   r4   rB   r   s       r#   !test_llm_inference_error_handlingz;AdminLLMInferenceTestCase.test_llm_inference_error_handling  s     !%;D[;Q,,8)>&"**11! +yy 2 
 	 )  "'2**K8r%   c                    t         j                  j                  dddd| j                        }t	        |       |j                          | j                  |j                  d       | j                  d|j                         y)	z-Test LLM inference with unsupported provider.r'   r(   unsupportedz
some-modelr+   r   zUnsupported providerN)
r   r   r2   r    r   rL   r3   r4   r   rB   r8   s     r#   'test_llm_inference_unsupported_providerzAAdminLLMInferenceTestCase.test_llm_inference_unsupported_provider3  so    "**11! "yy 2 
 	 )  "'2,h.?.?@r%   N)
rN   rO   rP   rQ   r$   r   r   r   r   r   rR   r%   r#   r   r     sb    5
 +,T -T2 -.T /T2 +,9 -9*Ar%   r   c                   "    e Zd ZdZd Zd Zd Zy)#AIProviderConfigIntegrationTestCasez-Test integration with AIProviderConfig model.c                 h   t        j                  d      }| j                  |t               | j	                  t        |      d       |D ]g  \  }}| j                  |t               | j                  |t               | j	                  t        |      d       | j	                  t        |      d       i y)z0Test getting available models for Groq provider.r)   r   Nr   r   r   r   assertGreaterr   r<   r"   r   
model_code
model_names       r#   test_get_available_models_groqzBAIProviderConfigIntegrationTestCase.test_get_available_models_groqG  s    !66v>fd+3v;* '-"J
!!*c2!!*c2s:2s:2	 '-r%   c                 h   t        j                  d      }| j                  |t               | j	                  t        |      d       |D ]g  \  }}| j                  |t               | j                  |t               | j	                  t        |      d       | j	                  t        |      d       i y)z2Test getting available models for OpenAI provider.rE   r   Nr   r   s       r#    test_get_available_models_openaizDAIProviderConfigIntegrationTestCase.test_get_available_models_openaiT  s    !66x@fd+3v;* '-"J
!!*c2!!*c2s:2s:2	 '-r%   c                 R    t        j                  d      }| j                  |g        y)z<Test getting models for invalid provider returns empty list.r   N)r   r   r3   )r"   r   s     r#   *test_get_available_models_invalid_providerzNAIProviderConfigIntegrationTestCase.test_get_available_models_invalid_providera  s#    !667IJ$r%   N)rN   rO   rP   rQ   r   r   r  rR   r%   r#   r   r   D  s    733%r%   r   )#rQ   r   unittest.mockr   r   django.testr   r   django.contrib.authr   django.contrib.auth.modelsr   "django.contrib.contenttypes.modelsr	   django.urlsr
   django.contrib.admin.sitesr   django.httpr   	ai.modelsr   r   ai.adminr   r   ai.utils.admin_llmr   r   r   rT   r   r   r   r   rR   r%   r#   <module>r     s   3j  % ( . 1 :  0 $ 7 C 6V=8 V=rw4 w4t}=8 }=@A,( A,HcA cAL %(  %r%   