def setup_for_test(self):
     self.email_alert = EmailAlert(self.cur_session)
     self.patched_out_sender = monitor.email_sender
     monitor.email_sender = FakeEmailer()
class EmailAlertTests(DbTest):
    def setup_for_test(self):
        self.email_alert = EmailAlert(self.cur_session)
        self.patched_out_sender = monitor.email_sender
        monitor.email_sender = FakeEmailer()

    def clean_up_after_test(self):
        monitor.email_sender = self.patched_out_sender

    def test_send_alerts_for_id_no_alert_nothing_sent(self):
        uri_check_id = 1
        self.add_with_one_uri_check_with_id_and_no_alerts(uri_check_id)

        self.email_alert.send_alerts_for_id(uri_check_id, '')

        assert not  monitor.email_sender.send_called

    def test_send_alerts_for_id_1_alert_msg_sent(self):
        uri_check_id = 1
        expected_target_email = '*****@*****.**'

        self.add_with_one_uri_check_with_id_and_no_alerts(uri_check_id)
        self.add_alert_for_uri_check_with_id(uri_check_id, 
                                             expected_target_email)

        self.email_alert.send_alerts_for_id(uri_check_id, '')

        assert monitor.email_sender.send_called
        assert monitor.email_sender.sent_to == expected_target_email 

    def test_send_alerts_for_id_1_alert_msg_sent_with_url_in(self):
        uri_check_id = 1
        expected_url = 'google.com'

        self.add_with_one_uri_check_with_id_and_no_alerts(uri_check_id)
        self.add_alert_for_uri_check_with_id(uri_check_id)

        self.email_alert.send_alerts_for_id(uri_check_id, expected_url)

        assert monitor.email_sender.send_args['url'] == expected_url

    def test_send_alerts_for_id_1_under_alert_count_msg_sent(self):
        uri_check_id = 1
        expected_url = 'google.com'

        self.add_with_one_uri_check_with_id_and_no_alerts(uri_check_id)
        self.add_alert_for_uri_check_with_id(uri_check_id, num_of_times = 1)

        self.email_alert.send_alerts_for_id(uri_check_id, expected_url)

        assert monitor.email_sender.send_called 

    def test_send_alerts_for_id_1_alert_count_incremented_and_commited(self):
        uri_check_id = 1
        expected_url = 'google.com'

        self.add_with_one_uri_check_with_id_and_no_alerts(uri_check_id)
        self.add_alert_for_uri_check_with_id(uri_check_id,
                                             num_of_times = 2,
                                             num_of_times_alerted=0)

        self.email_alert.send_alerts_for_id(uri_check_id, expected_url)

        self.assertEquals(self.cur_session.query(Alert).all()[0].num_of_times_alerted, 1)

    def test_send_alerts_for_id_1_reaches_message_count_stop_is_set_on_alert(self):
        uri_check_id = 1
        expected_url = 'google.com'

        self.add_with_one_uri_check_with_id_and_no_alerts(uri_check_id)
        self.add_alert_for_uri_check_with_id(uri_check_id, 
                                             num_of_times = 1, 
                                             num_of_times_alerted = 0)

        self.email_alert.send_alerts_for_id(uri_check_id, expected_url)

        assert self.cur_session.query(Alert).one().stop

    def test_send_alerts_for_id_1_over_alert_count_msg_not_sent(self):
        uri_check_id = 1
        expected_url = 'google.com'

        self.add_with_one_uri_check_with_id_and_no_alerts(uri_check_id)
        self.add_alert_for_uri_check_with_id(uri_check_id,
                                             num_of_times = 1,
                                             num_of_times_alerted = 2)

        self.email_alert.send_alerts_for_id(uri_check_id, expected_url)

        assert not monitor.email_sender.send_called 

    def test_send_alerts_for_id_1_unlimited_alerts_msg_sent(self):
        uri_check_id = 1
        expected_url = 'google.com'

        self.add_with_one_uri_check_with_id_and_no_alerts(uri_check_id)
        self.add_alert_for_uri_check_with_id(uri_check_id,
                                           num_of_times = EmailAlert.NO_LIMIT,
                                           num_of_times_alerted = 2)
        self.email_alert.send_alerts_for_id(uri_check_id, expected_url)

        assert monitor.email_sender.send_called
        assert not self.cur_session.query(Alert).one().stop