Wasana Bandara

105 papers A 10C 9Journal 25Unranked 54
YearRankTypeTitle / Venue / Authors
2026 ed.
BPM (RBPM, PT, and Educators Forum)
E. R. Mahendrawathi, Avigdor Gal, Thomas Grisold, Flávia Maria Santoro, Mathias Weske, Remco M. Dijkman, Dimka Karastoyanova, Banu Aysolmaz, Wasana Bandara, Kate Revoredo
2025 A conf
BPM
Thamali Chandrasiri, Nicole Croes, Wasana Bandara, Oktay Turetken, Nadine Ostern, Michael Rosemann, Marleen Voss
2025 conf
ACIS
Wasana Bandara, Erwin Fielt, Sultana Lubna Alam, Kasuni Weerasinghe, Rosetta Romano, Maduka Subasinghage, Marc T. P. Adam
2025 conf
BPM (RBPM, PT, and Educators Forum)
Thamali Chandrasiri, Wasana Bandara, Michael Rosemann, Nadine Ostern, Marleen Voss
2025 J jnl
Australas. J. Inf. Syst.
Wasana Bandara, Michael Leyer, Michael Rosemann
2025 conf
BPM (Industry & Society Forum)
Jayasuriya D. R. Naleen, Rajapaksha Dinusha, Ishadi Mirispelakotuwa, Wimalasuriya Bandula, Wasana Bandara, Rehan Syed
2025 A conf
BPM
Kamilla Wells, Rehan Syed, Wasana Bandara, Ignatius Chukwudi
2025 J jnl
Bus. Inf. Syst. Eng.
Azumah Mamudu, Wasana Bandara, Moe Thandar Wynn, Sander J. J. Leemans
2025 J jnl
Commun. Assoc. Inf. Syst.
Tolusha Dahanayake Yapa, Vathsala Wickramasinghe, Wasana Bandara
2024 conf
HICSS
Amy Van Looy, Michael Rosemann, Wasana Bandara
2024 conf
ACIS
Thamali Chandrasiri, Wasana Bandara, Michael Rosemann, Nadine Ostern
2024 J jnl
J. Decis. Syst.
Wasana Bandara, Rehan Syed
2023 J jnl
Bus. Process. Manag. J.
Azumah Mamudu, Wasana Bandara, Sander J. J. Leemans, Moe Thandar Wynn
2023 J jnl
Inf. Syst. Frontiers
Kanika Goel, Wasana Bandara, Guy Gable
2023 A conf
BPM
Michael Rosemann, Nadine Ostern, Marleen Voss, Wasana Bandara
2023 C conf
ICIS
P. D. Hettiarachchi, Wasana Bandara, Tolusha Dahanayake Yapa, Ignatius Chukwudi, Amali Wijekoon
2023 J jnl
Inf. Polity
Rehan Syed, Wasana Bandara, Rebekah Eden
2023 conf
BPM (Blockchain and RPA Forum)
Rehan Syed, Moe Thandar Wynn, Wasana Bandara
2023 J jnl
Comput. Ind.
Iris Beerepoot, Claudio Di Ciccio, Hajo A. Reijers, Stefanie Rinderle-Ma, Wasana Bandara, Andrea Burattin, Diego Calvanese, Tianwa Chen, Izack Cohen, Benoît Depaire, Gemma Di Federico, Marlon Dumas, Christopher G. J. van Dun, Tobias Fehrer, Dominik Andreas Fischer, Avigdor Gal, Marta Indulska, Vatche Isahagian, Christopher Klinkmüller, Wolfgang Kratsch, Henrik Leopold, Amy Van Looy, Hugo A. López, Sanja Lukumbuzya, Jan Mendling, Lara Meyers, Linda Moder, Marco Montali, Vinod Muthusamy, Manfred Reichert, Yara Rizk, Michael Rosemann, Maximilian Röglinger, Shazia Sadiq, Ronny Seiger, Tijs Slaats, Mantas Simkus, Ida Asadi Someh, Barbara Weber, Ingo Weber, Mathias Weske, Francesca Zerbato
2022 A conf
BPM
Azumah Mamudu, Wasana Bandara, Moe Thandar Wynn, Sander J. J. Leemans
2022 J jnl
Bus. Process. Manag. J.
Haleh Moattar, Wasana Bandara, Udo Kannengiesser, Michael Rosemann
2022 conf
PACIS
Milind Godbole, Rehan Syed, Wasana Bandara
2022 J jnl
Bus. Process. Manag. J.
Ahangama Withanage Janitha Chandimali Abeygunasekera, Wasana Bandara, Moe Thandar Wynn, Ogan Yigitbasioglu
2021 A conf
BPM
Charon Abbott, Wasana Bandara, Erica French, Mary Tate, Paul Mathiesen
2021 J jnl
Bus. Inf. Syst. Eng.
Kanika Goel, Wasana Bandara, Guy Gable
2021 conf
Problems@BPM
Wasana Bandara, Amy Van Looy, Michael Rosemann, Lara Meyers
2021 J jnl
Bus. Process. Manag. J.
Wasana Bandara, Guy G. Gable, Mary Tate, Michael Rosemann
2021 ch.
Business Process Management Cases (2)
Imesha Denagama Vitharanage, Denise Toman, Wasana Bandara, Rehan Syed
2021 ch.
Business Process Management Cases (2)
Wasana Bandara, John C. Merideth, Angsana A. Techatassanasoontorn, Paul Mathiesen, Dan O'Neill
2020 A conf
BPM
Owen Keates, Moe Thandar Wynn, Wasana Bandara
2020 A conf
BPM
Charon Abbott, Wasana Bandara, Paul Mathiesen, Erica French, Mary Tate
2020 conf
ECIS
Imesha Manuraji Denagama Vitharanage, Wasana Bandara, Rehan Syed, Denise Toman
2020 C conf
ICIS
Wasana Bandara, Mythreyi Velmurugan, Sander J. J. Leemans
2020 conf
BPM (Forum)
Wasana Bandara, Amy Van Looy, John C. Merideth, Lara Meyers
2020 C conf
ICIS
John C. Merideth, Wasana Bandara, Dan O'Neill
2020 J jnl
Comput. Ind.
Rehan Syed, Suriadi Suriadi, Michael Adams, Wasana Bandara, Sander J. J. Leemans, Chun Ouyang, Arthur H. M. ter Hofstede, Inge van de Weerd, Moe Thandar Wynn, Hajo A. Reijers
2019 C conf
ICIS
Rehan Syed, Wasana Bandara
2019 C conf
ICIS
Rehan Syed, Wasana Bandara
2019 A conf
BPM
Bastian Wurm, Kanika Goel, Wasana Bandara, Michael Rosemann
2019 conf
BPM (Industry Forum)
Wasana Bandara, John C. Merideth, Angsana A. Techatassanasoontorn, Paul Mathiesen, Dan O'Neill
2019 conf
BPM Forum
Ahangama Withanage Janitha Chandimali Abeygunasekera, Wasana Bandara, Moe Thandar Wynn, Ogan Yigitbasioglu
2019 conf
BPM (Industry Forum)
Imesha Denagama Vitharanage, Denise Toman, Wasana Bandara, Rehan Syed
2019 A conf
BPM
Jeremy Gibson, Kanika Goel, Janne Barnes, Wasana Bandara
2018 conf
BPM (Forum)
Kanika Goel, Wasana Bandara, Guy Gable
2018 A conf
BPM
Rehan Syed, Wasana Bandara, Erica French
2018 C conf
ICIS
Rehan Syed, Wasana Bandara, Erica French
2018 J jnl
Australas. J. Inf. Syst.
Rehan Syed, Wasana Bandara, Erica French, Glenn Stewart
2018 J jnl
Bus. Process. Manag. J.
Ahangama Withanage Janitha Chandimali Abeygunasekera, Wasana Bandara, Moe Wynn, Ogan Yigitbasioglu
2018 ch.
Business Process Management Cases
Wasana Bandara, Rehan Syed, Bandula Ranathunga, K. B. Sampath Kulathilaka
2018 C conf
ICIS
Fahame Emamjome, Alison Gable, Wasana Bandara, Guy Gable
2018 conf
Business Process Management Workshops
Paul Mathiesen, Jason Watson, Wasana Bandara
2018 J jnl
Bus. Process. Manag. J.
Dharshani Thennakoon, Wasana Bandara, Erica French, Paul Mathiesen
2017 conf
PACIS
Kanika Goel, Wasana Bandara
2017 conf
PACIS
Suraya Miskon, Wasana Bandara, Erwin Fielt
2015 J jnl
Commun. Assoc. Inf. Syst.
Wasana Bandara, Elfi Furtmueller, Elena Gorbacheva, Suraya Miskon, Jenine P. Beekhuyzen
2015 ch.
Handbook on Business Process Management (2)
Hugh Peterken, Wasana Bandara
2015 ch.
Handbook on Business Process Management (2)
Alexandra Kokkonen, Wasana Bandara
2015 conf
PACIS
Afreen Gaffar, Amrita Deshpande, Wasana Bandara, Paul Mathiesen
2015 J jnl
Commun. Assoc. Inf. Syst.
Mary Tate, Elfi Furtmueller, Joerg Evermann, Wasana Bandara
2015 ch.
Handbook on Business Process Management (2)
Wasana Bandara, Alain Guillemain, Paul Coogans
2014 J jnl
Commun. Assoc. Inf. Syst.
Erwin Fielt, Wasana Bandara, Suraya Miskon, Guy Gable
2014 conf
PACIS
Fahame Emamjome, Guy G. Gable, Wasana Bandara, Ahmad A. Rabaa'i
2013 J jnl
Commun. Assoc. Inf. Syst.
Paul Mathiesen, Wasana Bandara, Olivera Marjanovic, Houra Delavari
2013 conf
DESRIST
Ahmad Alturki, Guy G. Gable, Wasana Bandara
2013 conf
ECIS
Ronny Mans, Hajo A. Reijers, Hans Berends, Wasana Bandara, Rogier Prince
2013 conf
PACIS
Fahame Emamjome, Ahmad A. Rabaa'i, Guy G. Gable, Wasana Bandara
2013 C conf
ICIS
Paul Mathiesen, Wasana Bandara, Jason Watson
2013 conf
PACIS
Ahmad Alturki, Guy G. Gable, Wasana Bandara
2013 J jnl
Electron. Mark.
Suraya Miskon, Erwin Fielt, Wasana Bandara, Guy Gable
2012 conf
PACIS
Wasana Bandara, Guy Gable
2012 conf
PACIS
Wasana Bandara, Chun Ouyang
2012 conf
DESRIST
Ahmad Alturki, Wasana Bandara, Guy G. Gable
2012 conf
ACIS
Wasana Bandara, Rehan Syed
2012 conf
ACIS
Meng Zhang, Wasana Bandara
2012 J jnl
J. Inf. Technol. Res.
Suraya Miskon, Wasana Bandara, Guy G. Gable, Erwin Fielt
2012 conf
PACIS
Ahmad Alturki, Guy G. Gable, Wasana Bandara, Shirley Gregor
2011 conf
DESRIST
Ahmad Alturki, Guy G. Gable, Wasana Bandara
2011 conf
ECIS
Paul Mathiesen, Wasana Bandara, Houra Delavari, Paul Harmon, Kevin Brennan
2011 conf
ECIS
Wasana Bandara, Suraya Miskon, Erwin Fielt
2011 conf
AMCIS
Suraya Miskon, Wasana Bandara, Erwin Fielt, Guy G. Gable
2011 conf
Business Process Management Workshops (1)
Paul Mathiesen, Jason Watson, Wasana Bandara, Michael Rosemann
2011 conf
ECIS
Ahmad Alturki, Guy G. Gable, Wasana Bandara
2010 conf
ACIS
Houra Delavari, Wasana Bandara, Olivera Marjanovic, Paul Mathiesen
2010 J jnl
Commun. Assoc. Inf. Syst.
Wasana Bandara, Donald R. Chand, Alina M. Chircu, Sandra Hintringer, Dimitris Karagiannis, Jan Recker, Antonie van Rensburg, Catherine Usoff, Richard J. Welke
2010 conf
AMCIS
Ahmad A. Rabaa'i, Wasana Bandara, Guy G. Gable
2010 conf
Business Process Management Workshops
Wasana Bandara, Paul Harmon, Michael Rosemann
2010 conf
PACIS
Ahmad A. Rabaa'i, Guy G. Gable, Wasana Bandara, Erwin Fielt
2010 conf
Business Process Management Workshops
Olivera Marjanovic, Wasana Bandara
2010 conf
ECIS
Sebastian Reiter, Glenn Stewart, Christine Bruce, Wasana Bandara, Michael Rosemann
2010 J jnl
Int. J. E Serv. Mob. Appl.
Suraya Miskon, Wasana Bandara, Erwin Fielt, Guy G. Gable
2009 conf
ACIS
Ahmad A. Rabaa'i, Wasana Bandara, Guy G. Gable
2009 conf
MCIS
Ahmad Alibabaei, Wasana Bandara, Mohammad Aghdasi
2009 conf
ECIS
Alina M. Chircu, Wasana Bandara, Donald Chand
2009 conf
ECIS
Wasana Bandara, Diana Heckl, Michael Rosemann
2009 conf
ACIS
Suraya Miskon, Wasana Bandara, Erwin Fielt, Guy Gable
2007 conf
ACIS
Wasana Bandara, Michael Rosemann, Islay Davies, Cherri Tan
2007 conf
ECIS
Christine Stephenson, Wasana Bandara
2007 conf
PACIS
Shazia Sadiq, Marta Indulska, Wasana Bandara, Sandy Chong
2007 conf
ECIS
Wasana Bandara, Marta Indulska, Shazia Sadiq, Sandy Chong
2006 conf
ECIS
Corina Raduescu, Hui Min Tan, Malini Jayaganesh, Wasana Bandara, Michael zur Muehlen, Sonia Lippe
2006 C conf
ICIS
Wasana Bandara, Guy G. Gable, Michael Rosemann
2006 conf
PACIS
Atul Arora, Wasana Bandara
2006 conf
ACIS
Marta Indulska, Sandy Chong, Wasana Bandara, Shazia Sadiq, Michael Rosemann
2005 conf
ACIS
Wasana Bandara, Jamie Cornes, Michael Rosemann
2005 J jnl
Eur. J. Inf. Syst.
Wasana Bandara, Guy G. Gable, Michael Rosemann
tests/integration/test_pe_extractors.py
← Index tests/integration/test_pe_extractors.py python
"""
Integration tests for PE-specific extractors.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration, pytest.mark.pe]


# ============================================================================
# PEFeaturesExtractor Tests
# ============================================================================

class TestPEFeaturesExtractor:
    """Tests for PEFeaturesExtractor class."""

    def test_extract_valid_pe(self, pe_binary_path, mock_logger):
        """Test extracting features from valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.models.dataclasses import PE

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, PE)

    def test_extract_pe_type(self, pe_binary_path, mock_logger):
        """Test PE type detection (DLL, EXE, DRIVER)."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.type in ["DLL", "EXE", "DRIVER"]

    def test_extract_architecture(self, pe_binary_path, mock_logger):
        """Test architecture detection."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Architecture should be detected
            assert result.architecture is not None

    def test_extract_entry_point(self, pe_binary_path, mock_logger):
        """Test entry point extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Entry point should be a hex string
            assert result.entry_point.startswith("0x")

    def test_extract_compilation_time(self, pe_binary_path, mock_logger):
        """Test compilation time extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Compilation time should be an integer timestamp
            assert isinstance(result.compilation_time, int)
            assert result.compilation_time_utc is not None

    def test_extract_dotnet_detection(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Should be True for the test .NET binary
            assert isinstance(result.is_dotnet, bool)
            assert result.is_dotnet is True  # Test file is .NET

    def test_extract_headers(self, pe_binary_path, mock_logger):
        """Test header extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.dos_header is not None
            assert result.nt_header is not None
            assert result.file_header is not None
            assert result.optional_header is not None

    def test_extract_counts(self, pe_binary_path, mock_logger):
        """Test section/import/export counts."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert isinstance(result.number_of_sections, int)
            assert isinstance(result.number_of_imports, int)
            assert isinstance(result.number_of_exports, int)
            assert isinstance(result.number_of_resources, int)

    def test_extract_rich_header(self, pe_binary_path, mock_logger):
        """Test Rich header extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Rich header may or may not be present
            # If present, should be JSON string
            if result.rich_header_dump is not None:
                assert isinstance(result.rich_header_dump, str)

    def test_extract_version_info(self, pe_binary_path, mock_logger):
        """Test version info extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Version info may or may not be present
            if result.version_info is not None:
                assert isinstance(result.version_info, list)


# ============================================================================
# PEImportExtractor Tests
# ============================================================================

class TestPEImportExtractor:
    """Tests for PEImportExtractor class."""

    def test_extract_imports(self, pe_binary_path, mock_logger):
        """Test import extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.models.dataclasses import PEImport

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                assert isinstance(result, PEImport)
                assert isinstance(result.pe_imports_total, int)

    def test_extract_import_libraries(self, pe_binary_path, mock_logger):
        """Test import library extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_libraryName is not None:
                assert isinstance(result.pe_import_libraryName, list)

    def test_extract_import_functions(self, pe_binary_path, mock_logger):
        """Test import function extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_functions is not None:
                assert isinstance(result.pe_import_functions, list)

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'library_name' in column_names
                assert 'function_name' in column_names


# ============================================================================
# PESectionExtractor Tests
# ============================================================================

class TestPESectionExtractor:
    """Tests for PESectionExtractor class."""

    def test_extract_sections(self, pe_binary_path, mock_logger):
        """Test section extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor
        from redb.models.dataclasses import PESection

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, list)
            assert len(result) > 0
            assert isinstance(result[0], PESection)

    def test_section_properties(self, pe_binary_path, mock_logger):
        """Test section property extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                section = result[0]
                assert section.section_name is not None
                assert section.section_entropy >= 0
                assert section.section_sha256 is not None
                assert section.section_md5 is not None
                assert section.section_size >= 0

    def test_section_entropy_range(self, pe_binary_path, mock_logger):
        """Test that section entropy is in valid range."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                for section in result:
                    assert 0 <= section.section_entropy <= 8

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'section_name' in column_names
                assert 'section_entropy' in column_names
                assert 'section_sha256' in column_names


# ============================================================================
# PEResourceExtractor Tests
# ============================================================================

class TestPEResourceExtractor:
    """Tests for PEResourceExtractor class."""

    def test_extract_resources(self, pe_binary_path, mock_logger):
        """Test resource extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEResourceExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if no resources
            if result is not None:
                assert isinstance(result, list)

    def test_resource_properties(self, pe_binary_path, mock_logger):
        """Test resource property extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor
        from redb.models.dataclasses import PEResource

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEResourceExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                resource = result[0]
                assert isinstance(resource, PEResource)
                assert resource.resource_type is not None


# ============================================================================
# PEOverlayExtractor Tests
# ============================================================================

class TestPEOverlayExtractor:
    """Tests for PEOverlayExtractor class."""

    def test_extract_overlay(self, pe_binary_path, mock_logger):
        """Test overlay extraction."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEOverlayExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if no overlay
            # If present, should have overlay properties
            if result is not None:
                assert hasattr(result, 'overlay_size')

    def test_has_overlay_check(self, pe_binary_path, mock_logger):
        """Test overlay detection."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEOverlayExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            has_overlay = extractor._has_overlay()
            assert isinstance(has_overlay, bool)


# ============================================================================
# PESignatureExtractor Tests
# ============================================================================

class TestPESignatureExtractor:
    """Tests for PESignatureExtractor class."""

    def test_extract_signature(self, pe_binary_path, mock_logger):
        """Test signature extraction."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESignatureExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if not signed
            # Result type depends on implementation

    def test_is_signed_check(self, pe_binary_path, mock_logger):
        """Test signature detection."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESignatureExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            is_signed = extractor._is_signed()
            assert isinstance(is_signed, bool)


# ============================================================================
# PEDotNetExtractor Tests
# ============================================================================

class TestPEDotNetExtractor:
    """Tests for PEDotNetExtractor class."""

    def test_extract_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET metadata extraction."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEDotNetExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # The test file is a .NET binary
            if extractor._check_dotnet():
                assert result is not None

    def test_check_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEDotNetExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            is_dotnet = extractor._check_dotnet()
            assert isinstance(is_dotnet, bool)
            # Test file should be .NET
            assert is_dotnet is True


# ============================================================================
# PEInconsistencyTestsExtractor Tests
# ============================================================================

class TestPEInconsistencyTestsExtractor:
    """Tests for PEInconsistencyTestsExtractor class."""

    def test_extract_inconsistency_tests(self, pe_binary_path, mock_logger):
        """Test inconsistency tests extraction."""
        from redb.extractors.pe_extractors.pe_inconsistency_tests import PEInconstistencyTestsExtractor as PEInconsistencyTestsExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEInconsistencyTestsExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # extract() returns True if tests were performed, False otherwise
            # The actual test results are stored in extractor.pe_inconsistency_tests
            # and extractor.dotnet_inconsistency_tests
            assert result in (True, False)

            if result:
                # Check that test results were stored
                assert extractor.pe_inconsistency_tests is not None or extractor.dotnet_inconsistency_tests is not None


# ============================================================================
# PEExtraFindings Tests
# ============================================================================

class TestPEExtraFindings:
    """Tests for PEExtraFindings class."""

    def test_extract_extra_findings(self, pe_binary_path, mock_logger):
        """Test extra findings extraction."""
        from redb.extractors.pe_extractors.pe_extra_findings import PEExtraFindings

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEExtraFindings(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May return None or list of findings
            if result is not None:
                assert isinstance(result, list)


# ============================================================================
# Integration Tests
# ============================================================================

class TestPEExtractorIntegration:
    """Integration tests for PE extractors."""

    def test_all_extractors_same_pe_object(self, pe_binary_path, mock_logger, pe_object):
        """Test that extractors can share the same PE object."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            # Create extractors sharing the same PE object
            features_ext = PEFeaturesExtractor(pe_binary_path, mock_logger, pe=pe_object)
            imports_ext = PEImportExtractor(pe_binary_path, mock_logger, pe=pe_object)
            sections_ext = PESectionExtractor(pe_binary_path, mock_logger, pe=pe_object)

            # All should use the same PE object
            assert features_ext.pe is pe_object
            assert imports_ext.pe is pe_object
            assert sections_ext.pe is pe_object

            # All should extract successfully
            features_result = features_ext.extract()
            imports_result = imports_ext.extract()
            sections_result = sections_ext.extract()

            assert features_result is not None
            # imports and sections may be None if not present

    def test_hash_consistency_across_extractors(self, pe_binary_path, mock_logger):
        """Test that hashes are consistent across all extractors."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            features_ext = PEFeaturesExtractor(pe_binary_path, mock_logger)
            imports_ext = PEImportExtractor(pe_binary_path, mock_logger)

            # Hashes should be the same
            assert features_ext.sha256 == imports_ext.sha256
            assert features_ext.md5 == imports_ext.md5
            assert features_ext.sha1 == imports_ext.sha1