• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CBIIT / CCDI-C3DC-Dataloader / 21402440351

27 Jan 2026 03:08PM UTC coverage: 24.281%. First build
21402440351

Pull #84

github

web-flow
Merge 6785b1ded into a27e54d58
Pull Request #84: [WIP] Add standard pull request template and workflow for unit testing

93 of 145 new or added lines in 4 files covered. (64.14%)

1140 of 4695 relevant lines covered (24.28%)

0.49 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

30.95
/tests/test_reloading_data.py
1
import unittest
2✔
2
import os
2✔
3
from unittest.mock import Mock, patch
2✔
4
from bento.common.utils import get_logger, NODES_CREATED, RELATIONSHIP_CREATED, NODES_DELETED, RELATIONSHIP_DELETED
2✔
5
from data_loader import DataLoader
2✔
6
from icdc_schema import ICDC_Schema
2✔
7
from props import Props
2✔
8
from neo4j import Driver
2✔
9

10

11
class MockNeo4jDriver(Driver):
2✔
12
    """Mock Neo4j driver for testing without a database connection"""
13
    def __init__(self):
2✔
14
        # Don't call super().__init__ to avoid actual connection
NEW
15
        pass
×
16
    
17
    def session(self, **kwargs):
2✔
NEW
18
        session = Mock()
×
NEW
19
        session.__enter__ = Mock(return_value=session)
×
NEW
20
        session.__exit__ = Mock(return_value=False)
×
NEW
21
        return session
×
22
    
23
    def close(self):
2✔
NEW
24
        pass
×
25
    
26
    def verify_connectivity(self):
2✔
NEW
27
        return True
×
28

29

30
class TestLoaderReload(unittest.TestCase):
2✔
31
    def setUp(self):
2✔
32
        # Use mock Neo4j driver instead of requiring environment variable
NEW
33
        self.driver = MockNeo4jDriver()
×
34
        
35
        # Use paths relative to the tests directory
NEW
36
        test_dir = os.path.dirname(os.path.abspath(__file__))
×
NEW
37
        self.data_folder = os.path.join(test_dir, 'data', 'COTC007B')
×
NEW
38
        props_path = os.path.join(test_dir, 'data', 'props-icdc.yml')
×
NEW
39
        model_path = os.path.join(test_dir, 'data', 'icdc-model.yml')
×
NEW
40
        model_props_path = os.path.join(test_dir, 'data', 'icdc-model-props.yml')
×
41
        
NEW
42
        props = Props(props_path)
×
NEW
43
        self.schema = ICDC_Schema([model_path, model_props_path], props)
×
44
        self.log = get_logger('Test Loader')
×
45
        self.loader = DataLoader(self.driver, self.schema)
×
46
        self.file_list = [
×
47
            "data/Dataset/COP-program.txt",
48
            "data/Dataset/COTC007B-case.txt",
49
            "data/Dataset/COTC007B-cohort.txt",
50
            "data/Dataset/COTC007B-cycle.txt",
51
            "data/Dataset/COTC007B-demographic.txt",
52
            "data/Dataset/COTC007B-diagnostic.txt",
53
            "data/Dataset/COTC007B-enrollment.txt",
54
            "data/Dataset/COTC007B-extent_of_disease.txt",
55
            "data/Dataset/COTC007B-physical_exam.txt",
56
            "data/Dataset/COTC007B-principal_investigator.txt",
57
            "data/Dataset/COTC007B-prior_surgery.txt",
58
            "data/Dataset/COTC007B-study.txt",
59
            "data/Dataset/COTC007B-study_arm.txt",
60
            "data/Dataset/COTC007B-vital_signs.txt",
61
            "data/Dataset/NCATS-COP01-blood_samples.txt",
62
            "data/Dataset/NCATS-COP01-case.txt",
63
            "data/Dataset/NCATS-COP01-demographic.txt",
64
            "data/Dataset/NCATS-COP01-diagnosis.txt",
65
            "data/Dataset/NCATS-COP01-enrollment.txt",
66
            "data/Dataset/NCATS-COP01-normal_samples.txt",
67
            "data/Dataset/NCATS-COP01-tumor_samples.txt",
68
            "data/Dataset/NCATS-COP01_20170228-GSL-079A-PE-Breen-NCATS-MEL-Rep1-Lane3.tar-file_neo4j.txt",
69
            "data/Dataset/NCATS-COP01_GSL-076A-Breen-NCATS-MEL-Rep1-Lane1.tar-file_neo4j.txt",
70
            "data/Dataset/NCATS-COP01_GSL-076A-Breen-NCATS-MEL-Rep1-Lane2.tar-file_neo4j.txt",
71
            "data/Dataset/NCATS-COP01_GSL-076A-Breen-NCATS-MEL-Rep2-Lane1.tar-file_neo4j.txt",
72
            "data/Dataset/NCATS-COP01_GSL-076A-Breen-NCATS-MEL-Rep3-Lane1.tar-file_neo4j.txt",
73
            "data/Dataset/NCATS-COP01_GSL-079A-Breen-NCATS-MEL-Rep2-Lane2.tar-file_neo4j.txt",
74
            "data/Dataset/NCATS-COP01_GSL-079A-Breen-NCATS-MEL-Rep2-Lane3.tar-file_neo4j.txt",
75
            "data/Dataset/NCATS-COP01_GSL-079A-Breen-NCATS-MEL-Rep3-Lane2.tar-file_neo4j.txt",
76
            "data/Dataset/NCATS-COP01_GSL-079A-Breen-NCATS-MEL-Rep3-Lane3.tar-file_neo4j.txt",
77
            "data/Dataset/NCATS-COP01_cohort_file.txt",
78
            "data/Dataset/NCATS-COP01_path_report_file_neo4j.txt",
79
            "data/Dataset/NCATS-COP01_study_file.txt"
80
        ]
81
        self.file_list_unique = [
×
82
            "data/Dataset/COP-program.txt",
83
            "data/Dataset/COTC007B-case.txt",
84
            "data/Dataset/COTC007B-cohort.txt",
85
            "data/Dataset/COTC007B-cycle.txt",
86
            "data/Dataset/COTC007B-demographic.txt",
87
            "data/Dataset/COTC007B-diagnostic.txt",
88
            "data/Dataset/COTC007B-enrollment.txt",
89
            "data/Dataset/COTC007B-extent_of_disease.txt",
90
            "data/Dataset/COTC007B-physical_exam.txt",
91
            "data/Dataset/COTC007B-principal_investigator.txt",
92
            "data/Dataset/COTC007B-prior_surgery.txt",
93
            "data/Dataset/COTC007B-study.txt",
94
            "data/Dataset/COTC007B-study_arm.txt",
95
            "data/Dataset/COTC007B-vital_signs_unique.txt",
96
            "data/Dataset/NCATS-COP01-blood_samples.txt",
97
            "data/Dataset/NCATS-COP01-case.txt",
98
            "data/Dataset/NCATS-COP01-demographic.txt",
99
            "data/Dataset/NCATS-COP01-diagnosis.txt",
100
            "data/Dataset/NCATS-COP01-enrollment.txt",
101
            "data/Dataset/NCATS-COP01-normal_samples.txt",
102
            "data/Dataset/NCATS-COP01-tumor_samples.txt",
103
            "data/Dataset/NCATS-COP01_20170228-GSL-079A-PE-Breen-NCATS-MEL-Rep1-Lane3.tar-file_neo4j.txt",
104
            "data/Dataset/NCATS-COP01_GSL-076A-Breen-NCATS-MEL-Rep1-Lane1.tar-file_neo4j.txt",
105
            "data/Dataset/NCATS-COP01_GSL-076A-Breen-NCATS-MEL-Rep1-Lane2.tar-file_neo4j.txt",
106
            "data/Dataset/NCATS-COP01_GSL-076A-Breen-NCATS-MEL-Rep2-Lane1.tar-file_neo4j.txt",
107
            "data/Dataset/NCATS-COP01_GSL-076A-Breen-NCATS-MEL-Rep3-Lane1.tar-file_neo4j.txt",
108
            "data/Dataset/NCATS-COP01_GSL-079A-Breen-NCATS-MEL-Rep2-Lane2.tar-file_neo4j.txt",
109
            "data/Dataset/NCATS-COP01_GSL-079A-Breen-NCATS-MEL-Rep2-Lane3.tar-file_neo4j.txt",
110
            "data/Dataset/NCATS-COP01_GSL-079A-Breen-NCATS-MEL-Rep3-Lane2.tar-file_neo4j.txt",
111
            "data/Dataset/NCATS-COP01_GSL-079A-Breen-NCATS-MEL-Rep3-Lane3.tar-file_neo4j.txt",
112
            "data/Dataset/NCATS-COP01_cohort_file.txt",
113
            "data/Dataset/NCATS-COP01_path_report_file_neo4j.txt",
114
            "data/Dataset/NCATS-COP01_study_file.txt"
115
        ]
116

117

118
    @unittest.skip("Skipping test that requires actual Neo4j database interaction")
2✔
119
    def test_load_detect_duplicate(self):
2✔
NEW
120
        test_dir = os.path.dirname(os.path.abspath(__file__))
×
NEW
121
        self.assertRaises(Exception, self.loader.load([os.path.join(test_dir, "data/COTC007B/COTC007B-vital_signs.txt")], True, False, 'new', True, 1, '/tmp', False))
×
122

123

124
    @unittest.skip("Skipping test that requires actual Neo4j database interaction")
2✔
125
    def test_reload_with_new_and_delete_cohorts(self):
2✔
NEW
126
        test_dir = os.path.dirname(os.path.abspath(__file__))
×
NEW
127
        file_list_unique = [os.path.join(test_dir, f) for f in self.file_list_unique]
×
NEW
128
        load_result = self.loader.load(file_list_unique, True, False, 'new', True, 1, '/tmp', False)
×
129
        self.assertIsInstance(load_result, dict, msg='Load data failed!')
×
130
        self.assertEqual(1832, load_result[NODES_CREATED])
×
131
        self.assertEqual(1974, load_result[RELATIONSHIP_CREATED])
×
NEW
132
        result = self.loader.load([os.path.join(test_dir, 'data/Dataset/COTC007B-cohort.txt')], True, False, 'delete', False, 1, '/tmp', False)
×
133
        self.assertEqual(result[NODES_DELETED], 18)
×
134
        self.assertEqual(result[RELATIONSHIP_DELETED], 101)
×
135

136
    @unittest.skip("Skipping test that requires actual Neo4j database interaction")
2✔
137
    def test_reload_with_new_and_delete_study(self):
2✔
NEW
138
        test_dir = os.path.dirname(os.path.abspath(__file__))
×
NEW
139
        file_list_unique = [os.path.join(test_dir, f) for f in self.file_list_unique]
×
NEW
140
        load_result = self.loader.load(file_list_unique, True, False, 'new', True, 1, '/tmp', False)
×
141
        self.assertIsInstance(load_result, dict, msg='Load data failed!')
×
142
        self.assertEqual(1832, load_result[NODES_CREATED])
×
143
        self.assertEqual(1974, load_result[RELATIONSHIP_CREATED])
×
NEW
144
        result = self.loader.load([os.path.join(test_dir, 'data/Dataset/COTC007B-study.txt')], True, False, 'delete', False, 1, '/tmp', False)
×
145
        self.assertEqual(result[NODES_DELETED], 1118)
×
146
        self.assertEqual(result[RELATIONSHIP_DELETED], 1201)
×
147

NEW
148
        result = self.loader.load([os.path.join(test_dir, 'data/Dataset/NCATS-COP01_study_file.txt')], True, False, 'delete', False, 1, '/tmp', False)
×
149
        self.assertEqual(result[NODES_DELETED], 713)
×
150
        self.assertEqual(result[RELATIONSHIP_DELETED], 773)
×
151

152
    @unittest.skip("Skipping test that requires actual Neo4j database interaction")
2✔
153
    def test_reload_with_new_and_delete_program(self):
2✔
NEW
154
        test_dir = os.path.dirname(os.path.abspath(__file__))
×
NEW
155
        file_list_unique = [os.path.join(test_dir, f) for f in self.file_list_unique]
×
NEW
156
        load_result = self.loader.load(file_list_unique, True, False, 'new', True, 1, '/tmp', False)
×
157
        self.assertIsInstance(load_result, dict, msg='Load data failed!')
×
158
        self.assertEqual(1832, load_result[NODES_CREATED])
×
159
        self.assertEqual(1974, load_result[RELATIONSHIP_CREATED])
×
NEW
160
        result = self.loader.load([os.path.join(test_dir, 'data/Dataset/COP-program.txt')], True, False, 'delete', False, 1, '/tmp', False)
×
161
        self.assertEqual(result[NODES_DELETED], 1832)
×
162
        self.assertEqual(result[RELATIONSHIP_DELETED], 1974)
×
163

164

165
    @unittest.skip("Skipping test that requires actual Neo4j database interaction")
2✔
166
    def test_reload_upsert(self):
2✔
NEW
167
        test_dir = os.path.dirname(os.path.abspath(__file__))
×
NEW
168
        file_list = [os.path.join(test_dir, f) for f in self.file_list]
×
NEW
169
        load_result = self.loader.load(file_list, True, False, 'upsert', True, 1, '/tmp', False)
×
170
        self.assertIsInstance(load_result, dict, msg='Load data failed!')
×
171
        self.assertEqual(1832, load_result[NODES_CREATED])
×
172
        self.assertEqual(1974, load_result[RELATIONSHIP_CREATED])
×
173

174

175

176
if __name__ == '__main__':
2✔
177
    unittest.main()
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc