Na Zhao

136 papers A* 1A 2B 3C 7Misc 1Journal 103Unranked 19
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Yuchen Wu, Kun Wang, Yining Pan, Na Zhao
2026 A* conf
AAAI
Penghui Wen, Mengwei He, Patrick Filippi, Na Zhao, Feng Zhang, Thomas F. A. Bishop, Zhiyong Wang, Kun Hu
2026 J jnl
Reliab. Eng. Syst. Saf.
Na Zhao, Huaming Yang, Yuwen Lu, Wei Zhai, Guofang Zhai
2026 J jnl
ISPRS Int. J. Geo Inf.
Ying Gao, Xiaoran Wu, Mingxiao Xu, Yanlei Ye, Na Zhao
2026 J jnl
CoRR
Kun Wang, Yun Zhu, Pan Zhou, Na Zhao
2026 J jnl
CoRR
Vishal Thengane, Zhaochong An, Tianjin Huang, Son Lam Phung, Abdesselam Bouzerdoum, Lu Yin, Na Zhao, Xiatian Zhu
2026 J jnl
Expert Syst. Appl.
Na Zhao, Zhaoyu Huang, Rui Hua, Yaokun Li, Runze Zheng, Qian Shen, Jian Wang
2026 J jnl
CoRR
Yuchen Su, Shaoxin Zhong, Yonghua Zhu, Ruofan Wang, Zijian Huang, Qiqi Wang, Na Zhao, Diana Benavides-Prado, Michael Witbrock
2025 J jnl
CoRR
Falguni Roy, Yiduo Shen, Na Zhao, Xiaofeng Ding, Md. Omar Faruk
2025 A conf
ICWS
Yushan Xiang, Jiale Zhao, Yunni Xia, Yumin Dong, Yin Li, Na Zhao
2025 J jnl
CoRR
Mingda Zhang, Na Zhao, Jianglong Qin, Guoyu Ye, Ruixiang Tang
2025 J jnl
CoRR
Mingda Zhang, Na Zhao, Jianglong Qing, Qing Xu, Kaiwen Pan, Ting Luo
2025 J jnl
J. Ambient Intell. Humaniz. Comput.
Ling Hu, Na Zhao, Na Li, Bin Zhang
2025 J jnl
Entropy
Na Zhao, Xiongfei Jiang, Ling Bai
2025 J jnl
J. Bioinform. Comput. Biol.
Na Zhao, Haihong Liu, Fang Yan
2025 J jnl
NeuroImage
Na Zhao, Qiang Liu
2025 J jnl
Comput. Ind. Eng.
Na Zhao, Tao-Yan Zhao, Jiangtao Cao, Huiyuan Shi
2025 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Ke He, Jian Song, Na Zhao, Shenquan Liu
2025 J jnl
IEEE Geosci. Remote. Sens. Lett.
Yuan Han, Jianguang Wen, Dongqin You, Qing Xiao, Guokai Liu, Yong Tang, Sen Piao, Na Zhao, Qinhuo Liu
2025 J jnl
Vis. Comput.
Yixi Li, Yanzhe Liu, Rong Chen, Hui Li, Na Zhao
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Wei Shao, Chenchen Wu, Tianxiang Yue, Na Zhao, Yunfeng Hu
2025 J jnl
Multim. Tools Appl.
Yiju Zing, Na Zhao
2025 J jnl
Inf. Process. Manag.
Falguni Roy, Na Zhao, Xiaofeng Ding
2025 J jnl
J. Cogn. Neurosci.
Ziyuan Li, Wenjin Guo, Na Zhao, Qiang Liu
2024 J jnl
Remote. Sens.
Bin Li, Xiaotian Xu, Hongyu Wang, Yingrui Duan, Hongjuan Lei, Chenchen Liu, Na Zhao, Xu Liu, Shaoning Li, Shaowei Lu
2024 J jnl
Ann. Oper. Res.
Na Zhao, Xiaolian Li, Nina Sun
2024 J jnl
Int. J. Intell. Robotics Appl.
Shuo Yang, Peng Jia, Na Zhao, Shouwei Zhang, Qiang Xue
2024 J jnl
Appl. Artif. Intell.
Na Zhao, Weijie Zhao
2024 C conf
CSCWD
Mingya Zhang, Na Zhao, Yuqian Zhuang, Liang Wang, Xianing Tao
2024 J jnl
Neurocomputing
Na Zhao, Xisheng Zhan, Jie Wu, Tao Han, Huaicheng Yan
2024 J jnl
Int. J. Inf. Commun. Technol.
Zhen Yang, Huajian Gong, Weiyun Ma, Chunlin Yin, Jie Li, Siyang Liu, Hua Zhu, Na Zhao
2024 J jnl
IEEE Access
Feng Gao, Na Zhao, Yao Chen, Jianjun Guo, Yongqing Wang, Hongyu Yuan, Shan Lu
2024 conf
CISP-BMEI
Xiaohan Zang, Na Zhao, Yantao Xing, Lulu Zhao, Pufeng Wang, Chenglong Cai, Zhipeng Cai, Jianfeng Xie, Jianqing Li, Chengyu Liu
2024 J jnl
Int. J. Inf. Commun. Technol.
Chunlin Yin, Jie Li, Pengfeng Qiu, Zheng Yang, Li Yang, Meng Su, Na Zhao
2024 J jnl
Soft Comput.
Zhimin Zhao, ShouXi Deng, Yaofei Ma, Qiang Gao, Na Zhao
2024 J jnl
J. Nonlinear Sci.
Na Zhao, Jian Song, Ke He, Shenquan Liu
2024 conf
ASSE
Na Zhao, Dong Wang, Sijia Chen, Hua Wang
2024 J jnl
Neuroinformatics
Qiu Ge, Matthew Lock, Xue Yang, Yuejiao Ding, Juan Yue, Na Zhao, Yun-Song Hu, Yong Zhang, Minliang Yao, Yufeng Zang
2023 J jnl
Remote. Sens.
Na Zhao
2023 J jnl
IEEE Trans. Netw. Serv. Manag.
Na Zhao, Biao Han, Ruidong Li, Jinshu Su, Cong Zhou
2023 J jnl
Sensors
Na Zhao
2023 J jnl
Remote. Sens.
Na Zhao, Kainan Chen
2023 J jnl
Int. J. Reason. based Intell. Syst.
Zhixia Duan, Na Zhao
2023 J jnl
Int. J. Bifurc. Chaos
Ke He, Na Zhao, Jian Song, Shenquan Liu
2023 J jnl
Remote. Sens.
Xiaoran Wu, Na Zhao
2023 J jnl
Remote. Sens.
Na Zhao, Kainan Chen
2023 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Saibo Li, Shaoyang He, Tianxiang Yue, Zhengping Du, Na Zhao, Yapeng Zhao, Yimeng Jiao, Bin Fan, Yi Liu, Zhe Xu, Yang Yang
2023 J jnl
Int. J. Inf. Commun. Technol.
Kan Pan, Hailong Chen, Qian Liu, Jian Wang, Yingming Pu, Chunlin Yin, Zheng Yang, Na Zhao
2023 J jnl
J. Intell. Manuf.
Rui Zhang, Na Zhao, Liuhu Fu, Xiaolu Bai, Jianghui Cai
2023 J jnl
Digit. Signal Process.
Rui Zhang, Peng-Yun Zhang, Mei-Rong Gao, Li-Hu Pan, Xiaolu Bai, Na Zhao
2023 J jnl
Remote. Sens.
Yuwei Wang, Na Zhao
2023 conf
ISCSIC
Yan Li, Wenzhuo Li, Wei Zhang, Na Zhao, Haiyan Zhang, Yalei Li
2023 conf
IEA/AIE (1)
Tao Li, Yijia Zhou, Na Zhao, Hongzhe Zhao
2023 J jnl
IEICE Trans. Commun.
Cong Zhou, Jing Tao, Baosheng Wang, Na Zhao
2022 conf
BIBM
Mingya Zhang, Na Zhao, Yue Yu, Yuqian Zhuang, QuanQiu Zhu, Tianyuan Huang, XianPing Tao
2022 C conf
CIS
Shiwei Wei, Na Zhao, Xunzhang Li, Quanyou Zhao
2022 conf
ICSPCC
Chengyu Ju, Na Zhao, Ning Tang
2022 J jnl
Remote. Sens.
Lili Zhang, Na Zhao, Wenhao Zhang, John P. Wilson
2022 conf
eLEOT (1)
Na Zhao, Zhongwen Zheng
2022 J jnl
Remote. Sens.
Yuwei Wang, Na Zhao
2022 J jnl
CoRR
Junjia Huang, Wei Ma, Rong Li, Na Zhao, Tao Zhou
2022 conf
CinC
Yumin Shen, Na Zhao, Zhipeng Cai, Chengyu Liu, Jianqing Li
2022 J jnl
Frontiers Inf. Technol. Electron. Eng.
Jinshu Su, Baokang Zhao, Yi Dai, Jijun Cao, Ziling Wei, Na Zhao, Congxi Song, Yujing Liu, Yusheng Xia
2022 J jnl
Neuroinformatics
Na Zhao, Juan Yue, Zi-Jian Feng, Yang Qiao, Qiu Ge, Li-Xia Yuan, Jue Wang, Yu-Tao Xiang, Yufeng Zang
2022 J jnl
J. Frankl. Inst.
Chengxing Lv, Haisheng Yu, Jian Chen, Na Zhao, Jieru Chi
2021 J jnl
Sensors
Na Zhao, Ze-Meng Fan, Miaomiao Zhao
2021 J jnl
Remote. Sens.
Na Zhao, Yimeng Jiao
2021 J jnl
Remote. Sens.
Na Zhao
2021 J jnl
Int. J. Distributed Syst. Technol.
Na Zhao, Xu He
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Saeed Ghaderizadeh, Dariush Abbasi-Moghadam, Alireza Sharifi, Na Zhao, Aqil Tariq
2021 B conf
IWQoS
Yang Cai, Biao Han, Jie Li, Na Zhao, Jinshu Su
2021 J jnl
Int. Trans. Oper. Res.
Hua Wang, Zhenzhong Guan, Dayong Dong, Na Zhao
2021 conf
ICCCS
Yufang Yin, Na Zhao, Yuehao Yan, Hong Xu
2021 conf
APMS (1)
Na Zhao, Yumin He, Mingxin Zhang, Gaosheng Cui, Fuman Pan
2021 B conf
IWQoS
Na Zhao, Biao Han, Yang Cai, Jinshu Su
2021 J jnl
Comput. Intell. Neurosci.
Na Zhao, Dongjiao Fan, Yun Chen
2020 J jnl
Genom. Proteom. Bioinform.
Xizhan Xu, Zezheng Gao, Fuquan Yang, Yingying Yang, Liang Chen, Lin Han, Na Zhao, Jiayue Xu, Xinmiao Wang, Yue Ma, Kiran Kumar Eepuri, Lian Shu, Xiaoxi Hu, Na Lyu, Yuanlong Pan, Baoli Zhu, Linhua Zhao, Xiaolin Tong, Jun Wang
2020 A conf
IROS
Yanke Hu, Raj Subramanian, Wangpeng An, Na Zhao, Weili Wu
2020 J jnl
J. Medical Imaging Health Informatics
Qingzhen Zhao, Na Zhao, Dengdeng Luo, Sheng Yue
2020 J jnl
J. Medical Imaging Health Informatics
Qingzhen Zhao, Na Zhao, Dengdeng Luo, Sheng Yue
2020 J jnl
Complex.
Wei Zhou, Na Zhao, Tong Chu, Ying-Xiang Chang
2020 J jnl
Intell. Decis. Technol.
Hongqiang Jiao, Wanning Ding, Yachao Shi, Na Zhao, Baomin Wang
2019 J jnl
Int. J. Geogr. Inf. Sci.
Ting Ma, Rong Zhu, Jianghao Wang, Na Zhao, Tao Pei, Yunyan Du, Chenghu Zhou, Jie Chen
2019 J jnl
Sensors
Na Zhao, Changku Sun, Peng Wang
2019 conf
ICCT
Na Zhao, Zixiong Liu
2019 J jnl
J. Medical Syst.
Xiaohong Wang, Na Zhao, Jingjing Shi, Yuhua Wu, Jun Liu, Qiang Xiao, Jian Hu
2019 J jnl
J. Medical Syst.
Xiaohong Wang, Na Zhao, Jingjing Shi, Yuhua Wu, Jun Liu, Qiang Xiao, Jian Hu
2019 J jnl
CoRR
Guanxiong Luo, Na Zhao, Wenhao Jiang, Peng Cao
2019 J jnl
J. Medical Syst.
Xiaohong Wang, Na Zhao, Peng Ouyang, Jiayi Lin, Jian Hu
2019 J jnl
IEEE Access
Na Zhao, Guanlan Zhang, Sha Zhang, Yun Bai, Shahazad Ali, Jiahua Zhang
2018 J jnl
Complex.
Na Zhao, T. C. E. Cheng
2018 J jnl
Earth Sci. Informatics
Ling Jiang, Mingwei Zhao, Tianxiang Yue, Na Zhao, Chun Wang, Jinglu Sun
2018 J jnl
Int. J. Autom. Comput.
Yuanchao Si, Chengkang Xie, Na Zhao
2018 J jnl
Interact. Learn. Environ.
Na Zhao, Fei Gao, Dazhi Yang
2018 J jnl
Frontiers Neuroinformatics
Na Zhao, Li-Xia Yuan, Xi-Ze Jia, Xu-Feng Zhou, Xin-Ping Deng, Hong-Jian He, Jianhui Zhong, Jue Wang, Yufeng Zang
2018 J jnl
Remote. Sens.
Chuanfa Chen, Yanyan Li, Na Zhao, Bin Guo, Naixia Mou
2018 conf
BIBM
Yu Jin, Teng Zhang, Zhixin Cao, Na Zhao, Chang Chen, Dandan Wang, Kuan-Cheok Lei, Dongliang Leng, Xiaohua Douglas Zhang
2018 J jnl
IEEE Trans. Geosci. Remote. Sens.
Chuanfa Chen, Yanyan Li, Na Zhao, Changqing Yan
2017 J jnl
Sensors
Hao Zhang, Junzhen Jiang, Yu Zhang, Huai-xi Chen, Na Zhao, Lingyan Lin, Yishen Qiu
2017 J jnl
Soft Comput.
Chuanfa Chen, Changqing Yan, Na Zhao, Bin Guo, Guolin Liu
2017 J jnl
Comput. Sci. Inf. Syst.
Jun Wu, Yu He, Xiaohong Qin, Na Zhao, Yingpeng Sang
2017 J jnl
Comput. Optim. Appl.
Na Zhao, Qingzhi Yang, Yajun Liu
2017 J jnl
Remote. Sens.
Zi-Yue Chen, Danlu Chen, Yan Zhuang, Jun Cai, Na Zhao, Bin He, Bingbo Gao, Bing Xu
2017 J jnl
Sensors
Tian Jin, Heliang Yuan, Na Zhao, Honglei Qin, Kewen Sun, Yuanfa Ji
2017 J jnl
IEEE Access
Jun Wu, Yu He, Xiangnan Guo, Yujia Zhang, Na Zhao
2017 J jnl
Multim. Syst.
Yingjie Xia, Xingmin Shi, Na Zhao
2016 J jnl
J. Vis. Commun. Image Represent.
Na Zhao, Yingjie Xia, Chao Xu, Xingmin Shi, Yuncai Liu
2016 J jnl
Multim. Tools Appl.
Xingmin Shi, Na Zhao, Yingjie Xia
2016 J jnl
Neurocomputing
Xingmin Shi, Zhenyu Shan, Na Zhao
2016 J jnl
Sensors
Li-Li Zhang, Tian-Xiang Yue, John P. Wilson, Ding Yi Wang, Na Zhao, Yu Liu, Dongdong Liu, Zheng-Ping Du, Yi Fu Wang, Chao Lin, Yuquan Zheng, Jian Hong Guo
2016 conf
ISCSLP
Na Zhao, Hongwu Yang
2015 C conf
APCC
Na Zhao, Nam Yul Yu
2015 conf
ChinaCom
Na Zhao, Rong Chai, Qin Hu, Jian-Kang Zhang
2015 B conf
PIMRC
Qin Hu, Rong Chai, Na Zhao, Zhimin Guo, Qianbin Chen
2015 J jnl
Appl. Math. Comput.
Na Zhao
2015 J jnl
Quantum Inf. Process.
Nan Jiang, Wen-Ya Wu, Luo Wang, Na Zhao
2015 J jnl
Sensors
Xiaona Liu, Qiao Zhang, Zhisheng Wu, Xinyuan Shi, Na Zhao, Yanjiang Qiao
2014 C conf
PDP
Sheng Bi, Jianzhong Zhou, Na Zhao, Huajie Zhang, Yue Zhao
2014 C conf
DASC
Yunzhi Jin, Hua Zhou, Hongwei Kang, Jinzhuo Liu, Na Zhao
2014 conf
ChinaCom
Rong Chai, Li Zhou, Na Zhao, Xiaoya Lin
2013 J jnl
Trans. GIS
Tian-Xiang Yue, Na Zhao, Hai Yang, Yin-Jun Song, Zheng-Ping Du, Ze-Meng Fan, Dun-Jiang Song
2013 J jnl
IEEE Signal Process. Lett.
Nam Yul Yu, Na Zhao
2013 J jnl
Int. J. Autom. Technol.
Lu-Hua Fu, Heng Zhang, Yan Sun, Na Zhao, Zhong Wang
2012 J jnl
Numer. Linear Algebra Appl.
Xin-Guo Liu, Na Zhao
2011 C conf
CIS
Na Zhao, Shenghui Su
2010 conf
FSKD
Bo Feng, Yajing Xu, Na Zhao, Huimin Xu
2010 J jnl
Appl. Math. Lett.
Xin-Guo Liu, Na Zhao
2010 J jnl
Comput. Inf. Sci.
Chaoji Chen, Na Zhao, Hongtao Jin, Yongjin Zhao
2010 J jnl
Appl. Math. Comput.
Na Zhao, Zheng-Hai Huang
2010 conf
BIC-TA
Na Zhao, Xiaohui Ma, Lu Gan, Yiyun Wei, Peiyuan Sun, Deshan Zhang
2009 J jnl
Appl. Math. Comput.
Ping Wang, Na Zhao
2008 conf
CSSE (4)
Na Zhao, Qingzhong Li, Zhongmin Yan
2008 conf
CSSE (5)
Na Zhao, Fang Fang, Lei Fan
2008 J jnl
Appl. Math. Comput.
Na Zhao, Wei Wu
2006 C conf
IGARSS
Xin Mei, Weihong Cui, Xuexia Zhang, Na Zhao, Zhenguo Niu
2003 Misc conf
WSC
Gary S. H. Tan, Na Zhao, Simon J. E. Taylor
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()