def test_subscription_throws_404(self): """ Test that a subscription request sent to bouncy throws a 404 if not permitted """ original_setting = getattr(settings, 'BOUNCY_AUTO_SUBSCRIBE', True) settings.BOUNCY_AUTO_SUBSCRIBE = False with self.assertRaises(Http404): notification = loader('subscriptionconfirmation') self.request._body = json.dumps(notification) views.endpoint(self.request) settings.BOUNCY_AUTO_SUBSCRIBE = original_setting
def test_missing_necessary_key(self): """Test if the notification is missing vital keys""" self.request._body = json.dumps({}) result = views.endpoint(self.request) self.assertEqual(result.status_code, 400) self.assertEqual(result.content.decode('ascii'), 'Request Missing Necessary Keys')
def test_no_header(self): """Test the results if the request does not have a topic header""" request = self.factory.post('/') request._body = json.dumps(self.notification) result = views.endpoint(request) self.assertEqual(result.status_code, 400) self.assertEqual(result.content.decode('ascii'), 'No TopicArn Header')
def test_missing_necessary_key(self): """Test if the notification is missing vital keys""" self.request._body = json.dumps({}) result = views.endpoint(self.request) self.assertEqual(result.status_code, 400) self.assertEqual( result.content.decode('ascii'), 'Request Missing Necessary Keys')
def test_approve_subscription_called(self, mock): """Test that a approve_subscription is called""" mock.return_value = 'Test Return Value' notification = loader('subscriptionconfirmation') self.request._body = json.dumps(notification) result = views.endpoint(self.request) self.assertTrue(mock.called) self.assertEqual(result, 'Test Return Value')
def test_non_json_message_not_allowed(self): """Test that a non-JSON message is properly ignored""" notification = loader('bounce_notification') notification['Message'] = 'Non JSON Message' self.request._body = json.dumps(notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 200) self.assertEqual(result.content.decode('ascii'), 'Message is not valid JSON')
def test_unsubscribe_confirmation_not_handled(self): """Test that an unsubscribe notification is properly ignored""" notification = loader('bounce_notification') notification['Type'] = 'UnsubscribeConfirmation' self.request._body = json.dumps(notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 200) self.assertEqual(result.content.decode('ascii'), 'UnsubscribeConfirmation Not Handled')
def test_unknown_notification_type(self): """Test an unknown notification type""" notification = loader('bounce_notification') notification['Type'] = 'NotAKnownType' self.request._body = json.dumps(notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 400) self.assertEqual( result.content.decode('ascii'), 'Unknown Notification Type')
def test_non_json_message_not_allowed(self): """Test that a non-JSON message is properly ignored""" notification = loader('bounce_notification') notification['Message'] = 'Non JSON Message' self.request._body = json.dumps(notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 200) self.assertEqual( result.content.decode('ascii'), 'Message is not valid JSON')
def test_unknown_notification_type(self): """Test an unknown notification type""" notification = loader('bounce_notification') notification['Type'] = 'NotAKnownType' self.request._body = json.dumps(notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 400) self.assertEqual(result.content.decode('ascii'), 'Unknown Notification Type')
def test_bad_certificate_url(self): """Test an unknown certificate hostname""" notification = loader('bounce_notification') notification['SigningCertURL'] = 'https://baddomain.com/cert.pem' self.request._body = json.dumps(notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 400) self.assertEqual( result.content.decode('ascii'), 'Improper Certificate Location')
def test_bad_certificate_url(self): """Test an unknown certificate hostname""" notification = loader('bounce_notification') notification['SigningCertURL'] = 'https://baddomain.com/cert.pem' self.request._body = json.dumps(notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 400) self.assertEqual(result.content.decode('ascii'), 'Improper Certificate Location')
def test_unsubscribe_confirmation_not_handled(self): """Test that an unsubscribe notification is properly ignored""" notification = loader('bounce_notification') notification['Type'] = 'UnsubscribeConfirmation' self.request._body = json.dumps(notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 200) self.assertEqual( result.content.decode('ascii'), 'UnsubscribeConfirmation Not Handled' )
def test_signals_sent(self): """ Test that a notification feedback signal was sent Based on http://stackoverflow.com/questions/3817213/ """ # pylint: disable=attribute-defined-outside-init, unused-variable self.request._body = json.dumps(self.notification) self.signal_count = 0 @receiver(signals.notification) def _signal_receiver(sender, **kwargs): """Signal test receiver""" # pylint: disable=unused-argument self.signal_count += 1 self.signal_notification = kwargs['notification'] self.signal_request = kwargs['request'] result = views.endpoint(self.request) self.assertEqual(result.status_code, 200) self.assertEqual(self.signal_count, 1) self.assertEqual(self.signal_request, self.request) self.assertEqual(self.signal_notification, self.notification)
def test_invalid_json(self): """Test if the notification does not have a JSON body""" self.request._body = "This Is Not JSON" result = views.endpoint(self.request) self.assertEqual(result.status_code, 400) self.assertEqual(result.content.decode('ascii'), 'Not Valid JSON')
def test_non_post_http404(self): """Test that GET requests to the endpoint throw a 404""" request = self.factory.get('/') with self.assertRaises(Http404): views.endpoint(request)
def test_bad_topic(self): """Test the response if the topic does not match the settings""" self.request._body = json.dumps(self.notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 400) self.assertEqual(result.content.decode('ascii'), 'Bad Topic')
def test_success(self): """Test a successful request""" self.request._body = json.dumps(self.notification) result = views.endpoint(self.request) self.assertEqual(result.status_code, 200) self.assertEqual(result.content.decode('ascii'), 'Bounce Processed')