"""Tests for asset_status model.""" import datetime from flexmock import flexmock import pytest from sqlalchemy.exc import SQLAlchemyError from assets.connectors import mysql from assets.models import asset_status from tests.models import au_operations @pytest.fixture def valid_asset_status_data(): """Fixture for valid data for create_asset_status.""" return { 'asset_upload_id': 3, 'status': 'success', 'description': None, 'message': 'Message' } @pytest.fixture def asset_status_data(): """Fixture for asset_status table.""" return [{ 'asset_upload_id': 1, 'status': 'error', 'description': 'Description', 'message': '', 'status_time': datetime.datetime(2000, 1, 1, 0, 0, 1) }, { 'asset_upload_id': 1, 'status': 'success', 'description': '', 'message': 'Message', 'status_time': datetime.datetime(2001, 2, 2, 0, 0, 1) }, { 'asset_upload_id': 2, 'status': 'error', 'description': 'Description', 'message': '', 'status_time': datetime.datetime(2016, 1, 1, 0, 0, 1) }, { 'asset_upload_id': 2, 'status': 'success', 'description': '', 'message': 'Message', 'status_time': datetime.datetime(2017, 1, 1, 0, 0, 1) }] @pytest.fixture def db_fixture(asset_status_data): """Set up the asset_status table.""" au_operations.create_tables() au_operations.seed_asset_status_table(asset_status_data) def test_create_asset_status(db_fixture, valid_asset_status_data): """Test creating a new asset status.""" response = asset_status.create_asset_status(**valid_asset_status_data) utcnow = datetime.datetime.utcnow() assert response.status == 200 assert (response.message['asset_upload_id'] == valid_asset_status_data['asset_upload_id']) assert response.message['status'] == valid_asset_status_data['status'] assert (response.message['description'] == valid_asset_status_data['description']) assert response.message['message'] == valid_asset_status_data['message'] assert response.message['status_time'].year == utcnow.year assert response.message['status_time'].month == utcnow.month assert response.message['status_time'].day == utcnow.day def test_test_create_asset_status_error( db_fixture, valid_asset_status_data): """Test creating a new asset status with sql error.""" (flexmock(mysql) .should_receive('au_db_session') .and_raise(SQLAlchemyError(500))) response = asset_status.create_asset_status( **valid_asset_status_data) assert response.status == 500 def test_get_last_asset_status(db_fixture): """Test getting last asset status.""" response = asset_status.get_last_asset_status(2) assert response assert response.message['id'] == 4 assert response.message['status'] == 'success' def test_get_last_asset_status_not_found(db_fixture): """Test getting last asset status for non-existent asset.""" response = asset_status.get_last_asset_status(3) assert response.status == 404 def test_get_last_asset_status_error(): """Test getting last asset status with SQLAlchemyError failure.""" (flexmock(mysql) .should_receive('au_db_session') .and_raise(SQLAlchemyError(500))) response = asset_status.get_last_asset_status(1) assert response.status == 500 def test_get_asset_statuses(db_fixture): """Test getting asset statuses.""" response = asset_status.get_asset_statuses(1) assert response assert len(response.message['items']) == 2 assert response.message['items'][0]['id'] == 2 assert response.message['items'][1]['id'] == 1 def test_get_asset_statuses_not_found(db_fixture): """Test getting asset statuses for non-existent asset.""" response = asset_status.get_asset_statuses(3) assert response.status == 404 def test_get_asset_statuses_error(): """Test getting asset statuses with SQLAlchemyError failure.""" (flexmock(mysql) .should_receive('au_db_session') .and_raise(SQLAlchemyError(500))) response = asset_status.get_asset_statuses(1) assert response.status == 500