def test_unchanged_status_text(self): """Test that the text is correct.""" scale = "count" metric1 = dict(type="metric_type", name="Metric", unit="units", scale=scale, recent_measurements=[ dict(count=dict(value=0, status="near_target_met")), dict(count=dict(value=42, status="near_target_met")) ]) metric2 = dict(type="metric_type", name="Metric", unit="units", scale=scale, recent_measurements=[ dict(count=dict(value=5, status="target_met")), dict(count=dict(value=10, status="target_not_met")) ]) metric_notification_data1 = MetricNotificationData( metric1, self.data_model, "status_long_unchanged") metric_notification_data2 = MetricNotificationData( metric2, self.data_model, "status_long_unchanged") notification = Notification( self.report, [metric_notification_data1, metric_notification_data2], "destination_uuid", {}) text = build_notification_text(notification) self.assertEqual( "[Report 1](https://report1) has 2 metrics that are notable:\n\n" "* Metric has been yellow (near target met) for three weeks. Value: 42 units.\n" "* Metric has been red (target not met) for three weeks. Value: 10 units.\n", text)
def setUp(self): """Set variables for the other testcases.""" self.reason1 = "status_changed" self.data_model = dict( metrics=dict(metric_type=dict(name="type")), sources=dict(quality_time=dict(parameters=dict(status=dict( api_values={ "target met (green)": "target_met", "target not met (red)": "target_not_met" })))), ) self.report_url = "https://report1" self.report = dict(title="report_title", url=self.report_url) metric1 = self.create_metric("default metric 1") metric2 = self.create_metric("default metric 2") self.metric_notification_data1 = MetricNotificationData( metric1, self.data_model, self.reason1) self.metric_notification_data2 = MetricNotificationData( metric2, self.data_model, self.reason1) metrics1 = [ self.metric_notification_data1, self.metric_notification_data2 ] metric3 = self.create_metric("default metric 3") metric4 = self.create_metric("default metric 4") metric_notification_data3 = MetricNotificationData( metric3, self.data_model, self.reason1) metric_notification_data4 = MetricNotificationData( metric4, self.data_model, self.reason1) metrics2 = [metric_notification_data3, metric_notification_data4] self.notifications = [ Notification(self.report, metrics1, "uuid1", dict(webhook="https://url/1")), Notification(self.report, metrics2, "uuid2", dict(webhook="https://url/2")), ]
def get_notifications( self, json, most_recent_measurement_seen: str) -> List[Notification]: """Return the reports that have a webhook and metrics that require notifying.""" notifications = [] for report in json["reports"]: notable_metrics = [] for subject in report["subjects"].values(): for metric_uuid, metric in subject["metrics"].items(): notable = self.get_notification( metric, metric_uuid, most_recent_measurement_seen) if notable: notable_metrics.append( MetricNotificationData(metric, self.data_model, notable)) if notable_metrics: for destination_uuid, destination in report.get( "notification_destinations", {}).items(): notifications.append( Notification(report, notable_metrics, destination_uuid, destination)) return notifications
def test_unknown_text(self): """Test that the text is correct.""" metric1 = dict( type="metric_type", name="Metric", unit="units", scale="count", recent_measurements=[ dict(count=dict(value=0, status="near_target_met")), dict(count=dict(value=None, status="unknown")), ], ) metric_notification_data1 = MetricNotificationData( metric1, self.data_model, "status_changed") notification = Notification(self.report, [metric_notification_data1], "destination_uuid", {}) text = build_notification_text(notification) self.assertEqual( "[Report 1](https://report1) has 1 metric that is notable:\n\n" "* Metric status is white (unknown), was yellow (near target met). Value is ? units, was 0 units.\n", text, )
def test_unknown_status_without_recent_measurements(self): """Test that a metric without recent measurements works.""" self.metric["recent_measurements"] = [] new_status = MetricNotificationData(self.metric, self.data_model, "status_changed").new_metric_status self.assertEqual("white (unknown)", new_status)
def test_unknown_status(self): """Test that a recent measurement without status works.""" self.metric["recent_measurements"][-1]["count"]["status"] = None new_status = MetricNotificationData(self.metric, self.data_model, "status_changed").new_metric_status self.assertEqual("white (unknown)", new_status)
def test_new_status(self): """Test that the new status is set correctly.""" new_status = MetricNotificationData(self.metric, self.data_model, "status_changed").new_metric_status self.assertEqual("red (target not met)", new_status)