Coverage for test\test_climate_data_dialog.py: 99%
128 statements
« prev ^ index » next coverage.py v7.2.3, created at 2023-04-10 14:40 +0900
« prev ^ index » next coverage.py v7.2.3, created at 2023-04-10 14:40 +0900
1import copy
2import os
3from typing import Dict, Tuple
5import pytest
6from pytestqt.qtbot import QtBot
7from qgis.PyQt.QtCore import Qt
8from qgis.PyQt.QtWidgets import QFileDialog, QMessageBox
10from grm.dialogs.Climate_data import ClimateDataDialog
11from grm.lib.Util import MsTitle
13# Set environment variables (PyQt 실행용)
14if os.environ.get("QT_QPA_PLATFORM_PLUGIN_PATH") is None:
15 os.environ[
16 "QT_QPA_PLATFORM_PLUGIN_PATH"
17 ] = r"C:\Program Files\QGIS 3.10\apps\Qt5\plugins"
18if os.environ.get("PROJ_LIB") is None:
19 os.environ["PROJ_LIB"] = "C:\\PROGRA~1\\QGIS3~1.10\\share\\proj"
22class TestClimateDataDialog:
23 """
24 ClimateDataDialog 테스트
25 """
27 xmltodict = {
28 "GRMProject": {
29 "ProjectSettings": {
30 "PrecipitationDataFile": "",
31 "PrecipitationInterval_min": "",
32 "TemperatureMaxDataFile": "",
33 "TemperatureMaxInterval_min": "",
34 "TemperatureMinDataFile": "",
35 "TemperatureMinInterval_min": "",
36 "DaytimeLengthDataFile": "",
37 "DaytimeLengthInterval_min": "",
38 "DaytimeHoursRatioDataFile": "",
39 "SolarRadiationDataFile": "",
40 "SolarRadiationInterval_min": "",
41 "SnowPackTemperatureDataFile": "",
42 "SnowPackTemperatureInterval_min": "",
43 }
44 }
45 }
47 @classmethod
48 def setup_class(self):
49 MsTitle("ClimateDataDialog")
51 @pytest.fixture(scope="class")
52 def monkeyclass(self) -> pytest.MonkeyPatch:
53 """
54 Mocking QMessageBox
56 """
57 from _pytest.monkeypatch import MonkeyPatch
59 mpatch = MonkeyPatch()
60 mpatch.setattr(QMessageBox, "information", lambda *args: "information")
61 mpatch.setattr(QMessageBox, "warning", lambda *args: "warning")
62 mpatch.setattr(
63 QFileDialog,
64 "getOpenFileName",
65 lambda *args: ("/path/mock/file/test.txt", "txt"),
66 )
67 yield mpatch
68 mpatch.undo()
70 def test_default(self, qtbot: QtBot):
71 assert ClimateDataDialog()
73 def test_xml_input(self, qtbot: QtBot):
74 with pytest.raises(KeyError):
75 ClimateDataDialog({})
76 with pytest.raises(AttributeError):
77 ClimateDataDialog({"GRMProject": {"ProjectSettings": ""}})
79 def test_insert_precipitation(self, qtbot: QtBot, monkeyclass: pytest.MonkeyPatch):
80 """
81 Precipitation 정확한 데이터를 입력했을 시
82 """
83 xmltodict = copy.deepcopy(self.xmltodict)
84 dialog = ClimateDataDialog(xmltodict)
85 qtbot.addWidget(dialog)
87 qtbot.mouseClick(dialog.ui.load_btn_PrecipitationDataFile, Qt.LeftButton)
88 dialog.ui.spb_PrecipitationInterval_min.setValue(5)
89 dialog.ui.spb_PrecipitationInterval_min.setValue(1)
90 qtbot.mouseClick(dialog.ui.btnOK, Qt.LeftButton)
92 assert (
93 xmltodict["GRMProject"]["ProjectSettings"]["PrecipitationDataFile"]
94 == "/path/mock/file/test.txt"
95 )
96 assert (
97 xmltodict["GRMProject"]["ProjectSettings"]["PrecipitationInterval_min"] == 1
98 )
100 def test_not_insert_precipitation_datafile(
101 self, qtbot: QtBot, monkeyclass: pytest.MonkeyPatch
102 ):
103 """
104 Precipitation 데이터 파일을 입력하지 않았을 시
106 - 경고창이 떳는지 확인
107 - xmltodict가 변하지 않았는지 확인
108 """
109 xmltodict = copy.deepcopy(self.xmltodict)
111 is_warning = False
113 def set_warning(*args):
114 nonlocal is_warning
115 is_warning = True
117 monkeyclass.setattr(QMessageBox, "warning", set_warning)
119 dialog = ClimateDataDialog(xmltodict)
120 qtbot.addWidget(dialog)
121 dialog.ui.spb_PrecipitationInterval_min.setValue(5)
122 qtbot.mouseClick(dialog.ui.btnOK, Qt.LeftButton)
124 assert is_warning
125 assert xmltodict == self.xmltodict
127 def test_not_insert_precipitation_interval_min(
128 self, qtbot: QtBot, monkeyclass: pytest.MonkeyPatch
129 ):
130 """
131 Precipitation interval을 입력하지 않았을 시
133 - 경고창이 떳는지 확인
134 - xmltodict가 변하지 않았는지 확인
135 """
136 xmltodict = copy.deepcopy(self.xmltodict)
138 is_warning = False
140 def set_warning(*args):
141 nonlocal is_warning
142 is_warning = True
144 monkeyclass.setattr(QMessageBox, "warning", set_warning)
146 dialog = ClimateDataDialog(xmltodict)
147 qtbot.addWidget(dialog)
149 qtbot.mouseClick(dialog.ui.load_btn_PrecipitationDataFile, Qt.LeftButton)
150 qtbot.mouseClick(dialog.ui.btnOK, Qt.LeftButton)
152 assert is_warning
153 assert xmltodict == self.xmltodict
155 def test_insert_temperature_max(self, qtbot: QtBot):
156 """
157 TemperatureMax 정확한 데이터를 입력했을 시
158 """
159 xmltodict = copy.deepcopy(self.xmltodict)
160 dialog = ClimateDataDialog(xmltodict)
161 qtbot.addWidget(dialog)
163 # 필수 값 입력
164 qtbot.mouseClick(dialog.ui.load_btn_PrecipitationDataFile, Qt.LeftButton)
165 dialog.ui.spb_PrecipitationInterval_min.setValue(1)
167 qtbot.mouseClick(dialog.ui.load_btn_TemperatureMaxDataFile, Qt.LeftButton)
168 dialog.ui.spb_TemperatureMaxInterval_min.setValue(55)
169 dialog.ui.spb_TemperatureMaxInterval_min.setValue(13)
170 qtbot.mouseClick(dialog.ui.btnOK, Qt.LeftButton)
172 assert (
173 xmltodict["GRMProject"]["ProjectSettings"]["TemperatureMaxDataFile"]
174 == "/path/mock/file/test.txt"
175 )
176 assert (
177 xmltodict["GRMProject"]["ProjectSettings"]["TemperatureMaxInterval_min"]
178 == 13
179 )
181 def test_insert_temperature_min(self, qtbot: QtBot):
182 """
183 TemperatureMin 정확한 데이터를 입력했을 시
184 """
185 xmltodict = copy.deepcopy(self.xmltodict)
186 dialog = ClimateDataDialog(xmltodict)
187 qtbot.addWidget(dialog)
189 # 필수 값 입력
190 qtbot.mouseClick(dialog.ui.load_btn_PrecipitationDataFile, Qt.LeftButton)
191 dialog.ui.spb_PrecipitationInterval_min.setValue(1)
193 # TemperatureMin 값 입력
194 qtbot.mouseClick(dialog.ui.load_btn_TemperatureMinDataFile, Qt.LeftButton)
195 dialog.ui.spb_TemperatureMinInterval_min.setValue(55)
196 dialog.ui.spb_TemperatureMinInterval_min.setValue(65)
197 qtbot.mouseClick(dialog.ui.btnOK, Qt.LeftButton)
199 assert (
200 xmltodict["GRMProject"]["ProjectSettings"]["TemperatureMinDataFile"]
201 == "/path/mock/file/test.txt"
202 )
203 assert (
204 xmltodict["GRMProject"]["ProjectSettings"]["TemperatureMinInterval_min"]
205 == 65
206 )
208 def test_insert_daytime(self, qtbot: QtBot):
209 """
210 Daytime 정확한 데이터를 입력했을 시
211 """
213 xmltodict = copy.deepcopy(self.xmltodict)
214 dialog = ClimateDataDialog(xmltodict)
215 qtbot.addWidget(dialog)
217 # 필수 값 입력
218 qtbot.mouseClick(dialog.ui.load_btn_PrecipitationDataFile, Qt.LeftButton)
219 dialog.ui.spb_PrecipitationInterval_min.setValue(1)
221 # Daytime 값 입력
222 qtbot.mouseClick(dialog.ui.load_btn_DaytimeHoursRatioDataFile, Qt.LeftButton)
223 qtbot.mouseClick(dialog.ui.load_btn_DaytimeLengthDataFile, Qt.LeftButton)
224 dialog.ui.spb_DaytimeLengthInterval_min.setValue(55)
225 qtbot.mouseClick(dialog.ui.btnOK, Qt.LeftButton)
227 assert (
228 xmltodict["GRMProject"]["ProjectSettings"]["DaytimeHoursRatioDataFile"]
229 == "/path/mock/file/test.txt"
230 )
231 assert (
232 xmltodict["GRMProject"]["ProjectSettings"]["DaytimeLengthDataFile"]
233 == "/path/mock/file/test.txt"
234 )
235 assert xmltodict["GRMProject"]["ProjectSettings"]["DaytimeLengthInterval_min"] == 55
237 def test_insert_solar_radiation(self, qtbot: QtBot):
238 """
239 SolarRadiation 정확한 데이터를 입력했을 시
240 """
242 xmltodict = copy.deepcopy(self.xmltodict)
243 dialog = ClimateDataDialog(xmltodict)
244 qtbot.addWidget(dialog)
246 # 필수 값 입력
247 qtbot.mouseClick(dialog.ui.load_btn_PrecipitationDataFile, Qt.LeftButton)
248 dialog.ui.spb_PrecipitationInterval_min.setValue(1)
250 # SolarRadiation 값 입력
251 qtbot.mouseClick(dialog.ui.load_btn_SolarRadiationDataFile, Qt.LeftButton)
252 dialog.ui.spb_SolarRadiationInterval_min.setValue(55)
253 dialog.ui.spb_SolarRadiationInterval_min.setValue(13)
254 qtbot.mouseClick(dialog.ui.btnOK, Qt.LeftButton)
256 assert (
257 xmltodict["GRMProject"]["ProjectSettings"]["SolarRadiationDataFile"]
258 == "/path/mock/file/test.txt"
259 )
260 assert (
261 xmltodict["GRMProject"]["ProjectSettings"]["SolarRadiationInterval_min"]
262 == 13
263 )
265 def test_insert_snow_pack_temperature(self, qtbot: QtBot):
266 """
267 SnowPackTemperature 정확한 데이터를 입력했을 시
268 """
270 xmltodict = copy.deepcopy(self.xmltodict)
271 dialog = ClimateDataDialog(xmltodict)
272 qtbot.addWidget(dialog)
274 # 필수 값 입력
275 qtbot.mouseClick(dialog.ui.load_btn_PrecipitationDataFile, Qt.LeftButton)
276 dialog.ui.spb_PrecipitationInterval_min.setValue(1)
278 # SnowPackTemperature 값 입력
279 qtbot.mouseClick(dialog.ui.load_btn_SnowPackTemperatureDataFile, Qt.LeftButton)
280 dialog.ui.spb_SnowPackTemperatureInterval_min.setValue(55)
281 dialog.ui.spb_SnowPackTemperatureInterval_min.setValue(13)
282 qtbot.mouseClick(dialog.ui.btnOK, Qt.LeftButton)
284 assert (
285 xmltodict["GRMProject"]["ProjectSettings"]["SnowPackTemperatureDataFile"]
286 == "/path/mock/file/test.txt"
287 )
288 assert (
289 xmltodict["GRMProject"]["ProjectSettings"][
290 "SnowPackTemperatureInterval_min"
291 ]
292 == 13
293 )