iatoolkit 0.7.10__py3-none-any.whl → 0.7.12__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 (192) hide show
  1. iatoolkit/__init__.py +18 -14
  2. iatoolkit/base_company.py +5 -5
  3. iatoolkit/cli_commands.py +5 -3
  4. {common → iatoolkit/common}/auth.py +3 -3
  5. {common → iatoolkit/common}/routes.py +19 -19
  6. {common → iatoolkit/common}/util.py +2 -2
  7. iatoolkit/iatoolkit.py +37 -38
  8. {infra → iatoolkit/infra}/call_service.py +1 -1
  9. {infra → iatoolkit/infra}/connectors/file_connector_factory.py +5 -5
  10. {infra → iatoolkit/infra}/connectors/google_cloud_storage_connector.py +1 -1
  11. {infra → iatoolkit/infra}/connectors/google_drive_connector.py +1 -1
  12. {infra → iatoolkit/infra}/connectors/local_file_connector.py +2 -2
  13. {infra → iatoolkit/infra}/connectors/s3_connector.py +1 -1
  14. {infra → iatoolkit/infra}/gemini_adapter.py +2 -2
  15. {infra → iatoolkit/infra}/google_chat_app.py +1 -1
  16. {infra → iatoolkit/infra}/llm_client.py +7 -7
  17. {infra → iatoolkit/infra}/llm_proxy.py +6 -6
  18. {infra → iatoolkit/infra}/mail_app.py +1 -1
  19. {infra → iatoolkit/infra}/openai_adapter.py +2 -2
  20. {repositories → iatoolkit/repositories}/database_manager.py +1 -1
  21. {repositories → iatoolkit/repositories}/document_repo.py +3 -3
  22. {repositories → iatoolkit/repositories}/llm_query_repo.py +2 -2
  23. {repositories → iatoolkit/repositories}/profile_repo.py +2 -2
  24. {repositories → iatoolkit/repositories}/tasks_repo.py +2 -2
  25. {repositories → iatoolkit/repositories}/vs_repo.py +3 -3
  26. {services → iatoolkit/services}/benchmark_service.py +3 -3
  27. {services → iatoolkit/services}/dispatcher_service.py +9 -8
  28. {services → iatoolkit/services}/document_service.py +1 -1
  29. {services → iatoolkit/services}/excel_service.py +2 -2
  30. {services → iatoolkit/services}/file_processor_service.py +2 -2
  31. {services → iatoolkit/services}/history_service.py +4 -3
  32. {services → iatoolkit/services}/load_documents_service.py +11 -10
  33. {services → iatoolkit/services}/mail_service.py +2 -2
  34. {services → iatoolkit/services}/profile_service.py +6 -6
  35. {services → iatoolkit/services}/prompt_manager_service.py +5 -4
  36. {services → iatoolkit/services}/query_service.py +12 -11
  37. {services → iatoolkit/services}/search_service.py +2 -2
  38. {services → iatoolkit/services}/sql_service.py +4 -3
  39. {services → iatoolkit/services}/tasks_service.py +6 -6
  40. {services → iatoolkit/services}/user_feedback_service.py +3 -3
  41. {services → iatoolkit/services}/user_session_context_service.py +1 -1
  42. iatoolkit/static/images/arrow_up.png +0 -0
  43. iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
  44. iatoolkit/static/images/logo_clinica.png +0 -0
  45. iatoolkit/static/images/logo_iatoolkit.png +0 -0
  46. iatoolkit/static/images/logo_maxxa.png +0 -0
  47. iatoolkit/static/images/logo_notaria.png +0 -0
  48. iatoolkit/static/images/logo_tarjeta.png +0 -0
  49. iatoolkit/static/images/logo_umayor.png +0 -0
  50. iatoolkit/static/images/upload.png +0 -0
  51. iatoolkit/static/js/chat_feedback.js +115 -0
  52. iatoolkit/static/js/chat_filepond.js +85 -0
  53. iatoolkit/static/js/chat_history.js +117 -0
  54. iatoolkit/static/js/chat_main.js +436 -0
  55. iatoolkit/static/styles/chat_iatoolkit.css +701 -0
  56. iatoolkit/static/styles/chat_info.css +53 -0
  57. iatoolkit/static/styles/chat_modal.css +136 -0
  58. iatoolkit/static/styles/llm_output.css +115 -0
  59. iatoolkit/static/temp/024f44a9-cc7e-4bde-9a3c-11903a8f5d3d.xlsx +0 -0
  60. iatoolkit/static/temp/0b97768e-79e8-43ec-b17e-ba3137f94e93.xlsx +0 -0
  61. iatoolkit/static/temp/202883ee-763e-4b40-9bb6-bfacfc5e65fe.xlsx +0 -0
  62. iatoolkit/static/temp/28287491-08b7-4863-a2a3-49fcb64a0906.xlsx +0 -0
  63. iatoolkit/static/temp/36780cac-7a46-4db4-ac98-7338a51aaf52.xlsx +0 -0
  64. iatoolkit/static/temp/5c1b66f6-d58f-4684-8a7a-df3bb1a35eaa.xlsx +0 -0
  65. iatoolkit/static/temp/5d5a3500-ec57-4e07-a554-8799a906d1ab.xlsx +0 -0
  66. iatoolkit/static/temp/65887e40-cf64-49aa-8d1f-651cb0f8cdf0.xlsx +0 -0
  67. iatoolkit/static/temp/6fa64b13-e8e5-40ad-8257-00fd1682dad8.xlsx +0 -0
  68. iatoolkit/static/temp/7ab7071f-ad9b-49e6-8e63-f08410625ce7.xlsx +0 -0
  69. iatoolkit/static/temp/824346d9-d54d-40c6-b5c2-9e1d84d0ae90.xlsx +0 -0
  70. iatoolkit/static/temp/9ca80c3d-d196-4dfc-8179-582584fae04c.xlsx +0 -0
  71. iatoolkit/static/temp/a34cb8a6-85fb-4ea8-aabe-889967cd83b5.xlsx +0 -0
  72. iatoolkit/static/temp/a7fc9c13-c509-4499-b4be-23bfa57cac31.xlsx +0 -0
  73. iatoolkit/static/temp/b83084f5-fe54-4580-885e-412b4388cbda.xlsx +0 -0
  74. iatoolkit/static/temp/c17c6864-34e1-448f-b0e9-380354256ea9.xlsx +0 -0
  75. iatoolkit/static/temp/customer_clusters.parquet +0 -0
  76. iatoolkit/static/temp/customer_clusters.xlsx +0 -0
  77. iatoolkit/static/temp/d1af98b8-18a9-4b94-b9bc-607d19a87d0d.xlsx +0 -0
  78. iatoolkit/templates/about.html +13 -0
  79. iatoolkit/templates/base.html +45 -0
  80. iatoolkit/templates/change_password.html +45 -0
  81. iatoolkit/templates/chat.html +180 -0
  82. iatoolkit/templates/chat_modals.html +115 -0
  83. iatoolkit/templates/error.html +15 -0
  84. iatoolkit/templates/forgot_password.html +33 -0
  85. iatoolkit/templates/header.html +31 -0
  86. iatoolkit/templates/home.html +201 -0
  87. iatoolkit/templates/login.html +43 -0
  88. iatoolkit/templates/signup.html +78 -0
  89. iatoolkit/templates/test.html +9 -0
  90. {views → iatoolkit/views}/change_password_view.py +1 -1
  91. {views → iatoolkit/views}/chat_token_request_view.py +2 -2
  92. {views → iatoolkit/views}/chat_view.py +3 -3
  93. {views → iatoolkit/views}/download_file_view.py +3 -3
  94. {views → iatoolkit/views}/external_chat_login_view.py +5 -5
  95. {views → iatoolkit/views}/external_login_view.py +2 -2
  96. {views → iatoolkit/views}/file_store_view.py +2 -2
  97. {views → iatoolkit/views}/forgot_password_view.py +1 -1
  98. {views → iatoolkit/views}/history_view.py +2 -2
  99. {views → iatoolkit/views}/home_view.py +1 -1
  100. {views → iatoolkit/views}/llmquery_view.py +2 -2
  101. {views → iatoolkit/views}/login_view.py +1 -1
  102. {views → iatoolkit/views}/prompt_view.py +2 -2
  103. {views → iatoolkit/views}/signup_view.py +1 -1
  104. {views → iatoolkit/views}/tasks_review_view.py +2 -2
  105. {views → iatoolkit/views}/tasks_view.py +2 -2
  106. {views → iatoolkit/views}/user_feedback_view.py +2 -2
  107. {views → iatoolkit/views}/verify_user_view.py +1 -1
  108. {iatoolkit-0.7.10.dist-info → iatoolkit-0.7.12.dist-info}/METADATA +1 -1
  109. iatoolkit-0.7.12.dist-info/RECORD +194 -0
  110. iatoolkit-0.7.12.dist-info/top_level.txt +2 -0
  111. tests/__init__.py +5 -0
  112. tests/common/__init__.py +0 -0
  113. tests/common/test_auth.py +279 -0
  114. tests/common/test_routes.py +42 -0
  115. tests/common/test_session_manager.py +59 -0
  116. tests/common/test_util.py +444 -0
  117. tests/companies/__init__.py +5 -0
  118. tests/conftest.py +36 -0
  119. tests/infra/__init__.py +5 -0
  120. tests/infra/connectors/__init__.py +5 -0
  121. tests/infra/connectors/test_google_drive_connector.py +107 -0
  122. tests/infra/connectors/test_local_file_connector.py +85 -0
  123. tests/infra/connectors/test_s3_connector.py +95 -0
  124. tests/infra/test_call_service.py +92 -0
  125. tests/infra/test_database_manager.py +59 -0
  126. tests/infra/test_gemini_adapter.py +137 -0
  127. tests/infra/test_google_chat_app.py +68 -0
  128. tests/infra/test_llm_client.py +165 -0
  129. tests/infra/test_llm_proxy.py +122 -0
  130. tests/infra/test_mail_app.py +94 -0
  131. tests/infra/test_openai_adapter.py +105 -0
  132. tests/infra/test_redis_session_manager_service.py +117 -0
  133. tests/repositories/__init__.py +5 -0
  134. tests/repositories/test_database_manager.py +87 -0
  135. tests/repositories/test_document_repo.py +76 -0
  136. tests/repositories/test_llm_query_repo.py +340 -0
  137. tests/repositories/test_models.py +38 -0
  138. tests/repositories/test_profile_repo.py +142 -0
  139. tests/repositories/test_tasks_repo.py +76 -0
  140. tests/repositories/test_vs_repo.py +107 -0
  141. tests/services/__init__.py +5 -0
  142. tests/services/test_dispatcher_service.py +274 -0
  143. tests/services/test_document_service.py +181 -0
  144. tests/services/test_excel_service.py +208 -0
  145. tests/services/test_file_processor_service.py +121 -0
  146. tests/services/test_history_service.py +164 -0
  147. tests/services/test_jwt_service.py +255 -0
  148. tests/services/test_load_documents_service.py +112 -0
  149. tests/services/test_mail_service.py +70 -0
  150. tests/services/test_profile_service.py +379 -0
  151. tests/services/test_prompt_manager_service.py +190 -0
  152. tests/services/test_query_service.py +243 -0
  153. tests/services/test_search_service.py +39 -0
  154. tests/services/test_sql_service.py +160 -0
  155. tests/services/test_tasks_service.py +252 -0
  156. tests/services/test_user_feedback_service.py +389 -0
  157. tests/services/test_user_session_context_service.py +132 -0
  158. tests/views/__init__.py +5 -0
  159. tests/views/test_change_password_view.py +191 -0
  160. tests/views/test_chat_token_request_view.py +188 -0
  161. tests/views/test_chat_view.py +98 -0
  162. tests/views/test_download_file_view.py +149 -0
  163. tests/views/test_external_chat_login_view.py +120 -0
  164. tests/views/test_external_login_view.py +102 -0
  165. tests/views/test_file_store_view.py +128 -0
  166. tests/views/test_forgot_password_view.py +142 -0
  167. tests/views/test_history_view.py +336 -0
  168. tests/views/test_home_view.py +61 -0
  169. tests/views/test_llm_query_view.py +154 -0
  170. tests/views/test_login_view.py +114 -0
  171. tests/views/test_prompt_view.py +111 -0
  172. tests/views/test_signup_view.py +140 -0
  173. tests/views/test_tasks_review_view.py +104 -0
  174. tests/views/test_tasks_view.py +130 -0
  175. tests/views/test_user_feedback_view.py +214 -0
  176. tests/views/test_verify_user_view.py +110 -0
  177. iatoolkit-0.7.10.dist-info/RECORD +0 -80
  178. iatoolkit-0.7.10.dist-info/top_level.txt +0 -6
  179. {common → iatoolkit/common}/__init__.py +0 -0
  180. {common → iatoolkit/common}/exceptions.py +0 -0
  181. {common → iatoolkit/common}/session_manager.py +0 -0
  182. {infra → iatoolkit/infra}/__init__.py +0 -0
  183. {infra → iatoolkit/infra}/connectors/__init__.py +0 -0
  184. {infra → iatoolkit/infra}/connectors/file_connector.py +0 -0
  185. {infra → iatoolkit/infra}/llm_response.py +0 -0
  186. {infra → iatoolkit/infra}/redis_session_manager.py +0 -0
  187. {repositories → iatoolkit/repositories}/__init__.py +0 -0
  188. {repositories → iatoolkit/repositories}/models.py +0 -0
  189. {services → iatoolkit/services}/__init__.py +0 -0
  190. {services → iatoolkit/services}/jwt_service.py +0 -0
  191. {views → iatoolkit/views}/__init__.py +0 -0
  192. {iatoolkit-0.7.10.dist-info → iatoolkit-0.7.12.dist-info}/WHEEL +0 -0
@@ -0,0 +1,214 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ import pytest
7
+ from unittest.mock import MagicMock, patch
8
+ from flask import Flask
9
+ from iatoolkit.views.user_feedback_view import UserFeedbackView
10
+ from iatoolkit.services.user_feedback_service import UserFeedbackService
11
+ from iatoolkit.common.auth import IAuthentication
12
+
13
+
14
+ class TestUserFeedbackView:
15
+ @staticmethod
16
+ def create_app():
17
+ app = Flask(__name__)
18
+ app.testing = True
19
+ return app
20
+
21
+ @pytest.fixture(autouse=True)
22
+ def setup(self):
23
+ self.app = self.create_app()
24
+ self.client = self.app.test_client()
25
+ self.feedback_service = MagicMock(spec=UserFeedbackService)
26
+ self.iauthentication = MagicMock(spec=IAuthentication)
27
+
28
+ self.iauthentication.verify.return_value = {
29
+ 'success': True,
30
+ 'company_id': 101,
31
+ 'external_user_id': 'test_user_id'
32
+ }
33
+
34
+ # register the view
35
+ self.feedback_view = UserFeedbackView.as_view("feedback",
36
+ user_feedback_service=self.feedback_service,
37
+ iauthentication=self.iauthentication)
38
+ self.app.add_url_rule('/<company_short_name>/feedback',
39
+ view_func=self.feedback_view,
40
+ methods=["POST"])
41
+
42
+
43
+ def test_post_when_missing_data(self):
44
+ response = self.client.post('/my_company/feedback',
45
+ json={})
46
+
47
+ assert response.status_code == 400
48
+ self.feedback_service.new_feedback.assert_not_called()
49
+
50
+ def test_post_when_auth_error(self):
51
+ self.iauthentication.verify.return_value = {'error_message': 'error in authentication'}
52
+ response = self.client.post('/my_company/feedback',
53
+ json={'external_user_id': 'flibe'})
54
+
55
+ assert response.status_code == 401
56
+ assert response.json["error_message"] == 'error in authentication'
57
+
58
+ def test_post_when_missing_message(self):
59
+ response = self.client.post('/my_company/feedback',
60
+ json={'external_user_id': 'flibe'})
61
+
62
+ assert response.status_code == 400
63
+ assert response.json["error_message"] == 'Falta el mensaje de feedback'
64
+ self.feedback_service.new_feedback.assert_not_called()
65
+
66
+ def test_post_when_missing_space(self):
67
+ response = self.client.post('/my_company/feedback',
68
+ json={'external_user_id': 'flibe', 'message': 'test message'})
69
+
70
+ assert response.status_code == 400
71
+ assert response.json["error_message"] == 'Falta el espacio de Google Chat'
72
+ self.feedback_service.new_feedback.assert_not_called()
73
+
74
+ def test_post_when_missing_type(self):
75
+ response = self.client.post('/my_company/feedback',
76
+ json={'external_user_id': 'flibe', 'message': 'test message', 'space': 'spaces/test'})
77
+
78
+ assert response.status_code == 400
79
+ assert response.json["error_message"] == 'Falta el tipo de feedback'
80
+ self.feedback_service.new_feedback.assert_not_called()
81
+
82
+ def test_post_when_missing_rating(self):
83
+ response = self.client.post('/my_company/feedback',
84
+ json={'external_user_id': 'flibe', 'message': 'test message', 'space': 'spaces/test', 'type': 'MESSAGE_TRIGGER'})
85
+
86
+ assert response.status_code == 400
87
+ assert response.json["error_message"] == 'Falta la calificación'
88
+ self.feedback_service.new_feedback.assert_not_called()
89
+
90
+ @patch("iatoolkit.views.user_feedback_view.render_template")
91
+ def test_post_when_exception(self, mock_render_template):
92
+ mock_render_template.return_value = "<html><body></body></html>"
93
+ self.feedback_service.new_feedback.side_effect = Exception('error')
94
+
95
+ response = self.client.post('/my_company/feedback',
96
+ json={
97
+ 'message': 'feedback message',
98
+ 'external_user_id': 'flibe',
99
+ 'space': 'spaces/test',
100
+ 'type': 'MESSAGE_TRIGGER',
101
+ 'rating': 4
102
+ })
103
+
104
+ assert response.status_code == 500
105
+
106
+ def test_post_when_service_error(self):
107
+ self.feedback_service.new_feedback.return_value = {'error': 'an error'}
108
+
109
+ response = self.client.post('/my_company/feedback',
110
+ json={
111
+ 'message': 'feedback message',
112
+ 'external_user_id': 'flibe',
113
+ 'space': 'spaces/test',
114
+ 'type': 'MESSAGE_TRIGGER',
115
+ 'rating': 3
116
+ })
117
+
118
+ assert response.status_code == 402
119
+ assert response.json == {'error_message': 'an error'}
120
+
121
+ def test_post_when_ok(self):
122
+ self.feedback_service.new_feedback.return_value = {'message': "Feedback guardado correctamente"}
123
+
124
+ response = self.client.post('/my_company/feedback',
125
+ json={
126
+ 'message': 'feedback message',
127
+ 'external_user_id': 'flibe',
128
+ 'space': 'spaces/test',
129
+ 'type': 'MESSAGE_TRIGGER',
130
+ 'rating': 5
131
+ })
132
+
133
+ assert response.status_code == 200
134
+ assert response.json == {'message': "Feedback guardado correctamente"}
135
+
136
+ def test_post_with_all_required_fields(self):
137
+ """Test that all required fields are passed to the service correctly"""
138
+ self.feedback_service.new_feedback.return_value = {'message': "Feedback guardado correctamente"}
139
+
140
+ test_data = {
141
+ 'message': 'test feedback message',
142
+ 'external_user_id': 'test_user_123',
143
+ 'local_user_id': 456,
144
+ 'space': 'spaces/custom-space',
145
+ 'type': 'CUSTOM_TYPE',
146
+ 'rating': 4
147
+ }
148
+
149
+ response = self.client.post('/my_company/feedback', json=test_data)
150
+
151
+ assert response.status_code == 200
152
+
153
+ # Verify service was called with all parameters
154
+ self.feedback_service.new_feedback.assert_called_once_with(
155
+ company_short_name='my_company',
156
+ message='test feedback message',
157
+ external_user_id='test_user_123',
158
+ local_user_id=456,
159
+ space='spaces/custom-space',
160
+ type='CUSTOM_TYPE',
161
+ rating=4
162
+ )
163
+
164
+ def test_post_with_optional_local_user_id(self):
165
+ """Test that local_user_id is optional and defaults to 0"""
166
+ self.feedback_service.new_feedback.return_value = {'message': "Feedback guardado correctamente"}
167
+
168
+ test_data = {
169
+ 'message': 'test feedback message',
170
+ 'external_user_id': 'test_user_123',
171
+ 'space': 'spaces/test',
172
+ 'type': 'MESSAGE_TRIGGER',
173
+ 'rating': 2
174
+ }
175
+
176
+ response = self.client.post('/my_company/feedback', json=test_data)
177
+
178
+ assert response.status_code == 200
179
+
180
+ # Verify service was called with default local_user_id
181
+ call_args = self.feedback_service.new_feedback.call_args[1]
182
+ assert call_args['local_user_id'] == 0
183
+
184
+ def test_post_with_different_rating_values(self):
185
+ """Test that different rating values are accepted"""
186
+ self.feedback_service.new_feedback.return_value = {'message': "Feedback guardado correctamente"}
187
+
188
+ # Test with rating 1
189
+ response1 = self.client.post('/my_company/feedback',
190
+ json={
191
+ 'message': 'feedback message',
192
+ 'external_user_id': 'flibe',
193
+ 'space': 'spaces/test',
194
+ 'type': 'MESSAGE_TRIGGER',
195
+ 'rating': 1
196
+ })
197
+ assert response1.status_code == 200
198
+
199
+ # Test with rating 5
200
+ response2 = self.client.post('/my_company/feedback',
201
+ json={
202
+ 'message': 'feedback message',
203
+ 'external_user_id': 'flibe',
204
+ 'space': 'spaces/test',
205
+ 'type': 'MESSAGE_TRIGGER',
206
+ 'rating': 5
207
+ })
208
+ assert response2.status_code == 200
209
+
210
+ # Verify both calls were made with correct ratings
211
+ calls = self.feedback_service.new_feedback.call_args_list
212
+ assert len(calls) == 2
213
+ assert calls[0][1]['rating'] == 1
214
+ assert calls[1][1]['rating'] == 5
@@ -0,0 +1,110 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ import pytest
7
+ from flask import Flask
8
+ from unittest.mock import MagicMock, patch
9
+ from iatoolkit.services.profile_service import ProfileService
10
+ from iatoolkit.repositories.models import Company
11
+ from iatoolkit.views.verify_user_view import VerifyAccountView
12
+ import os
13
+ from itsdangerous import SignatureExpired
14
+
15
+
16
+ class TestVerifyAccountView:
17
+ @classmethod
18
+ def setup_class(cls):
19
+ cls.patcher = patch.dict(os.environ, {"USER_VERIF_KEY": "mocked_secret_key"})
20
+ cls.patcher.start()
21
+
22
+ @staticmethod
23
+ def create_app():
24
+ """Configura la aplicación Flask para pruebas."""
25
+ app = Flask(__name__)
26
+ app.testing = True
27
+ return app
28
+
29
+ @pytest.fixture(autouse=True)
30
+ def setup(self):
31
+ """Configura el cliente y los mocks antes de cada test."""
32
+ self.app = self.create_app()
33
+ self.client = self.app.test_client()
34
+ self.profile_service = MagicMock(spec=ProfileService)
35
+ self.test_company = Company(
36
+ id=1,
37
+ name="Empresa de Prueba",
38
+ short_name="test_company",
39
+ logo_file="test_logo.png"
40
+ )
41
+ self.profile_service.get_company_by_short_name.return_value = self.test_company
42
+
43
+ # Registrar la vista
44
+ view = VerifyAccountView.as_view("verify_account", profile_service=self.profile_service)
45
+ self.app.add_url_rule("/<company_short_name>/verify/<token>", view_func=view, methods=["GET"])
46
+
47
+ @patch("iatoolkit.views.verify_user_view.render_template")
48
+ def test_get_with_invalid_company(self, mock_render):
49
+ self.profile_service.get_company_by_short_name.return_value = None
50
+ response = self.client.get("/test_company/verify/<expired_token>")
51
+ assert response.status_code == 404
52
+
53
+
54
+ @patch("iatoolkit.views.verify_user_view.render_template")
55
+ @patch("iatoolkit.views.verify_user_view.URLSafeTimedSerializer")
56
+ def test_get_with_expired_token(self, mock_serializer_class, mock_render_template):
57
+ # Configura que el serializer lance una excepción de expiración
58
+ mock_serializer = mock_serializer_class.return_value
59
+ mock_serializer.loads.side_effect = SignatureExpired('error')
60
+
61
+ mock_render_template.return_value = "<html><body><h1>Signup Page</h1></body></html>"
62
+ response = self.client.get("/test_company/verify/<expired_token>")
63
+
64
+ assert response.status_code == 400
65
+
66
+ @patch("iatoolkit.views.verify_user_view.render_template")
67
+ @patch("iatoolkit.views.verify_user_view.URLSafeTimedSerializer")
68
+ def test_verify_with_error(self, mock_serializer, mock_render_template):
69
+ # Simula que el token es válido y contiene un email
70
+ mock_serializer.return_value.loads.return_value = "nonexistent@email.com"
71
+ mock_render_template.return_value = "<html><body><h1>Signup Page</h1></body></html>"
72
+ self.profile_service.verify_account.return_value = {'error': 'invalid link'}
73
+
74
+ response = self.client.get("/test_company/verify/<valid_token>")
75
+ assert response.status_code == 400
76
+
77
+ @patch("iatoolkit.views.verify_user_view.render_template")
78
+ @patch("iatoolkit.views.verify_user_view.URLSafeTimedSerializer")
79
+ def test_verify_ok(self, mock_serializer, mock_render_template):
80
+ # Simula que el token es válido y contiene un email
81
+ mock_serializer.return_value.loads.return_value = "nonexistent@email.com"
82
+ mock_render_template.return_value = "<html><body><h1>Signup Page</h1></body></html>"
83
+ self.profile_service.verify_account.return_value = {"message": "account verified"}
84
+
85
+ response = self.client.get("/test_company/verify/<valid_token>")
86
+
87
+ mock_render_template.assert_called_once_with(
88
+ "login.html",
89
+ company=self.test_company,
90
+ company_short_name='test_company',
91
+ alert_icon='success',
92
+ alert_message="account verified"
93
+ )
94
+
95
+ assert response.status_code == 200
96
+
97
+ @patch("iatoolkit.views.verify_user_view.render_template")
98
+ @patch("iatoolkit.views.verify_user_view.URLSafeTimedSerializer")
99
+ def test_post_unexpected_error(self, mock_serializer, mock_render_template):
100
+ mock_serializer.return_value.loads.return_value = "nonexistent@email.com"
101
+ self.profile_service.verify_account.side_effect = Exception('an error')
102
+ response = self.client.get("/test_company/verify/<valid_token>")
103
+
104
+ mock_render_template.assert_called_once_with(
105
+ "error.html",
106
+ company=self.test_company,
107
+ company_short_name='test_company',
108
+ message="Ha ocurrido un error inesperado."
109
+ )
110
+ assert response.status_code == 500
@@ -1,80 +0,0 @@
1
- common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- common/auth.py,sha256=kKBvZoIm8RPpPFZ6KEm1oowHJfJwSO0mf10Yac8SG9k,8456
3
- common/exceptions.py,sha256=EXx40n5htp7UiOM6P1xfJ9U6NMcADqm62dlFaKz7ICU,1154
4
- common/routes.py,sha256=_1ywiXorwEeJ8IAamQwSxU9z8jlAAL_U64tMb01-zFg,4188
5
- common/session_manager.py,sha256=7D_RuJs60w-1zDr3fOGEz9JW7IZlSXuUHgUT87CzaUo,472
6
- common/util.py,sha256=5zw1wL_FdPBibGJbQAl1kozgTjUpsOZlPqT3tbWsHp4,15515
7
- iatoolkit/__init__.py,sha256=GkFxAQHKPifz4Kd8M73Rc8TWRVIxjxkl1N0nsPvb_sU,1743
8
- iatoolkit/base_company.py,sha256=WmD4o0qFC1n5DW5eRsRsuNfaGot9nxGFcJe3LmibSuE,4259
9
- iatoolkit/cli_commands.py,sha256=BGuThg19eoSssrBJIqzBNaWpMmyy7u4yRUz0JA7d-vc,2270
10
- iatoolkit/company_registry.py,sha256=tduqt3oV8iDX_IB1eA7KIgvIxE4edTcy-3qZIXh3Lzw,2549
11
- iatoolkit/iatoolkit.py,sha256=bbwLkLS_xZGNS0Dki3zX73RhAYMS32IshXDIdr_RVXg,15776
12
- iatoolkit/system_prompts/format_styles.prompt,sha256=MSMe1qvR3cF_0IbFshn8R0z6Wx6VCHQq1p37rpu5wwk,3576
13
- iatoolkit/system_prompts/query_main.prompt,sha256=w_9ybgWgiQH4V_RbAXqsvz0M7oOuiyhxcwf-D0CgfA4,3017
14
- iatoolkit/system_prompts/sql_rules.prompt,sha256=y4nURVnb9AyFwt-lrbMNBHHtZlhk6kC9grYoOhRnrJo,59174
15
- infra/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
16
- infra/call_service.py,sha256=170qCNJb_9caUiEi8PprQaqSUS3Rj7XmU917J2-m62I,4919
17
- infra/gemini_adapter.py,sha256=MLesq8Oyx_Jd6-cSA_41zC1UtDM6CMino054NEybOJM,15031
18
- infra/google_chat_app.py,sha256=XHyFQyX92ztpJQLvNx4mKPjbR2x7_15t_dcpVqW25ZQ,1927
19
- infra/llm_client.py,sha256=cN1uaZxOP7H8LkmFpSpQMesBH3Pg1LKJuent4r1yovg,18548
20
- infra/llm_proxy.py,sha256=qBird4-k3Z8ABECvnWXbljXCQWx2q6RTmylJZQLDk4U,5684
21
- infra/llm_response.py,sha256=YUUQPBHzmP3Ce6-t0kKMRIpowvh7de1odSoefEByIvI,904
22
- infra/mail_app.py,sha256=eWSOz5uWf-KmZoUJbYFPad-0uWP2LekINAamDYbxYpg,6093
23
- infra/openai_adapter.py,sha256=roPrp-DJWcHHhOXdUttsgwfhJpMhHNy1RpkdzVKQMFo,3510
24
- infra/redis_session_manager.py,sha256=Dkwii8fns0_Vd9hm9GmotmrKtSCxVps868U5sqj7FAE,2278
25
- infra/connectors/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
26
- infra/connectors/file_connector.py,sha256=HOjRTFd-WfDOcFyvHncAhnGNZuFgChIwC-P6osPo9ZM,352
27
- infra/connectors/file_connector_factory.py,sha256=xa4hphbeNVt0l4nn_mNbBT31lgn-OMlIQ8TtXpgN42M,2068
28
- infra/connectors/google_cloud_storage_connector.py,sha256=5KDZlT7ndgkqFOC3SebrmSQpP2zSb3KnSBVXWWt7Alg,2040
29
- infra/connectors/google_drive_connector.py,sha256=MyRECNWvLf5j-YvNwokcwihRS1WhZnBDUjx8tSup2L0,2527
30
- infra/connectors/local_file_connector.py,sha256=FO9_HFGKRE_GQqOjyWuIHyNFXYUgro39CxxqEcXUq1c,1719
31
- infra/connectors/s3_connector.py,sha256=M91gWnOgyCYIsoB0xka2oSaOTL4gDgjfjHwZi20jgnw,1113
32
- repositories/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
33
- repositories/database_manager.py,sha256=UWOZhbUjNQV0yoL9xevuAnxV2OuBkMaxu5nqaqMuMQE,3098
34
- repositories/document_repo.py,sha256=dq41jj5hBOd6mRKdaSRMhyiHk12ukX43njVyLuuGl44,1094
35
- repositories/llm_query_repo.py,sha256=NF8Ybye_sMVvzeQGa_5MGJup0AFvl_P1Z0oCsr2Wz0Y,3592
36
- repositories/models.py,sha256=RJH0dtq2VIDJFaFDufV05NUnNW4WtNpdTjhONtfLyCw,13179
37
- repositories/profile_repo.py,sha256=JWbClu9SM18koUceLQdeuT5DA37h6ij5aeK-nwoRgIk,4042
38
- repositories/tasks_repo.py,sha256=cCg4uz8ou4tkx7yzmktEV4lfQjQBU-RylcqUof2dytY,1725
39
- repositories/vs_repo.py,sha256=PP6iPf0rt64rMyvqg-ffJk__sLbT2wgxx3dta3o8Vuo,5270
40
- services/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
41
- services/benchmark_service.py,sha256=_ruKh9YzrTLtR0ZKrRNxqJQW0HdbwWuFz1gfLzJ9owA,5850
42
- services/dispatcher_service.py,sha256=y2J-TfrkoCcsOESr3E6E3q5bleJfRibT4ONxs9AxUSg,13959
43
- services/document_service.py,sha256=8MsJz0pihM9E9Z92PrPqDgQnpMAmpFrbogXr5HscMWM,5926
44
- services/excel_service.py,sha256=ATPaeAvkLwQAkPZ3AKIUpO73RVyRg0D8c6i37_mcql0,3559
45
- services/file_processor_service.py,sha256=98yWYF7nIq1nm7nh6IzMmTKaOMTIeqCFWYwXVtV-ZJI,4102
46
- services/history_service.py,sha256=j0QCqcIIyw7DBy3GrZrEZNk0I4m-uuRoG5g0Z2RCcOE,1586
47
- services/jwt_service.py,sha256=YoZ9h7_o9xBko-arNQv4MbcwnxoSWVNj4VbZmMo_QGY,3908
48
- services/load_documents_service.py,sha256=UGfomYz7seWFXawbDuk2t6CyoEr1vggR8vmrCUAeLBg,7190
49
- services/mail_service.py,sha256=_67pctxZO46DHnWBip51ayuYtWd4bEoS1kg29ACO7_I,2162
50
- services/profile_service.py,sha256=vTK9TvH_2AFdqgL3sGjhck9LyLGIbvdC2USoaRx82G8,17561
51
- services/prompt_manager_service.py,sha256=7SMC6N_T4BP4m5-ZNYAL3Y2YWHwl1bytXSgnEqu5bWI,8301
52
- services/query_service.py,sha256=gvUnq0Vpn4gv5ycQk8-fklh7NDFIXpO1Vt1lT2ugO6Q,15283
53
- services/search_service.py,sha256=bB3FWFxJi1iYsOdBxyu9tzIO406nQxcyeQzEowpmpjY,1803
54
- services/sql_service.py,sha256=s84K1ADlvMtum949wgMh8jsmqlOUeL-m_SWfAM4Wsv4,2141
55
- services/tasks_service.py,sha256=1DdbERlAxIkCpGEylnHDKC-KAsXRJugbaRSzRbPfL58,6790
56
- services/user_feedback_service.py,sha256=_LeNBYz4hHFapXfYTQVfkkD34gE8j2UeKnyOZ8H0nWo,2442
57
- services/user_session_context_service.py,sha256=GluNSgqP6W_hFke4oslSnfGnU_b-ph28BHH6jf3EIm0,3797
58
- views/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
59
- views/change_password_view.py,sha256=KY6mf25Vc-rJn8pTLuJlkIHB7j9_NI0UoxIWod32qpM,3930
60
- views/chat_token_request_view.py,sha256=7Bgf7rOVdgo4u4nU4lZWk87wi_D9_-sYxB9zBuL8TcA,4388
61
- views/chat_view.py,sha256=XvKJApeJPU9uoH0XpHusehNbge3dDwwr72iMcuBveBY,2048
62
- views/download_file_view.py,sha256=AIHLURyPi7w0k_Rs_fqz0yOp1Hav8K73AC5Bxx4vzf4,1980
63
- views/external_chat_login_view.py,sha256=pz8EPmTSrYHpr3WbfYYBbPvSKaDJ9taOro4bMqTAZZE,3732
64
- views/external_login_view.py,sha256=2NPzdxIqw1zvRHcsKOVvL896mE9B4GCUI6gBW7LsZCU,1335
65
- views/file_store_view.py,sha256=591Kc2QR7SdxMrcJcL1ciMEwRopCpqYbmODL4XZ2SU8,1913
66
- views/forgot_password_view.py,sha256=7W2VP3nZlUdgGLv-zc7Pj5wa7OsT3K66t6fkntrSPzI,2705
67
- views/history_view.py,sha256=nkvV6Dg6SrVWZsWQJaCpy7D9VygwXDQF5FVanhzHdeo,2044
68
- views/home_view.py,sha256=lQvDYUJ1X-xu0GuJcZJwF9iW74d834_q8fCkLgqo6j4,1238
69
- views/llmquery_view.py,sha256=_CsbtFQFRuGCe50TWJDtTSUyaM3kMMwkn54kVuxMEQw,2412
70
- views/login_view.py,sha256=s2FQPo8EuJCWPoC2hs1Wyqh8rY6Dc_5HmiL9b9GLhho,2322
71
- views/prompt_view.py,sha256=ARuZ64EYjBhMAClUvjeFcr7zcgZUt2rEktbUvqpiE2U,1237
72
- views/signup_view.py,sha256=Jn2F0gGBDmyUYt4vo0fw2UMHoJblau-Be62zNAMas50,3795
73
- views/tasks_review_view.py,sha256=nvxdUJowfpgrJk0m8quxYg4iw5BZOhZhpDpPt5-wsDI,3368
74
- views/tasks_view.py,sha256=TWW48wzcJzqIPat1kSRx41Et92-wLr-wCkgypWYZ7dk,4090
75
- views/user_feedback_view.py,sha256=inZoNl5YnEq9_2FXOVvzKymXuSPELLmi9zPNG3zQxEQ,2632
76
- views/verify_user_view.py,sha256=0hRKIudox7KjxZDH973trUhw4fZtc7eiLz6R44QbIG8,2341
77
- iatoolkit-0.7.10.dist-info/METADATA,sha256=P78xA38vWo7UMf4r-4QHKiinE3VPxT6B7O7EsG-36EQ,9301
78
- iatoolkit-0.7.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
79
- iatoolkit-0.7.10.dist-info/top_level.txt,sha256=ZXCST2AUsVPIeMiz49ZFn7WEfIiO4d8BfWY9QzUqP0s,51
80
- iatoolkit-0.7.10.dist-info/RECORD,,
@@ -1,6 +0,0 @@
1
- common
2
- iatoolkit
3
- infra
4
- repositories
5
- services
6
- views
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes