iatoolkit 0.8.1__py3-none-any.whl → 0.8.2__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 (70) hide show
  1. {iatoolkit-0.8.1.dist-info → iatoolkit-0.8.2.dist-info}/METADATA +1 -1
  2. {iatoolkit-0.8.1.dist-info → iatoolkit-0.8.2.dist-info}/RECORD +4 -70
  3. {iatoolkit-0.8.1.dist-info → iatoolkit-0.8.2.dist-info}/top_level.txt +0 -1
  4. tests/__init__.py +0 -5
  5. tests/common/__init__.py +0 -0
  6. tests/common/test_auth.py +0 -279
  7. tests/common/test_routes.py +0 -42
  8. tests/common/test_session_manager.py +0 -59
  9. tests/common/test_util.py +0 -444
  10. tests/companies/__init__.py +0 -5
  11. tests/conftest.py +0 -36
  12. tests/infra/__init__.py +0 -5
  13. tests/infra/connectors/__init__.py +0 -5
  14. tests/infra/connectors/test_google_drive_connector.py +0 -107
  15. tests/infra/connectors/test_local_file_connector.py +0 -85
  16. tests/infra/connectors/test_s3_connector.py +0 -95
  17. tests/infra/test_call_service.py +0 -92
  18. tests/infra/test_database_manager.py +0 -59
  19. tests/infra/test_gemini_adapter.py +0 -137
  20. tests/infra/test_google_chat_app.py +0 -68
  21. tests/infra/test_llm_client.py +0 -165
  22. tests/infra/test_llm_proxy.py +0 -122
  23. tests/infra/test_mail_app.py +0 -94
  24. tests/infra/test_openai_adapter.py +0 -105
  25. tests/infra/test_redis_session_manager_service.py +0 -117
  26. tests/repositories/__init__.py +0 -5
  27. tests/repositories/test_database_manager.py +0 -87
  28. tests/repositories/test_document_repo.py +0 -76
  29. tests/repositories/test_llm_query_repo.py +0 -340
  30. tests/repositories/test_models.py +0 -38
  31. tests/repositories/test_profile_repo.py +0 -142
  32. tests/repositories/test_tasks_repo.py +0 -76
  33. tests/repositories/test_vs_repo.py +0 -107
  34. tests/services/__init__.py +0 -5
  35. tests/services/test_dispatcher_service.py +0 -274
  36. tests/services/test_document_service.py +0 -181
  37. tests/services/test_excel_service.py +0 -208
  38. tests/services/test_file_processor_service.py +0 -121
  39. tests/services/test_history_service.py +0 -164
  40. tests/services/test_jwt_service.py +0 -255
  41. tests/services/test_load_documents_service.py +0 -112
  42. tests/services/test_mail_service.py +0 -70
  43. tests/services/test_profile_service.py +0 -379
  44. tests/services/test_prompt_manager_service.py +0 -190
  45. tests/services/test_query_service.py +0 -243
  46. tests/services/test_search_service.py +0 -39
  47. tests/services/test_sql_service.py +0 -160
  48. tests/services/test_tasks_service.py +0 -252
  49. tests/services/test_user_feedback_service.py +0 -389
  50. tests/services/test_user_session_context_service.py +0 -132
  51. tests/views/__init__.py +0 -5
  52. tests/views/test_change_password_view.py +0 -191
  53. tests/views/test_chat_token_request_view.py +0 -188
  54. tests/views/test_chat_view.py +0 -98
  55. tests/views/test_download_file_view.py +0 -149
  56. tests/views/test_external_chat_login_view.py +0 -120
  57. tests/views/test_external_login_view.py +0 -102
  58. tests/views/test_file_store_view.py +0 -128
  59. tests/views/test_forgot_password_view.py +0 -142
  60. tests/views/test_history_view.py +0 -336
  61. tests/views/test_home_view.py +0 -61
  62. tests/views/test_llm_query_view.py +0 -154
  63. tests/views/test_login_view.py +0 -114
  64. tests/views/test_prompt_view.py +0 -111
  65. tests/views/test_signup_view.py +0 -140
  66. tests/views/test_tasks_review_view.py +0 -104
  67. tests/views/test_tasks_view.py +0 -130
  68. tests/views/test_user_feedback_view.py +0 -214
  69. tests/views/test_verify_user_view.py +0 -110
  70. {iatoolkit-0.8.1.dist-info → iatoolkit-0.8.2.dist-info}/WHEEL +0 -0
@@ -1,214 +0,0 @@
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
@@ -1,110 +0,0 @@
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