"""Test file for project model.""" import datetime from unittest.mock import MagicMock import pytest from project_manager.connector import mysql from project_manager.models import project from project_manager.util import error_handling from tests.utils import db @pytest.fixture def project_data(): """Data used to create a release.""" return { 'project_id': 12345, 'project_code': 'project-code', 'vendor_id': 7123, 'subaccount_id': 0, 'project_name': 'Awesome Project', 'created_date_utc': datetime.date(2017, 7, 7), 'updated_date_utc': datetime.date(2016, 7, 8), 'correlation_id': None, 'artist_id': 13579, 'description': 'Totes awesome project about stuff', 'deletions': 'N'} def test_to_dict_properties(project_data): """Test that the expected properties are returned.""" new_project = project.Project(**project_data) assert new_project.to_dict() == { 'project_id': new_project.project_id, 'project_code': new_project.project_code, 'vendor_id': new_project.vendor_id, 'subaccount_id': new_project.subaccount_id, 'project_name': new_project.project_name, 'created_date_utc': new_project.created_date_utc, 'updated_date_utc': new_project.updated_date_utc, 'correlation_id': new_project.correlation_id, 'artist_id': new_project.artist_id, 'description': new_project.description, 'deletions': new_project.deletions} def test_delete_project(db_fixture): """Test that the given project is soft deleted.""" db.insert_project() project_id = 1 with mysql.pm_session_scope() as session: existing_project = session.query(project.Project).get(project_id) assert existing_project delete_result = project.delete_project(project_id) with mysql.pm_session_scope() as session: existing_project = session.query(project.Project).get(project_id) assert existing_project assert existing_project.deletions == 'Y' assert delete_result.status == 200 def test_delete_project_when_not_found(db_fixture): """Test that the given project is not found and error returned.""" delete_result = project.delete_project(1) assert delete_result.status == 404 def test_delete_project_when_db_error(db_exception, mocker): """Test that the db exception is handled.""" mock_session = db.mock_db_session(mocker) mock_session.query.side_effect = db_exception mocker.patch.object(error_handling, 'log_db_exception', MagicMock()) delete_result = project.delete_project(1) assert delete_result.status == 500 error_handling.log_db_exception.assert_called_once_with(db_exception) def test_hard_delete_project(db_fixture): """Test that the given project is hard deleted.""" db.insert_project() project_id = 1 with mysql.pm_session_scope() as session: existing_project = session.query(project.Project).get(project_id) assert existing_project delete_result = project.hard_delete_project(project_id) with mysql.pm_session_scope() as session: existing_project = session.query(project.Project).get(project_id) assert not existing_project assert delete_result.status == 200 def test_fetch_project(db_fixture): """Test that the given project is fetched.""" db.insert_project() project_id = 1 result = project.get_project_instance(project_id) assert result.status == 200