示例#1
0
    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)
示例#2
0
    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()
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)