From bec1c82f67411f9fa517e57877b21598a4479b06 Mon Sep 17 00:00:00 2001 From: Christian Strappazzon Date: Thu, 17 Nov 2016 10:17:55 +0100 Subject: [PATCH 1/4] Test with v3 meetup api response --- flask_pyGlialo.py | 1 - pyglialo.py | 18 ++-- tests.py | 236 +++++++++++++++------------------------------- 3 files changed, 81 insertions(+), 174 deletions(-) diff --git a/flask_pyGlialo.py b/flask_pyGlialo.py index 37df886..490d75c 100644 --- a/flask_pyGlialo.py +++ b/flask_pyGlialo.py @@ -27,7 +27,6 @@ def spread_the_goodies(): def save_winner(name): if name not in pyglialo.list_of_winners: pyglialo.list_of_winners.append(name) - pyglialo.remove_rsvp(name) return redirect(url_for('saved')) diff --git a/pyglialo.py b/pyglialo.py index 4786ab5..b6f1073 100644 --- a/pyglialo.py +++ b/pyglialo.py @@ -38,25 +38,19 @@ def load_meetup_data(self): def extract_safe_winner(self): self.winner = None - if self.event_rsvps and len(self.event_rsvps['results']): - lucky_number = random.randint(0, abs(len(self.event_rsvps['results']) - 1)) - winner = self.event_rsvps['results'][lucky_number] - self.remove_rsvp(winner['member']['member_id']) + if self.event_rsvps and len(self.event_rsvps): + lucky_number = random.randint(0, abs(len(self.event_rsvps) - 1)) + winner = self.event_rsvps[lucky_number] + self.event_rsvps.remove(winner) if winner['response'] == 'yes': self.winner = { 'name': winner['member']['name'], - 'member_id': winner['member']['member_id'], - 'photo_url': winner.get('member_photo', {}).get('photo_link', '/static/img/no_image.png') + 'member_id': winner['member']['id'], + 'photo_url': winner['member'].get('photo', {}).get('photo_link', '/static/img/no_image.png') } else: self.extract_safe_winner() - def remove_rsvp(self, rsvp_id): - for idx, result in enumerate(self.event_rsvps['results']): - if rsvp_id == result['member']['member_id']: - self.event_rsvps['results'].pop(idx) - break - def save_winners_list(self): file_date = datetime.datetime.now() with open("winner_list_{}.txt".format(file_date.strftime("%Y-%m-%d")), "w") as out_file: diff --git a/tests.py b/tests.py index d2f1e9d..2b57df4 100644 --- a/tests.py +++ b/tests.py @@ -27,31 +27,11 @@ def fake_data_empty(url): def fake_data_load(url): - venue = { - 'lat': 45.49055480957031, - 'address_1': 'Via Giulio e Corrado Venini, 42', - 'country': 'it', - 'city': 'Milano', - 'repinned': False, - 'localized_country_name': 'Italy', - 'id': 24633392, - 'lon': 9.215377807617188, - 'name': 'Mikamai/LinkMe' - } - event = { - 'name': "Python Mashup! Casi d'uso: virtualenv, Fabric, uWSGI, ngnix, Vagrant...", - 'event_url': 'http://www.meetup.com/Python-Milano/events/235147743/', - 'time': 1480528800000, - 'id': '235147743' - } - group = { - 'join_mode': 'open', - 'urlname': 'Python-Milano', - 'group_lat': 45.459999084472656, - 'id': 8923782, - 'created': 1478519732926, - 'group_lon': 9.1899995803833 - } + """ + Omitted some json response that pyGlialo doesn't use + :param url: + :return: + """ if url == URL_EVENTS: return [{ 'rsvp_limit': 50, @@ -78,82 +58,52 @@ def fake_data_load(url): 'duration': 7200000, 'status': 'upcoming', 'how_to_find_us': 'vagrant fabric python postgres uwsgi devops', - 'venue': venue, + 'venue': { + 'id': 24633392, + 'name': 'Mikamai/LinkMe', + 'lat': 45.49055480957031, + 'lon': 9.215377807617188, + 'repinned': 'false', + 'address_1': 'Via Giulio e Corrado Venini, 42', + 'city': 'Milano', + 'country': 'it', + 'localized_country_name': 'Italia' + }, 'id': '235147743' }] else: - return { - 'meta': { - # not under test - }, - 'results': [ - { - 'member': { - 'name': 'Antani Tatablinda', - 'member_id': 1 - }, - 'rsvp_id': 1, - 'group': group, - 'event': event, - 'response': 'yes', - 'guests': 0, - 'mtime': 1478498756000, - 'member_photo': { - 'base_url': 'http://photos4.meetupstatic.com', - 'thumb_link': 'http://photos4.meetupstatic.com/photos/member/0/0/0/8/thumb_1.jpeg', - 'photo_link': 'http://photos2.meetupstatic.com/photos/member/c/a/c/8/member_1.jpeg', - 'type': 'member', - 'photo_id': 101 - }, - 'venue': venue, - 'created': 1478498756000 - }, - { - 'member': { - 'name': 'Arnoldo Truffaldoni', - 'member_id': 2 + return [ + { + 'response': 'yes', + 'member': { + 'id': 1, + 'name': 'Tatablinda Tapioca', + 'photo': { + 'photo_link': 'http://url/to/photos/member.jpg', }, - 'rsvp_id': 1638255364, - 'group': group, - 'event': event, - 'response': 'no', - 'guests': 0, - 'mtime': 1478468670000, - 'member_photo': { - 'base_url': 'http://photos3.meetupstatic.com', - 'thumb_link': 'http://photos3.meetupstatic.com/photos/member/0/0/7/thumb_2.jpeg', - 'highres_link': 'http://photos3.meetupstatic.com/photos/member/0/0/7/highres_2.jpeg', - 'photo_id': 102, - 'photo_link': 'http://photos3.meetupstatic.com/photos/member/0/0/7/member_2.jpeg', - 'type': 'member' + } + }, + { + 'response': 'yes', + 'member': { + 'id': 2, + 'name': 'Antani Tatablinda', + 'photo': { + 'photo_link': 'http://url/to/photos/member.jpg', }, - 'venue': venue, - 'created': 1478468670000 }, - { - 'member': { - 'name': 'Tatablinda Tapioca', - 'member_id': 3 - }, - 'rsvp_id': 3, - 'group': group, - 'event': event, - 'response': 'yes', - 'guests': 0, - 'mtime': 1478312467000, - 'member_photo': { - 'base_url': 'http://photos1.meetupstatic.com', - 'thumb_link': 'http://photos1.meetupstatic.com/photos/member/0/0/0/2/thumb_3.jpeg', - 'highres_link': 'http://photos1.meetupstatic.com/photos/member/0/0/0/2/highres_3.jpeg', - 'photo_id': 103, - 'photo_link': 'http://photos1.meetupstatic.com/photos/member/0/0/0/2/member_3.jpeg', - 'type': 'member' + }, + { + 'response': 'no', + 'member': { + 'id': 3, + 'name': 'Arnoldo Truffaldoni', + 'photo': { + 'photo_link': 'http://url/to/photos/member.jpg', }, - 'venue': venue, - 'created': 1478312467000 } - ] - } + } + ] def fake_randint(): @@ -191,87 +141,54 @@ def test_load_meetup_data_nearest_meetup(self, fake_data): py.load_meetup_data() self.assertEqual(py.event.get('id', None), '235147743') self.assertEqual(py.event_id, '235147743') - self.assertEqual(len(py.event_rsvps), 2) + self.assertEqual(len(py.event_rsvps), 3) self.assertEqual(py.list_of_winners, []) - def test_remove_rsvp(self): - py = PyGlialo() - py.event_rsvps = {'results': [{ - 'member': { - 'name': 'Antani Tatablinda', - 'member_id': 1 - }, - }]} - py.remove_rsvp(1) - self.assertEqual(len(py.event_rsvps['results']), 0) - - def test_remove_rsvp_not_in_list(self): - py = PyGlialo() - py.event_rsvps = {'results': [{ - 'member': { - 'name': 'Foobar', - 'member_id': 1 - }, - }]} - py.remove_rsvp(42) - self.assertEqual(len(py.event_rsvps['results']), 1) - def test_extract_winner(self): py = PyGlialo() - py.event_rsvps = {'results': [{ + py.event_rsvps = [{ + 'response': 'yes', 'member': { - 'name': 'Foobar', - 'member_id': 1 - }, - 'response': 'yes' - }]} + 'id': 2, + 'name': 'Antani Tatablinda', + 'photo': { + 'photo_link': 'http://url/to/photos/member.jpg', + } + } + }] py.extract_safe_winner() - self.assertEqual(py.winner['name'], 'Foobar') - self.assertEqual(py.winner['member_id'], 1) + self.assertEqual(py.winner['name'], 'Antani Tatablinda') + self.assertEqual(py.winner['member_id'], 2) @patch('random.randint', return_value=0) def test_extract_winner_no_rsvp(self, random_patched): py = PyGlialo() - py.event_rsvps = {'results': [ - { - 'member': { - 'name': 'Foobar', - 'member_id': 1 - }, - 'response': 'no' - }, - { - 'member': { - 'name': 'Barfoo', - 'member_id': 2 - }, - 'response': 'yes', - 'member_photo': { - 'photo_link': 'http://photos1.meetupstatic.com/photos/member/0/0/0/2/member_3.jpeg', - }, + py.event_rsvps = [{ + 'response': 'no', + 'member': { + 'id': 3, + 'name': 'Arnoldo Truffaldoni', + 'photo': { + 'photo_link': 'http://url/to/photos/member.jpg', + } } - ]} + }] py.extract_safe_winner() - self.assertEqual(len(py.event_rsvps['results']), 0) - self.assertEqual(py.winner['name'], 'Barfoo') - self.assertEqual(py.winner['member_id'], 2) - self.assertEqual(py.winner['photo_url'], 'http://photos1.meetupstatic.com/photos/member/0/0/0/2/member_3.jpeg') + self.assertEqual(len(py.event_rsvps), 0) def test_extract_winner_no_photo(self): py = PyGlialo() - py.event_rsvps = {'results': [ - { - 'member': { - 'name': 'Foobar', - 'member_id': 1 - }, - 'response': 'yes' + py.event_rsvps = [{ + 'response': 'yes', + 'member': { + 'id': 2, + 'name': 'Antani Tatablinda', } - ]} + }] py.extract_safe_winner() - self.assertEqual(len(py.event_rsvps['results']), 0) - self.assertEqual(py.winner['name'], 'Foobar') - self.assertEqual(py.winner['member_id'], 1) + self.assertEqual(len(py.event_rsvps), 0) + self.assertEqual(py.winner['name'], 'Antani Tatablinda') + self.assertEqual(py.winner['member_id'], 2) self.assertEqual(py.winner['photo_url'], '/static/img/no_image.png') def test_extract_winner_empty_rsvps(self): @@ -331,14 +248,11 @@ def test_save_winner_already_in_list(self, redirect_mock): response = self.app.get('/save/antani/') self.assertEqual(response.status_code, 302) - - @patch('pyglialo.PyGlialo.remove_rsvp') - def test_save_winner_in_list(self, remove_rsvp_mock): + def test_save_winner_in_list(self): with patch.object(PyGlialo, 'list_of_winners', new_callable=PropertyMock) as list_of_winners_mock: list_of_winners_mock.return_value = ['antani'] response = self.app.get('/save/tapioca/') self.assertEqual(response.status_code, 302) - remove_rsvp_mock.assert_called_with('tapioca') def test_saved(self): with patch.object(PyGlialo, 'list_of_winners', new_callable=PropertyMock) as list_of_winners_mock: From 910d14bea7c0e420a1f54f3ebf7cc8db00ccd1bb Mon Sep 17 00:00:00 2001 From: Christian Strappazzon Date: Thu, 17 Nov 2016 10:18:14 +0100 Subject: [PATCH 2/4] config url v3 meetup api --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 9cc2972..349de74 100644 --- a/config.py +++ b/config.py @@ -4,4 +4,4 @@ meetup_api_key = 'no-api-key-provided' URL_EVENTS = 'https://api.meetup.com/Python-Milano/events' -URL_RSVPS = 'https://api.meetup.com/2/rsvps?offset=0&format=json&event_id={id}&key=' + meetup_api_key +URL_RSVPS = 'https://api.meetup.com/Python-Milano/events/{id}/rsvps/?key=' + meetup_api_key From e645df3dda8671fc8da984e594a0496b8f49c5af Mon Sep 17 00:00:00 2001 From: Christian Strappazzon Date: Thu, 17 Nov 2016 11:05:17 +0100 Subject: [PATCH 3/4] added coveralls to requirements tests --- .travis.yml | 4 ++-- requirements_tests.txt | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3c3ab5f..8dec046 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,10 @@ language: python python: - "3.4" + - "3.5" install: - pip install -r requirements_tests.txt - - pip install coveralls -script: +script: python tests.py after_success: coveralls diff --git a/requirements_tests.txt b/requirements_tests.txt index 7554464..ad7b4f4 100644 --- a/requirements_tests.txt +++ b/requirements_tests.txt @@ -1,3 +1,4 @@ coverage>4 +coveralls>1 flake8>3 -r requirements.txt \ No newline at end of file From 770e58c7cd432c526c751eb6e88475657feaf5a0 Mon Sep 17 00:00:00 2001 From: Christian Strappazzon Date: Thu, 17 Nov 2016 11:05:39 +0100 Subject: [PATCH 4/4] coverage configurations --- .coveragerc | 22 ++++++++++++++++++++++ tests.py | 11 ++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..045ad89 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,22 @@ +[run] +branch = true +omit = + '*/flask/*', + '*/click/*', + '*/jinja2/*', + '*/werkzeug/*', + '*/itsdangerous.py', + '*/markupsafe/*', + 'config.py', + 'tests.py' + +source = . + +[report] +show_missing = true +# skip_covered = true +exclude_lines = + if __name__ == .__main__.: + +[html] +title = "pyGlialo Coverage Report" \ No newline at end of file diff --git a/tests.py b/tests.py index 2b57df4..b3a4bcb 100644 --- a/tests.py +++ b/tests.py @@ -8,7 +8,8 @@ '*/itsdangerous.py', '*/markupsafe/*', 'config.py', - 'tests.py']) + 'tests.py', + 'secrets.py']) cov.exclude('if __name__ == .__main__.:') cov.start() @@ -17,9 +18,10 @@ import os # noqa import unittest # noqa from unittest.mock import patch, MagicMock, PropertyMock # noqa + +import flask_pyGlialo # noqa from config import URL_EVENTS # noqa from pyglialo import PyGlialo, get_data_from_url # noqa -import flask_pyGlialo def fake_data_empty(url): @@ -241,8 +243,7 @@ def test_random_no_winner(self, piglialo_mock): self.assertEqual(response.status_code, 200) self.assertTrue('No one else can win!!!' in str(response.data)) - @patch('werkzeug.utils.redirect') - def test_save_winner_already_in_list(self, redirect_mock): + def test_save_winner_already_in_list(self): with patch.object(PyGlialo, 'list_of_winners', new_callable=PropertyMock) as list_of_winners_mock: list_of_winners_mock.return_value = ['antani'] response = self.app.get('/save/antani/') @@ -284,4 +285,4 @@ def test_finalize(self, pyglialo_mock): cov.report() print("HTML version: {}/tmp/coverage/index.html".format(os.path.join(os.path.abspath(os.path.dirname(__file__))))) cov.html_report(directory='tmp/coverage') - # cov.erase() +