"""Tests for label copy export history model.""" from datetime import datetime from unittest.mock import MagicMock import pytest import sentry_sdk from sqlalchemy.exc import SQLAlchemyError from project_manager.connector import mysql from project_manager.constant import lce_history from project_manager.models import label_copy_history as history @pytest.fixture def job_data(): """Dictionary with data suitable to create Job object.""" return { 'status': lce_history.GENERATION_STATUSES[0], 'user_id': 'oa:1234', 'project_id': 8765432, } def test_job_to_dict(test_lce_database, job_data): """Assert Job object can convert itself to dict.""" job_obj = history.Job(**job_data) with mysql.lce_session_scope() as session: session.add(job_obj) session.commit() job_obj = session.query(history.Job).first() job_data['job_id'] = 1 job_data['last_change_date'] = job_obj.last_change_date assert job_obj.to_dict() == job_data def test_manual_job_last_change_date_raises_exc(test_lce_database, job_data): """Assert can not change Job.last_change_date directly.""" job_obj = history.Job(**job_data) with mysql.lce_session_scope() as session: session.add(job_obj) job_obj = session.query(history.Job).first() initial_change_date = job_obj.last_change_date manual_change_date = datetime.utcnow() with pytest.raises(AttributeError): job_obj.last_change_date = manual_change_date with mysql.lce_session_scope() as session: job_obj = session.query(history.Job).first() assert initial_change_date < manual_change_date assert initial_change_date == job_obj.last_change_date def test_create_job(test_lce_database, job_data): """Test inserting single job into table.""" result = history.create_job(**job_data) with mysql.lce_session_scope() as session: job_obj = session.query(history.Job).first() assert job_obj.to_dict()['project_id'] == job_data['project_id'] assert result.status == 200 def test_create_job_exception(job_data, monkeypatch): """Test create job for exception.""" monkeypatch.setattr( mysql, 'lce_session_scope', MagicMock(side_effect=SQLAlchemyError)) monkeypatch.setattr(sentry_sdk, 'capture_exception', MagicMock()) result = history.create_job(**job_data) assert result.status == 500 sentry_sdk.capture_exception.assert_called_once() def test_get_job_by_project_id(test_lce_database, job_data): """Test get job by project id success.""" job_data['status'] = lce_history.COMPLETED history.create_job(**job_data) result = history.get_job_by_project_id(job_data['project_id']) assert result.status == 200 assert result.message.to_dict()['project_id'] == job_data['project_id'] def test_get_job_by_project_id_job_not_completed(test_lce_database, job_data): """Test get job by id job not completed.""" exp_msg = "Metadata for project {id} doesn\'t exist.".format( id=job_data['project_id']) history.create_job(**job_data) result = history.get_job_by_project_id(job_data['project_id']) assert result.status == 404 assert result.errors['message'] == exp_msg def test_get_job_by_project_id_job_no_such_job(test_lce_database, job_data): """Test get job by id job doesn't exist.""" exp_msg = "Metadata for project {id} doesn\'t exist.".format( id=job_data['project_id']) result = history.get_job_by_project_id(job_data['project_id']) assert result.status == 404 assert result.errors['message'] == exp_msg def test_get_job_by_project_id_job_exception(monkeypatch, job_data): """Test get job by id job exception.""" monkeypatch.setattr( mysql, 'lce_session_scope', MagicMock(side_effect=SQLAlchemyError)) monkeypatch.setattr(sentry_sdk, 'capture_exception', MagicMock()) result = history.get_job_by_project_id(job_data['project_id']) assert result.status == 500 sentry_sdk.capture_exception.assert_called_once()