From bc84230554afb92b4c66e436e1b51c44cca3fa9a Mon Sep 17 00:00:00 2001 From: Aurélien Bompard Date: Oct 19 2020 09:35:42 +0000 Subject: [PATCH 1/2] Publish using Fedora Messaging schemas Signed-off-by: Aurélien Bompard --- diff --git a/fedora_elections/admin.py b/fedora_elections/admin.py index b24aa90..3c013fd 100644 --- a/fedora_elections/admin.py +++ b/fedora_elections/admin.py @@ -31,6 +31,13 @@ from functools import wraps import flask from sqlalchemy.exc import SQLAlchemyError from fedora.client import AuthError +from fedora_elections_messages import ( + NewElectionV1, + EditElectionV1, + NewCandidateV1, + EditCandidateV1, + DeleteCandidateV1, +) from fedora_elections import fedmsgshim from fedora_elections import forms @@ -109,13 +116,11 @@ def admin_new_election(): SESSION.commit() - fedmsgshim.publish( - topic="election.new", - msg=dict( + fedmsgshim.publish(NewElectionV1(body=dict( agent=flask.g.fas_user.username, election=election.to_json(), - ) - ) + ) + )) flask.flash('Election "%s" added' % election.alias) return flask.redirect(flask.url_for( @@ -197,13 +202,11 @@ def admin_view_election(election_alias): SESSION.delete(admingrp) SESSION.commit() - fedmsgshim.publish( - topic="election.edit", - msg=dict( + fedmsgshim.publish(EditElectionV1(body=dict( agent=flask.g.fas_user.username, election=election.to_json(), ) - ) + )) flask.flash('Election "%s" saved' % election.alias) return flask.redirect(flask.url_for( 'admin_view_election', election_alias=election.alias)) @@ -257,14 +260,12 @@ def admin_add_candidate(election_alias): SESSION.add(candidate) SESSION.commit() flask.flash('Candidate "%s" saved' % candidate.name) - fedmsgshim.publish( - topic="candidate.new", - msg=dict( + fedmsgshim.publish(NewCandidateV1(body=dict( agent=flask.g.fas_user.username, election=candidate.election.to_json(), candidate=candidate.to_json(), ) - ) + )) return flask.redirect(flask.url_for( 'admin_view_election', election_alias=election.alias)) @@ -328,14 +329,13 @@ def admin_add_multi_candidate(election_alias): candidates_name.append(cand.name) else: flask.flash("There was an issue!") - fedmsgshim.publish( - topic="candidate.new", - msg=dict( + continue + fedmsgshim.publish(NewCandidateV1(body=dict( agent=flask.g.fas_user.username, election=cand.election.to_json(), candidate=cand.to_json(), ) - ) + )) SESSION.commit() flask.flash('Added %s candidates' % len(candidates_name)) @@ -386,14 +386,12 @@ def admin_edit_candidate(election_alias, candidate_id): SESSION.commit() flask.flash('Candidate "%s" saved' % candidate.name) - fedmsgshim.publish( - topic="candidate.edit", - msg=dict( + fedmsgshim.publish(EditCandidateV1(body=dict( agent=flask.g.fas_user.username, election=candidate.election.to_json(), candidate=candidate.to_json(), ) - ) + )) return flask.redirect(flask.url_for( 'admin_view_election', election_alias=election.alias)) @@ -423,14 +421,12 @@ def admin_delete_candidate(election_alias, candidate_id): SESSION.delete(candidate) SESSION.commit() flask.flash('Candidate "%s" deleted' % candidate_name) - fedmsgshim.publish( - topic="candidate.delete", - msg=dict( + fedmsgshim.publish(DeleteCandidateV1(body=dict( agent=flask.g.fas_user.username, election=candidate.election.to_json(), candidate=candidate.to_json(), ) - ) + )) except SQLAlchemyError as err: SESSION.rollback() APP.logger.debug('Could not delete candidate') diff --git a/fedora_elections/fedmsgshim.py b/fedora_elections/fedmsgshim.py index ce08619..8d8eed0 100644 --- a/fedora_elections/fedmsgshim.py +++ b/fedora_elections/fedmsgshim.py @@ -15,13 +15,9 @@ from fedora_messaging.exceptions import PublishReturned, ConnectionException _log = logging.getLogger(__name__) -def publish(topic, msg): # pragma: no cover - _log.debug('Publishing a message for %r: %s', topic, msg) +def publish(message): # pragma: no cover + _log.debug('Publishing a message for %r: %s', message.topic, message.body) try: - message = fedora_messaging.api.Message( - topic='fedora_elections.%s' % topic, - body=msg - ) fedora_messaging.api.publish(message) _log.debug("Sent to fedora_messaging") except PublishReturned as e: diff --git a/fedora_elections/models.py b/fedora_elections/models.py index b447bb6..703cc3d 100644 --- a/fedora_elections/models.py +++ b/fedora_elections/models.py @@ -267,6 +267,7 @@ class Candidate(BASE): ''' Return a json representation of this object. ''' return dict( name=self.name, + fas_name=self.fas_name, url=self.url, ) diff --git a/setup.py b/setup.py index 8836c03..c9e8a12 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ setup( install_requires=[ 'Flask', 'SQLAlchemy>=0.7', 'python-fedora', 'kitchen', 'python-openid', 'python-openid-teams', 'python-openid-cla', - 'Flask-wtf', 'wtforms', + 'Flask-wtf', 'wtforms', 'fedora-elections-messages', ], test_suite="tests", ) diff --git a/tests/test_candidate.py b/tests/test_candidate.py index aab8751..1b07da5 100644 --- a/tests/test_candidate.py +++ b/tests/test_candidate.py @@ -218,6 +218,7 @@ class Candidatetests(Modeltests): { 'name': 'Ralph', 'url': 'https://fedoraproject.org/wiki/User:Ralph', + 'fas_name': None, } ) @@ -227,6 +228,7 @@ class Candidatetests(Modeltests): { 'name': 'Kevin', 'url': 'https://fedoraproject.org/wiki/User:Kevin', + 'fas_name': None, } ) diff --git a/tests/test_flask_admin.py b/tests/test_flask_admin.py index 468d24d..4cc0feb 100644 --- a/tests/test_flask_admin.py +++ b/tests/test_flask_admin.py @@ -33,6 +33,10 @@ from datetime import timedelta import flask from mock import patch, MagicMock +from fedora_messaging.testing import mock_sends +from fedora_elections_messages import ( + NewElectionV1, EditElectionV1, NewCandidateV1, EditCandidateV1, DeleteCandidateV1, +) sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) @@ -318,8 +322,9 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/new', data=data, follow_redirects=True) + with mock_sends(NewElectionV1): + output = self.app.post( + '/admin/new', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -357,8 +362,9 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/new', data=data, follow_redirects=True) + with mock_sends(NewElectionV1): + output = self.app.post( + '/admin/new', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -502,8 +508,9 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/test_election/', data=data, follow_redirects=True) + with mock_sends(EditElectionV1): + output = self.app.post( + '/admin/test_election/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -580,8 +587,9 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/test_election2/', data=data, follow_redirects=True) + with mock_sends(EditElectionV1): + output = self.app.post( + '/admin/test_election2/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -619,8 +627,9 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/test_election2/', data=data, follow_redirects=True) + with mock_sends(EditElectionV1): + output = self.app.post( + '/admin/test_election2/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -705,8 +714,9 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/test_election3/', data=data, follow_redirects=True) + with mock_sends(EditElectionV1): + output = self.app.post( + '/admin/test_election3/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -734,8 +744,9 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/test_election3/', data=data, follow_redirects=True) + with mock_sends(EditElectionV1): + output = self.app.post( + '/admin/test_election3/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -829,9 +840,10 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/test_election/candidates/new', data=data, - follow_redirects=True) + with mock_sends(NewCandidateV1): + output = self.app.post( + '/admin/test_election/candidates/new', data=data, + follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -919,9 +931,10 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/test_election/candidates/new/multi', data=data, - follow_redirects=True) + with mock_sends(NewCandidateV1, NewCandidateV1, NewCandidateV1): + output = self.app.post( + '/admin/test_election/candidates/new/multi', data=data, + follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -1029,9 +1042,10 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/test_election/candidates/1/edit', data=data, - follow_redirects=True) + with mock_sends(EditCandidateV1): + output = self.app.post( + '/admin/test_election/candidates/1/edit', data=data, + follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( @@ -1121,9 +1135,10 @@ class FlaskAdmintests(ModelFlasktests): 'csrf_token': csrf_token, } - output = self.app.post( - '/admin/test_election4/candidates/10/delete', data=data, - follow_redirects=True) + with mock_sends(DeleteCandidateV1): + output = self.app.post( + '/admin/test_election4/candidates/10/delete', data=data, + follow_redirects=True) self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertTrue( From 5e816a9c4a6bdea6095fe20f70c3e8103a88d3e2 Mon Sep 17 00:00:00 2001 From: Aurélien Bompard Date: Oct 19 2020 09:35:42 +0000 Subject: [PATCH 2/2] Run tests with python3 in tox Signed-off-by: Aurélien Bompard --- diff --git a/tox.ini b/tox.ini index 4d3302a..3728341 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py27,diff-cover +envlist = py36,py37,py38,diff-cover skipsdist = True [testenv]