def testGetDistinctColumnsFromSQLQueryData(self):
        """test the creating of a distinct list of all attributes of the queries"""
        queries = list()
        column1 = sql_query_model.SQLQueryModel(columns=[
            sql_query_column_model.SQLColumnModel('createdDate'),
            sql_query_column_model.SQLColumnModel('updatedAt'),
            sql_query_column_model.SQLColumnModel('screenName')
        ],
                                                timestamp_columns=[],
                                                query="",
                                                name="",
                                                needs_customizing=False,
                                                amount_events=0)
        column2 = sql_query_model.SQLQueryModel(columns=[
            sql_query_column_model.SQLColumnModel('profileImageUrl'),
            sql_query_column_model.SQLColumnModel('screenName'),
            sql_query_column_model.SQLColumnModel('userId')
        ],
                                                timestamp_columns=[],
                                                query="",
                                                name="",
                                                needs_customizing=False,
                                                amount_events=0)
        column3 = sql_query_model.SQLQueryModel(columns=[
            sql_query_column_model.SQLColumnModel('screenName'),
            sql_query_column_model.SQLColumnModel('createdDate'),
            sql_query_column_model.SQLColumnModel('createdDate')
        ],
                                                timestamp_columns=[],
                                                query="",
                                                name="",
                                                needs_customizing=False,
                                                amount_events=0)
        column4 = sql_query_model.SQLQueryModel(columns=[
            sql_query_column_model.SQLColumnModel('screenNameSecond'),
            sql_query_column_model.SQLColumnModel('createdDate')
        ],
                                                timestamp_columns=[],
                                                query="",
                                                name="",
                                                needs_customizing=False,
                                                amount_events=0)
        queries.append(column1)
        queries.append(column2)
        queries.append(column3)
        queries.append(column4)
        actual = self.helper.GetDistinctColumnsFromSQLQueryData(queries)
        expected = [
            'created_date', 'profile_image_url', 'screen_name',
            'screen_name_second', 'updated_at', 'user_id'
        ]

        self.assertEqual(actual, expected)
 def testGetDistinctColumnsFromSQLQueryDataEmpty(self):
     """test the creating of a distinct list of all attributes of the queries
 with an empty array"""
     queries = list()
     column1 = sql_query_model.SQLQueryModel(columns=[],
                                             timestamp_columns=[],
                                             query="",
                                             name="",
                                             needs_customizing=False,
                                             amount_events=0)
     column2 = sql_query_model.SQLQueryModel(
         columns=[sql_query_column_model.SQLColumnModel('first')],
         timestamp_columns=[],
         query="",
         name="",
         needs_customizing=False,
         amount_events=0)
     queries.append(column1)
     queries.append(column2)
     actual = self.helper.GetDistinctColumnsFromSQLQueryData(queries)
     expected = ['first']
     self.assertEqual(actual, expected)
    def _CreateSQLQueryModelWithUserInput(
        self, query: str, with_examples: bool,
        query_execution: base_sql_query_execution.BaseSQLQueryExecution()
    ) -> sql_query_model.SQLQueryModel:
        """Asks the user information about the SQL Query.

    Args:
      query (str): the SQL Query
      with_examples (bool): if the user wants examples for the given Query

    Returns:
      sql_query_model.SQLQueryModel: a SQL Query model
    """
        query_data = self._plugin_helper.RunSQLQuery(query, query_execution)
        query_plan = explain_query_plan.ExplainQueryPlan(query_execution)

        if query_data.has_error:
            self._output_handler.PrintError(str(query_data.error_message))
            return None

        else:
            if with_examples:
                length = len(query_data.data)
                if length == 0:
                    self._output_handler.PrintInfo(
                        'Your query does not return anything.')
                else:
                    self._output_handler.PrintInfo(
                        'Your query output could look like this.')
                    self._output_handler.PrintInfo(
                        str(
                            list(
                                map(lambda x: x.sql_column,
                                    query_data.columns))))
                    amount = min(self._NUMBER_OF_SQLITE_OUTPUT_EXAMPLES,
                                 length)
                    for index in range(0, amount):
                        self._output_handler.PrintInfo(
                            str(query_data.data[index]))

                add_query = self._output_handler.Confirm(
                    'Do you want to add this query?',
                    abort=False,
                    default=True)
                if not add_query:
                    return None
            else:
                self._output_handler.PrintError('The SQL query was ok.')

            locked_tables = query_plan.GetLockedTables(query)
            name = ''.join(locked_tables).capitalize()

            question_parse = 'Do you want to name the query parse row: {0} ?'.format(
                name)
            add_recommended_name = self._output_handler.Confirm(question_parse,
                                                                abort=False,
                                                                default=True)

            if not add_recommended_name:
                question_event = 'What row does the SQL Query parse?'
                initial_name = self._output_handler.PromptInfo(question_event)
                name = self._ValidateRowName(initial_name)

            data_column, timestamp_column = self.GetTimestamps(
                query_data.columns, query_data.data)

            if query_data.data is not None:
                amount_events = len(query_data.data)
            else:
                amount_events = 0

            message = 'Does the event {0} need customizing?'.format(name)
            needs_customizing = self._output_handler.Confirm(text=message,
                                                             abort=False,
                                                             default=False)
            if needs_customizing:
                data_column = self.GetCustomizable(data_column)

        return sql_query_model.SQLQueryModel(query.strip(), name, data_column,
                                             timestamp_column,
                                             needs_customizing, amount_events)
    def testNormalGenerate(self):
        """Test a normal generation."""
        expected_path = os.path.join(os.path.dirname(__file__),
                                     'expected_files_twitterdb')
        plugin_name = 'the_plugin'
        database_suffix = 'db'
        test_file = os.path.join(path_helper.TestDatabasePath(),
                                 'twitter_ios.db')
        with tempfile.TemporaryDirectory() as tmpdir:
            output_path = os.path.join(tmpdir, "temp")

            file_handler.FileHandler()._CreateFolder(output_path)

            output_console_path = os.path.join(output_path, 'prompts.txt')
            output_handler = output_handler_file.OutputHandlerFile(
                file_path=output_console_path,
                file_handler=file_handler.FileHandler(),
                confirm=True)

            sqlite_path_helper = sqlite_plugin_path_helper.SQLitePluginPathHelper(
                path=output_path,
                plugin_name=plugin_name,
                database_suffix=database_suffix)

            plugin_helper = sqlite_plugin_helper.SQLitePluginHelper()
            controller = sqlite_controller.SQLiteController(
                output_handler=output_handler, plugin_helper=plugin_helper)

            query_execution = sqlite_query_execution.SQLiteQueryExecution(
                test_file)
            query_execution.TryToConnect()

            query_first = 'select * from users'
            query_data_first = plugin_helper.RunSQLQuery(
                query_first, query_execution)
            data_first = plugin_helper.GetColumnsAndTimestampColumn(
                query_data_first.columns, ['createdDate', 'updatedAt'],
                query_data_first.data)
            query_data_first_timestamp = data_first[1]
            query_data_first_normal = data_first[0]
            query_data_first_normal[0].customize = True
            query_data_first_normal[1].customize = True
            query_data_first_normal[2].customize = True

            query_model_first = sql_query_model.SQLQueryModel(
                'select * from users', 'Users', query_data_first_normal,
                query_data_first_timestamp, True, len(query_data_first.data))

            query_second = 'select * from statuses'
            query_data_second = plugin_helper.RunSQLQuery(
                query_second, query_execution)
            data_second = plugin_helper.GetColumnsAndTimestampColumn(
                query_data_second.columns, ['date', 'updatedAt'],
                query_data_second.data)
            query_data_second_timestamp = data_second[1]
            query_data_second_normal = data_second[0]

            query_model_second = sql_query_model.SQLQueryModel(
                'select * from users', 'Statuses',
                query_data_second_normal, query_data_second_timestamp, False,
                len(query_data_second.data))

            sql_query = [query_model_first, query_model_second]

            controller._path = output_path
            controller._name = plugin_name
            controller._testfile = test_file
            controller._sql_query = sql_query
            controller._plugin_helper = plugin_helper
            controller._output_handler = output_handler
            controller._query_execution = query_execution

            controller.Generate(path_helper.TemplatePath(),
                                path_helper.YapfStyleFilePath())

            formatter_init = self._ReadFromFile(
                sqlite_path_helper.formatter_init_file_path)
            formatter = self._ReadFromFile(
                sqlite_path_helper.formatter_file_path)
            formatter_test = self._ReadFromFile(
                sqlite_path_helper.formatter_test_file_path)
            parser_init = self._ReadFromFile(
                sqlite_path_helper.parser_init_file_path)
            parser = self._ReadFromFile(sqlite_path_helper.parser_file_path)
            parser_test = self._ReadFromFile(
                sqlite_path_helper.parser_test_file_path)
            console_output = self._ReadFromFile(
                os.path.join(output_path, 'prompts.txt'))

            expected_formatter_init = self._ReadFromFile(
                os.path.join(expected_path, 'formatters_init.py'))
            expected_formatter = self._ReadFromFile(
                os.path.join(expected_path, 'formatters.py'))
            expected_formatter_test = self._ReadFromFile(
                os.path.join(expected_path, 'formatters_test.py'))
            expected_parser_init = self._ReadFromFile(
                os.path.join(expected_path, 'parsers_init.py'))
            expected_parser = self._ReadFromFile(
                os.path.join(expected_path, 'parsers.py'))
            expected_parser_test = self._ReadFromFile(
                os.path.join(expected_path, 'parsers_test.py'))
            expected_console_output = (
                'Do you want to Generate the files?create '
                '{0}create {1}create {2}create '
                '{3}copy {4}create {5}create {6}'.format(
                    sqlite_path_helper.formatter_file_path,
                    sqlite_path_helper.parser_file_path,
                    sqlite_path_helper.formatter_test_file_path,
                    sqlite_path_helper.parser_test_file_path,
                    sqlite_path_helper.database_path,
                    sqlite_path_helper.parser_init_file_path,
                    sqlite_path_helper.formatter_init_file_path))

            self.assertEqual(formatter_init, expected_formatter_init)
            self.assertEqual(formatter, expected_formatter)
            self.assertEqual(formatter_test, expected_formatter_test)
            self.assertEqual(parser_init, expected_parser_init)
            self.assertEqual(parser, expected_parser)
            self.assertEqual(parser_test, expected_parser_test)
            self.assertEqual(console_output, expected_console_output)
    def testNormalGenerateForAllTypes(self):
        """Test a normal generation."""
        expected_path = os.path.join(os.path.dirname(__file__),
                                     'expected_files_typesdb')
        plugin_name = 'the_plugin'
        database_suffix = 'db'
        test_file = os.path.join(path_helper.TestDatabasePath(),
                                 'test_database_types.db')
        with tempfile.TemporaryDirectory() as tmpdir:
            output_path = os.path.join(tmpdir, "temp")

            file_handler.FileHandler()._CreateFolder(output_path)

            output_console_path = os.path.join(output_path, 'prompts.txt')
            output_handler = output_handler_file.OutputHandlerFile(
                file_path=output_console_path,
                file_handler=file_handler.FileHandler(),
                confirm=True)

            sqlite_path_helper = sqlite_plugin_path_helper.SQLitePluginPathHelper(
                path=output_path,
                plugin_name=plugin_name,
                database_suffix=database_suffix)

            plugin_helper = sqlite_plugin_helper.SQLitePluginHelper()
            controller = sqlite_controller.SQLiteController(
                output_handler=output_handler, plugin_helper=plugin_helper)

            query_execution = sqlite_query_execution.SQLiteQueryExecution(
                test_file)
            query_execution.TryToConnect()

            query_blob = 'select * from blobtypes'
            query_integer = 'select * from integertypes'
            query_numeric = 'select * from numerictypes'
            query_real = 'select * from realtypes'
            query_text = 'select * from texttypes'
            query_no_data = 'select * from nodata'

            query_data_blob = plugin_helper.RunSQLQuery(
                query_blob, query_execution)
            query_data_integer = plugin_helper.RunSQLQuery(
                query_integer, query_execution)
            query_data_numeric = plugin_helper.RunSQLQuery(
                query_numeric, query_execution)
            query_data_real = plugin_helper.RunSQLQuery(
                query_real, query_execution)
            query_data_text = plugin_helper.RunSQLQuery(
                query_text, query_execution)
            query_data_no_data = plugin_helper.RunSQLQuery(
                query_no_data, query_execution)

            query_model_blob = sql_query_model.SQLQueryModel(
                query_blob, 'blobtypes', query_data_blob.columns, [], False, 0)
            query_model_integer = sql_query_model.SQLQueryModel(
                query_integer, 'integertypes', query_data_integer.columns, [],
                False, 0)
            query_model_numeric = sql_query_model.SQLQueryModel(
                query_numeric, 'numerictypes', query_data_numeric.columns, [],
                False, 0)
            query_model_real = sql_query_model.SQLQueryModel(
                query_real, 'realtypes', query_data_real.columns, [], False, 0)
            query_model_text = sql_query_model.SQLQueryModel(
                query_text, 'texttypes', query_data_text.columns, [], False, 0)
            query_model_no_data = sql_query_model.SQLQueryModel(
                query_no_data, 'nodata', query_data_no_data.columns, [], False,
                0)

            sql_query = [
                query_model_blob, query_model_integer, query_model_numeric,
                query_model_real, query_model_text, query_model_no_data
            ]

            controller._path = output_path
            controller._name = plugin_name
            controller._testfile = test_file
            controller._sql_query = sql_query
            controller._plugin_helper = plugin_helper
            controller._output_handler = output_handler
            controller._query_execution = query_execution

            controller.Generate(path_helper.TemplatePath(),
                                path_helper.YapfStyleFilePath())

            formatter_init = self._ReadFromFile(
                sqlite_path_helper.formatter_init_file_path)
            formatter = self._ReadFromFile(
                sqlite_path_helper.formatter_file_path)
            formatter_test = self._ReadFromFile(
                sqlite_path_helper.formatter_test_file_path)
            parser_init = self._ReadFromFile(
                sqlite_path_helper.parser_init_file_path)
            parser = self._ReadFromFile(sqlite_path_helper.parser_file_path)
            parser_test = self._ReadFromFile(
                sqlite_path_helper.parser_test_file_path)
            console_output = self._ReadFromFile(
                os.path.join(output_path, 'prompts.txt'))

            expected_formatter_init = self._ReadFromFile(
                os.path.join(expected_path, 'formatters_init.py'))
            expected_formatter = self._ReadFromFile(
                os.path.join(expected_path, 'formatters.py'))
            expected_formatter_test = self._ReadFromFile(
                os.path.join(expected_path, 'formatters_test.py'))
            expected_parser_init = self._ReadFromFile(
                os.path.join(expected_path, 'parsers_init.py'))
            expected_parser = self._ReadFromFile(
                os.path.join(expected_path, 'parsers.py'))
            expected_parser_test = self._ReadFromFile(
                os.path.join(expected_path, 'parsers_test.py'))
            expected_console_output = (
                'Do you want to Generate the files?create '
                '{0}create {1}create {2}create '
                '{3}copy {4}create {5}create {6}'.format(
                    sqlite_path_helper.formatter_file_path,
                    sqlite_path_helper.parser_file_path,
                    sqlite_path_helper.formatter_test_file_path,
                    sqlite_path_helper.parser_test_file_path,
                    sqlite_path_helper.database_path,
                    sqlite_path_helper.parser_init_file_path,
                    sqlite_path_helper.formatter_init_file_path))

            self.assertEqual(formatter_init, expected_formatter_init)
            self.assertEqual(formatter, expected_formatter)
            self.assertEqual(formatter_test, expected_formatter_test)
            self.assertEqual(parser_init, expected_parser_init)
            self.assertEqual(parser, expected_parser)
            self.assertEqual(parser_test, expected_parser_test)
            self.assertEqual(console_output, expected_console_output)