def test_get_phone_alarm_success(self, test_app):
        alarm = Alarm("car").save()
        phone = Phone(str(uuid.uuid4())).save()

        phone_alarm = PhoneAlarm()
        phone_alarm.timestamp = isoparse("20200607T032905Z")
        phone_alarm.status = True
        phone_alarm.alarm = alarm
        phone_alarm.phone = phone

        phone.alarms.append(phone_alarm)
        phone.save()

        res = test_app.get(
            f"/server/vehicle/alarm?pid={phone.pid}&aid={alarm.aid}")

        json = res.get_json()

        assert res.status_code == 200
        assert json["success"]
        assert json["error"] is None

        data = json["data"]

        assert data["pid"] == phone.pid
        assert data["aid"] == alarm.aid
        assert data["timestamp"] == "20200607T032905Z"
        assert data["status"]
    def test_delete_phone_alarm_success(self, test_app):
        alarm = Alarm("truck").save()
        phone = Phone(str(uuid.uuid4())).save()

        phone_alarm = PhoneAlarm()
        phone_alarm.alarm = alarm
        phone_alarm.phone = phone

        phone.alarms.append(phone_alarm)
        phone.save()

        res = test_app.delete(
            f"/server/vehicle/alarm?pid={phone.pid}&aid={alarm.aid}")

        json = res.get_json()

        phone_alarm = db.session.query(PhoneAlarm).filter_by(
            phone_id=phone.pid, alarm_id=alarm.aid).all()

        assert res.status_code == 200
        assert json['success']
        assert json["data"] is None
        assert json['error'] is None

        assert not phone_alarm
    def test_update_phone_alarm_success(self, test_app):
        alarm = Alarm("car").save()
        phone = Phone(str(uuid.uuid4())).save()

        phone_alarm = PhoneAlarm()

        phone_alarm.alarm = alarm
        phone_alarm.phone = phone
        phone.alarms.append(phone_alarm)
        phone_alarm.save()

        res = test_app.put(
            f"/server/vehicle/alarm?pid={phone.pid}&aid={alarm.aid}",
            json={
                "timestamp": "20200607T032905Z",
                "status": True
            })

        json = res.get_json()
        data = json["data"]

        phone_alarm_db = db.session.query(PhoneAlarm).filter_by(
            phone_id=phone.pid, alarm_id=alarm.aid).all()
        phone_alarm_db = phone_alarm_db.pop().serialize()

        assert res.status_code == 200
        assert json['success']
        assert json['error'] is None

        assert data["pid"] == phone_alarm.phone_id == phone_alarm_db["pid"]
        assert data["aid"] == phone_alarm.alarm_id == phone_alarm_db["aid"]
        assert data["status"]
        assert phone_alarm_db["status"]
        assert data["timestamp"] == "20200607T032905Z" == phone_alarm_db[
            "timestamp"]
    def test_get_alarm_exists_success(self, test_app):
        alarm = Alarm("truck").save()
        alarm.description = "Alarma para alertar de camiones cercanos"
        alarm.update()

        res = test_app.get(f'/server/alarm/{alarm.aid}')

        json = res.get_json()
        data = json["data"]

        assert res.status_code == 200
        assert json["success"]
        assert json['error'] is None

        assert data["aid"] == alarm.aid
        assert data["name"] == "truck"
        assert data["description"] == "Alarma para alertar de camiones cercanos"
    def test_add_phone_not_exists_alarm_fail(self, test_app):
        alarm = Alarm("truck").save()

        res = test_app.post(
            f"/server/vehicle/alarm?pid=197c92f1-ef0d-41b2-8192-1444b232a5fd&aid={alarm.aid}"
        )

        json = res.get_json()

        assert res.status_code == 404
        assert not json["success"]
        assert json['data'] is None
        assert json['error'] == 'Phone does not exist'
    def test_add_phone_alarm_already_exists(self, test_app):
        alarm = Alarm("skate").save()
        phone = Phone(str(uuid.uuid4())).save()

        test_app.post(f"/server/vehicle/alarm?pid={phone.pid}&aid={alarm.aid}")
        res = test_app.post(
            f"/server/vehicle/alarm?pid={phone.pid}&aid={alarm.aid}")

        json = res.get_json()

        assert res.status_code == 409
        assert not json["success"]
        assert json['data'] is None
        assert json['error'] == 'Phone_alarm does already exist'
    def test_delete_alarm_exists_success(self, test_app):
        alarm = Alarm("truck").save()

        res = test_app.delete(f'/server/alarm/{alarm.aid}')

        json = res.get_json()
        alarm = Alarm.query.get(alarm.aid)

        assert res.status_code == 200
        assert json["success"]
        assert json["error"] is None
        assert json["data"] is None

        assert alarm is None
    def test_update_phone_not_exists_alarm_fail(self, test_app):
        alarm = Alarm("car").save()

        res = test_app.put(
            f"/server/vehicle/alarm?pid=197c92f1-ef0d-41b2-8192-1444b232a5fd&aid={alarm.aid}",
            json={
                "timestamp": "20200607T032905Z",
                "status": True
            })

        json = res.get_json()

        assert res.status_code == 404
        assert not json['success']
        assert json["data"] is None
        assert json['error'] == "Phone does not exist"
    def test_get_phone_alarm_no_relation_fail(self, test_app):
        alarm = Alarm("truck").save()
        phone = Phone(str(uuid.uuid4())).save()

        res = test_app.get(
            f"/server/vehicle/alarm?pid={phone.pid}&aid={alarm.aid}")

        json = res.get_json()

        phone_alarm = db.session.query(PhoneAlarm).filter_by(
            phone_id=phone.pid, alarm_id=alarm.aid).all()

        assert res.status_code == 404
        assert not json["success"]
        assert json['data'] is None
        assert json['error'] == 'Phone_Alarm does not exist'
        assert not phone_alarm
    def test_update_phone_alarm_no_relation_fail(self, test_app):
        alarm = Alarm("car").save()
        phone = Phone(str(uuid.uuid4())).save()

        res = test_app.put(
            f"/server/vehicle/alarm?pid={phone.pid}&aid={alarm.aid}",
            json={
                "timestamp": "20200607T032905Z",
                "status": True
            })

        json = res.get_json()

        assert res.status_code == 404
        assert not json['success']
        assert json["data"] is None
        assert json['error'] == "Phone_Alarm does not exist"
    def test_get_all_phone_alarm_success(self, test_app):
        phone = Phone(str(uuid.uuid4())).save()

        boolean = True

        for x in range(2):
            alarm = Alarm("car").save()

            phone_alarm = PhoneAlarm()
            phone_alarm.alarm = alarm
            phone_alarm.phone = phone

            phone_alarm.timestamp = isoparse("20200607T032905Z")
            phone_alarm.status = boolean

            phone.alarms.append(phone_alarm)

            boolean = not boolean

        phone.save()

        res = test_app.get(f"/server/vehicle/alarm?pid={phone.pid}")

        json = res.get_json()
        data = json["data"]

        assert res.status_code == 200
        assert json["success"]
        assert json["error"] is None

        assert len(data) == 2

        phone_alarm = data.pop(0)

        assert phone_alarm["pid"] is not None
        assert phone_alarm["aid"] is not None
        assert phone_alarm["timestamp"] == "20200607T032905Z"
        assert phone_alarm["status"]

        phone_alarm = data.pop(0)

        assert phone_alarm["pid"] is not None
        assert phone_alarm["aid"] is not None
        assert phone_alarm["timestamp"] == "20200607T032905Z"
        assert not phone_alarm["status"]
    def test_update_alarm_description_success(self, test_app):
        alarm = Alarm("skate").save()

        res = test_app.put(f'/server/alarm/{alarm.aid}?desc=true',
                           json={"description": "Alarma para alertar de skates cercanos"})

        json = res.get_json()

        data = json["data"]
        alarm_db = Alarm.query.get(alarm.aid)

        assert res.status_code == 200
        assert json['success']
        assert json['error'] is None

        assert alarm_db.aid == alarm.aid == data["aid"]
        assert alarm_db.name == "skate" == data["name"]
        assert alarm_db.description == "Alarma para alertar de skates cercanos" == data["description"]
    def test_update_alarm_name_success(self, test_app):
        alarm = Alarm("skate").save()

        res = test_app.put(f'/server/alarm/{alarm.aid}?name=true', json={"name": 'truck'})

        json = res.get_json()

        data = json["data"]
        alarm_db = Alarm.query.get(alarm.aid)

        assert res.status_code == 200
        assert json['success']
        assert json['error'] is None

        assert alarm_db.aid == alarm.aid == data["aid"]
        assert alarm_db.name == "truck" == data["name"]
        assert alarm_db.description is None
        assert data["description"] is None
    def test_add_phone_alarm_success(self, test_app):
        phone = Phone(str(uuid.uuid4())).save()
        alarm = Alarm("car").save()

        res = test_app.post(
            f"/server/vehicle/alarm?pid={phone.pid}&aid={alarm.aid}")

        json = res.get_json()

        phone_alarm = db.session.query(PhoneAlarm).filter_by(
            phone_id=phone.pid, alarm_id=alarm.aid)
        data = json["data"]

        assert res.status_code == 201
        assert json["success"]
        assert json['error'] is None
        assert data['pid'] == phone.pid
        assert data['aid'] == alarm.aid
        assert data['status'] is None
        assert data['timestamp'] is None

        assert phone_alarm is not None
    def test_update_phone_alarm_invalid_timestamp_fail(self, test_app):
        alarm = Alarm("car").save()
        phone = Phone(str(uuid.uuid4())).save()

        phone_alarm = PhoneAlarm()

        phone_alarm.alarm = alarm
        phone_alarm.phone = phone
        phone.alarms.append(phone_alarm)
        phone_alarm.save()

        res = test_app.put(
            f"/server/vehicle/alarm?pid={phone.pid}&aid={alarm.aid}",
            json={
                "timestamp": "20200607032905Z",
                "status": True
            })

        json = res.get_json()

        assert res.status_code == 403
        assert not json['success']
        assert json["data"] is None
        assert json['error'] == "Invalid timestamp"