"""Tests for hive text recognition handler endpoints.""" import json from unittest.mock import MagicMock, patch from flask.ctx import AppContext from flask.testing import FlaskClient from sqlalchemy.exc import SQLAlchemyError from assets.constants import authorization, error from assets.exceptions import AssetFinalNotFound, HiveTextRecognitionExists VALID_PAYLOAD = { "asset_final_id": 12345, "block_text": "extracted text from image", } @patch("assets.logic.hive_text_recognition.save_hive_text_recognition") @patch("assets.utils.handlers.g") def test_save_hive_text_recognition_success( mock_g: MagicMock, mock_save: MagicMock, fixture_client: FlaskClient, fixture_app: AppContext, ) -> None: """Test POST /hive-text-recognition returns 200 on success.""" mock_g.request_context.jwt_identity_id = authorization.HIVE_TEXT_RECOGNITION_UUID mock_save.return_value = None result = fixture_client.post("/hive-text-recognition", json=VALID_PAYLOAD) assert result.status_code == 200 mock_save.assert_called_once_with(VALID_PAYLOAD) assert json.loads(result.data.decode()) == {"status": error.SUCCESS_CODE} @patch("assets.logic.hive_text_recognition.save_hive_text_recognition") @patch("assets.utils.handlers.g") def test_save_hive_text_recognition_conflict( mock_g: MagicMock, mock_save: MagicMock, fixture_client: FlaskClient, fixture_app: AppContext, ) -> None: """Test POST /hive-text-recognition returns 409 on duplicate asset_final_id.""" mock_g.request_context.jwt_identity_id = authorization.HIVE_TEXT_RECOGNITION_UUID mock_save.side_effect = HiveTextRecognitionExists( "hive text recognition data already exists for asset_final_id 12345" ) result = fixture_client.post("/hive-text-recognition", json=VALID_PAYLOAD) assert result.status_code == 409 mock_save.assert_called_once_with(VALID_PAYLOAD) @patch("assets.logic.hive_text_recognition.save_hive_text_recognition") @patch("assets.utils.handlers.g") def test_save_hive_text_recognition_asset_final_not_found( mock_g: MagicMock, mock_save: MagicMock, fixture_client: FlaskClient, fixture_app: AppContext, ) -> None: """Test POST /hive-text-recognition returns 404 when asset_final_id does not exist.""" mock_g.request_context.jwt_identity_id = authorization.HIVE_TEXT_RECOGNITION_UUID mock_save.side_effect = AssetFinalNotFound(error.ERROR_ASSET_FINAL_NOT_FOUND) result = fixture_client.post("/hive-text-recognition", json=VALID_PAYLOAD) assert result.status_code == 404 mock_save.assert_called_once_with(VALID_PAYLOAD) @patch("assets.logic.hive_text_recognition.save_hive_text_recognition") @patch("assets.utils.handlers.g") def test_save_hive_text_recognition_missing_jwt( mock_g: MagicMock, mock_save: MagicMock, fixture_client: FlaskClient, fixture_app: AppContext, ) -> None: """Test POST /hive-text-recognition returns 401 without a JWT.""" mock_g.request_context.jwt_identity_id = "" result = fixture_client.post("/hive-text-recognition", json=VALID_PAYLOAD) assert result.status_code == 401 mock_save.assert_not_called() @patch("assets.logic.hive_text_recognition.save_hive_text_recognition") @patch("assets.utils.handlers.g") def test_save_hive_text_recognition_invalid_jwt( mock_g: MagicMock, mock_save: MagicMock, fixture_client: FlaskClient, fixture_app: AppContext, ) -> None: """Test POST /hive-text-recognition returns 403 with an unrecognized JWT.""" mock_g.request_context.jwt_identity_id = "invalid-uuid" result = fixture_client.post("/hive-text-recognition", json=VALID_PAYLOAD) assert result.status_code == 403 mock_save.assert_not_called() @patch("assets.logic.hive_text_recognition.get_hive_text_recognition_by_product") @patch("assets.utils.handlers.g") def test_get_hive_text_recognition_success( mock_g: MagicMock, mock_get: MagicMock, fixture_client: FlaskClient, fixture_app: AppContext, ) -> None: """Test GET /v2/asset/product//image-text-extract returns 200 on success.""" mock_g.request_context.jwt_identity_id = authorization.HIVE_TEXT_RECOGNITION_UUID expected_data = {"asset_final_id": 101, "block_text": "extracted text"} mock_get.return_value = expected_data result = fixture_client.get("/v2/asset/product/1001/image-text-extract") assert result.status_code == 200 mock_get.assert_called_once_with(1001) response_data = json.loads(result.data.decode()) assert response_data["result"] == expected_data @patch("assets.logic.hive_text_recognition.get_hive_text_recognition_by_product") @patch("assets.utils.handlers.g") def test_get_hive_text_recognition_failure( mock_g: MagicMock, mock_get: MagicMock, fixture_client: FlaskClient, fixture_app: AppContext, ) -> None: """Test GET /v2/asset/product//image-text-extract returns 500 on error.""" mock_g.request_context.jwt_identity_id = authorization.HIVE_TEXT_RECOGNITION_UUID mock_get.side_effect = SQLAlchemyError("database error") result = fixture_client.get("/v2/asset/product/1001/image-text-extract") assert result.status_code == 500 mock_get.assert_called_once_with(1001)