def test_zone_list_get_with_sensor_filter(self, api_root): excluded_zone = Zone(name='Test Zone Excluded', notes='Zone notes.', key=uuid4()) excluded_zone.save() excluded_sensor = Sensor(guid=uuid4(), name='Test Sensor Excluded', notes='Sensor notes.', zone=excluded_zone, min_value=20, max_value=25, min_value_operator='>=', max_value_operator='<=', state=True, state_last_change_date=datetime.utcnow()) excluded_sensor.save() suffix = 'zones/?sensor_ids={}&format=json'.format(self.sensor.id) response = requests.get(api_root + suffix) data = response.json() assert len(data) > 0 excluded_zone_json = [ x for x in data if x['id'] == str(excluded_zone.id) ] assert len(excluded_zone_json) == 0 excluded_sensor.delete() excluded_zone.delete() zone_json = [x for x in data if int(x['id']) == self.zone.id][0] self._compare_zone_json(self.zone, zone_json)
def test_sensor_data_detail_post_guid(self, api_root): """ Test adding sensor data with only supplying a Sensor guid, sensor data value and a zone key. If the sensor doesn't exist, this will create it. """ zone = Zone(name='Test Zone', key=uuid4()) zone.save() guid = 'DEADBEEF00000012345TEST' value_first = 15.0 value_second = 25.0 num_sensors_before_add = Sensor.objects.all().count() data_dict = { 'guid': guid, 'value': value_first, 'key': str(zone.key), } headers = {'Content-type': 'application/json'} response = requests.post(api_root + 'data/', data=json.dumps(data_dict), headers=headers) response_json_first = response.json() num_sensors_after_add = Sensor.objects.all().count() assert response.status_code == 201 assert num_sensors_before_add + 1 == num_sensors_after_add data = SensorData.objects.get(pk=response_json_first["id"]) data.delete() data_dict = { 'guid': guid, 'value': value_second, 'key': str(zone.key), } headers = {'Content-type': 'application/json'} response = requests.post(api_root + 'data/', data=json.dumps(data_dict), headers=headers) response_json_second = response.json() num_sensors_after_second_request = Sensor.objects.all().count() # Ensure we didn't add another sensor assert response.status_code == 201 assert num_sensors_after_add == num_sensors_after_second_request assert response_json_first["sensor"] == response_json_second["sensor"] data = SensorData.objects.get(pk=response_json_second["id"]) sensor = Sensor.objects.get(pk=data.sensor.id) data.delete() sensor.delete()
def test_zone_list_get_with_zone_filter(self, api_root): excluded_zone = Zone(name='Test Zone Excluded', notes='Zone notes.', key=uuid4()) excluded_zone.save() suffix = 'zones/?zone_ids={}&format=json'.format(self.zone.id) response = requests.get(api_root + suffix) data = response.json() assert len(data) > 0 excluded_zone_json = [ x for x in data if x['id'] == str(excluded_zone.id) ] assert len(excluded_zone_json) == 0 excluded_zone.delete() zone_json = [x for x in data if int(x['id']) == self.zone.id][0] self._compare_zone_json(self.zone, zone_json)
def create_data(self, request): def finalizer(): if self.data is not None: for data in self.data: data.delete() self.data = None if self.sensor is not None: self.sensor.delete() self.sensor = None if self.zone is not None: self.zone.delete() self.zone = None self.zone = Zone(name='Test Zone', notes='Zone notes.', key=uuid4()) self.zone.save() self.sensor = Sensor(guid=uuid4(), name='Test Sensor', notes='Sensor notes.', zone=self.zone, min_value=20, max_value=25, min_value_operator='>=', max_value_operator='<=', state=True, state_last_change_date=datetime.utcnow()) self.sensor.save() self.data = [] for i in range(3): datum = SensorData(sensor=self.sensor, datetime=datetime.utcnow(), value=self.sensor.min_value + i, state=True, state_changed=False) datum.save() self.data.append(datum) request.addfinalizer(finalizer)
def create_data(self, request): def finalizer(): if self.alerts is not None: for alert in self.alerts: alert.delete() self.alerts = None if self.data is not None: for data in self.data: data.delete() self.data = None if self.sensor is not None: self.sensor.delete() self.sensor = None if self.zone is not None: self.zone.delete() self.zone = None if self.alert_group is not None: self.alert_group.delete() self.alert_group = None if self.user is not None: self.user.delete() username = str(uuid4())[:30] self.user = User(username=username, email='{}@example.net'.format(username)) self.user.save() self.alert_group = SensorAlertGroup(name='Test Group') self.alert_group.save() self.alert_group.users.add(self.user) self.zone = Zone(name='Test Zone', notes='Zone notes.', key=uuid4()) self.zone.save() self.sensor = Sensor(guid=uuid4(), name='Test Sensor', notes='Sensor notes.', zone=self.zone, min_value=60, max_value=85, min_value_operator='>=', max_value_operator='<=', state=True, state_last_change_date=datetime.utcnow()) self.sensor.save() self.sensor.alert_groups.add(self.alert_group) self.data = [] # Inbox is empty assert 0 == len(mail.outbox) # Create in-range data point; no notification. datum = SensorData(sensor=self.sensor, datetime=datetime.utcnow(), value=self.sensor.min_value + 1, state=True, state_changed=False) datum.save() self.data.append(datum) # Inbox still empty assert 0 == len(mail.outbox) # Create out-of-range notification; sends "alert." datum = SensorData(sensor=self.sensor, datetime=datetime.utcnow(), value=self.sensor.min_value - 1, state=True, state_changed=False) datum.save() self.data.append(datum) # Inbox received alert assert 1 == len(mail.outbox) # Create another in-range data point; sends "recovered." datum = SensorData(sensor=self.sensor, datetime=datetime.utcnow(), value=self.sensor.min_value + 1, state=True, state_changed=False) datum.save() self.data.append(datum) # Inbox received recovery email assert 2 == len(mail.outbox) self.alerts = SensorAlert.objects.all().order_by('id') request.addfinalizer(finalizer)