Ina Schieferdecker

152 papers A* 1A 5B 6C 13Misc 1Journal 27Unranked 84
YearRankTypeTitle / Venue / Authors
2026 ch.
Let's Talk AI
Ina Schieferdecker, Barbara Steffen
2025 J jnl
Softwaretechnik-Trends
Ina Schieferdecker
2025 C ed.
AST
Andy Zaidman, Francesca Lonetti, Ina Schieferdecker, Rajesh Subramanyan
2020 J jnl
IEEE Softw.
Juergen Grossmann, Michael Felderer, Johannes Viehmann, Ina Schieferdecker
2020 conf
Wirtschaftsinformatik (Zentrale Tracks)
Andrea Hamm, Alexander Willner, Ina Schieferdecker
2020 J jnl
Softw. Test. Verification Reliab.
Ina Schieferdecker, Atif Memon, Hironori Washizaki
2020 B conf
NOMS
Ramon Barakat, Faruk Catal, Nikolay Tcholtchev, Yacine Rebahi, Ina Schieferdecker
2020 J jnl
ACM J. Data Inf. Qual.
Philipp Lämmel, Benjamin Dittwald, Lina Bruns, Nikolay Tcholtchev, Yuri Glikman, Silke Cuno, Mathias Flügge, Ina Schieferdecker
2020 ch.
The Future of Software Quality Assurance
Ina Schieferdecker
2019 A ed.
ISSRE
Katinka Wolter, Ina Schieferdecker, Barbara Gallina, Michel Cukier, Roberto Natella, Naghmeh Ramezani Ivaki, Nuno Laranjeiro
2019 J jnl
CoRR
Jürgen Großmann, Michael Felderer, Johannes Viehmann, Ina Schieferdecker
2019 J jnl
CoRR
Michael Felderer, Ina Schieferdecker
2019 J jnl
Data
Silke Cuno, Lina Bruns, Nikolay Tcholtchev, Philipp Lämmel, Ina Schieferdecker
2019 J jnl
CoRR
Andrea Hamm, Alexander Willner, Ina Schieferdecker
2019 conf
ICUMT
Denis Rangelov, Nikolay Tcholtchev, Philipp Lämmel, Ina Schieferdecker
2019 ed.
ISSRE Workshops
Katinka Wolter, Ina Schieferdecker, Barbara Gallina, Michel Cukier, Roberto Natella, Naghmeh Ramezani Ivaki, Nuno Laranjeiro
2019 conf
QRS Companion
Nikolay Tcholtchev, Steven Ulrich, Faruk Catal, Wojciech Konitzer, Ramon Barakat, Andreas Hoffmann, Ina Schieferdecker
2018 conf
UCC Companion
Nikolay Tcholtchev, Philipp Lammel, Robert Scholz, Wojciech Konitzer, Ina Schieferdecker
2018 conf
FTSCS
William da Silva, Max Bureck, Ina Schieferdecker, Christian Hein
2018 conf
ICST Workshops
Armin Lunkeit, Ina Schieferdecker
2018 J jnl
CoRR
Michael Felderer, Juergen Grossmann, Ina Schieferdecker
2017 C conf
CLOSER
Robert Scholz, Nikolay Tcholtchev, Philipp Lämmel, Ina Schieferdecker
2017 conf
UCC (Companion")
Philipp Lämmel, Nikolay Tcholtchev, Ina Schieferdecker
2017 conf
CLOSER (Selected Papers)
Robert Scholz, Nikolay Tcholtchev, Philipp Lämmel, Ina Schieferdecker
2017 C conf
QRS
Ina Schieferdecker, Sascha Kretzschmann, Axel Rennoch, Michael Wagner
2017 conf
CeDEM
Ina Schieferdecker, Nikolay Tcholtchev, Philipp Lammel, Robert Scholz, Evanela Lapi
2016 conf
ICST Workshops
Nikolay Tcholtchev, Martin A. Schneider, Ina Schieferdecker
2016 conf
OpenSym (Companion)
Ina Schieferdecker, Nikolay Tcholtchev, Philipp Lämmel
2015 conf
ICUMT
Alexej Starschenko, Nikolay Tcholtchev, Arun Prakash, Ina Schieferdecker, Ranganai Chaparadza
2015 J jnl
Prax. Inf.verarb. Kommun.
Philipp Lämmel, Nikolay Tcholtchev, Ina Schieferdecker
2015 ed.
SDL Forum
Joachim Fischer, Markus Scheidgen, Ina Schieferdecker, Rick Reed
2014 J jnl
Int. J. Softw. Tools Technol. Transf.
Michael Felderer, Ina Schieferdecker
2014 J jnl
Trans. Comput. Sci.
Nikolay Tcholtchev, Ina Schieferdecker
2014 J jnl
Int. J. Commun. Syst.
Nikolay Tcholtchev, Ina Schieferdecker
2014 conf
URSW
Edzard Höfig, Ina Schieferdecker
2014 J jnl
Int. J. Softw. Tools Technol. Transf.
Jens Grabowski, Ina Schieferdecker, Andreas Ulrich
2014 ch.
Computation for Humanity
Ina Schieferdecker, Walter Mattauch
2014 C ed.
OpenSym
Dirk Riehle, Jesús M. González-Barahona, Gregorio Robles, Kathrin M. Möslein, Ina Schieferdecker, Ulrike Cress, Astrid Wichmann, Brent J. Hecht, Nicolas Jullien
2014 conf
ISoLA (2)
Michael Felderer, Marc-Florian Wendland, Ina Schieferdecker
2014 J jnl
J. Supercomput.
Mikko Nieminen, Nikolay Tcholtchev, Ina Schieferdecker, Tomi Räty
2014 conf
COMPSAC Workshops
Nikolay Tcholtchev, Benjamin Dittwald, Thomas Scheel, Begüm Ilke Zilci, Danilo Schmidt, Philipp Lammel, Jurma Jacobsen, Ina Schieferdecker
2013 conf
ACME@ECOOP
Marc-Florian Wendland, Andreas Hoffmann, Ina Schieferdecker
2013 C conf
OpenSym
Florian Marienfeld, Ina Schieferdecker, Evanela Lapi, Nikolay Tcholtchev
2013 conf
ICST Workshops
Martin A. Schneider, Jürgen Großmann, Ina Schieferdecker, Andrej Pietschker
2013 conf
ISCTCS
Axel Rennoch, Ina Schieferdecker, Jürgen Großmann
2012 B conf
COMPSAC
Ina Schieferdecker
2012 conf
GLOBECOM Workshops
Nikolay Tcholtchev, Arun Prakash, Ina Schieferdecker, Ranganai Chaparadza, Razvan Petre
2012 conf
SAM
Martin A. Schneider, Jürgen Großmann, Nikolay Tcholtchev, Ina Schieferdecker, Andrej Pietschker
2012 C conf
FedCSIS
Peter M. Kruse, Ina Schieferdecker
2012 J jnl
ERCIM News
Ina Schieferdecker, Axel Rennoch, Jürgen Großmann
2012 conf
COMPSAC Workshops
Evanela Lapi, Nikolay Tcholtchev, Louay Bassbouss, Florian Marienfeld, Ina Schieferdecker
2012 A conf
ICST
Ina Schieferdecker
2012 conf
MBT
Ina Schieferdecker, Juergen Grossmann, Martin A. Schneider
2012 J jnl
IEEE Softw.
Ina Schieferdecker
2012 conf
LCN Workshops
Nikolay Tcholtchev, Lena Farid, Florian Marienfeld, Ina Schieferdecker, Benjamin Dittwald, Evanela Lapi
2012 conf
GLOBECOM Workshops
Arun Prakash, Ina Schieferdecker, Michael Wagner, Christian Hein
2012 B conf
COMPSAC
Ina Schieferdecker
2011 ch.
Model-Based Testing for Embedded Systems
Justyna Zander, Ina Schieferdecker
2011 conf
ITNG
Pekka Aho, Nadja Menz, Tomi Räty, Ina Schieferdecker
2011 book
Justyna Zander, Ina Schieferdecker, Pieter J. Mosterman
2011 ch.
Model-Based Testing for Embedded Systems
Jürgen Großmann, Philip Makedonski, Hans-Werner Wiesbrock, Jaroslav Svacina, Ina Schieferdecker, Jens Grabowski
2011 A conf
SEAMS
Edzard Höfig, Peter H. Deussen, Ina Schieferdecker
2011 conf
ICST Workshops
Marc-Florian Wendland, Ina Schieferdecker, Alain Vouffo-Feudjio
2010 conf
STM
Nadim Sarrouh, Florian Eilers, Uwe Nestmann, Ina Schieferdecker
2010 conf
eTELEMED
Diana Elena Vega, Ina Schieferdecker, George Din
2010 conf
ICAART (2)
Cosmin Mogos, Ina Schieferdecker
2010 J jnl
Computer
Gabor Karsai, Fabio Massacci, Leon J. Osterweil, Ina Schieferdecker
2010 ch.
Encyclopedia of Software Engineering
Ina Schieferdecker, Andreas Hoffmann
2010 ch.
Encyclopedia of Software Engineering
Ina Schieferdecker, Axel Rennoch, Alain Vouffo-Feudjio
2010 ch.
Encyclopedia of Software Engineering
Ina Schieferdecker, Jürgen Großmann, Marc-Florian Wendland
2010 C conf
ICTSS
Ina Schieferdecker
2009 conf
GI Jahrestagung
Andreas Hoffmann, Axel Rennoch, Ina Schieferdecker, Nicole Radziwill
2009 Misc conf
EuroPLoP
Alain Vouffo-Feudjio, Ina Schieferdecker
2009 conf
TestCom/FATES
Sebastian Wieczorek, Vitaly Kozyura, Andreas Roth, Michael Leuschel, Jens Bendisposto, Daniel Plagge, Ina Schieferdecker
2009 conf
PESOS@ICSE
Willem-Jan van den Heuvel, Olaf Zimmermann, Frank Leymann, Patricia Lago, Ina Schieferdecker, Uwe Zdun, Paris Avgeriou
2009 A conf
ICST
Juergen Grossmann, Diana Alina Serbanescu, Ina Schieferdecker
2009 conf
WICSA/ECSA
Sebastian Wieczorek, Andreas Roth, Alin Stefanescu, Vitaly Kozyura, Anis Charfi, Frank Michael Kraft, Ina Schieferdecker
2009 J jnl
Electron. Commun. Eur. Assoc. Softw. Sci. Technol.
Hakan Coskun, Ina Schieferdecker, Yahya Al-Hazmi
2008 conf
ICST Workshops
George Din, Klaus-Peter Eckert, Ina Schieferdecker
2008 C conf
ICSEA
Diana Vega, George Din, Stefan Taranu, Ina Schieferdecker
2008 conf
SEUS
George Din, Diana Vega, Ina Schieferdecker
2008 J jnl
Int. J. Softw. Tools Technol. Transf.
Ina Schieferdecker, Jens Grabowski
2008 ed.
ECMDA-FA
Ina Schieferdecker, Alan Hartman
2008 conf
TestCom/FATES
Jürgen Großmann, Ina Schieferdecker, Hans-Werner Wiesbrock
2008 conf
TestCom/FATES
George Din, Ina Schieferdecker, Razvan Petre
2008 conf
TestCom/FATES
Diana Alina Serbanescu, Victoria Molovata, George Din, Ina Schieferdecker, Ilja Radusch
2008 conf
Software Engineering Research and Practice
Justyna Zander-Nowicka, Xuezheng Xiong, Ina Schieferdecker
2008 A conf
ICST
Sebastian Wieczorek, Alin Stefanescu, Ina Schieferdecker
2008 J jnl
Int. J. Softw. Tools Technol. Transf.
Ina Schieferdecker, Jürgen Großmann
2008 conf
DIPES
Augustin Kebemou, Ina Schieferdecker
2008 conf
Formal Methods and Testing
Ina Schieferdecker, Jens Grabowski, Theofanis Vassiliou-Gioles, George Din
2007 B conf
GLOBECOM
George Din, Razvan Petre, Ina Schieferdecker
2007 C conf
Software Engineering
Benjamin Zeiss, Diana Vega, Ina Schieferdecker, Helmut Neukirchen, Jens Grabowski
2007 conf
EUC Workshops
Augustin Kebemou, Ina Schieferdecker
2007 conf
Software Engineering Research and Practice
Justyna Zander-Nowicka, Abel Marrero Pérez, Ina Schieferdecker
2007 A* conf
ASE
Stefan Wappler, Ina Schieferdecker
2007 conf
Model-Based Engineering of Embedded Real-Time Systems
Christian Buckl, Alois C. Knoll, Ina Schieferdecker, Justyna Zander
2007 C conf
ISADS
Ina Schieferdecker
2007 conf
FTDCS
Ina Schieferdecker
2007 conf
TestCom/FATES
Diana Vega, Ina Schieferdecker, George Din
2007 conf
SEUS
Ina Schieferdecker, Jürgen Großmann
2006 conf
JCKBSE
Elena-Ramona Modroiu, Ina Schieferdecker
2006 conf
MBEES
Justyna Zander-Nowicka, Ina Schieferdecker, Tibor Farkas
2006 conf
TestCom
George Din, Sorin Tolea, Ina Schieferdecker
2006 conf
GI Jahrestagung (2)
Fevzi Belli, Christof J. Budnik, Michael Linschulte, Ina Schieferdecker
2006 conf
MBEES
Ina Schieferdecker, Jürgen Großmann
2005 J jnl
Int. J. Softw. Tools Technol. Transf.
Ina Schieferdecker, George Din, Dimitrios Apostolidis
2005 conf
TestCom
Justyna Zander, Zhen Ru Dai, Ina Schieferdecker, George Din
2005 conf
GI Jahrestagung (1)
Ina Schieferdecker
2004 conf
FORTE Workshops
Ina Schieferdecker, George Din
2004 conf
RISE
Marc Born, Ina Schieferdecker, Olaf Kath, Chiaki Hirai
2004 conf
TestCom
Theofanis Vassiliou-Gioles, George Din, Ina Schieferdecker
2004 conf
MBT
Hans-Gerhard Groß, Ina Schieferdecker, George Din
2004 conf
FATES
Alain Vouffo-Feudjio, Ina Schieferdecker
2003 C conf
ISADS
Peter H. Deussen, George Din, Ina Schieferdecker
2003 conf
ICDCS Workshops
George Din, Akihiro Hayakawa, Ina Schieferdecker, Peter H. Deussen
2003 J jnl
Comput. Networks
Jens Grabowski, Dieter Hogrefe, György Réthy, Ina Schieferdecker, Anthony Wiles, Colin Willcock
2003 conf
KiVS
Ina Schieferdecker, Bernard Stepien
2003 conf
TestCom
Ina Schieferdecker, Theofanis Vassiliou-Gioles
2003 J jnl
Sci. Comput. Program.
Hubert Garavel, Stefania Gnesi, Ina Schieferdecker
2003 conf
TestCom
Ina Schieferdecker, Zhen Ru Dai, Jens Grabowski, Axel Rennoch
2003 C conf
FMICS
Ina Schieferdecker, Theofanis Vassiliou-Gioles
2002 conf
ICC
Tonghong Li, Andreas Hoffmann, Marc Born, Ina Schieferdecker
2002 ed.
TestCom
Ina Schieferdecker, Hartmut König, Adam Wolisz
2002 conf
SAM
Ina Schieferdecker, Jens Grabowski
2001 B conf
EDOC
Mang Li, Ina Schieferdecker, Arno Puder
2001 conf
APAQS
Mang Li, Axel Rennoch, Ina Schieferdecker, Dorota Witaszek, O. Halabi, Alain Vouffo, Aihong Yin
2001 conf
SDL Forum
Paul Baker, Ekkart Rudolph, Ina Schieferdecker
2000 conf
FBT
Ekkart Rudolph, Ina Schieferdecker, Jens Grabowski
2000 conf
SAM
Ekkart Rudolph, Ina Schieferdecker, Jens Grabowski
2000 conf
TestCom
Ina Schieferdecker, Mang Li, Axel Rennoch
2000 conf
ICDCS Workshop on Distributed System Validation and Verification
Marc Born, Ina Schieferdecker, Mang Li
1999 conf
FMOODS
Marc Born, Andreas Hoffmann, Mang Li, Ina Schieferdecker
1999 conf
IWTCS
Theofanis Vassiliou-Gioles, Ina Schieferdecker, Marc Born, Mario Winkler, Mang Li
1999 B conf
LCN
Ascan F. Morlang, Ina Schieferdecker
1999 conf
FBT
Axel Rennoch, Jan de Meer, Ina Schieferdecker
1999 C conf
ISADS
Mang Li, Ina Schieferdecker, Axel Rennoch
1998 J jnl
Formal Aspects Comput.
Theofanis Vassiliou-Gioles, Ina Schieferdecker
1998 conf
IS&N
Ina Schieferdecker, Mang Li, Andreas Hoffmann
1998 J jnl
Prax. Inf.verarb. Kommun.
Ina Schieferdecker, Axel Rennoch, Mang Li, Bernard Stepien
1998 conf
IWTCS
Thomas Walter, Ina Schieferdecker, Jens Grabowski
1998 conf
IWTCS
Claude Desroches, Mang Li, Stephan Pietsch, Axel Rennoch, Ina Schieferdecker, Theofanis Vassiliou-Gioles
1998 conf
FBT
Stephan Pietsch, Ina Schieferdecker
1997 conf
FBT
Ina Schieferdecker, Mang Li, Axel Rennoch
1997 ed.
FBT
Adam Wolisz, Ina Schieferdecker, Axel Rennoch
1997 conf
FBT
Ina Schieferdecker, Axel Rennoch, Olaf Mertens
1995 conf
Integrated Network Management
Jane Hall, Ina Schieferdecker, Michael Tschichholz
1995
Ina Schieferdecker
1995 conf
TAPSOFT
Ina Schieferdecker
1995 conf
Formal Methods for Industrial Applications
Andreas Willig, Ina Schieferdecker
1991 conf
ASIM
Klaus Ahrens, Joachim Fischer, Eckhardt Holz, Ina Schieferdecker, Günter Schwarze, Dorota Witaszek, Andreas Vogel
1990 J jnl
it Inf. Technol.
Klaus Ahrens, Joachim Fischer, Eckhardt Holz, Ina Schieferdecker
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()