def setUp(self): self._setUpUsersAndLogin() self._setUpOrganizations() self.cmd = WebsiteUpdatesCommand() self.metadata = { 'slug': '2015-07-13-test', 'language': 'US', 'start': date(2015, 7, 13), 'end': date(2015, 7, 14), 'country': 'US', 'venue': 'Euphoric State University', 'address': 'Highway to Heaven 42, Academipolis', 'latitude': 36.998977, 'longitude': -109.045173, 'reg_key': '10000000', 'instructors': ['Hermione Granger', 'Ron Weasley'], 'helpers': ['Peter Parker', 'Tony Stark', 'Natasha Romanova'], 'contact': '[email protected], [email protected]', } self.metadata_serialized = self.cmd.serialize(self.metadata) # create event with some changes detected self.event = Event.objects.create(slug='event-for-changes', start=date(2016, 4, 20), end=date(2016, 4, 22), host=Organization.objects.first(), metadata_changed=True) # add metadata to the session session = self.client.session session['metadata_from_event_website'] = self.metadata_serialized session.save()
def setUp(self): self.cmd = WebsiteUpdatesCommand() self.fake_cmd = FakeDatabaseCommand() self.seed = 12345 self.fake_cmd.faker.seed(self.seed) self.fake_cmd.stdout = StringIO() self.fake_cmd.fake_organizations() self.mocked_event_page = """ <html><head> <meta name="slug" content="2015-07-13-test" /> <meta name="startdate" content="2015-07-13" /> <meta name="enddate" content="2015-07-14" /> <meta name="country" content="us" /> <meta name="venue" content="Euphoric State University" /> <meta name="address" content="Highway to Heaven 42, Academipolis" /> <meta name="latlng" content="36.998977, -109.045173" /> <meta name="language" content="us" /> <meta name="invalid" content="invalid" /> <meta name="instructor" content="Hermione Granger|Ron Weasley" /> <meta name="helper" content="Peter Parker|Tony Stark|Natasha Romanova" /> <meta name="contact" content="[email protected], [email protected]" /> <meta name="eventbrite" content="10000000" /> <meta name="charset" content="utf-8" /> </head> <body> <h1>test</h1> </body></html> """ self.expected_metadata_parsed = { 'slug': '2015-07-13-test', 'language': 'US', 'start': date(2015, 7, 13), 'end': date(2015, 7, 14), 'country': 'US', 'venue': 'Euphoric State University', 'address': 'Highway to Heaven 42, Academipolis', 'latitude': 36.998977, 'longitude': -109.045173, 'reg_key': 10000000, 'instructors': ['Hermione Granger', 'Ron Weasley'], 'helpers': ['Peter Parker', 'Tony Stark', 'Natasha Romanova'], 'contact': '[email protected], [email protected]', } self.date_serialization_tests = [ # simple tests ('', ''), ('empty string', 'empty string'), # format-matching ('2016-04-18', date(2016, 4, 18)), ('2016-04-18T16:41:30', datetime(2016, 4, 18, 16, 41, 30)), ('2016-04-18T16:41:30.123', datetime(2016, 4, 18, 16, 41, 30, 123000)), ('16:41:30', time(16, 41, 30)), ('16:41:30.123', time(16, 41, 30, 123000)), # format not matching (ie. timezone-aware) ('2016-04-18T16:41:30+02:00', '2016-04-18T16:41:30+02:00'), ('2016-04-18T14:41:30Z', '2016-04-18T14:41:30Z'), ('16:41:30+02:00', '16:41:30+02:00'), ('14:41:30Z', '14:41:30Z'), ]
class TestWebsiteUpdatesCommand(TestBase): maxDiff = None def setUp(self): self.cmd = WebsiteUpdatesCommand() self.fake_cmd = FakeDatabaseCommand() self.seed = 12345 self.fake_cmd.faker.seed(self.seed) self.fake_cmd.stdout = StringIO() self.fake_cmd.fake_organizations() self.mocked_event_page = """ <html><head> <meta name="slug" content="2015-07-13-test" /> <meta name="startdate" content="2015-07-13" /> <meta name="enddate" content="2015-07-14" /> <meta name="country" content="us" /> <meta name="venue" content="Euphoric State University" /> <meta name="address" content="Highway to Heaven 42, Academipolis" /> <meta name="latlng" content="36.998977, -109.045173" /> <meta name="language" content="us" /> <meta name="invalid" content="invalid" /> <meta name="instructor" content="Hermione Granger|Ron Weasley" /> <meta name="helper" content="Peter Parker|Tony Stark|Natasha Romanova" /> <meta name="contact" content="[email protected], [email protected]" /> <meta name="eventbrite" content="10000000" /> <meta name="charset" content="utf-8" /> </head> <body> <h1>test</h1> </body></html> """ self.expected_metadata_parsed = { 'slug': '2015-07-13-test', 'language': 'US', 'start': date(2015, 7, 13), 'end': date(2015, 7, 14), 'country': 'US', 'venue': 'Euphoric State University', 'address': 'Highway to Heaven 42, Academipolis', 'latitude': 36.998977, 'longitude': -109.045173, 'reg_key': 10000000, 'instructors': ['Hermione Granger', 'Ron Weasley'], 'helpers': ['Peter Parker', 'Tony Stark', 'Natasha Romanova'], 'contact': '[email protected], [email protected]', } self.date_serialization_tests = [ # simple tests ('', ''), ('empty string', 'empty string'), # format-matching ('2016-04-18', date(2016, 4, 18)), ('2016-04-18T16:41:30', datetime(2016, 4, 18, 16, 41, 30)), ('2016-04-18T16:41:30.123', datetime(2016, 4, 18, 16, 41, 30, 123000)), ('16:41:30', time(16, 41, 30)), ('16:41:30.123', time(16, 41, 30, 123000)), # format not matching (ie. timezone-aware) ('2016-04-18T16:41:30+02:00', '2016-04-18T16:41:30+02:00'), ('2016-04-18T14:41:30Z', '2016-04-18T14:41:30Z'), ('16:41:30+02:00', '16:41:30+02:00'), ('14:41:30Z', '14:41:30Z'), ] def test_getting_events(self): """Ensure only active events with URL are returned.""" self.fake_cmd.fake_current_events(count=6, add_tags=False) Event.objects.all().update(start=date.today()) # one active event with URL and one without e1, e2 = Event.objects.all()[0:2] e1.completed = False # completed == !active e1.url = 'https://swcarpentry.github.io/workshop-template/' e1.save() e2.completed = False e2.url = None e2.save() # one inactive event with URL and one without e3, e4 = Event.objects.all()[2:4] e3.completed = True e3.url = 'https://datacarpentry.github.io/workshop-template/' e3.save() e4.completed = True e4.url = None e4.save() # both active but one very old e5, e6 = Event.objects.all()[4:6] e5.completed = False e5.url = 'https://swcarpentry.github.io/workshop-template2/' e5.start = date(2014, 1, 1) e5.save() e6.completed = False e6.url = 'https://datacarpentry.github.io/workshop-template2/' e6.save() # check events = set(self.cmd.get_events()) self.assertEqual({e1, e6}, events) def test_parsing_github_url(self): """Ensure `parse_github_url()` correctly parses repository URL.""" url = 'https://github.com/swcarpentry/workshop-template' expected = 'swcarpentry', 'workshop-template' self.assertEqual(expected, self.cmd.parse_github_url(url)) with self.assertRaises(WrongWorkshopURL): url = 'https://swcarpentry.github.io/workshop-template' self.cmd.parse_github_url(url) @requests_mock.Mocker() def test_getting_event_metadata(self, mock): """Ensure metadata are fetched and normalized by `get_event_metadata`.""" # underlying `fetch_event_metadata` and `parse_metadata_from_event_website` # are tested in great detail in `test_util.py`, so here's just a short # test website_url = 'https://github.com/swcarpentry/workshop-template' mock_text = self.mocked_event_page mock.get(website_url, text=mock_text, status_code=200) # mock placed, let's test `get_event_metadata` metadata = self.cmd.get_event_metadata(website_url) self.assertEqual(metadata, self.expected_metadata_parsed) def test_deserialization_of_string(self): "Ensure our datetime matching function works correctly for strings." for test, expected in self.date_serialization_tests: with self.subTest(test=test): self.assertEqual(datetime_match(test), expected) def test_deserialization_of_list(self): """Ensure our datetime matching function works correctly for lists.""" tests = self.date_serialization_tests[:] tests = list(zip(*tests)) # transpose test = list(tests[0]) expected = list(tests[1]) self.assertEqual(datetime_decode(test), expected) def test_deserialization_of_dict(self): """Ensure our datetime matching function works correctly for dicts.""" test = {k: k for k, v in self.date_serialization_tests} expected = {k: v for k, v in self.date_serialization_tests} self.assertEqual(datetime_decode(test), expected) def test_deserialization_of_nested(self): """Ensure our datetime matching function works correctly for nested objects/lists.""" # this test uses simpler format dict_test = {'2016-04-18': '2016-04-18'} dict_expected = {'2016-04-18': date(2016, 4, 18)} test = [dict_test.copy(), dict_test.copy(), dict_test.copy()] expected = [ dict_expected.copy(), dict_expected.copy(), dict_expected.copy() ] self.assertEqual(datetime_decode(test), expected) test = {'1': test[:]} expected = {'1': expected[:]} self.assertEqual(datetime_decode(test), expected) def test_serialization(self): """Ensure serialization uses JSON and works correctly with dates, datetimes and times. Ensure derialization from JSON works correctly with dates, datetimes and times.""" serialized_json = self.cmd.serialize(self.expected_metadata_parsed) self.assertIn('2015-07-13', serialized_json) self.assertIn('2015-07-14', serialized_json) self.assertIn('2015-07-13-test', serialized_json) self.assertIn('-109.045173', serialized_json) self.assertIn('36.998977', serialized_json) self.assertIn('[email protected], [email protected]', serialized_json) deserialized_data = self.cmd.deserialize(serialized_json) self.assertEqual(deserialized_data, self.expected_metadata_parsed) @unittest.skip('Don\'t know how to test it') def test_loading_from_github(self): """Not sure how to test it, so for now leaving this blank.""" # TODO: mock up github response? pass @requests_mock.Mocker() def test_detecting_changes(self, mock): """Make sure metadata changes are detected.""" hash_ = 'abcdefghijklmnopqrstuvwxyz' e = Event.objects.create( slug='with-changes', host=Organization.objects.first(), url='https://swcarpentry.github.io/workshop-template/', repository_last_commit_hash=hash_, repository_metadata='', metadata_changed=False) branch = MagicMock() branch.commit = MagicMock() branch.commit.sha = hash_ changes = self.cmd.detect_changes(branch, e) self.assertEqual(changes, []) # more real example: hash changed hash_ = "zyxwvutsrqponmlkjihgfedcba" branch.commit.sha = hash_ mock_text = self.mocked_event_page mock.get(e.url, text=mock_text, status_code=200) metadata = self.cmd.empty_metadata() metadata['instructors'] = self.expected_metadata_parsed['instructors'] metadata['latitude'] = self.expected_metadata_parsed['latitude'] metadata['longitude'] = self.expected_metadata_parsed['longitude'] e.repository_metadata = self.cmd.serialize(metadata) e.save() changes = self.cmd.detect_changes(branch, e) expected = [ 'Helpers changed', 'Start date changed', 'End date changed', 'Country changed', 'Venue changed', 'Address changed', 'Contact details changed', 'Eventbrite key changed', ] self.assertEqual(changes, expected) @requests_mock.Mocker() def test_initialization(self, mock): """Make sure events are initialized to sane values.""" e = Event.objects.create( slug='with-changes', host=Organization.objects.first(), url='https://swcarpentry.github.io/workshop-template/', repository_last_commit_hash='', repository_metadata='', metadata_changed=False, metadata_all_changes='') hash_ = 'abcdefghijklmnopqrstuvwxyz' branch = MagicMock() branch.commit = MagicMock() branch.commit.sha = hash_ mock_text = self.mocked_event_page mock.get(e.url, text=mock_text, status_code=200) self.cmd.init(branch, e) e.refresh_from_db() # metadata updated self.assertEqual(e.repository_last_commit_hash, hash_) self.assertEqual(self.cmd.deserialize(e.repository_metadata), self.expected_metadata_parsed) self.assertEqual(e.metadata_all_changes, '') self.assertEqual(e.metadata_changed, False) @unittest.skip('This command requires internet connection') def test_running(self): """Test running whole command.""" call_command('check_for_workshop_websites_updates')
class TestEventReviewingRepoChanges(TestBase): """Ensure views used for reviewing, accepting and dismissing changes made to event's metadata work correctly.""" def setUp(self): self._setUpUsersAndLogin() self._setUpOrganizations() self.cmd = WebsiteUpdatesCommand() self.metadata = { 'slug': '2015-07-13-test', 'language': 'US', 'start': date(2015, 7, 13), 'end': date(2015, 7, 14), 'country': 'US', 'venue': 'Euphoric State University', 'address': 'Highway to Heaven 42, Academipolis', 'latitude': 36.998977, 'longitude': -109.045173, 'reg_key': '10000000', 'instructors': ['Hermione Granger', 'Ron Weasley'], 'helpers': ['Peter Parker', 'Tony Stark', 'Natasha Romanova'], 'contact': '[email protected], [email protected]', } self.metadata_serialized = self.cmd.serialize(self.metadata) # create event with some changes detected self.event = Event.objects.create(slug='event-for-changes', start=date(2016, 4, 20), end=date(2016, 4, 22), host=Organization.objects.first(), metadata_changed=True) # add metadata to the session session = self.client.session session['metadata_from_event_website'] = self.metadata_serialized session.save() def test_showing_all_events_with_changed_metadata(self): """Ensure `events_metadata_changed` only shows events with changed metadata.""" url = reverse('events_metadata_changed') rv = self.client.get(url) self.assertEqual(rv.status_code, 200) self.assertEqual(list(rv.context['events']), [self.event]) def test_accepting_changes(self): """Ensure `event_review_repo_changes_accept`: * updates changed values in event * dismisses notification about changed metadata * removes metadata from session * redirects to the event details page.""" url = reverse('event_accept_metadata_changes', args=[self.event.slug]) rv = self.client.get(url, follow=False) # check for redirect to event's details page self.assertEqual(rv.status_code, 302) self.event.refresh_from_db() self.assertEqual(self.event.metadata_changed, False) self.assertEqual(self.event.metadata_all_changes, '') self.assertEqual(self.event.repository_metadata, self.metadata_serialized) for key, value in self.metadata.items(): if key not in ('slug', 'instructors', 'helpers', 'language'): self.assertEqual(getattr(self.event, key), value) def test_accepting_changes_no_session_data(self): """Ensure `event_review_repo_changes_accept` throws 404 when specific session key 'metadata_from_event_website' is unavailable.""" session = self.client.session del session['metadata_from_event_website'] session.save() url = reverse('event_accept_metadata_changes', args=[self.event.slug]) rv = self.client.get(url, follow=False) self.assertEqual(rv.status_code, 404) def test_dismissing_changes(self): url = reverse('event_dismiss_metadata_changes', args=[self.event.slug]) rv = self.client.get(url, follow=False) # check for redirect to event's details page self.assertEqual(rv.status_code, 302) self.event.refresh_from_db() self.assertEqual(self.event.metadata_changed, False) self.assertEqual(self.event.metadata_all_changes, '') for key, value in self.metadata.items(): if key not in ('slug', 'instructors', 'helpers', 'language'): self.assertNotEqual(getattr(self.event, key), value)
def setUp(self): self.cmd = WebsiteUpdatesCommand() self.fake_cmd = FakeDatabaseCommand() self.seed = 12345 Faker.seed(self.seed) self.fake_cmd.stdout = StringIO() self.fake_cmd.fake_organizations() self.mocked_event_page = """ <html><head> <meta name="slug" content="2015-07-13-test" /> <meta name="startdate" content="2015-07-13" /> <meta name="enddate" content="2015-07-14" /> <meta name="country" content="us" /> <meta name="venue" content="Euphoric State University" /> <meta name="address" content="Highway to Heaven 42, Academipolis" /> <meta name="latlng" content="36.998977, -109.045173" /> <meta name="language" content="us" /> <meta name="invalid" content="invalid" /> <meta name="instructor" content="Hermione Granger|Ron Weasley" /> <meta name="helper" content="Peter Parker|Tony Stark|Natasha Romanova" /> <meta name="contact" content="[email protected]|[email protected]" /> <meta name="eventbrite" content="10000000" /> <meta name="charset" content="utf-8" /> </head> <body> <h1>test</h1> </body></html> """ self.expected_metadata_parsed = { "slug": "2015-07-13-test", "language": "US", "start": date(2015, 7, 13), "end": date(2015, 7, 14), "country": "US", "venue": "Euphoric State University", "address": "Highway to Heaven 42, Academipolis", "latitude": 36.998977, "longitude": -109.045173, "reg_key": 10000000, "instructors": ["Hermione Granger", "Ron Weasley"], "helpers": ["Peter Parker", "Tony Stark", "Natasha Romanova"], "contact": ["*****@*****.**", "*****@*****.**"], } self.date_serialization_tests = [ # simple tests ("", ""), ("empty string", "empty string"), # format-matching ("2016-04-18", date(2016, 4, 18)), ("2016-04-18T16:41:30", datetime(2016, 4, 18, 16, 41, 30)), ("2016-04-18T16:41:30.123", datetime(2016, 4, 18, 16, 41, 30, 123000)), ("16:41:30", time(16, 41, 30)), ("16:41:30.123", time(16, 41, 30, 123000)), # format not matching (ie. timezone-aware) ("2016-04-18T16:41:30+02:00", "2016-04-18T16:41:30+02:00"), ("2016-04-18T14:41:30Z", "2016-04-18T14:41:30Z"), ("16:41:30+02:00", "16:41:30+02:00"), ("14:41:30Z", "14:41:30Z"), ]
class TestWebsiteUpdatesCommand(TestBase): maxDiff = None def setUp(self): self.cmd = WebsiteUpdatesCommand() self.fake_cmd = FakeDatabaseCommand() self.seed = 12345 self.fake_cmd.faker.seed(self.seed) self.fake_cmd.stdout = StringIO() self.fake_cmd.fake_organizations() self.mocked_event_page = """ <html><head> <meta name="slug" content="2015-07-13-test" /> <meta name="startdate" content="2015-07-13" /> <meta name="enddate" content="2015-07-14" /> <meta name="country" content="us" /> <meta name="venue" content="Euphoric State University" /> <meta name="address" content="Highway to Heaven 42, Academipolis" /> <meta name="latlng" content="36.998977, -109.045173" /> <meta name="language" content="us" /> <meta name="invalid" content="invalid" /> <meta name="instructor" content="Hermione Granger|Ron Weasley" /> <meta name="helper" content="Peter Parker|Tony Stark|Natasha Romanova" /> <meta name="contact" content="[email protected], [email protected]" /> <meta name="eventbrite" content="10000000" /> <meta name="charset" content="utf-8" /> </head> <body> <h1>test</h1> </body></html> """ self.expected_metadata_parsed = { 'slug': '2015-07-13-test', 'language': 'US', 'start': date(2015, 7, 13), 'end': date(2015, 7, 14), 'country': 'US', 'venue': 'Euphoric State University', 'address': 'Highway to Heaven 42, Academipolis', 'latitude': 36.998977, 'longitude': -109.045173, 'reg_key': 10000000, 'instructors': ['Hermione Granger', 'Ron Weasley'], 'helpers': ['Peter Parker', 'Tony Stark', 'Natasha Romanova'], 'contact': '[email protected], [email protected]', } self.date_serialization_tests = [ # simple tests ('', ''), ('empty string', 'empty string'), # format-matching ('2016-04-18', date(2016, 4, 18)), ('2016-04-18T16:41:30', datetime(2016, 4, 18, 16, 41, 30)), ('2016-04-18T16:41:30.123', datetime(2016, 4, 18, 16, 41, 30, 123000)), ('16:41:30', time(16, 41, 30)), ('16:41:30.123', time(16, 41, 30, 123000)), # format not matching (ie. timezone-aware) ('2016-04-18T16:41:30+02:00', '2016-04-18T16:41:30+02:00'), ('2016-04-18T14:41:30Z', '2016-04-18T14:41:30Z'), ('16:41:30+02:00', '16:41:30+02:00'), ('14:41:30Z', '14:41:30Z'), ] def test_getting_events(self): """Ensure only active events with URL are returned.""" self.fake_cmd.fake_current_events(count=6, add_tags=False) Event.objects.all().update(start=date.today()) # one active event with URL and one without e1, e2 = Event.objects.all()[0:2] e1.completed = False # completed == !active e1.url = 'https://swcarpentry.github.io/workshop-template/' e1.save() e2.completed = False e2.url = None e2.save() # one inactive event with URL and one without e3, e4 = Event.objects.all()[2:4] e3.completed = True e3.url = 'https://datacarpentry.github.io/workshop-template/' e3.save() e4.completed = True e4.url = None e4.save() # both active but one very old e5, e6 = Event.objects.all()[4:6] e5.completed = False e5.url = 'https://swcarpentry.github.io/workshop-template2/' e5.start = date(2014, 1, 1) e5.save() e6.completed = False e6.url = 'https://datacarpentry.github.io/workshop-template2/' e6.save() # check events = set(self.cmd.get_events()) self.assertEqual({e1, e6}, events) def test_parsing_github_url(self): """Ensure `parse_github_url()` correctly parses repository URL.""" url = 'https://github.com/swcarpentry/workshop-template' expected = 'swcarpentry', 'workshop-template' self.assertEqual(expected, self.cmd.parse_github_url(url)) with self.assertRaises(WrongWorkshopURL): url = 'https://swcarpentry.github.io/workshop-template' self.cmd.parse_github_url(url) @requests_mock.Mocker() def test_getting_event_metadata(self, mock): """Ensure metadata are fetched and normalized by `get_event_metadata`.""" # underlying `fetch_event_metadata` and `parse_metadata_from_event_website` # are tested in great detail in `test_util.py`, so here's just a short # test website_url = 'https://github.com/swcarpentry/workshop-template' mock_text = self.mocked_event_page mock.get(website_url, text=mock_text, status_code=200) # mock placed, let's test `get_event_metadata` metadata = self.cmd.get_event_metadata(website_url) self.assertEqual(metadata, self.expected_metadata_parsed) def test_deserialization_of_string(self): "Ensure our datetime matching function works correctly for strings." for test, expected in self.date_serialization_tests: with self.subTest(test=test): self.assertEqual(datetime_match(test), expected) def test_deserialization_of_list(self): """Ensure our datetime matching function works correctly for lists.""" tests = self.date_serialization_tests[:] tests = list(zip(*tests)) # transpose test = list(tests[0]) expected = list(tests[1]) self.assertEqual(datetime_decode(test), expected) def test_deserialization_of_dict(self): """Ensure our datetime matching function works correctly for dicts.""" test = {k: k for k, v in self.date_serialization_tests} expected = {k: v for k, v in self.date_serialization_tests} self.assertEqual(datetime_decode(test), expected) def test_deserialization_of_nested(self): """Ensure our datetime matching function works correctly for nested objects/lists.""" # this test uses simpler format dict_test = {'2016-04-18': '2016-04-18'} dict_expected = {'2016-04-18': date(2016, 4, 18)} test = [dict_test.copy(), dict_test.copy(), dict_test.copy()] expected = [dict_expected.copy(), dict_expected.copy(), dict_expected.copy()] self.assertEqual(datetime_decode(test), expected) test = {'1': test[:]} expected = {'1': expected[:]} self.assertEqual(datetime_decode(test), expected) def test_serialization(self): """Ensure serialization uses JSON and works correctly with dates, datetimes and times. Ensure derialization from JSON works correctly with dates, datetimes and times.""" serialized_json = self.cmd.serialize(self.expected_metadata_parsed) self.assertIn('2015-07-13', serialized_json) self.assertIn('2015-07-14', serialized_json) self.assertIn('2015-07-13-test', serialized_json) self.assertIn('-109.045173', serialized_json) self.assertIn('36.998977', serialized_json) self.assertIn('[email protected], [email protected]', serialized_json) deserialized_data = self.cmd.deserialize(serialized_json) self.assertEqual(deserialized_data, self.expected_metadata_parsed) @unittest.skip('Don\'t know how to test it') def test_loading_from_github(self): """Not sure how to test it, so for now leaving this blank.""" # TODO: mock up github response? pass @requests_mock.Mocker() def test_detecting_changes(self, mock): """Make sure metadata changes are detected.""" hash_ = 'abcdefghijklmnopqrstuvwxyz' e = Event.objects.create( slug='with-changes', host=Organization.objects.first(), url='https://swcarpentry.github.io/workshop-template/', repository_last_commit_hash=hash_, repository_metadata='', metadata_changed=False) branch = MagicMock() branch.commit = MagicMock() branch.commit.sha = hash_ changes = self.cmd.detect_changes(branch, e) self.assertEqual(changes, []) # more real example: hash changed hash_ = "zyxwvutsrqponmlkjihgfedcba" branch.commit.sha = hash_ mock_text = self.mocked_event_page mock.get(e.url, text=mock_text, status_code=200) metadata = self.cmd.empty_metadata() metadata['instructors'] = self.expected_metadata_parsed['instructors'] metadata['latitude'] = self.expected_metadata_parsed['latitude'] metadata['longitude'] = self.expected_metadata_parsed['longitude'] e.repository_metadata = self.cmd.serialize(metadata) e.save() changes = self.cmd.detect_changes(branch, e) expected = [ 'Helpers changed', 'Start date changed', 'End date changed', 'Country changed', 'Venue changed', 'Address changed', 'Contact details changed', 'Eventbrite key changed', ] self.assertEqual(changes, expected) @requests_mock.Mocker() def test_initialization(self, mock): """Make sure events are initialized to sane values.""" e = Event.objects.create( slug='with-changes', host=Organization.objects.first(), url='https://swcarpentry.github.io/workshop-template/', repository_last_commit_hash='', repository_metadata='', metadata_changed=False, metadata_all_changes='') hash_ = 'abcdefghijklmnopqrstuvwxyz' branch = MagicMock() branch.commit = MagicMock() branch.commit.sha = hash_ mock_text = self.mocked_event_page mock.get(e.url, text=mock_text, status_code=200) self.cmd.init(branch, e) e.refresh_from_db() # metadata updated self.assertEqual(e.repository_last_commit_hash, hash_) self.assertEqual(self.cmd.deserialize(e.repository_metadata), self.expected_metadata_parsed) self.assertEqual(e.metadata_all_changes, '') self.assertEqual(e.metadata_changed, False) @unittest.skip('This command requires internet connection') def test_running(self): """Test running whole command.""" call_command('check_for_workshop_websites_updates')