James Y. L. Thong

62 papers C 2Journal 49Unranked 9
YearRankTypeTitle / Venue / Authors
2025 J jnl
Int. J. Inf. Manag.
Frank K. Y. Chan, James Y. L. Thong, Susan A. Brown, Viswanath Venkatesh
2025 J jnl
J. Manag. Inf. Syst.
Frank K. Y. Chan, James Y. L. Thong, Viswanath Venkatesh
2022 J jnl
MIS Q.
Viswanath Venkatesh, James Y. L. Thong, Kai Spohrer, Frank K. Y. Chan, Ankur Arora, Hartmut Hoehle, Srinivasan Venkatraman
2021 J jnl
J. Manag. Inf. Syst.
Ka Chung Ng, Xiaojun Zhang, James Y. L. Thong, Kar Yan Tam
2021 J jnl
J. Assoc. Inf. Syst.
Weiyin Hong, Muller Y. M. Cheung, James Y. L. Thong
2020 ed.
PACIS
Doug Vogel, Kathy Ning Shen, Pan Shan Ling, Carol Hsu, James Y. L. Thong, Marco De Marco, Moez Limayem, Sean Xin Xu
2020 J jnl
Inf. Syst. J.
Viswanath Venkatesh, James Y. L. Thong, Frank K. Y. Chan, Hartmut Hoehle, Kai Spohrer
2019 J jnl
J. Manag. Inf. Syst.
Likoebe M. Maruping, Viswanath Venkatesh, James Y. L. Thong, Xiaojun Zhang
2019 J jnl
MIS Q.
Viswanath Venkatesh, Tracy Ann Sykes, Frank K. Y. Chan, James Y. L. Thong, Paul Jen-Hwa Hu
2017 J jnl
J. Assoc. Inf. Syst.
Muller Y. M. Cheung, Weiyin Hong, James Y. L. Thong
2017 J jnl
J. Manag. Inf. Syst.
Xin Xu, James Y. L. Thong, Kar Yan Tam
2016 J jnl
Inf. Syst. Res.
Viswanath Venkatesh, James Y. L. Thong, Frank K. Y. Chan, Paul Jen-Hwa Hu
2016 J jnl
J. Assoc. Inf. Syst.
Viswanath Venkatesh, James Y. L. Thong, Xin Xu
2014 J jnl
Inf. Syst. Res.
Weiyin Hong, Frank K. Y. Chan, James Y. L. Thong, Lewis C. Chasalow, Gurpreet Dhillon
2014 J jnl
Inf. Syst. Res.
Xin Xu, James Y. L. Thong, Viswanath Venkatesh
2013 ed.
PACIS
Jae-Nam Lee, Ji-Ye Mao, James Y. L. Thong
2013 J jnl
MIS Q.
Weiyin Hong, James Y. L. Thong
2012 J jnl
MIS Q.
Viswanath Venkatesh, James Y. L. Thong, Xin Xu
2011 J jnl
IEEE Trans. Engineering Management
James Y. L. Thong, Viswanath Venkatesh, Xin Xu, Se-Joon Hong, Kar Yan Tam
2011 J jnl
Inf. Syst. J.
Viswanath Venkatesh, James Y. L. Thong, Frank K. Y. Chan, Paul Jen-Hwa Hu, Susan A. Brown
2011 conf
WEB
Muller Y. M. Cheung, James Y. L. Thong
2011 J jnl
J. Manag. Inf. Syst.
Weiyin Hong, James Y. L. Thong, Lewis C. Chasalow, Gurpreet Dhillon
2010 J jnl
J. Assoc. Inf. Syst.
Frank K. Y. Chan, James Y. L. Thong, Viswanath Venkatesh, Susan A. Brown, Paul Jen-Hwa Hu, Kar Yan Tam
2009 J jnl
Decis. Support Syst.
Frank K. Y. Chan, James Y. L. Thong
2009 J jnl
J. Assoc. Inf. Sci. Technol.
Paul Jen-Hwa Hu, Susan A. Brown, James Y. L. Thong, Frank K. Y. Chan, Kar Yan Tam
2009 J jnl
Decis. Support Syst.
James Y. L. Thong, Felix B. Tan
2009 J jnl
Int. J. Electron. Commer.
James Y. L. Thong, Felix B. Tan
2008 conf
PACIS
Kwok Yue Chan, Min Gong, Yan Xu, James Y. L. Thong
2008 J jnl
Inf. Syst. Frontiers
Se-Joon Hong, James Y. L. Thong, Jae Yun Moon, Kar Yan Tam
2007 conf
PACIS
Frank K. Y. Chan, James Y. L. Thong
2007 J jnl
J. Assoc. Inf. Sci. Technol.
Weiyin Hong, James Y. L. Thong, Kar Yan Tam
2007 conf
PACIS
Xin Xu, James Y. L. Thong, Kar Yan Tam
2006 J jnl
Int. J. Hum. Comput. Stud.
James Y. L. Thong, Se-Joon Hong, Kar Yan Tam
2006 J jnl
Decis. Support Syst.
Se-Joon Hong, James Y. L. Thong, Kar Yan Tam
2005 conf
PACIS
Se-Joon Hong, James Y. L. Thong, Kar Yan Tam
2004 J jnl
Eur. J. Oper. Res.
Rudy Setiono, James Y. L. Thong
2004 J jnl
Int. J. Hum. Comput. Stud.
Weiyin Hong, James Y. L. Thong, Kar Yan Tam
2004 J jnl
Inf. Syst. Res.
Weiyin Hong, James Y. L. Thong, Kar Yan Tam
2004 J jnl
J. Manag. Inf. Syst.
Weiyin Hong, James Y. L. Thong, Kar Yan Tam
2004 J jnl
Commun. ACM
James Y. L. Thong, Weiyin Hong, Kar Yan Tam
2003 J jnl
Int. J. Comput. Appl. Technol.
James Y. L. Thong, Chee-Sing Yap, Kin-Lee Seah
2003 J jnl
J. Manag. Inf. Syst.
A. Graham Peace, Dennis F. Galletta, James Y. L. Thong
2002 J jnl
J. Manag. Inf. Syst.
Weiyin Hong, James Y. L. Thong, Wai-Man Wong, Kar Yan Tam
2002 J jnl
Int. J. Hum. Comput. Stud.
James Y. L. Thong, Weiyin Hong, Kar Yan Tam
2001 J jnl
Decis. Support Syst.
James Y. L. Thong, Patrick Y. K. Chau, Kar Yan Tam
2001 J jnl
IEEE Commun. Mag.
Xu Yan, James Y. L. Thong
2001 J jnl
J. Organ. Comput. Electron. Commer.
James Y. L. Thong, Patrick Y. K. Chau, Kar Yan Tam
2000 J jnl
J. Manag. Inf. Syst.
James Y. L. Thong, Chee-Sing Yap, Kin-Lee Seah
2000 C conf
ICIS
Rudy Setiono, Wee Kheng Leow, James Y. L. Thong
1999 J jnl
J. Manag. Inf. Syst.
James Y. L. Thong
1998 J jnl
Inf. Manag.
Rudy Setiono, James Y. L. Thong, Chee-Sing Yap
1998 J jnl
J. Manag. Inf. Syst.
James Y. L. Thong, Chee-Sing Yap
1997 J jnl
J. Organ. Comput. Electron. Commer.
James Y. L. Thong, Chee-Sing Yap, K. S. Raman
1997 C conf
ICIS
Kwang-Tat Ang, James Y. L. Thong, Chee-Sing Yap
1997 J jnl
J. Inf. Technol.
Chee-Sing Yap, James Y. L. Thong
1996 J jnl
Inf. Process. Manag.
James Y. L. Thong, Chee-Sing Yap
1996 conf
ECIS
Ai-Hua Liang, James Y. L. Thong, Chee-Sing Yap
1996 J jnl
Inf. Syst. Res.
James Y. L. Thong, Chee-Sing Yap, K. S. Raman
1995 conf
ECIS
Chee-Sing Yap, James Y. L. Thong
1994 J jnl
J. Manag. Inf. Syst.
James Y. L. Thong, Chee-Sing Yap, K. S. Raman
1993 conf
ECIS
Chee-Sing Yap, James Y. L. Thong, K. S. Raman
1992 conf
SIGCPR
James Y. L. Thong, Chee-Sing Yap, K. S. Raman
tests/integration/test_pe_extractor.py
← Index tests/integration/test_pe_extractor.py python
"""
Integration tests for the PEExtractor base class.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

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


class TestPEExtractorInitialization:
    """Tests for PEExtractor initialization."""

    def test_pe_extractor_with_valid_pe(self, pe_binary_path, mock_logger):
        """Test PEExtractor initialization with valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            assert extractor.pe is not None
            assert extractor.filepath == pe_binary_path

    def test_pe_extractor_with_provided_pe_object(self, pe_binary_path, mock_logger, pe_object):
        """Test PEExtractor initialization with pre-existing PE object."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should use the provided PE object, not create a new one
            assert extractor.pe is pe_object

    def test_pe_extractor_with_invalid_file(self, elf_binary_path, mock_logger):
        """Test PEExtractor initialization with non-PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should return None for pe when file is not a valid PE
            assert extractor.pe is None
            # Logger should have recorded an error
            assert mock_logger.error.called


class TestPEExtractorMethods:
    """Tests for PEExtractor helper methods."""

    def test_check_dotnet_true(self, pe_binary_path, mock_logger):
        """Test _check_dotnet returns True for .NET PE."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # The test PE file is a .NET binary
            if extractor.pe is not None:
                result = extractor._check_dotnet()
                # d8637bdbcfc9112fcb1f0167b398e771 is a .NET binary
                assert result is True

    def test_check_dotnet_false(self, elf_binary_path, mock_logger):
        """Test _check_dotnet returns False for non-PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should return False when PE is None
            result = extractor._check_dotnet()
            assert result is False

    def test_is_signed_false(self, pe_binary_path, mock_logger):
        """Test _is_signed method."""
        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 not None:
                result = extractor._is_signed()
                # Result depends on the actual binary
                assert isinstance(result, bool)

    def test_has_overlay(self, pe_binary_path, mock_logger):
        """Test _has_overlay method."""
        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 not None:
                result = extractor._has_overlay()
                assert isinstance(result, bool)


class TestGeneratePEFileObject:
    """Tests for _generate_pefile_object method."""

    def test_generate_pefile_object_valid(self, pe_binary_path, mock_logger):
        """Test _generate_pefile_object with valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # The PE object should be created successfully
            assert extractor.pe is not None

    def test_generate_pefile_object_invalid(self, temp_text_file, mock_logger):
        """Test _generate_pefile_object with invalid file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should return None for invalid PE
            assert extractor.pe is None


class TestGenerateDotNetFileObject:
    """Tests for _generate_dotnetfile_object method."""

    def test_generate_dotnetfile_object_valid(self, pe_binary_path, mock_logger):
        """Test _generate_dotnetfile_object with .NET PE file."""
        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 not None and extractor._check_dotnet():
                dotnet, error = extractor._generate_dotnetfile_object()
                # Should create dotnet object for .NET PE
                assert dotnet is not None
                assert error is None

    def test_generate_dotnetfile_object_invalid(self, elf_binary_path, mock_logger):
        """Test _generate_dotnetfile_object with non-.NET file."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

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

            dotnet, error = extractor._generate_dotnetfile_object()
            # Should return error for non-.NET file
            assert dotnet is None
            assert error is not None


class TestPEExtractorTag:
    """Tests for tag method in PE extractors."""

    def test_pe_features_tag(self, pe_binary_path, mock_logger):
        """Test that PEFeaturesExtractor returns correct tag."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)
            assert extractor.tag() == Tag.PE_FEATURES.value

    def test_pe_import_tag(self, pe_binary_path, mock_logger):
        """Test that PEImportExtractor returns correct tag."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)
            assert extractor.tag() == Tag.PE_IMPORT.value

    def test_pe_section_tag(self, pe_binary_path, mock_logger):
        """Test that PESectionExtractor returns correct tag."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)
            assert extractor.tag() == Tag.PE_SECTION.value


class TestPEExtractorClickHouseTable:
    """Tests for get_clickhouse_table method in PE extractors."""

    def test_pe_features_clickhouse_table(self, pe_binary_path, mock_logger):
        """Test that PEFeaturesExtractor returns correct ClickHouse table name."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

    def test_pe_import_clickhouse_table(self, pe_binary_path, mock_logger):
        """Test that PEImportExtractor returns correct ClickHouse table name."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

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

    def test_pe_section_clickhouse_table(self, pe_binary_path, mock_logger):
        """Test that PESectionExtractor returns correct ClickHouse table name."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

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


class TestPEExtractorPrepareExportData:
    """Tests for prepare_export_data method in PE extractors."""

    def test_pe_features_prepare_export_elasticsearch(self, pe_binary_path, mock_logger):
        """Test prepare_export_data for Elasticsearch."""
        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 not None:
                # First extract
                extractor.extract()
                result = extractor.prepare_export_data("ElasticsearchExporter")
                # Should return the pe_features dataclass
                assert result is extractor.pe_features

    def test_pe_features_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse."""
        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 not None:
                # First extract
                extractor.extract()
                result = extractor.prepare_export_data("ClickHouseExporter")

                # Should return tuple of (data, column_names, column_type_names)
                assert isinstance(result, tuple)
                assert len(result) == 3
                data, column_names, column_type_names = result
                assert isinstance(data, list)
                assert isinstance(column_names, list)
                assert isinstance(column_type_names, list)
                # Column names and types should match in length
                assert len(column_names) == len(column_type_names)