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)
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 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)
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()
def run(self, argv: List[str]) -> None: """This is the main entry point of the backend application.""" defaultConfigPath = os.path.join( self.appInfo.path, SituationBoard.DEFAULT_CONFIG_FILENAME) defaultConfigPath = os.getenv("SB_CONFIG", defaultConfigPath) defaultDatabasePath = os.path.join( self.appInfo.path, SituationBoard.DEFAULT_DATABASE_FILENAME) defaultDatabasePath = os.getenv("SB_DATABASE", defaultDatabasePath) parser = argparse.ArgumentParser( description=f"{self.appInfo.name} v{self.appInfo.version}", add_help=False) igroup = parser.add_argument_group("Important Commands and Parameters") mmutex = igroup.add_mutually_exclusive_group() mmutex.add_argument("-s", "--server", help="start backend server (default)", default=True, action='store_true') mmutex.add_argument("-i", "--import", help="import data from CSV", default=None, dest='importFile') mmutex.add_argument("-e", "--export", help="export data to CSV", default=None, dest='exportFile') mmutex.add_argument("-n", "--version", help="show version number and exit", default=False, action='store_true') mmutex.add_argument("-h", "--help", help="show this help message and exit", action='help') ogroup = parser.add_argument_group("Other Parameters and Options") ogroup.add_argument("-c", "--config", help="alternate path to config file", default=defaultConfigPath, dest='configPath') ogroup.add_argument("-d", "--database", help="alternate path to database file", default=defaultDatabasePath, dest='databasePath') ogroup.add_argument("-r", "--reset", help="reset database before import", default=False, action='store_true') ogroup.add_argument("-v", "--verbose", help="force debug output", default=False, action='store_true') # args = parser.parse_args(argv) args = parser.parse_args() # Check command line parameters if (args.reset is True) and (args.importFile is None): parser.error("reset is only allowed for the import command") sys.exit(1) # Show version number and exit (if requested) if args.version: print(f"{self.appInfo.name} {self.appInfo.version}") sys.exit(0) # Print application header if args.importFile is not None: self.print("Starting import from CSV...") elif args.exportFile is not None: self.print("Starting export to CSV...") else: self.clrPrint( f"Starting {self.appInfo.name} backend v{self.appInfo.version} (PID {self.appInfo.pid})" ) # Load configuration and database settings = Settings(args.configPath, self.appInfo.path, args.verbose) database = Database(args.databasePath, args.reset) self.lateInit(settings) # Handle CSV import/export (if required) if args.importFile is not None: csvImporter = CSVImporter(database) result = csvImporter.importEvents(args.importFile) sys.exit(result) elif args.exportFile is not None: csvExporter = CSVExporter(database) result = csvExporter.exportEvents(args.exportFile) sys.exit(result) # Start SituationBoard backend service backendService = SituationBoardBackend(self.appInfo, settings, database) backendService.run()
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)