"""Tests for track_audit model functions.""" import datetime import pytest from sqlalchemy import create_engine from sqlalchemy import pool from sqlalchemy.orm import sessionmaker from backend.connectors import mysql from backend.constants import mysql as mysql_consts from backend.models import track_audit from tests.testutils import db @pytest.fixture def audit_entry_args(): """Dict with values to create audit entry.""" return { 'source_tuid': 1, 'destination_tuid': 2, 'source_product_id': 3, 'destination_product_id': 4, 'orchard_user_id': 'alw:123', 'action': 'import', 'created_date': datetime.datetime.utcnow() } @pytest.fixture def expected_audit_data(audit_entry_args): """Expected return value from track_audit.create_log_entries.""" first_entry = audit_entry_args.copy() first_entry['record_id'] = 1 first_entry['audit_metadata'] = None second_entry = audit_entry_args.copy() second_entry['destination_tuid'] = 2 second_entry['record_id'] = 2 second_entry['audit_metadata'] = None return [first_entry, second_entry] @db.test_schema def test_create_track_audit_entry(audit_entry_args, expected_audit_data): """Should create TrackAudit entry in ows-track DB.""" with mysql.ows_track_db_session() as write_session: audit_entry = track_audit.TrackAudit(**audit_entry_args) write_session.add(audit_entry) with mysql.ows_track_db_session() as read_session: audit_entry = read_session.query(track_audit.TrackAudit).first() audit_data = audit_entry.to_dict() assert audit_data == expected_audit_data[0] def test_create_track_audit_entry_bad_session( mocker, audit_entry_args, expected_audit_data): """Should create TrackAudit entry in ows-track DB.""" db_engine = create_engine( 'mysql+pymysql://None', poolclass=pool.StaticPool, connect_args={'connect_timeout': 0}) mocker.patch.dict( mysql.sessions, {mysql_consts.OWS_TRACK: sessionmaker(bind=db_engine)}) mock_sentry_capture_exception = mocker.patch('backend.models.track_audit.capture_exception') track_audit_response = track_audit.create_log_entries( [audit_entry_args]) assert not track_audit_response assert mock_sentry_capture_exception.called @db.test_schema def test_create_audit_entries_via_helper( audit_entry_args, expected_audit_data): """Should create TrackAudit entries.""" several_entries = [audit_entry_args] * 2 track_audit_response = track_audit.create_log_entries( several_entries) assert track_audit_response.message == expected_audit_data with mysql.ows_track_db_session() as read_session: audit_entries = read_session.query(track_audit.TrackAudit).all() audit_entries = [entry.to_dict() for entry in audit_entries] assert audit_entries == expected_audit_data