iatoolkit 0.8.1__py3-none-any.whl → 0.63.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of iatoolkit might be problematic. Click here for more details.

Files changed (159) hide show
  1. iatoolkit/__init__.py +8 -34
  2. iatoolkit/base_company.py +14 -3
  3. iatoolkit/common/routes.py +83 -52
  4. iatoolkit/common/session_manager.py +0 -1
  5. iatoolkit/common/util.py +0 -27
  6. iatoolkit/iatoolkit.py +61 -46
  7. iatoolkit/infra/llm_client.py +7 -8
  8. iatoolkit/infra/openai_adapter.py +1 -1
  9. iatoolkit/infra/redis_session_manager.py +48 -2
  10. iatoolkit/repositories/database_manager.py +17 -2
  11. iatoolkit/repositories/models.py +31 -6
  12. iatoolkit/repositories/profile_repo.py +7 -2
  13. iatoolkit/services/auth_service.py +188 -0
  14. iatoolkit/services/branding_service.py +147 -0
  15. iatoolkit/services/dispatcher_service.py +10 -40
  16. iatoolkit/services/excel_service.py +15 -15
  17. iatoolkit/services/history_service.py +3 -12
  18. iatoolkit/services/jwt_service.py +15 -24
  19. iatoolkit/services/onboarding_service.py +43 -0
  20. iatoolkit/services/profile_service.py +97 -44
  21. iatoolkit/services/query_service.py +124 -81
  22. iatoolkit/services/tasks_service.py +1 -1
  23. iatoolkit/services/user_feedback_service.py +67 -31
  24. iatoolkit/services/user_session_context_service.py +112 -54
  25. iatoolkit/static/images/fernando.jpeg +0 -0
  26. iatoolkit/static/js/{chat_feedback.js → chat_feedback_button.js} +6 -11
  27. iatoolkit/static/js/chat_history_button.js +126 -0
  28. iatoolkit/static/js/chat_logout_button.js +36 -0
  29. iatoolkit/static/js/chat_main.js +130 -220
  30. iatoolkit/static/js/chat_onboarding_button.js +97 -0
  31. iatoolkit/static/js/chat_prompt_manager.js +94 -0
  32. iatoolkit/static/js/chat_reload_button.js +52 -0
  33. iatoolkit/static/styles/chat_iatoolkit.css +329 -507
  34. iatoolkit/static/styles/chat_modal.css +95 -56
  35. iatoolkit/static/styles/landing_page.css +182 -0
  36. iatoolkit/static/styles/onboarding.css +169 -0
  37. iatoolkit/system_prompts/query_main.prompt +3 -12
  38. iatoolkit/templates/_company_header.html +20 -0
  39. iatoolkit/templates/_login_widget.html +40 -0
  40. iatoolkit/templates/base.html +8 -3
  41. iatoolkit/templates/change_password.html +54 -37
  42. iatoolkit/templates/chat.html +149 -66
  43. iatoolkit/templates/chat_modals.html +47 -18
  44. iatoolkit/templates/error.html +41 -8
  45. iatoolkit/templates/forgot_password.html +37 -24
  46. iatoolkit/templates/index.html +140 -0
  47. iatoolkit/templates/login_simulation.html +34 -0
  48. iatoolkit/templates/onboarding_shell.html +105 -0
  49. iatoolkit/templates/signup.html +64 -66
  50. iatoolkit/views/base_login_view.py +81 -0
  51. iatoolkit/views/change_password_view.py +23 -12
  52. iatoolkit/views/external_login_view.py +61 -28
  53. iatoolkit/views/{file_store_view.py → file_store_api_view.py} +9 -2
  54. iatoolkit/views/forgot_password_view.py +23 -13
  55. iatoolkit/views/history_api_view.py +52 -0
  56. iatoolkit/views/home_view.py +58 -25
  57. iatoolkit/views/index_view.py +14 -0
  58. iatoolkit/views/init_context_api_view.py +68 -0
  59. iatoolkit/views/llmquery_api_view.py +45 -0
  60. iatoolkit/views/login_simulation_view.py +81 -0
  61. iatoolkit/views/login_view.py +118 -34
  62. iatoolkit/views/logout_api_view.py +45 -0
  63. iatoolkit/views/{prompt_view.py → prompt_api_view.py} +7 -7
  64. iatoolkit/views/signup_view.py +38 -29
  65. iatoolkit/views/{tasks_view.py → tasks_api_view.py} +10 -36
  66. iatoolkit/views/tasks_review_api_view.py +55 -0
  67. iatoolkit/views/{user_feedback_view.py → user_feedback_api_view.py} +16 -31
  68. iatoolkit/views/verify_user_view.py +13 -8
  69. {iatoolkit-0.8.1.dist-info → iatoolkit-0.63.4.dist-info}/METADATA +2 -2
  70. iatoolkit-0.63.4.dist-info/RECORD +113 -0
  71. {iatoolkit-0.8.1.dist-info → iatoolkit-0.63.4.dist-info}/top_level.txt +0 -1
  72. iatoolkit/common/auth.py +0 -200
  73. iatoolkit/static/images/arrow_up.png +0 -0
  74. iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
  75. iatoolkit/static/images/logo_clinica.png +0 -0
  76. iatoolkit/static/images/logo_iatoolkit.png +0 -0
  77. iatoolkit/static/images/logo_maxxa.png +0 -0
  78. iatoolkit/static/images/logo_notaria.png +0 -0
  79. iatoolkit/static/images/logo_tarjeta.png +0 -0
  80. iatoolkit/static/images/logo_umayor.png +0 -0
  81. iatoolkit/static/images/upload.png +0 -0
  82. iatoolkit/static/js/chat_history.js +0 -117
  83. iatoolkit/templates/home.html +0 -201
  84. iatoolkit/templates/login.html +0 -43
  85. iatoolkit/views/chat_token_request_view.py +0 -98
  86. iatoolkit/views/chat_view.py +0 -51
  87. iatoolkit/views/download_file_view.py +0 -58
  88. iatoolkit/views/external_chat_login_view.py +0 -88
  89. iatoolkit/views/history_view.py +0 -57
  90. iatoolkit/views/llmquery_view.py +0 -65
  91. iatoolkit/views/tasks_review_view.py +0 -83
  92. iatoolkit-0.8.1.dist-info/RECORD +0 -175
  93. tests/__init__.py +0 -5
  94. tests/common/__init__.py +0 -0
  95. tests/common/test_auth.py +0 -279
  96. tests/common/test_routes.py +0 -42
  97. tests/common/test_session_manager.py +0 -59
  98. tests/common/test_util.py +0 -444
  99. tests/companies/__init__.py +0 -5
  100. tests/conftest.py +0 -36
  101. tests/infra/__init__.py +0 -5
  102. tests/infra/connectors/__init__.py +0 -5
  103. tests/infra/connectors/test_google_drive_connector.py +0 -107
  104. tests/infra/connectors/test_local_file_connector.py +0 -85
  105. tests/infra/connectors/test_s3_connector.py +0 -95
  106. tests/infra/test_call_service.py +0 -92
  107. tests/infra/test_database_manager.py +0 -59
  108. tests/infra/test_gemini_adapter.py +0 -137
  109. tests/infra/test_google_chat_app.py +0 -68
  110. tests/infra/test_llm_client.py +0 -165
  111. tests/infra/test_llm_proxy.py +0 -122
  112. tests/infra/test_mail_app.py +0 -94
  113. tests/infra/test_openai_adapter.py +0 -105
  114. tests/infra/test_redis_session_manager_service.py +0 -117
  115. tests/repositories/__init__.py +0 -5
  116. tests/repositories/test_database_manager.py +0 -87
  117. tests/repositories/test_document_repo.py +0 -76
  118. tests/repositories/test_llm_query_repo.py +0 -340
  119. tests/repositories/test_models.py +0 -38
  120. tests/repositories/test_profile_repo.py +0 -142
  121. tests/repositories/test_tasks_repo.py +0 -76
  122. tests/repositories/test_vs_repo.py +0 -107
  123. tests/services/__init__.py +0 -5
  124. tests/services/test_dispatcher_service.py +0 -274
  125. tests/services/test_document_service.py +0 -181
  126. tests/services/test_excel_service.py +0 -208
  127. tests/services/test_file_processor_service.py +0 -121
  128. tests/services/test_history_service.py +0 -164
  129. tests/services/test_jwt_service.py +0 -255
  130. tests/services/test_load_documents_service.py +0 -112
  131. tests/services/test_mail_service.py +0 -70
  132. tests/services/test_profile_service.py +0 -379
  133. tests/services/test_prompt_manager_service.py +0 -190
  134. tests/services/test_query_service.py +0 -243
  135. tests/services/test_search_service.py +0 -39
  136. tests/services/test_sql_service.py +0 -160
  137. tests/services/test_tasks_service.py +0 -252
  138. tests/services/test_user_feedback_service.py +0 -389
  139. tests/services/test_user_session_context_service.py +0 -132
  140. tests/views/__init__.py +0 -5
  141. tests/views/test_change_password_view.py +0 -191
  142. tests/views/test_chat_token_request_view.py +0 -188
  143. tests/views/test_chat_view.py +0 -98
  144. tests/views/test_download_file_view.py +0 -149
  145. tests/views/test_external_chat_login_view.py +0 -120
  146. tests/views/test_external_login_view.py +0 -102
  147. tests/views/test_file_store_view.py +0 -128
  148. tests/views/test_forgot_password_view.py +0 -142
  149. tests/views/test_history_view.py +0 -336
  150. tests/views/test_home_view.py +0 -61
  151. tests/views/test_llm_query_view.py +0 -154
  152. tests/views/test_login_view.py +0 -114
  153. tests/views/test_prompt_view.py +0 -111
  154. tests/views/test_signup_view.py +0 -140
  155. tests/views/test_tasks_review_view.py +0 -104
  156. tests/views/test_tasks_view.py +0 -130
  157. tests/views/test_user_feedback_view.py +0 -214
  158. tests/views/test_verify_user_view.py +0 -110
  159. {iatoolkit-0.8.1.dist-info → iatoolkit-0.63.4.dist-info}/WHEEL +0 -0
@@ -1,175 +0,0 @@
1
- iatoolkit/__init__.py,sha256=yi7Uw68KajDWUUo-v4xV31Nt7hjr_-2gCXbkhdiDl44,1887
2
- iatoolkit/base_company.py,sha256=gM3X7xedNaVLodOObvjUN9eJKPO5-HmSLaBFa9jowCk,4277
3
- iatoolkit/cli_commands.py,sha256=G5L9xQXZ0lVFXQWBaE_KEZHyfuiT6PL1nTQRoSdnBzc,2302
4
- iatoolkit/company_registry.py,sha256=tduqt3oV8iDX_IB1eA7KIgvIxE4edTcy-3qZIXh3Lzw,2549
5
- iatoolkit/iatoolkit.py,sha256=ttGG_xeifaAqYfcegYi30YPYKGrXeIIut9lLp2HV138,16820
6
- iatoolkit/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- iatoolkit/common/auth.py,sha256=8NH6MQXfddLQd1GxrO2op3IYrrP4SMQKoKzj1o1jZmc,8486
8
- iatoolkit/common/exceptions.py,sha256=EXx40n5htp7UiOM6P1xfJ9U6NMcADqm62dlFaKz7ICU,1154
9
- iatoolkit/common/routes.py,sha256=8_wvrFiB5w5Sq-5gZfIDz9JVPROd9JED5oxkX1N87gY,4923
10
- iatoolkit/common/session_manager.py,sha256=7D_RuJs60w-1zDr3fOGEz9JW7IZlSXuUHgUT87CzaUo,472
11
- iatoolkit/common/util.py,sha256=08js3KLJTXICOd5sgwDp2u_kDaZO_0xG4BIuzWZnLo8,15535
12
- iatoolkit/infra/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
13
- iatoolkit/infra/call_service.py,sha256=iRk9VxbXaAwlLIl8fUzGDWIAdzwfsbs1MtP84YeENxg,4929
14
- iatoolkit/infra/gemini_adapter.py,sha256=kXV-t5i9GmWBafUPX2kAyiqvcT7GPoxHylcCUWG_c_U,15051
15
- iatoolkit/infra/google_chat_app.py,sha256=_uKWxeacHH6C5a4FVx0YZjBn1tL-x_MIQV9gqgWGAjo,1937
16
- iatoolkit/infra/llm_client.py,sha256=3w2BUQmnyq9Tbc9_CI2JjxZQ7pGVlMF_GmUdqBa9O7Y,18618
17
- iatoolkit/infra/llm_proxy.py,sha256=cHyNxUpVE4UDoWUfvSGfGCrIUFPTrpWZOixELQTsGFY,5744
18
- iatoolkit/infra/llm_response.py,sha256=YUUQPBHzmP3Ce6-t0kKMRIpowvh7de1odSoefEByIvI,904
19
- iatoolkit/infra/mail_app.py,sha256=PLGZdEs7LQ_9bmMRRxz0iqQdNa4xToAFyf9tg75wK8U,6103
20
- iatoolkit/infra/openai_adapter.py,sha256=Z1JSi3Tw2mXQ7JAh6yR79Ri_9yZJcJpcZLOLL3Mfda8,3530
21
- iatoolkit/infra/redis_session_manager.py,sha256=Dkwii8fns0_Vd9hm9GmotmrKtSCxVps868U5sqj7FAE,2278
22
- iatoolkit/infra/connectors/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
23
- iatoolkit/infra/connectors/file_connector.py,sha256=HOjRTFd-WfDOcFyvHncAhnGNZuFgChIwC-P6osPo9ZM,352
24
- iatoolkit/infra/connectors/file_connector_factory.py,sha256=3qvyfH4ZHKuiMxJFkawOxhW2-TGKKtsBYHgoPpZMuKU,2118
25
- iatoolkit/infra/connectors/google_cloud_storage_connector.py,sha256=IXpL3HTo7Ft4EQsYiQq5wXRRQK854jzOEB7ZdWjLa4U,2050
26
- iatoolkit/infra/connectors/google_drive_connector.py,sha256=WR1AlO5-Bl3W89opdja0kKgHTJzVOjTsy3H4SlIvwVg,2537
27
- iatoolkit/infra/connectors/local_file_connector.py,sha256=hrzIgpMJOTuwTqzlQeTIU_50ZbZ6yl8lcWPv6hMnoqI,1739
28
- iatoolkit/infra/connectors/s3_connector.py,sha256=Nj4_YaLobjfcnbZewJf21_K2EXohgcc3mJll1Pzn4zg,1123
29
- iatoolkit/repositories/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
30
- iatoolkit/repositories/database_manager.py,sha256=UaU7k3s7IRuXhCHTy9GoCeP9K1ad0LBdj_n1a_QjGS0,3108
31
- iatoolkit/repositories/document_repo.py,sha256=Y7bF1kZB1HWJsAGjWdF7P2aVYeTYNufq9ngQXp7mDkY,1124
32
- iatoolkit/repositories/llm_query_repo.py,sha256=YT_t7cYGQk8rwzH_17-28aTzO-e2jUfa2rvXy8tugvA,3612
33
- iatoolkit/repositories/models.py,sha256=RJH0dtq2VIDJFaFDufV05NUnNW4WtNpdTjhONtfLyCw,13179
34
- iatoolkit/repositories/profile_repo.py,sha256=ZULbh7ZOI9BFVi7HEfXtx3SaStgFnsCBVM_zuli_F8I,4062
35
- iatoolkit/repositories/tasks_repo.py,sha256=icVO_r2oPagGnnBhwVFzznnvEEU2EAx-2dlWuWvoDC4,1745
36
- iatoolkit/repositories/vs_repo.py,sha256=UkpmQQiocgM5IwRBmmWhw3HHzHP6zK1nN3J3TcQgjhc,5300
37
- iatoolkit/services/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
38
- iatoolkit/services/benchmark_service.py,sha256=CdbFYyS3FHFhNzWQEa9ZNjUlmON10DT1nKNbZQ1EUi8,5880
39
- iatoolkit/services/dispatcher_service.py,sha256=ykR1ye6McyCCuaBgwH6r3-PqcLAr4v4ApkPazMSBzbs,14040
40
- iatoolkit/services/document_service.py,sha256=nMXrNtbHQuc9pSaten0LvKY0kT8_WngBDmZJUP3jNPw,5936
41
- iatoolkit/services/excel_service.py,sha256=CJGhu7cQl9J6y_ZWSJ-M63Xm-RXR9Zs66oOR2NJErZQ,3868
42
- iatoolkit/services/file_processor_service.py,sha256=B1sUUhZNFf-rT4_1wrD38GKNoBFMp2g0dYrXYMCWe2E,4122
43
- iatoolkit/services/history_service.py,sha256=JwW958tYTrcdWSP5TRoDgDtBdGCvWIG4fnmHsrXLQ-8,1617
44
- iatoolkit/services/jwt_service.py,sha256=YoZ9h7_o9xBko-arNQv4MbcwnxoSWVNj4VbZmMo_QGY,3908
45
- iatoolkit/services/load_documents_service.py,sha256=ZpB0BZ3qX1fGJGBtZtMLbFdWWx0hkPoeCS3OqJKwCTs,7291
46
- iatoolkit/services/mail_service.py,sha256=2h-fcF3swZDya_o7IpgXkmuj3iEVHVCiHi7oVxU99sQ,2182
47
- iatoolkit/services/profile_service.py,sha256=azaCQtRJwQayg-3NV6k0lX97SFiF12emhz60S4CWv-M,17621
48
- iatoolkit/services/prompt_manager_service.py,sha256=U-XmSpkeXvv1KRN4dytdMxSYBMRSB7y-UHcb18mk0nA,8342
49
- iatoolkit/services/query_service.py,sha256=CI_LUBdqolvsuh7TjY23oaQcc8s6rmmr4LqnjE81ZJc,15394
50
- iatoolkit/services/search_service.py,sha256=i1xGWu7ORKIIDH0aAQBkF86dVVbLQ0Yrooz5TiZ6aGo,1823
51
- iatoolkit/services/sql_service.py,sha256=MIslAtpJWnTMgSD74nnqTvQj27p-lHiyRXc6OiA2C_c,2172
52
- iatoolkit/services/tasks_service.py,sha256=g0rBku8JSRuludFKJFNfKARJoKdX9JXISKNVe7wtH5A,6850
53
- iatoolkit/services/user_feedback_service.py,sha256=KW3VMgsH_ZNlBZIHr8eF49oO7jr75lPpr_1wWTEQYsc,2472
54
- iatoolkit/services/user_session_context_service.py,sha256=j8mKgmSyma6k_1FyXOXwpnYi9CrdEBCpPJA1eLHYZsg,3807
55
- iatoolkit/static/images/arrow_up.png,sha256=vPcWMebWVOOt13x5U7pzsyukysoiXO0siSyErUMleHw,2781
56
- iatoolkit/static/images/diagrama_iatoolkit.jpg,sha256=GhauwUVqWjt9dWtsW53Uon_mo61j73brmC4ogQc6tkY,93527
57
- iatoolkit/static/images/logo_clinica.png,sha256=vLX6X7O9RPUHYTQHvO_Fx28sI4JulpRZsRpkuJ9XIu0,56806
58
- iatoolkit/static/images/logo_iatoolkit.png,sha256=7XSxLy8v_mGxQMM8EA0gund-MmnQoIy1RV6DkJ-eukI,185089
59
- iatoolkit/static/images/logo_maxxa.png,sha256=X4JtTu6ooe2RUHRo1stxGGquXlkiEWcTUxH5vbFdMv0,10592
60
- iatoolkit/static/images/logo_notaria.png,sha256=FLDK1mHydFpzudKLKQSqHdSqq6vbqs77a_bO0PI_yHE,105105
61
- iatoolkit/static/images/logo_tarjeta.png,sha256=HQe2lp_jHFWq5hnx3SCBEcqW5IFfvSCktv9oyN--5cQ,1700
62
- iatoolkit/static/images/logo_umayor.png,sha256=FHr1wvI8uDn1YRbRcLSRLBOc0mYusHx9Um6ZzVZUbOQ,19199
63
- iatoolkit/static/images/upload.png,sha256=zh5FiINURpaWZQF86bF_gALBX4W1c4aLp5wPQO9xGXI,296
64
- iatoolkit/static/js/chat_feedback.js,sha256=_izl49hFEUZYREcJoaPukpTs0YjDgJYUu-QfPt5Ll2s,4398
65
- iatoolkit/static/js/chat_filepond.js,sha256=mzXafm7a506EpM37KATTK3zvAswO1E0KSUY1vKbwuRc,3163
66
- iatoolkit/static/js/chat_history.js,sha256=_bmwmMl9DL37FWJgoSS74j3LSqckD93C6fktB9-PxZk,3901
67
- iatoolkit/static/js/chat_main.js,sha256=zVDERp3_WZBTeP3N-gCf0IVTWbKToUB6L_lUaEi56A8,15149
68
- iatoolkit/static/styles/chat_iatoolkit.css,sha256=ZPQAgLT0HIeXjZC_EY8xACmVdjEp7spdPKFsTTIB-k0,20283
69
- iatoolkit/static/styles/chat_info.css,sha256=17DbgoNYE21VYWfb5L9-QLCpD2R1idK4imKRLwXtJLY,1058
70
- iatoolkit/static/styles/chat_modal.css,sha256=67qwltu-QS-sU0d_fSeTIiXwcNjfAnQQtmsgStx-ezk,3047
71
- iatoolkit/static/styles/llm_output.css,sha256=AlxgRSOleeCk2dLAqFWVaQ-jwZiJjcpC5rHuUv3T6VU,2312
72
- iatoolkit/system_prompts/format_styles.prompt,sha256=MSMe1qvR3cF_0IbFshn8R0z6Wx6VCHQq1p37rpu5wwk,3576
73
- iatoolkit/system_prompts/query_main.prompt,sha256=w_9ybgWgiQH4V_RbAXqsvz0M7oOuiyhxcwf-D0CgfA4,3017
74
- iatoolkit/system_prompts/sql_rules.prompt,sha256=y4nURVnb9AyFwt-lrbMNBHHtZlhk6kC9grYoOhRnrJo,59174
75
- iatoolkit/templates/about.html,sha256=ciC08grUVz5qLzdzDDqDX31xirg5PrJIRYabWpV9oA8,294
76
- iatoolkit/templates/base.html,sha256=LXXB8oPrcBFkf2pLfOSyAaSh66kHbs4SEujpFL3h9Nw,2163
77
- iatoolkit/templates/change_password.html,sha256=DFfQSFcZ2YJZNFis2IXfzEKStxTf4i9f4eQ_6GiyNs8,2342
78
- iatoolkit/templates/chat.html,sha256=YZKHn0VINtAFoyAISgahMD29iNO_oHON2N5EZkoCkE4,8219
79
- iatoolkit/templates/chat_modals.html,sha256=9OtJHRMeBup8zojPnUqSl7Fd5StPdvOZMs2MiJPqVFY,5704
80
- iatoolkit/templates/error.html,sha256=BNF-7z8AYL5vF4ZMUFMrOBt8c85kCFrm9qSHn9EiHWg,540
81
- iatoolkit/templates/forgot_password.html,sha256=1lUbKg9CKnQdnySplceY_pibwYne1-mOlM38fqI1kW8,1563
82
- iatoolkit/templates/header.html,sha256=179agI7rnYwP_rvJNXIiVde5E8Ec5649_XKq6eew2Hk,1263
83
- iatoolkit/templates/home.html,sha256=h6qZ6d5tPYAGeHsVr-o6NFG3YMs1QeDVCxFlnPneFEA,8345
84
- iatoolkit/templates/login.html,sha256=r4hy7MsQkfDqi6pBRNkkRiFr3GPSoHCT89R5lQLUWZc,1991
85
- iatoolkit/templates/signup.html,sha256=J8wOjUhUe_KozyThDTWHjXpSJ1ubR2IDVobThtkSRuo,3819
86
- iatoolkit/templates/test.html,sha256=rwNtxC83tbCl5COZFXYvmRBxxmgFJtPNuVBd_nq9KWY,133
87
- iatoolkit/views/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
88
- iatoolkit/views/change_password_view.py,sha256=rSebwecI1zwBgR2yvAhcfMwWpGDa4QbVAIllgtSOo9k,3940
89
- iatoolkit/views/chat_token_request_view.py,sha256=wf32_A2Sq8NHYWshCwL10Tovd1znLoD0jQjzutR3sVE,4408
90
- iatoolkit/views/chat_view.py,sha256=rnljdVHfe2E4E57ku6eblVgwT6SrLi1v-yqXGri68Ks,2078
91
- iatoolkit/views/download_file_view.py,sha256=1gZ0ipqeCn39sTrJFo1-tlewlcSF7s_YNTvE4qd0HOw,2010
92
- iatoolkit/views/external_chat_login_view.py,sha256=uh8DQRfZpZOXYr9qoxtwSwtL3PNdIJh-R5OjGgLqcoY,3782
93
- iatoolkit/views/external_login_view.py,sha256=EHxN2omqTDkWyMp0FVCNDFt-JJ2hpg8LvprKanGR1gY,1355
94
- iatoolkit/views/file_store_view.py,sha256=hUm5wX4E5oqJJEPEAObEj-nPiRp5EJIICULSfAWmHCs,1933
95
- iatoolkit/views/forgot_password_view.py,sha256=Rk8Qbe9Fz7Wlgje1rt29I15gFM-a089EBi2at4FT7kA,2715
96
- iatoolkit/views/history_view.py,sha256=8sqc9i8hN5bbRs3mSjurqKEZaXKANTQqATfwVAS4qSM,2064
97
- iatoolkit/views/home_view.py,sha256=TihO2flkelJa9j6a0FKCMVhD-2X7BhemonB7LTne4x8,1248
98
- iatoolkit/views/llmquery_view.py,sha256=rv2i3oeXlNc3Sv7Qu3DZGf37r-bMSa4N25FzG7_kPAI,2432
99
- iatoolkit/views/login_view.py,sha256=MI87rGB1QpxEVxWy-tR2q7s9ms9pcFLIW8ZmNQh1EFE,2332
100
- iatoolkit/views/prompt_view.py,sha256=l8KHlLmkSgSLK43VbhwKED7mCN9YyfeHHh4zvx0pT0E,1257
101
- iatoolkit/views/signup_view.py,sha256=NTx_2w8F6Np88FKEpDvBvJXU-bISKpDMdhhT4XFAVfk,3805
102
- iatoolkit/views/tasks_review_view.py,sha256=keLsLCyOTTlcoIapnB_lbuSvLwrPVZVpBiFC_7ChbLg,3388
103
- iatoolkit/views/tasks_view.py,sha256=a3anTXrJTTvbQuc6PSpOzidLKQFL4hWa7PI2Cppcz8w,4110
104
- iatoolkit/views/user_feedback_view.py,sha256=G37zmP8P4LvZrSymNJ5iFXhLZg1A3BEwRfTpH1Iam5w,2652
105
- iatoolkit/views/verify_user_view.py,sha256=a3q4wHJ8mKAEmgbNTOcnX4rMikROjOR3mHvCr30qGGA,2351
106
- tests/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
107
- tests/conftest.py,sha256=S000Ry-rWczEDsndTtOvsj2zf2EYgjHi78oVn60hoOU,1094
108
- tests/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
- tests/common/test_auth.py,sha256=WViWPG3E8OldgZyPbl-lp5rosjgPQb9MlADGLr1rq4k,14338
110
- tests/common/test_routes.py,sha256=_Fz8mYqxp8YZ39CSng0CQOIRs9fOfgC42iU9XiHLMzU,1560
111
- tests/common/test_session_manager.py,sha256=8FLa8Z7ueLYNnJeJyTgCm8pp1DY6QvC0b0ZxZC2vpKc,2388
112
- tests/common/test_util.py,sha256=SMh0pSIv8K-bCeMZeYBbCD70o6MpOUXHQH6kZFLLN5c,20653
113
- tests/companies/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
114
- tests/infra/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
115
- tests/infra/test_call_service.py,sha256=p5kFqXFojSmHucLTyika2u3wvpQwJRCrAlVOPeohoVE,3747
116
- tests/infra/test_database_manager.py,sha256=SMU_pcCsW89b6GyykAU2LEO8UaHL9gO5rdeWGFP3A6g,2503
117
- tests/infra/test_gemini_adapter.py,sha256=gMjSgxh854sC08vYQpH6QSIX9w921U3g_Jrt_HU1i1Y,6292
118
- tests/infra/test_google_chat_app.py,sha256=D1iUaGy8Z-PHufJuQ607lGEUOFueedoziXR8J9b7qmM,2363
119
- tests/infra/test_llm_client.py,sha256=i5uRPy3k2csoNOg16dlVAaZq93MDTk5OxLgRPrsyDow,7619
120
- tests/infra/test_llm_proxy.py,sha256=Y9F8ozVsnPLOiIt_Minr_VvANEz0x0JIPvFaWJBCLgk,5753
121
- tests/infra/test_mail_app.py,sha256=6Mhj3HbnQ_sVaQc7wgTpIEFb2GAzc4kkFNWgPWBCmp0,3727
122
- tests/infra/test_openai_adapter.py,sha256=4CLLIOqQLaC_zpc3clyoA9fiMu5uJmfDoPqs7hEw4Qo,4319
123
- tests/infra/test_redis_session_manager_service.py,sha256=NbrUVxmEmWIZc9TtnFd1IiWwm1N0Ih0y7chP7z5Mx34,4914
124
- tests/infra/connectors/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
125
- tests/infra/connectors/test_google_drive_connector.py,sha256=UxbR64xiDpFyeE18--BHiKgvwEuaWt9b4Cf6bL6LreM,4434
126
- tests/infra/connectors/test_local_file_connector.py,sha256=-1wpjXt2DOn_NbSUerdGFd-g-NI3rWS5vDoL3PFqxGA,3459
127
- tests/infra/connectors/test_s3_connector.py,sha256=2hsJvKPyTWQj6kkNjtpRwsLNdvW3O5N5JlhzUM67x5Q,3512
128
- tests/repositories/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
129
- tests/repositories/test_database_manager.py,sha256=C6pqzxPCtk0DcZE7VNaFCT5ahONO7mWFKDo1bxb-9sU,3990
130
- tests/repositories/test_document_repo.py,sha256=sqNL5yVM_8phPaxcYR3FupuTWN5RNG8yLfeDxR07uIM,2543
131
- tests/repositories/test_llm_query_repo.py,sha256=Vdu85MI_L7Nh5ksNz9X3d4hORp9hXaXPwH1AUbuN5YE,13228
132
- tests/repositories/test_models.py,sha256=CJbz3U89BgPKmP61pwGdwDW8vHvPROKwYfqcg4lx-_Q,1627
133
- tests/repositories/test_profile_repo.py,sha256=Ex9R5JH2uyam8dt8Nl-1yiNYYj72Ma9A3Jlo_JkwktI,4981
134
- tests/repositories/test_tasks_repo.py,sha256=ZtOOjJTb_j8dKEpirZTQAnR9fhDDO7xQWZU710So9Bk,2769
135
- tests/repositories/test_vs_repo.py,sha256=PGN5PqQBtlwMC_UFU3qMSqxtoBSNz1YvZK4yYj0O0UU,4595
136
- tests/services/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
137
- tests/services/test_dispatcher_service.py,sha256=iALQx0I94SehG4eXqwvdswyYrPVShXFIlk-GwwbWyzw,13086
138
- tests/services/test_document_service.py,sha256=Z62VjjIn1EPgDT2_2jEVI6AQoO3yOdskc_FDqlvML1Q,8085
139
- tests/services/test_excel_service.py,sha256=7Gyy82MFqOVFIGL7RXMIOmal22ne-lsgAfY16azDAMM,8434
140
- tests/services/test_file_processor_service.py,sha256=XzdA581hoAhevp8atqgI7jxTY1gmHE7rnMllihRS9S0,4794
141
- tests/services/test_history_service.py,sha256=VF6IgogsgaFe64LNDeXMFcLrWjuGLf3Vj_srnFfkneM,7273
142
- tests/services/test_jwt_service.py,sha256=3TYtuPk1ps0aa5TKGvd30Q4F7Q1FEsqK6Gr1wjW8-q8,10325
143
- tests/services/test_load_documents_service.py,sha256=zDcHSXVQAdtAZCVWecTl-pYlkA4Sp8JLxKpu82LB69A,4640
144
- tests/services/test_mail_service.py,sha256=PPy5XA2lYFFBNdmU1Ea-cfqszwQZrrqZSZU1OQ26lDE,2295
145
- tests/services/test_profile_service.py,sha256=WzvVxeK5AYUDWJLBRB43vVDLHi64cIkPYPcynMEGZzM,14831
146
- tests/services/test_prompt_manager_service.py,sha256=B6j12RNjljAKZnd7vy1CNAdZxwKiTWD5l4uxOGKVuvE,9395
147
- tests/services/test_query_service.py,sha256=vq8dhteJOFiA0eGo1s5eBzasx7noZFrv96XdKFKhmS8,11331
148
- tests/services/test_search_service.py,sha256=n8C5mjDDCVX4NAJvS3mKgw-WsLWu5qUA8eTOxy-g9NU,1183
149
- tests/services/test_sql_service.py,sha256=bHDiPzjfM7-mbM4eEXlMVk3vcvefhlGCx3bdIrlriVM,7753
150
- tests/services/test_tasks_service.py,sha256=V_WcglSX4CAtOkkKhZKl7Q92LsODHLRu66TqydiSQP4,10598
151
- tests/services/test_user_feedback_service.py,sha256=HMU75j48jT-Chls78QEXoq92Hpq7TXP-m8xXIAL0rK0,15859
152
- tests/services/test_user_session_context_service.py,sha256=c49RqHuoY6W_u-eR-UR05SNwDfqvRpRQWAJ6Ghyh7sQ,6799
153
- tests/views/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
154
- tests/views/test_change_password_view.py,sha256=5dIjx6_-rNHqj9yrkz00ajMxmZENBoTwN0gNFGUzxRE,9213
155
- tests/views/test_chat_token_request_view.py,sha256=jwgGaNmBPTK9irKTqsDTTTIZawpYBxfGXBUv0xxvCQ0,9850
156
- tests/views/test_chat_view.py,sha256=24dySNWlpu7EXkIeFJwUUXwb5xAq3Kdv2IVzPSVSWuY,3798
157
- tests/views/test_download_file_view.py,sha256=l0o5DnI29ByV7N5kK4UoTKhPmStKuiAOZKFPxCSZszE,5969
158
- tests/views/test_external_chat_login_view.py,sha256=1PLOPqVJjR-7d1DV24uuA7QOYEeKsIusjw6poBYTFB8,5405
159
- tests/views/test_external_login_view.py,sha256=Lf4VHxTyddx_RSTvYoxcZr8cG82bvJ0pdVqU1CJpwcg,4394
160
- tests/views/test_file_store_view.py,sha256=hT2k5-ppGNphKnQwueTvyzHQUGJ1umVXpPNOpTL8GOI,4837
161
- tests/views/test_forgot_password_view.py,sha256=GeaGMQpY20T9_cM_kBTrwRcx-Z1zsDbytB-KoyM9p2o,6224
162
- tests/views/test_history_view.py,sha256=AxNNjVEEYVdLDNa6aZaWdSE3FMquiqqDGxvl57UYdD8,12322
163
- tests/views/test_home_view.py,sha256=uqPCQnDyTm25l6YLrwzINrHMd16oyY3yrqXui1LChjg,2438
164
- tests/views/test_llm_query_view.py,sha256=3Mf_mfZNW9wTG7BivwEW0OL-QXplV2zRakl5rIUOvu8,5121
165
- tests/views/test_login_view.py,sha256=P-6n6LGnQ87pC9a48FMz0okVm7eukpSeIKDnMUABs3I,4812
166
- tests/views/test_prompt_view.py,sha256=y8mIXc0AqOoSe2QJJX3UdiFgA1a2TYFCcIwGiupxR0U,4563
167
- tests/views/test_signup_view.py,sha256=WVh11rzH2MbJWS9rvYIn9R1aCWJLnpIhIK_k7MQxi0I,6534
168
- tests/views/test_tasks_review_view.py,sha256=HXbAY99rbcdg-ZoaU3kxp-jNTPgOhgiTyKmV9rUcFyQ,3743
169
- tests/views/test_tasks_view.py,sha256=TNdV69Vt17uc-vBI37A7qtRNqyPho2MoW7cgGxQKecU,4551
170
- tests/views/test_user_feedback_view.py,sha256=IfKOpsncmf5ciMDsGuPtro9GdKXkxhRzsysVlEEM_HA,9181
171
- tests/views/test_verify_user_view.py,sha256=dxQ3ibOETEuP8M50Gmwbmzj2L6UU7PAyC91Wp9Xs0K0,4772
172
- iatoolkit-0.8.1.dist-info/METADATA,sha256=3jM0LUTEQLziEwLaP2Cao3WePdsFE_UEPxGY4mEbCKw,9300
173
- iatoolkit-0.8.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
174
- iatoolkit-0.8.1.dist-info/top_level.txt,sha256=or0Ar3Su6BhTy86zRrUwMAWtsR8Nk-tFEwdC0CZpKCs,16
175
- iatoolkit-0.8.1.dist-info/RECORD,,
tests/__init__.py DELETED
@@ -1,5 +0,0 @@
1
- # Copyright (c) 2024 Fernando Libedinsky
2
- # Product: IAToolkit
3
- #
4
- # IAToolkit is open source software.
5
-
tests/common/__init__.py DELETED
File without changes
tests/common/test_auth.py DELETED
@@ -1,279 +0,0 @@
1
- # Copyright (c) 2024 Fernando Libedinsky
2
- # Product: IAToolkit
3
- #
4
- # IAToolkit is open source software.
5
-
6
- from flask import Flask, Response
7
- from unittest.mock import patch, MagicMock
8
- from iatoolkit.common.auth import IAuthentication
9
- import pytest
10
- from datetime import datetime, timezone
11
- from iatoolkit.repositories.profile_repo import ProfileRepo
12
- from iatoolkit.services.jwt_service import JWTService
13
- from werkzeug.exceptions import HTTPException
14
-
15
- CURRENT_TIME = datetime.now(timezone.utc).timestamp()
16
-
17
-
18
- class TestAuth:
19
-
20
- def setup_method(self):
21
- self.app = Flask(__name__)
22
- self.app.config['TESTING'] = True
23
-
24
- self.profile_repo = MagicMock(spec=ProfileRepo)
25
- self.jwt_service = MagicMock(spec=JWTService)
26
- self.iauth_service = IAuthentication(
27
- profile_repo=self.profile_repo,
28
- jwt_service=self.jwt_service
29
- )
30
-
31
- @self.app.route('/<company_short_name>/protected')
32
- def protected(company_short_name):
33
- with self.app.test_request_context():
34
- auth_result = self.iauth_service.check_if_user_is_logged_in(company_short_name)
35
- if isinstance(auth_result, Response):
36
- return auth_result
37
- return "Access Granted", 200
38
-
39
- @self.app.route('/login')
40
- def login():
41
- return "Login Page", 200
42
-
43
- self.client = self.app.test_client()
44
-
45
- def teardown_method(self):
46
- patch.stopall()
47
-
48
- # --- Pruebas para check_if_user_is_logged_in (de TestAuth original) ---
49
-
50
- def test_allows_access_if_user_authenticated_and_active(self):
51
- with patch('iatoolkit.common.auth.SessionManager.get') as mock_get, \
52
- patch('iatoolkit.common.auth.SessionManager.set') as mock_set:
53
- mock_get.side_effect = lambda key, default=None: {
54
- 'user': {'id': 1, 'username': 'test_user'},
55
- 'company_short_name': 'test_company',
56
- 'last_activity': CURRENT_TIME
57
- }.get(key, default)
58
-
59
- response = self.client.get('/test_company/protected')
60
-
61
- assert response.status_code == 200
62
- assert response.data == b"Access Granted"
63
- mock_set.assert_called_with("last_activity", pytest.approx(CURRENT_TIME, 1))
64
-
65
- def test_redirect_if_user_not_authenticated(self):
66
- with patch('iatoolkit.common.auth.SessionManager.get') as mock_get:
67
- mock_get.side_effect = lambda key, default=None: None if key == "user" else default
68
- response = self.client.get('/test_company/protected')
69
- assert response.status_code == 302
70
- assert "/login" in response.headers['Location']
71
-
72
- def test_redirect_if_last_activity_missing(self):
73
- with patch('iatoolkit.common.auth.SessionManager.get') as mock_get, \
74
- patch('iatoolkit.common.auth.SessionManager.clear') as mock_clear:
75
- mock_get.side_effect = lambda key, default=None: {
76
- 'user': {'id': 1, 'username': 'test_user'},
77
- 'company_short_name': 'test_company'
78
- }.get(key, default)
79
-
80
- response = self.client.get('/test_company/protected')
81
-
82
- assert response.status_code == 302
83
- assert "/login" in response.headers['Location']
84
- mock_clear.assert_called_once()
85
-
86
- # --- Pruebas para verify (de TestAuthVerify original) ---
87
-
88
- def test_verify_with_jwt_success(self):
89
- with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
90
- patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key:
91
- mock_auth_jwt.return_value = (123, 'ext_user_1', None)
92
-
93
- with self.app.test_request_context():
94
- result = self.iauth_service.verify('some_company')
95
-
96
- assert result['success'] is True
97
- assert result['company_id'] == 123
98
- assert result['external_user_id'] == 'ext_user_1'
99
- mock_auth_jwt.assert_called_once_with('some_company')
100
- mock_auth_api_key.assert_not_called()
101
-
102
- def test_verify_with_jwt_failure(self):
103
- with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
104
- patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key:
105
- mock_auth_jwt.return_value = (None, None, "Error de JWT")
106
-
107
- with self.app.test_request_context():
108
- result = self.iauth_service.verify('some_company')
109
-
110
- assert result == {"error_message": "Fallo de autenticación JWT"}
111
- mock_auth_api_key.assert_not_called()
112
-
113
- def test_verify_with_api_key_success(self):
114
- with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
115
- patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key, \
116
- patch.object(self.iauth_service, 'check_if_user_is_logged_in') as mock_check_if_logged_in:
117
- mock_auth_jwt.return_value = (None, None, None)
118
- mock_auth_api_key.return_value = (456, None)
119
-
120
- with self.app.test_request_context():
121
- result = self.iauth_service.verify('some_company', body_external_user_id='body_user_2')
122
-
123
- assert result['success'] is True
124
- assert result['company_id'] == 456
125
- assert result['external_user_id'] == 'body_user_2'
126
- mock_auth_api_key.assert_called_once_with('some_company')
127
- mock_check_if_logged_in.assert_not_called()
128
-
129
- def test_verify_with_api_key_failure(self):
130
- with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
131
- patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key:
132
- mock_auth_jwt.return_value = (None, None, None)
133
- mock_auth_api_key.return_value = (None, "Error de API Key")
134
-
135
- with self.app.test_request_context():
136
- result = self.iauth_service.verify('some_company')
137
-
138
- assert result == {"error_message": "Fallo de autenticación API Key"}
139
-
140
- def test_verify_with_session_success(self):
141
- with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
142
- patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key, \
143
- patch.object(self.iauth_service, 'check_if_user_is_logged_in') as mock_check_if_logged_in, \
144
- patch('iatoolkit.common.auth.SessionManager.get') as mock_session_get:
145
- mock_auth_jwt.return_value = (None, None, None)
146
- mock_auth_api_key.return_value = (None, None)
147
- mock_check_if_logged_in.return_value = None
148
- mock_session_get.side_effect = lambda key, default=None: {'user_id': 789, 'company_id': 999}.get(key,
149
- default)
150
-
151
- with self.app.test_request_context():
152
- result = self.iauth_service.verify('some_company')
153
-
154
- assert result['success'] is True
155
- assert result['company_id'] == 999
156
- assert result['local_user_id'] == 789
157
- mock_check_if_logged_in.assert_called_once_with('some_company')
158
-
159
- def test_verify_with_session_incomplete_data(self):
160
- with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
161
- patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key, \
162
- patch.object(self.iauth_service, 'check_if_user_is_logged_in') as mock_check_if_logged_in, \
163
- patch('iatoolkit.common.auth.SessionManager.get') as mock_session_get:
164
- mock_auth_jwt.return_value = (None, None, None)
165
- mock_auth_api_key.return_value = (None, None)
166
- mock_check_if_logged_in.return_value = None
167
- mock_session_get.side_effect = lambda key, default=None: {'user_id': 789}.get(key, default)
168
-
169
- with self.app.test_request_context():
170
- result = self.iauth_service.verify('some_company')
171
-
172
- assert result == {"error_message": "Fallo interno en la autenticación o no autenticado"}
173
-
174
- def test_verify_with_session_check_fails_by_exception(self):
175
- with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
176
- patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key, \
177
- patch.object(self.iauth_service, 'check_if_user_is_logged_in') as mock_check_if_logged_in:
178
- mock_auth_jwt.return_value = (None, None, None)
179
- mock_auth_api_key.return_value = (None, None)
180
- mock_check_if_logged_in.side_effect = HTTPException
181
-
182
- with self.app.test_request_context(), pytest.raises(HTTPException):
183
- self.iauth_service.verify('some_company')
184
-
185
- # --- Nuevas pruebas para _authenticate_via_api_key ---
186
-
187
- def test_authenticate_via_api_key_success(self):
188
- with self.app.test_request_context(headers={'Authorization': 'Bearer valid_key'}):
189
- mock_api_entry = MagicMock()
190
- mock_api_entry.company.short_name = 'test_company'
191
- mock_api_entry.company_id = 123
192
- self.profile_repo.get_active_api_key_entry.return_value = mock_api_entry
193
-
194
- company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
195
-
196
- assert company_id == 123
197
- assert error is None
198
- self.profile_repo.get_active_api_key_entry.assert_called_once_with('valid_key')
199
-
200
- def test_authenticate_via_api_key_no_header(self):
201
- with self.app.test_request_context(headers={}):
202
- company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
203
- assert company_id is None
204
- assert error is None
205
- self.profile_repo.get_active_api_key_entry.assert_not_called()
206
-
207
- def test_authenticate_via_api_key_wrong_scheme(self):
208
- with self.app.test_request_context(headers={'Authorization': 'Basic some_token'}):
209
- company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
210
- assert company_id is None
211
- assert error is None
212
- self.profile_repo.get_active_api_key_entry.assert_not_called()
213
-
214
- def test_authenticate_via_api_key_inactive_key(self):
215
- with self.app.test_request_context(headers={'Authorization': 'Bearer inactive_key'}):
216
- self.profile_repo.get_active_api_key_entry.return_value = None
217
- company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
218
- assert company_id is None
219
- assert error == "API Key inválida o inactiva"
220
-
221
- def test_authenticate_via_api_key_company_mismatch(self):
222
- with self.app.test_request_context(headers={'Authorization': 'Bearer valid_key'}):
223
- mock_api_entry = MagicMock()
224
- mock_api_entry.company.short_name = 'other_company'
225
- self.profile_repo.get_active_api_key_entry.return_value = mock_api_entry
226
-
227
- company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
228
- assert company_id is None
229
- assert error == "API Key no es válida para la compañía test_company"
230
-
231
- def test_authenticate_via_api_key_repo_exception(self):
232
- with self.app.test_request_context(headers={'Authorization': 'Bearer any_key'}):
233
- self.profile_repo.get_active_api_key_entry.side_effect = Exception("DB error")
234
- company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
235
- assert company_id is None
236
- assert error == "Error interno del servidor al validar API Key"
237
-
238
- # --- Nuevas pruebas para _authenticate_via_chat_jwt ---
239
-
240
- def test_authenticate_via_chat_jwt_success(self):
241
- with self.app.test_request_context(headers={'X-Chat-Token': 'valid_jwt'}):
242
- self.jwt_service.validate_chat_jwt.return_value = {'company_id': 123, 'external_user_id': 'ext_user'}
243
- company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
244
- assert company_id == 123
245
- assert external_user_id == 'ext_user'
246
- assert error is None
247
- self.jwt_service.validate_chat_jwt.assert_called_once_with('valid_jwt', 'test_company')
248
-
249
- def test_authenticate_via_chat_jwt_no_header(self):
250
- with self.app.test_request_context(headers={}):
251
- company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
252
- assert company_id is None
253
- assert external_user_id is None
254
- assert error is None
255
- self.jwt_service.validate_chat_jwt.assert_not_called()
256
-
257
- def test_authenticate_via_chat_jwt_validation_fails(self):
258
- with self.app.test_request_context(headers={'X-Chat-Token': 'invalid_jwt'}):
259
- self.jwt_service.validate_chat_jwt.return_value = None
260
- company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
261
- assert company_id is None
262
- assert external_user_id is None
263
- assert error == "Token de chat expirado, debes reingresar al chat"
264
-
265
- def test_authenticate_via_chat_jwt_incomplete_payload_no_company_id(self):
266
- with self.app.test_request_context(headers={'X-Chat-Token': 'valid_jwt'}):
267
- self.jwt_service.validate_chat_jwt.return_value = {'external_user_id': 'ext_user'}
268
- company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
269
- assert company_id is None
270
- assert external_user_id is None
271
- assert error == "Token de chat con formato interno incorrecto"
272
-
273
- def test_authenticate_via_chat_jwt_incomplete_payload_no_external_id(self):
274
- with self.app.test_request_context(headers={'X-Chat-Token': 'valid_jwt'}):
275
- self.jwt_service.validate_chat_jwt.return_value = {'company_id': 123}
276
- company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
277
- assert company_id is None
278
- assert external_user_id is None
279
- assert error == "Token de chat con formato interno incorrecto"
@@ -1,42 +0,0 @@
1
- # Copyright (c) 2024 Fernando Libedinsky
2
- # Product: IAToolkit
3
- #
4
- # IAToolkit is open source software.
5
-
6
- from flask import Flask
7
- from unittest.mock import patch
8
-
9
-
10
- class TestRoutes:
11
- def setup_method(self):
12
- # Configurar la aplicación Flask para pruebas
13
- self.app = Flask(__name__)
14
- self.app.config['VERSION'] = "1.0.0"
15
- self.app.secret_key = 'test_secret'
16
-
17
- # Concentramos todos los mocks y patches aquí:
18
-
19
- # Patch para el SessionManager (por ejemplo para evitar lecturas de sesión reales)
20
- self.session_manager_patch = patch("common.routes.SessionManager")
21
- self.mock_session_manager = self.session_manager_patch.start()
22
- # Para este ejemplo, no es necesario configurar un return_value, pero se podría definir según se requiera
23
-
24
- # Patch para la función flash, reemplazándola para que no intente enviar mensajes reales
25
- self.flash_patch = patch("common.routes.flash")
26
- self.mock_flash = self.flash_patch.start()
27
-
28
- # Patch para render_template, que es usado por la ruta "/about" y otros
29
- self.render_template_patch = patch("common.routes.render_template", return_value="<html>About</html>")
30
- self.mock_render_template = self.render_template_patch.start()
31
-
32
- # Registrar las rutas en la aplicación
33
- from iatoolkit.common.routes import register_routes
34
- register_routes(self.app)
35
-
36
- # Crear el cliente de pruebas
37
- self.client = self.app.test_client()
38
-
39
- def teardown_method(self, method):
40
- patch.stopall()
41
-
42
-
@@ -1,59 +0,0 @@
1
- # Copyright (c) 2024 Fernando Libedinsky
2
- # Product: IAToolkit
3
- #
4
- # IAToolkit is open source software.
5
-
6
- import unittest
7
- from unittest.mock import patch
8
- from iatoolkit.common.session_manager import SessionManager
9
-
10
-
11
- class TestSessionManager(unittest.TestCase):
12
-
13
- def setUp(self):
14
- """
15
- Configura los patches y mocks comunes para las pruebas.
16
- """
17
- # Parchear el objeto 'session' como un diccionario en todos los tests
18
- self.session_patcher = patch("iatoolkit.common.session_manager.session", new_callable=dict)
19
- self.mock_session = self.session_patcher.start() # Iniciar el patch y obtener el mock
20
-
21
- def tearDown(self):
22
- """
23
- Detiene todos los patches después de cada prueba.
24
- """
25
- patch.stopall() # Detener cualquier parche activo y limpiar el entorno
26
-
27
- def test_set(self):
28
- """Prueba que el método set almacena un valor en la sesión."""
29
- SessionManager.set("key", "value")
30
- self.assertEqual(self.mock_session["key"], "value")
31
-
32
- def test_get_existing_key(self):
33
- """Prueba que el método get devuelve el valor correcto si la clave existe."""
34
- self.mock_session["key"] = "value"
35
- result = SessionManager.get("key")
36
- self.assertEqual(result, "value")
37
-
38
- def test_get_non_existing_key_with_default(self):
39
- """Prueba que el método get devuelve el valor predeterminado si la clave no existe."""
40
- result = SessionManager.get("non_existing_key", default="default_value")
41
- self.assertEqual(result, "default_value")
42
-
43
- def test_remove_existing_key(self):
44
- """Prueba que el método remove elimina correctamente una clave existente."""
45
- self.mock_session["key"] = "value"
46
- SessionManager.remove("key")
47
- self.assertNotIn("key", self.mock_session)
48
-
49
- def test_remove_non_existing_key(self):
50
- """Prueba que el método remove no lanza errores si la clave no existe."""
51
- SessionManager.remove("non_existing_key")
52
- # No debería hacer nada, y la sesión debe permanecer vacía
53
- self.assertEqual(len(self.mock_session), 0)
54
-
55
- def test_clear(self):
56
- """Prueba que el método clear elimina todos los elementos de la sesión."""
57
- self.mock_session.update({"key1": "value1", "key2": "value2"})
58
- SessionManager.clear()
59
- self.assertEqual(len(self.mock_session), 0)