Rafael Kunst

40 papers B 3C 2Misc 1Journal 23Unranked 10
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Access
Cassiano Moralles, Luis Antonio Leite Francisco da Costa, Sandro José Rigo, Rafael Kunst, Vinicius Costa de Souza, Éderson Passos Silva, George Lucas Ebertz Prado, Taimisson De Carvalho Schardosim, Alex Roehrs
2026 J jnl
Int. J. Inf. Sec.
Luciano Ignaczak, Márcio Garcia Martins, Cristiano André da Costa, Rafael Kunst
2025 J jnl
IEEE Access
Luis Antonio Leite Francisco da Costa, Rodrigo C. de Lamare, Rafael Kunst, Edison Pignaton de Freitas
2025 Misc conf
ICNC
Luis Antonio Leite Francisco da Costa, Rafael Kunst, Rodrigo C. de Lamare, Edison Pignaton de Freitas
2025 J jnl
J. Univers. Comput. Sci.
Carlos Goetz, Rodrigo Simon Bavaresco, Wesllei Felipe Heckler, Gustavo Lazarotto Schroeder, Rafael Kunst, Jorge Luis Victória Barbosa
2025 J jnl
Inf. Softw. Technol.
Robson Keemps Silva, Kleinner Farias, Rafael Kunst, Carlos Eduardo Carbonera, Willian Bolzan
2025 J jnl
CoRR
Luis Antonio Leite Francisco da Costa, Rodrigo C. de Lamare, Rafael Kunst, Edison Pignaton de Freitas
2024 J jnl
AI Commun.
Vitor A. Fraga, Lincoln Vinicius Schreiber, Marco Antonio Chitolina Da Silva, Rafael Kunst, Jorge L. V. Barbosa, Gabriel de Oliveira Ramos
2024 C conf
IoTBDS
Luis Claudio Gubert, Felipe André Zeiser, Cristiano André da Costa, Rafael Kunst
2024 conf
PROPOR (1)
Eduardo G. Cortes, Ana Luiza Vianna, Mikaela Martins, Sandro Rigo, Rafael Kunst
2024 J jnl
Internet Technol. Lett.
Emiliano Soares Monteiro, Maria Eloisa Mignoni, Rodrigo da Rosa Righi, Cristiano André da Costa, Rafael Kunst, Jorge Luis Victória Barbosa, Antônio Marcos Alberti
2024 conf
AINA (4)
Guilherme Falcão da Silva Campos, Jovani Dalzochio, Raul Ceretta Nunes, Luís Alvaro de Lima Silva, Edison Pignaton de Freitas, Rafael Kunst
2023 J jnl
J. Field Robotics
Faezeh Pasandideh, João P. J. da Costa, Rafael Kunst, Wibowo Hardjawana, Edison Pignaton de Freitas
2023 conf
SBSI
Robson Keemps Silva, Kleinner Farias, Rafael Kunst, Jovani Dalzochio
2023 J jnl
Sensors
Helder Moreira Arruda, Rodrigo Simon Bavaresco, Rafael Kunst, Elvis Fernandes Bugs, Giovani Cheuiche Pesenti, Jorge Luis Victória Barbosa
2023 C conf
ICMLA
Jovani Dalzochio, Rafael Kunst, Jorge L. V. Barbosa, Edison Pignaton de Freitas, Alécio P. D. Binotto
2023 J jnl
ACM Comput. Surv.
Jovani Dalzochio, Rafael Kunst, Jorge Luis Victória Barbosa, Pedro Clarindo da Silva Neto, Edison Pignaton, Carla Schwengber ten Caten, Alex de Lima Teodoro da Penha
2023 conf
ISWCS
Luis Antonio Leite Francisco da Costa, Rafael Kunst, Rodrigo C. de Lamare, Edison Pignaton de Freitas
2022 conf
ATT@IJCAI
Vitor A. Fraga, Lincoln Schreiber, Rafael Kunst, Jorge L. V. Barbosa, Gabriel de Oliveira Ramos
2022 J jnl
Remote. Sens.
Faezeh Pasandideh, João Paulo C. L. da Costa, Rafael Kunst, Nahina Islam, Wibowo Hardjawana, Edison Pignaton de Freitas
2022 J jnl
Neurocomputing
Jovani Dalzochio, Rafael Kunst, Jorge Luis Victória Barbosa, Henrique Damasceno Vianna, Gabriel de Oliveira Ramos, Edison Pignaton, Alécio P. D. Binotto, Jose Favilla
2022 J jnl
Computing
Luis Antonio Leite Francisco da Costa, Rafael Kunst, Edison Pignaton de Freitas
2021 J jnl
Comput. Networks
Luis Antonio Leite Francisco da Costa, Rafael Kunst, Edison Pignaton de Freitas
2020 conf
IHCI (1)
Emiliano Soares Monteiro, Rodrigo da Rosa Righi, Rafael Kunst, Cristiano André da Costa, Dhananjay Singh
2020 J jnl
Comput. Methods Programs Biomed.
Vinicius Facco Rodrigues, Euclides Palma Paim, Rafael Kunst, Rodolfo Stoffel Antunes, Cristiano André da Costa, Rodrigo da Rosa Righi
2020 J jnl
Comput. Ind.
Jovani Dalzochio, Rafael Kunst, Edison Pignaton, Alécio Pedro Delazari Binotto, Srijnan Sanyal, Jose Favilla, Jorge L. V. Barbosa
2020 J jnl
Comput. Electron. Agric.
Rodrigo da Rosa Righi, Guilherme Goldschmidt, Rafael Kunst, Cássio Deon, Cristiano André da Costa
2019 J jnl
Ad Hoc Networks
Patric Marques, Diogo Manfroi, Eduardo Deitos, Jonatan Cegoni, Rodrigo Castilhos, Juergen Rochol, Edison Pignaton, Rafael Kunst
2019 J jnl
Eng. Appl. Artif. Intell.
Rafael Kunst, Leandro Avila, Alécio P. D. Binotto, Edison Pignaton, Sergio Bampi, Juergen Rochol
2019 conf
CSE/EUC
Rodrigo da Rosa Righi, Alexandre Lima Santana, Cristiano André da Costa, Rafael Kunst, Guilherme Goldschmidt, Dhananjay Singh, Madhusudan Singh
2018 J jnl
Comput. Networks
Rafael Kunst, Leandro Avila, Edison Pignaton, Sergio Bampi, Juergen Rochol
2017
Rafael Kunst
2017 conf
ICC
Jean Cerrillo Fernandez, Rafael Kunst, Juergen Rochol
2016 B conf
LCN
Rafael Kunst, Leandro Avila, Edison Pignaton, Sergio Bampi, Juergen Rochol
2016 conf
ICECS
Leandro A. de Avila, Rafael Kunst, Edison Pignaton, Juergen Rochol, Sergio Bampi
2016 B conf
WiMob
Rafael Kunst, Leandro Avila, Edison Pignaton, Sergio Bampi, Juergen Rochol
2013 B conf
WCNC
Leonardo Roveda Faganello, Rafael Kunst, Cristiano Bonato Both, Lisandro Zambenedetti Granville, Juergen Rochol
2012 J jnl
J. Netw. Comput. Appl.
Cristiano Bonato Both, Clarissa Cassales Marquezan, Rafael Kunst, Lisandro Zambenedetti Granville, Juergen Rochol
2011 J jnl
Comput. Networks
Rafael Kunst, Cristiano Bonato Both, Lisandro Zambenedetti Granville, Juergen Rochol
2008 conf
ISWCS
Cristiano Bonato Both, Eliane Gobetti de Camargo, Rafael Kunst
tests/unit/test_database_exporters.py
← Index tests/unit/test_database_exporters.py python
"""
Unit tests for database exporters.
"""
import pytest
import json
from dataclasses import dataclass, asdict
from datetime import datetime, timezone
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.unit, pytest.mark.exporters]


# ============================================================================
# Sample Dataclass for Testing
# ============================================================================

@dataclass
class SampleData:
    """Sample dataclass for export testing."""
    sha256: str = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    name: str = "test_sample"
    value: int = 42
    _id: str = "test_id"


# ============================================================================
# PrintExporter Tests
# ============================================================================

class TestPrintExporter:
    """Tests for PrintExporter class."""

    def test_initialization(self, mock_logger):
        """Test PrintExporter initialization."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")

        assert exporter.index_prefix == "test_index"
        assert exporter.log is mock_logger

    def test_export_dataclass(self, mock_logger, capsys):
        """Test exporting a dataclass."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        sample = SampleData()

        result = exporter.export(sample)

        assert result is True
        captured = capsys.readouterr()
        assert "test_sample" in captured.out

    def test_export_list_of_dataclasses(self, mock_logger, capsys):
        """Test exporting a list of dataclasses."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        samples = [SampleData(name="sample1"), SampleData(name="sample2")]

        result = exporter.export(samples)

        assert result is True
        captured = capsys.readouterr()
        assert "sample1" in captured.out
        assert "sample2" in captured.out

    def test_export_dict(self, mock_logger, capsys):
        """Test exporting a dictionary."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        data = {"key": "value", "number": 42}

        result = exporter.export(data)

        assert result is True
        captured = capsys.readouterr()
        assert "key" in captured.out
        assert "value" in captured.out

    def test_export_none(self, mock_logger):
        """Test exporting None."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")

        result = exporter.export(None)

        assert result is True

    def test_export_empty_list(self, mock_logger):
        """Test exporting empty list."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")

        result = exporter.export([])

        assert result is True


# ============================================================================
# ElasticsearchExporter Tests
# ============================================================================

class TestElasticsearchExporter:
    """Tests for ElasticsearchExporter class."""

    def test_initialization(self, mock_logger):
        """Test ElasticsearchExporter initialization."""
        with patch('redb.settings.get_elasticsearch_client') as mock_client:
            mock_client.return_value = Mock()
            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")

            assert exporter.index_prefix == "test_index"
            assert exporter.log is mock_logger
            assert exporter.client is not None

    def test_export_dataclass(self, mock_logger):
        """Test exporting a dataclass to Elasticsearch."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            sample = SampleData()

            result = exporter.export(
                sample,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": sample.sha256}
            )

            assert result is True
            mock_client.index.assert_called()

    def test_export_list(self, mock_logger):
        """Test exporting a list to Elasticsearch."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            samples = [SampleData(name="sample1"), SampleData(name="sample2")]

            result = exporter.export(
                samples,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": "test_hash"}
            )

            assert result is True
            # Should be called twice (once per sample)
            assert mock_client.index.call_count == 2

    def test_export_failure(self, mock_logger):
        """Test handling export failure."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_client.index.side_effect = Exception("Connection failed")
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            sample = SampleData()

            result = exporter.export(
                sample,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": sample.sha256}
            )

            assert result is False
            mock_logger.error.assert_called()

    def test_export_with_custom_id(self, mock_logger):
        """Test exporting with custom _id field."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            sample = SampleData(_id="custom_id")

            result = exporter.export(
                sample,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": sample.sha256}
            )

            assert result is True


# ============================================================================
# ClickHouseExporter Tests
# ============================================================================

class TestClickHouseExporter:
    """Tests for ClickHouseExporter class."""

    def test_initialization(self, mock_logger):
        """Test ClickHouseExporter initialization."""
        from redb.extractors.database_exporters import ClickHouseExporter

        mock_client = Mock()
        exporter = ClickHouseExporter(mock_logger, "test_index", client=mock_client)

        assert exporter.index_prefix == "test_index"
        assert exporter.log is mock_logger
        assert exporter.client is mock_client

    def test_export_tuple_data(self, mock_logger):
        """Test exporting tuple data to ClickHouse."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = [["hash123", "sample.exe", 1024]]
            column_names = ["sha256", "name", "size"]
            column_type_names = ["String", "String", "UInt64"]

            result = exporter.export(
                (data, column_names, column_type_names),
                table="test_table"
            )

            assert result is True

    def test_export_multi_table(self, mock_logger):
        """Test exporting multi-table data to ClickHouse."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table1',
                    'data': [["hash123", "sample.exe"]],
                    'column_names': ["sha256", "name"],
                    'column_type_names': ["String", "String"]
                }
            }

            result = exporter.export(data)

            assert result is True

    def test_export_failure(self, mock_logger):
        """Test handling export failure."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.side_effect = Exception("Connection failed")
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = [["hash123", "sample.exe", 1024]]
            column_names = ["sha256", "name", "size"]
            column_type_names = ["String", "String", "UInt64"]

            result = exporter.export(
                (data, column_names, column_type_names),
                table="test_table"
            )

            assert result is False

    def test_export_missing_table(self, mock_logger):
        """Test export without table name raises error."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = [["hash123", "sample.exe", 1024]]
            column_names = ["sha256", "name", "size"]
            column_type_names = ["String", "String", "UInt64"]

            result = exporter.export(
                (data, column_names, column_type_names)
                # Missing table parameter
            )

            assert result is False

    def test_get_client(self, mock_logger):
        """Test get_client method."""
        from redb.extractors.database_exporters import ClickHouseExporter

        mock_client = Mock()
        exporter = ClickHouseExporter(mock_logger, "test_index", client=mock_client)

        result = exporter.get_client()

        assert result is mock_client

    def test_get_client_creates_new(self, mock_logger):
        """Test get_client creates new client if none exists."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_new_client = Mock()
            mock_create.return_value = mock_new_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            result = exporter.get_client()

            assert result is mock_new_client


# ============================================================================
# DatabaseExporter Abstract Base Class Tests
# ============================================================================

class TestDatabaseExporter:
    """Tests for DatabaseExporter abstract base class."""

    def test_cannot_instantiate_abstract(self):
        """Test that DatabaseExporter cannot be instantiated directly."""
        from redb.extractors.database_exporters import DatabaseExporter

        with pytest.raises(TypeError):
            DatabaseExporter()

    def test_subclass_must_implement_export(self):
        """Test that subclasses must implement export method."""
        from redb.extractors.database_exporters import DatabaseExporter

        # Define incomplete subclass
        class IncompleteExporter(DatabaseExporter):
            pass

        with pytest.raises(TypeError):
            IncompleteExporter()


# ============================================================================
# Null/Edge Case Tests
# ============================================================================

class TestExporterEdgeCases:
    """Tests for edge cases in exporters."""

    def test_print_exporter_with_complex_nested_data(self, mock_logger, capsys):
        """Test PrintExporter with complex nested data."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        data = {
            "level1": {
                "level2": {
                    "level3": [1, 2, 3]
                }
            },
            "array": [{"a": 1}, {"b": 2}]
        }

        result = exporter.export(data)

        assert result is True
        captured = capsys.readouterr()
        assert "level1" in captured.out

    def test_clickhouse_null_handling(self, mock_logger):
        """Test ClickHouse exporter handles null values."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            # Multi-table data with null values
            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table',
                    'data': [[None, "sample.exe", None]],
                    'column_names': ["sha256", "name", "size"],
                    'column_type_names': ["Nullable(String)", "String", "Nullable(UInt64)"]
                }
            }

            result = exporter.export(data)

            # Should handle nulls appropriately
            assert result is True

    def test_clickhouse_array_handling(self, mock_logger):
        """Test ClickHouse exporter handles array types."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table',
                    'data': [["hash", ["tag1", "tag2"]]],
                    'column_names': ["sha256", "tags"],
                    'column_type_names': ["String", "Array(String)"]
                }
            }

            result = exporter.export(data)

            assert result is True


# ============================================================================
# Type Conversion Tests
# ============================================================================

class TestExporterTypeConversions:
    """Tests for type conversions in exporters."""

    def test_clickhouse_datetime_handling(self, mock_logger):
        """Test ClickHouse exporter handles datetime values."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            now = datetime.now(timezone.utc)
            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table',
                    'data': [["hash", now]],
                    'column_names': ["sha256", "timestamp"],
                    'column_type_names': ["String", "DateTime64(3, 'UTC')"]
                }
            }

            result = exporter.export(data)

            assert result is True

    def test_print_exporter_datetime_serialization(self, mock_logger, capsys):
        """Test PrintExporter handles datetime serialization."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        now = datetime.now(timezone.utc)
        data = {"timestamp": now, "name": "test"}

        result = exporter.export(data)

        assert result is True
        captured = capsys.readouterr()
        assert "timestamp" in captured.out


# ============================================================================
# Connection Context Manager Tests
# ============================================================================

class TestClickHouseConnectionManager:
    """Tests for ClickHouse connection context manager."""

    def test_clickhouse_connection_context(self, mock_logger):
        """Test clickhouse_connection context manager."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            with exporter.clickhouse_connection() as client:
                assert client is mock_client

            # Client should be closed after context exits
            mock_client.close.assert_called()

    def test_clickhouse_connection_close_on_error(self, mock_logger):
        """Test client is closed even if operation fails."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            try:
                with exporter.clickhouse_connection() as client:
                    raise ValueError("Test error")
            except ValueError:
                pass

            # Client should still be closed
            mock_client.close.assert_called()