def setup_class(self) -> None:
        #pylint: disable=W0201
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(
            appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.conf")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        self.settings = Settings(settingsFilename, appInfo.path)

        section = ActionSendMessagePowerAlarm.PLUGIN_TYPE + Plugin.NAME_SEPARATOR + "send_poweralarm"
        self.settings.setString(section, "api_key", "NO_API_KEY")

        self.settings.setString(section, "api_group_nodetails", "NODETAILS")
        self.settings.setString(section, "api_group_reduced", "REDUCED")
        self.settings.setString(section, "api_group_full", "FULL")
        self.settings.setString(section, "api_group_tablet", "TABLET")
        self.settings.setString(section, "api_group_binary", "BINARY")
        self.settings.setString(section, "api_group_admin", "ADMIN")

        self.settings.setBoolean(section, "send_invalid", True)

        self.settings.setBoolean(section, "admin_send_setting", True)
        self.settings.setBoolean(section, "admin_send_unhandled", True)
        self.settings.setBoolean(section, "admin_send_invalid", False)

        self.settings.setString(section, "alarm_message", "TEST_ALARM")

        self.action = ActionSendMessagePowerAlarm("", self.settings, test=True)
Esempio n. 2
0
    def setup_class(self) -> None:
        #pylint: disable=W0201
        self.appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(self.appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(self.appInfo.path, ".temp/situationboard.conf")
        databaseFilename = os.path.join(self.appInfo.path, ".temp/situationboard.sqlite")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        self.database = Database(databaseFilename, reset = True)

        settings = Settings(settingsFilename, self.appInfo.path)
        settings.setFrontendHeader("header")
        settings.setFrontendNews("news")
        settings.setBoolean(Settings.SECTION_BACKEND, "web_api", True)

        displayPowerManager = DisplayPowerManager(settings)

        self.webSocket = WebSocket(self.appInfo, settings, self.database)

        pluginManager = PluginManager(settings, self.database, self.webSocket, displayPowerManager)

        self.webSocket.init(pluginManager)

        self.appClient = self.webSocket.app_test_client()
        self.socketClient = self.webSocket.socket_test_client(self.appClient)
def pytest_generate_tests(metafunc):
    appInfo = AppInfo()
    idlist = []
    argvalues = []
    argnames = ['input', 'result', 'parser']
    input_dir = os.path.join(appInfo.path, "test/parser_input/ILS-KA")
    s = get_settings()
    parser = MessageParserMail(instanceName=str(uuid.uuid1()), settings=s)
    for file in os.listdir(input_dir):
        args = []
        if os.path.isdir(input_dir):
            mail_file_path = os.path.join(input_dir, file, "mail.txt")
            result_file_path = os.path.join(input_dir, file, "result.json")
            if os.path.isfile(mail_file_path) and os.path.isfile(result_file_path):
                input = open(mail_file_path, "r").read()
                try:
                    result = json.loads(open(result_file_path, 'r').read())
                except json.decoder.JSONDecodeError:
                    result = None
                if result is not None and input is not None:
                    idlist.append(file)
                    args.append(input)
                    args.append(result)
                    args.append(parser)
                    argvalues.append(args)
    metafunc.parametrize(argnames, argvalues, ids=idlist, scope="class")
Esempio n. 4
0
    def test_settings(self) -> None:
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path, ".temp/situationboard.conf")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        s = Settings(settingsFilename, appInfo.path)

        frontendHeaderTest = "Frontend\n\"Complicated\"\tHeader\\=Test=1234"
        assert(s.getFrontendHeader() != frontendHeaderTest)
        s.setFrontendHeader(frontendHeaderTest)
        assert(s.getFrontendHeader() == frontendHeaderTest)

        frontendNewsTest = "Frontend\n\"Complicated\"\tNews\\=Test=1234"
        assert(s.getFrontendNews() != frontendNewsTest)
        s.setFrontendNews(frontendNewsTest)
        assert(s.getFrontendNews() == frontendNewsTest)

        test_string = "test_string"
        test_boolean = True
        test_int = 112
        test_float = 1.12

        s.setString("test", "test_string", test_string)
        s.setBoolean("test", "test_boolean", test_boolean)
        s.setInt("test", "test_int", test_int)
        s.setFloat("test", "test_float", test_float)

        s.store()

        sr = Settings(settingsFilename, appInfo.path)

        assert(sr.getFrontendHeader() == frontendHeaderTest)
        assert(sr.getFrontendNews() == frontendNewsTest)

        assert(sr.getString("test", "test_string", "") == test_string)
        assert(sr.getBoolean("test", "test_boolean", not test_boolean) == test_boolean)
        assert(sr.getInt("test", "test_int", 0) == test_int)
        assert(sr.getFloat("test", "test_float", 0.0) == test_float)

        defaultSources = ["dummy"]
        defaultActions = ["search_location", "update_database", "update_settings", "update_frontend" , "update_calendar"]
        defaultLanguage = "de"
        assert(sr.getBackendSources() == defaultSources)    # test getList and correct default sources
        assert(sr.getBackendActions() == defaultActions)    # test getList and correct default actions
        assert(sr.getFrontendLanguage() == defaultLanguage) # test getOption and correct default language
    def setup_class(self) -> None:
        #pylint: disable=W0201
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(
            appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.conf")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        s = Settings(settingsFilename, appInfo.path)

        self.p = MessageParserSMS("", s)

        self.defaultSender = "112"
        self.alarmSender = "+49112"  # alarm sender set in config
        self.settingSender = "123"
        self.defaultTimestamp = datetime.datetime.now().strftime(
            AlarmEvent.TIMESTAMP_FORMAT)
        self.eid = 1302
    def test_handle_event(self) -> None:
        #pylint: disable=W0201
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(
            appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.conf")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        settings = Settings(settingsFilename, appInfo.path)

        action = ActionUpdateSettings("", settings)

        # init and check initial settings
        settings.setFrontendHeader(Test_ActionUpdateSettings.INITIAL_HEADER)
        settings.setFrontendNews(Test_ActionUpdateSettings.INITIAL_NEWS)
        assert (settings.getFrontendHeader() ==
                Test_ActionUpdateSettings.INITIAL_HEADER)
        assert (settings.getFrontendNews() ==
                Test_ActionUpdateSettings.INITIAL_NEWS)

        # check that updating header setting succeeds
        settingEvent = SettingEvent()
        settingEvent.key = "header"
        settingEvent.value = Test_ActionUpdateSettings.UPDATED_HEADER
        settingEvent.flags = SettingEvent.FLAGS_VALID
        action.handleEvent(settingEvent)
        assert (settings.getFrontendHeader() ==
                Test_ActionUpdateSettings.UPDATED_HEADER)

        # check that updating news setting succeeds
        settingEvent = SettingEvent()
        settingEvent.key = "news"
        settingEvent.value = Test_ActionUpdateSettings.UPDATED_NEWS
        settingEvent.flags = SettingEvent.FLAGS_VALID
        action.handleEvent(settingEvent)
        assert (settings.getFrontendNews() ==
                Test_ActionUpdateSettings.UPDATED_NEWS)
Esempio n. 7
0
    def test_csv(self) -> None:
        appInfo = AppInfo()
        dbFilename = os.path.join(appInfo.path, ".temp/situationboard.sqlite")
        inFilename = os.path.join(appInfo.path, "docs/dummy.csv")
        outFilename = os.path.join(appInfo.path, ".temp/dummy.csv")
        csvFilename = os.path.join(appInfo.path, ".temp/corner.csv")

        ###### TEST 1 (round trip) ######

        # create a new (empty) database
        d = Database(dbFilename, reset = True)
        assert(d.getEventCount(textOnly = False) == 0)

        # import data from CSV
        i = CSVImporter(d)
        result = i.importEvents(inFilename)
        assert(result == 0)
        assert(d.getEventCount(textOnly = False) > 0)

        # export data to CSV
        e = CSVExporter(d)
        result = e.exportEvents(outFilename)
        assert(result == 0)

        # compare CSV files
        assert(filecmp.cmp(inFilename, outFilename, shallow=False))

        # close database
        d.close()

        ###### TEST 2 (corner cases) ######

        # create a new (empty) database
        d = Database(dbFilename, reset = True)
        assert(d.getEventCount(textOnly = False) == 0)

        # add new event with pathologic content
        ts = datetime.datetime.now().strftime(AlarmEvent.TIMESTAMP_FORMAT)
        content = "Test\n;\\Test\nTest\"äöüß\"\"äöüß'äöüß''äöüß\näöüß"

        aeAdded = AlarmEvent()
        aeAdded.timestamp = ts
        aeAdded.event = content
        aeAdded.eventDetails = content
        aeAdded.location = content
        aeAdded.locationDetails = content
        aeAdded.comment = content
        aeAdded.alarmTimestamp = ts
        aeAdded.locationLatitude = 1.12
        aeAdded.locationLongitude = -13.2
        eventID = d.addEvent(aeAdded)

        # export data to CSV
        e = CSVExporter(d)
        result = e.exportEvents(csvFilename)
        assert(result == 0)

        # close database
        d.close()

        # create a new (empty) database
        d = Database(dbFilename, reset = True)

        # import data from CSV
        i = CSVImporter(d)
        result = i.importEvents(csvFilename)
        assert(result == 0)
        assert(d.getEventCount(textOnly = False) > 0)

        # load event
        aeLoaded = d.getEvent(eventID)
        assert(aeLoaded is not None)

        # compare event data
        assert(aeAdded.comment == aeLoaded.comment)

        # close database
        d.close()
Esempio n. 8
0
    def test_database(self) -> None:
        appInfo = AppInfo()
        databaseFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.sqlite")
        maxLastEvents = 10

        # check that creating a database works and yields an empty database
        db = Database(databaseFilename, reset=True)
        assert (db.getEventCount(textOnly=False) == 0)
        assert (db.getEventCount(textOnly=True) == 0)
        assert (db.getEvent(1302) is None)
        assert (len(db.getEvents(textOnly=False)) == 0)
        assert (len(db.getEvents(textOnly=True)) == 0)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=False)) == 0)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=True)) == 0)

        # check for valid stats
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=True) == 0)

        # check that inserting a binary event succeeds
        newEvent1 = self.__createBinaryEvent()
        newEventTemp1 = copy.deepcopy(newEvent1)
        assert (db.updateEvent(newEventTemp1) != 0)
        eventID1 = db.addEvent(newEventTemp1)
        assert (eventID1 != AlarmEvent.NO_ID)
        assert (newEventTemp1.eventID == eventID1)
        assert (db.getEventCount(textOnly=False) == 1)
        assert (db.getEventCount(textOnly=True) == 0)
        assert (len(db.getEvents(textOnly=False)) == 1)
        assert (len(db.getEvents(textOnly=True)) == 0)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=False)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=True)) == 0)
        assert (db.getEvent(eventID1) is not None)

        # check for valid stats
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=True) == 0)

        # check that inserting a text event succeeds
        newEvent2 = self.__createTextEvent()
        newEvent2Temp = copy.deepcopy(newEvent2)
        eventID2 = db.addEvent(newEvent2Temp)
        assert (eventID2 != AlarmEvent.NO_ID)
        assert (newEvent2Temp.eventID == eventID2)
        assert (db.getEventCount(textOnly=False) == 2)
        assert (db.getEventCount(textOnly=True) == 1)
        assert (len(db.getEvents(textOnly=False)) == 2)
        assert (len(db.getEvents(textOnly=True)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=False)) == 2)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=True)) == 1)
        assert (db.getEvent(eventID2) is not None)

        # check for valid stats
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=False) == 2)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=False) == 2)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=False) == 2)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=False) == 2)
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=True) == 1)

        db.commitAndClose()

        # check that reloading a database succeeds and yields existing data
        dbr = Database(databaseFilename, reset=False)
        assert (dbr.getEventCount(textOnly=False) == 2)
        assert (dbr.getEventCount(textOnly=True) == 1)
        assert (len(dbr.getEvents(textOnly=False)) == 2)
        assert (len(dbr.getEvents(textOnly=True)) == 1)
        assert (len(dbr.getLastEvents(maxLastEvents, textOnly=False)) == 2)
        assert (len(dbr.getLastEvents(maxLastEvents, textOnly=True)) == 1)

        # check that retrieving an event succeeds after reload succeeds and yields the correct data
        event1 = dbr.getEvent(eventID1)
        assert (event1 is not None)
        assert (isinstance(event1, AlarmEvent))
        assert (event1.eventID == eventID1)
        self.__compareEvents(event1, newEvent1)

        # check that retrieving an event succeeds after reload succeeds and yields the correct data
        event2 = dbr.getEvent(eventID2)
        assert (event2 is not None)
        assert (isinstance(event2, AlarmEvent))
        assert (event2.eventID == eventID2)
        self.__compareEvents(event2, newEvent2)

        # check that updating an event succeeds
        newEvent2Updated = copy.deepcopy(newEvent2Temp)
        self.__updateTextEvent(newEvent2Updated)
        newEvent2UpdatedTemp = copy.deepcopy(newEvent2Updated)
        assert (dbr.updateEvent(newEvent2UpdatedTemp) == 0)
        event2Updated = dbr.getEvent(eventID2)
        assert (event2Updated is not None)
        assert (isinstance(event2Updated, AlarmEvent))
        assert (event2Updated.eventID == eventID2)
        self.__compareEvents(event2Updated, newEvent2Updated)

        # check that deleting an event by ID succeeds
        assert (dbr.removeEventID(eventID1) == 0)
        assert (dbr.getEventCount(textOnly=False) == 1)
        assert (dbr.getEventCount(textOnly=True) == 1)
        assert (dbr.getEvent(eventID1) is None)
        assert (len(dbr.getEvents(textOnly=False)) == 1)
        assert (len(dbr.getEvents(textOnly=True)) == 1)
        assert (len(dbr.getLastEvents(maxLastEvents, textOnly=False)) == 1)
        assert (len(dbr.getLastEvents(maxLastEvents, textOnly=True)) == 1)

        # check that deleting an event succeeds
        assert (dbr.removeEvent(newEvent2Updated) == 0)
        assert (dbr.getEventCount(textOnly=False) == 0)
        assert (dbr.getEventCount(textOnly=True) == 0)
        assert (dbr.getEvent(eventID2) is None)
        assert (len(dbr.getEvents(textOnly=False)) == 0)
        assert (len(dbr.getEvents(textOnly=True)) == 0)
        assert (len(dbr.getLastEvents(maxLastEvents, textOnly=False)) == 0)
        assert (len(dbr.getLastEvents(maxLastEvents, textOnly=True)) == 0)

        # check that deleting non-existent events fails
        assert (dbr.removeEvent(event1) != 0)
        assert (dbr.removeEventID(eventID2) != 0)

        dbr.commitAndClose()
Esempio n. 9
0
    def test_handle_event(self) -> None:
        #pylint: disable=W0201
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(
            appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.conf")
        databaseFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.sqlite")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        settings = Settings(settingsFilename, appInfo.path)

        maxLastEvents = 10

        displayPowerManager = DisplayPowerManager(settings)

        db = Database(databaseFilename, reset=True)

        webSocket = WebSocket(appInfo, settings, db)

        pluginManager = PluginManager(settings, db, webSocket,
                                      displayPowerManager)

        webSocket.init(pluginManager)

        # check that creating a database works and yields an empty database
        assert (db.getEventCount(textOnly=False) == 0)
        assert (db.getEventCount(textOnly=True) == 0)
        assert (db.getEvent(1302) is None)
        assert (len(db.getEvents(textOnly=False)) == 0)
        assert (len(db.getEvents(textOnly=True)) == 0)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=False)) == 0)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=True)) == 0)

        # check for valid stats
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=True) == 0)

        action = ActionUpdateDatabase("", settings, db, webSocket)

        # check that inserting an alarm event succeeds
        newEvent = self.__createEvent()
        action.handleEvent(newEvent)
        assert (not newEvent.noID)
        assert (db.getEventCount(textOnly=False) == 1)
        assert (db.getEventCount(textOnly=True) == 1)
        assert (len(db.getEvents(textOnly=False)) == 1)
        assert (len(db.getEvents(textOnly=True)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=False)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=True)) == 1)
        newEventID = newEvent.eventID
        assert (db.getEvent(newEventID) is not None)

        # check for valid stats
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=True) == 1)

        # check that updating an alarm event succeeds
        self.__updateEvent(newEvent)
        action.handleEvent(newEvent)
        assert (newEvent.eventID == newEventID)
        assert (db.getEventCount(textOnly=False) == 1)
        assert (db.getEventCount(textOnly=True) == 1)
        assert (len(db.getEvents(textOnly=False)) == 1)
        assert (len(db.getEvents(textOnly=True)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=False)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=True)) == 1)
        retrievedEvent = db.getEvent(newEventID)
        assert (retrievedEvent is not None)
        assert (retrievedEvent.comment ==
                Test_ActionUpdateDatabase.UPDATED_COMMENT)

        # check for valid stats
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=True) == 1)

        db.commitAndClose()
Esempio n. 10
0
 def __init__(self) -> None:
     """This constructor is responsible for the early startup of the backend
     and instantiates all the required modules."""
     super().__init__("situationboard", settings=None, debug=False)
     self.appInfo = AppInfo()
Esempio n. 11
0
 def setup_class(self) -> None:
     #pylint: disable=W0201
     self.appInfo = AppInfo()
def get_settings():
    appInfo = AppInfo()
    settingsFilenameOrig = os.path.join(appInfo.path, "misc/setup/situationboard_default.conf")
    settingsFilename = os.path.join(appInfo.path, ".temp/situationboard.conf")
    shutil.copy(settingsFilenameOrig, settingsFilename)
    return Settings(settingsFilename, appInfo.path)