"""Lambda test module.""" import pytest from src import app as index from src.app import UnsupportedEngine def test_handler_no_scripts(mocker): """Test handler function with no sanitisation scripts provided.""" mock_reset_credentials = mocker.patch( 'src.logic.database.reset_rds_master_credentials', side_effect=( { 'host': 'src-host', 'username': 'src-username', 'password': 'src-password' }, { 'host': 'target-host', 'username': 'target-username', 'password': 'target-password' } )) mock_wait_for_pending_modifications = mocker.patch( 'src.logic.database.wait_for_pending_modifications', return_value=None ) mock_copy_users = mocker.patch( 'src.logic.mysql.copy_users', return_value=5) mocker.patch( 'src.logic.secrets.get_role_passwords', return_value={}) result = index.handler({ 'engine': 'aurora-mysql', 'users_source_db': { 'name': 'src-db', 'type': 'cluster' }, 'target_db': { 'name': 'target-db', 'type': 'cluster' } }, None) assert mock_reset_credentials.call_count == 2 mock_reset_credentials.assert_any_call('src-db', 'cluster', wait=False) mock_reset_credentials.assert_any_call('target-db', 'cluster', wait=False) mock_wait_for_pending_modifications.assert_any_call('src-db', 'cluster') mock_wait_for_pending_modifications.assert_any_call('target-db', 'cluster') mock_copy_users.assert_called_once_with( { 'host': 'src-host', 'username': 'src-username', 'password': 'src-password' }, { 'host': 'target-host', 'username': 'target-username', 'password': 'target-password' }, {} ) assert result == { 'scripts_run': 0, 'users_created': 5 } def test_handler_with_scripts(mocker): """Test handler function with sanitisation scripts provided.""" mock_reset_credentials = mocker.patch( 'src.logic.database.reset_rds_master_credentials', side_effect=( { 'host': 'src-host', 'username': 'src-username', 'password': 'src-password' }, { 'host': 'target-host', 'username': 'target-username', 'password': 'target-password' } )) mock_wait_for_pending_modifications = mocker.patch( 'src.logic.database.wait_for_pending_modifications', return_value=None ) mock_run_scripts = mocker.patch( 'src.logic.mysql.run_scripts', return_value=2) mock_copy_users = mocker.patch( 'src.logic.mysql.copy_users', return_value=5) mocker.patch( 'src.logic.secrets.get_role_passwords', return_value={'app_login': 's3cret'}) result = index.handler({ 'scripts_dir': 'scripts/test', 'engine': 'aurora-mysql', 'users_source_db': { 'name': 'src-db', 'type': 'cluster' }, 'target_db': { 'name': 'target-db', 'type': 'cluster' } }, None) assert mock_reset_credentials.call_count == 2 mock_reset_credentials.assert_any_call('src-db', 'cluster', wait=False) mock_reset_credentials.assert_any_call('target-db', 'cluster', wait=False) mock_wait_for_pending_modifications.assert_any_call('src-db', 'cluster') mock_wait_for_pending_modifications.assert_any_call('target-db', 'cluster') mock_run_scripts.assert_called_once_with({ 'host': 'target-host', 'username': 'target-username', 'password': 'target-password' }, 'scripts/test') mock_copy_users.assert_called_once_with( { 'host': 'src-host', 'username': 'src-username', 'password': 'src-password' }, { 'host': 'target-host', 'username': 'target-username', 'password': 'target-password' }, {'app_login': 's3cret'} ) assert result == { 'scripts_run': 2, 'users_created': 5 } def test_handler_postgres_engine_dispatch(mocker): """Test handler dispatches to postgresql logic for a postgres engine.""" mocker.patch( 'src.logic.database.reset_rds_master_credentials', side_effect=( { 'host': 'src-host', 'username': 'src-username', 'password': 'src-password' }, { 'host': 'target-host', 'username': 'target-username', 'password': 'target-password' } )) mocker.patch( 'src.logic.database.wait_for_pending_modifications', return_value=None) mock_pg_copy_users = mocker.patch( 'src.logic.postgresql.copy_users', return_value=3) mock_pg_run_scripts = mocker.patch( 'src.logic.postgresql.run_scripts', return_value=1) mock_mysql_copy_users = mocker.patch( 'src.logic.mysql.copy_users', return_value=99) mock_get_role_passwords = mocker.patch( 'src.logic.secrets.get_role_passwords', return_value={'app_login': 's3cret'}) result = index.handler({ 'scripts_dir': 'scripts/test', 'engine': 'aurora-postgresql', 'users_source_db': { 'name': 'src-db', 'type': 'cluster' }, 'target_db': { 'name': 'target-db', 'type': 'cluster' } }, None) mock_get_role_passwords.assert_called_once_with('target-db') mock_pg_copy_users.assert_called_once() # The fetched password map is forwarded to copy_users. assert mock_pg_copy_users.call_args[0][2] == {'app_login': 's3cret'} mock_pg_run_scripts.assert_called_once() mock_mysql_copy_users.assert_not_called() assert result == { 'scripts_run': 1, 'users_created': 3 } def test_handler_unsupported_engine(): """Test handler raises for an unsupported engine.""" with pytest.raises(UnsupportedEngine): index.handler({ 'engine': 'oracle', 'users_source_db': {'name': 'src-db', 'type': 'cluster'}, 'target_db': {'name': 'target-db', 'type': 'cluster'} }, None) def test_handler_missing_engine(): """Test handler raises when no engine is provided.""" with pytest.raises(UnsupportedEngine): index.handler({ 'users_source_db': {'name': 'src-db', 'type': 'cluster'}, 'target_db': {'name': 'target-db', 'type': 'cluster'} }, None)