Skip to content

Commit c6f6388

Browse files
committed
Refactor to common mockstorage in gui tests
1 parent 8fbae49 commit c6f6388

5 files changed

Lines changed: 123 additions & 175 deletions

File tree

src/ert/gui/simulation/manual_update_panel.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,10 @@ def _realizations_from_fs(self) -> None:
120120
parameters = ensemble.get_realization_mask_with_parameters()
121121
responses = ensemble.get_realization_mask_with_responses()
122122
mask = np.logical_and(parameters, responses)
123-
self._ensemble_size = list(mask).count(True)
124-
123+
self._number_of_realizations_with_responses_in_selected_ensemble = list(
124+
mask
125+
).count(True)
126+
self._ensemble_size = ensemble.ensemble_size
125127
self._active_realizations_field.setValidator(
126128
EnsembleRealizationsArgument(
127129
lambda: ensemble,
@@ -135,7 +137,7 @@ def _realizations_from_fs(self) -> None:
135137
self._active_realizations_model.ensemble_size = ensemble.ensemble_size
136138
self._active_realizations_model.setValueFromMask(mask)
137139
self._number_of_realizations_label.setText(
138-
f"<b>{self._ensemble_size}</b>"
140+
f"<b>{self._number_of_realizations_with_responses_in_selected_ensemble}</b>"
139141
)
140142
self._analysis_module_edit.ensemble_size = ensemble.ensemble_size
141143
self._analysis_module_edit.setEnabled(bool(ensemble.ensemble_size))

tests/ert/ui_tests/gui/test_restart_esmda.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def test_active_realizations_esmda(opened_main_window_poly, qtbot):
6666
simulation_mode_combo.setCurrentText(MultipleDataAssimilation.display_name())
6767
es_mda_panel = gui.findChild(QWidget, name="ES_MDA_panel")
6868
assert es_mda_panel
69-
active_reals = gui.findChild(StringBox, "active_realizations_box")
69+
active_reals = es_mda_panel.findChild(StringBox, "active_realizations_box")
7070
assert active_reals.text() == "0-9"
7171

7272
restart_checkbox = es_mda_panel.findChild(QCheckBox, name="restart_checkbox_esmda")
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from datetime import datetime
2+
from uuid import uuid4
3+
4+
from ert.storage.local_ensemble import LocalEnsemble
5+
from ert.storage.local_ensemble import _Index as _EnsembleIndex
6+
from ert.storage.local_experiment import LocalExperiment
7+
from ert.storage.local_experiment import _Index as _ExperimentIndex
8+
from ert.storage.local_storage import LocalStorage
9+
from ert.storage.realization_storage_state import RealizationStorageState
10+
11+
REALIZATION_FINISHED_SUCCESSFULLY = {
12+
RealizationStorageState.PARAMETERS_LOADED,
13+
RealizationStorageState.RESPONSES_LOADED,
14+
}
15+
REALIZATION_UNDEFINED = {RealizationStorageState.UNDEFINED}
16+
REALIZATION_ONLY_PARAMETERS = {RealizationStorageState.PARAMETERS_LOADED}
17+
REALIZATION_FAILED_DURING_EVALUATION = {
18+
RealizationStorageState.PARAMETERS_LOADED,
19+
RealizationStorageState.FAILURE_IN_CURRENT,
20+
}
21+
22+
23+
class MockEnsemble(LocalEnsemble):
24+
def __init__(self, ensemble_name, experiment_id, storage_states, storage) -> None:
25+
self._index = _EnsembleIndex(
26+
id=uuid4(),
27+
experiment_id=experiment_id,
28+
ensemble_size=len(storage_states),
29+
iteration=0,
30+
name=ensemble_name,
31+
prior_ensemble_id=None,
32+
started_at=datetime.now(),
33+
)
34+
self._storage_state = storage_states
35+
self._storage = storage
36+
37+
def get_ensemble_state(self):
38+
return self._storage_state
39+
40+
41+
class MockExperiment(LocalExperiment):
42+
def __init__(self, experiment_name) -> None:
43+
self._index = _ExperimentIndex(id=uuid4(), name=experiment_name)
44+
45+
@property
46+
def relative_weights(self) -> str:
47+
return "4, 2, 1"
48+
49+
50+
class MockStorage(LocalStorage):
51+
def __init__(self) -> None:
52+
self._ensembles = {}
53+
self._experiments = {}
54+
55+
def _setup_mocked_run(
56+
self, ensemble_name, experiment_name, ensemble_states
57+
) -> None:
58+
mock_experiment = MockExperiment(experiment_name)
59+
mock_ensemble2 = MockEnsemble(
60+
ensemble_name,
61+
experiment_id=mock_experiment.id,
62+
storage_states=ensemble_states,
63+
storage=self,
64+
)
65+
self._ensembles[mock_ensemble2.id] = mock_ensemble2
66+
self._experiments[mock_experiment.id] = mock_experiment

tests/ert/unit_tests/gui/simulation/test_manual_update.py

Lines changed: 29 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
import datetime
2-
from unittest.mock import MagicMock
3-
from uuid import uuid4
4-
5-
import numpy as np
6-
import pytest
71
from PyQt6.QtCore import Qt
82
from pytestqt.qtbot import QtBot
93

@@ -12,87 +6,14 @@
126
from ert.gui.ertwidgets.ensembleselector import EnsembleSelector
137
from ert.gui.ertwidgets.stringbox import StringBox
148
from ert.gui.simulation.manual_update_panel import ManualUpdatePanel
15-
from ert.storage.local_ensemble import LocalEnsemble
16-
from ert.storage.local_experiment import LocalExperiment
17-
from ert.storage.local_storage import LocalStorage
18-
from ert.storage.realization_storage_state import RealizationStorageState
19-
20-
realization_finished_successfully = {
21-
RealizationStorageState.PARAMETERS_LOADED,
22-
RealizationStorageState.RESPONSES_LOADED,
23-
}
24-
realization_failed = {RealizationStorageState.UNDEFINED}
25-
26-
27-
class MockStorage(LocalStorage):
28-
def __init__(self) -> None:
29-
self._ensembles = {}
30-
self._experiments = {}
31-
32-
def _setup_mocked_run(
33-
self, ensemble_name, experiment_name, ensemble_states
34-
) -> None:
35-
mock_ensemble = MagicMock(spec=LocalEnsemble)
36-
mock_ensemble.id = uuid4()
37-
mock_ensemble.name = ensemble_name
38-
mock_ensemble.relative_weights = "4, 2, 1"
39-
mock_ensemble.started_at = datetime.datetime.now()
40-
41-
def mock_get_ensemble_state(*args, **kwargs):
42-
return ensemble_states
43-
44-
mock_ensemble.ensemble_size = len(mock_get_ensemble_state())
45-
mock_ensemble.get_ensemble_state = mock_get_ensemble_state
46-
47-
def mock_get_realization_mask_with_responses(*args):
48-
return np.array(
49-
[
50-
RealizationStorageState.RESPONSES_LOADED in state
51-
for state in mock_ensemble.get_ensemble_state()
52-
]
53-
)
54-
55-
def mock_get_realization_mask_with_parameters(*args):
56-
return np.array(
57-
[
58-
RealizationStorageState.PARAMETERS_LOADED in state
59-
for state in mock_ensemble.get_ensemble_state()
60-
]
61-
)
62-
63-
mock_ensemble.get_realization_mask_with_responses = (
64-
mock_get_realization_mask_with_responses
65-
)
66-
mock_ensemble.get_realization_mask_with_parameters = (
67-
mock_get_realization_mask_with_parameters
68-
)
699

70-
def mock_get_realization_list_with_responses(self) -> list[int]:
71-
mask = self.get_realization_mask_with_responses()
72-
return np.where(mask)[0].tolist()
10+
from .conftest import (
11+
REALIZATION_FINISHED_SUCCESSFULLY,
12+
REALIZATION_UNDEFINED,
13+
MockStorage,
14+
)
7315

74-
mock_ensemble.has_data = (
75-
lambda *args: len(mock_ensemble.get_realization_list_with_responses()) > 0
76-
)
77-
mock_ensemble.get_realization_list_with_responses = (
78-
lambda *args: mock_get_realization_list_with_responses(mock_ensemble)
79-
)
80-
mock_experiment = MagicMock(spec=LocalExperiment)
81-
mock_experiment.ensembles = [mock_ensemble]
82-
mock_experiment.id = uuid4()
83-
mock_experiment.name = experiment_name
8416

85-
mock_ensemble.experiment_id = mock_experiment.id
86-
mock_ensemble.experiment = mock_experiment
87-
self._ensembles[mock_ensemble.id] = mock_ensemble
88-
self._experiments[mock_experiment.id] = mock_experiment
89-
90-
@property
91-
def ensembles(self):
92-
yield from self._ensembles.values()
93-
94-
95-
@pytest.mark.usefixtures("copy_poly_case")
9617
def test_that_active_realizations_selector_validates_with_ensemble_size_from_prior(
9718
qtbot: QtBot,
9819
) -> None:
@@ -107,26 +28,26 @@ def test_that_active_realizations_selector_validates_with_ensemble_size_from_pri
10728
"mock_ensemble0",
10829
"mock_experiment0",
10930
[
110-
realization_failed,
111-
realization_finished_successfully,
112-
realization_finished_successfully,
113-
realization_finished_successfully,
114-
realization_failed,
115-
realization_finished_successfully,
116-
realization_finished_successfully,
117-
realization_finished_successfully,
31+
REALIZATION_UNDEFINED,
32+
REALIZATION_FINISHED_SUCCESSFULLY,
33+
REALIZATION_FINISHED_SUCCESSFULLY,
34+
REALIZATION_FINISHED_SUCCESSFULLY,
35+
REALIZATION_UNDEFINED,
36+
REALIZATION_FINISHED_SUCCESSFULLY,
37+
REALIZATION_FINISHED_SUCCESSFULLY,
38+
REALIZATION_FINISHED_SUCCESSFULLY,
11839
],
11940
)
12041
notifier._storage._setup_mocked_run(
12142
"mock_ensemble1",
12243
"mock_experiment1",
12344
[
124-
realization_failed,
125-
realization_failed,
126-
realization_finished_successfully,
127-
realization_finished_successfully,
128-
realization_failed,
129-
realization_finished_successfully,
45+
REALIZATION_UNDEFINED,
46+
REALIZATION_UNDEFINED,
47+
REALIZATION_FINISHED_SUCCESSFULLY,
48+
REALIZATION_FINISHED_SUCCESSFULLY,
49+
REALIZATION_UNDEFINED,
50+
REALIZATION_FINISHED_SUCCESSFULLY,
13051
],
13152
)
13253
panel = ManualUpdatePanel(
@@ -138,8 +59,10 @@ def test_that_active_realizations_selector_validates_with_ensemble_size_from_pri
13859
qtbot.addWidget(panel)
13960

14061
prior_ensemble0_number_of_realizations_with_responses = 6
141-
prior_ensemble1_number_of_realizations_with_responses = 3
62+
prior_ensemble0_ensemble_size = 8
14263

64+
prior_ensemble1_number_of_realizations_with_responses = 3
65+
prior_ensemble1_ensemble_size = 6
14366
realization_selector = panel.findChild(StringBox, "active_realizations_box")
14467
assert realization_selector is not None
14568
ensemble_selector = panel.findChild(EnsembleSelector)
@@ -159,6 +82,9 @@ def test_that_active_realizations_selector_validates_with_ensemble_size_from_pri
15982
realization_selector._validation._validation_message
16083
)
16184
assert panel.isConfigurationValid()
85+
assert (
86+
panel.get_experiment_arguments().ensemble_size == prior_ensemble0_ensemble_size
87+
)
16288

16389
# We try running a realization that does not have RESPONSES_LOADED
16490
realization_selector.setText("4-7")
@@ -169,14 +95,16 @@ def test_that_active_realizations_selector_validates_with_ensemble_size_from_pri
16995

17096
# The active realizations field should auto-populate with a valid value
17197
assert panel.isConfigurationValid()
98+
assert (
99+
panel.get_experiment_arguments().ensemble_size == prior_ensemble1_ensemble_size
100+
)
172101
assert (
173102
panel._number_of_realizations_label.text()
174103
== f"<b>{prior_ensemble1_number_of_realizations_with_responses}</b>"
175104
)
176105
assert realization_selector.text() == "2-3, 5"
177106

178107

179-
@pytest.mark.usefixtures("copy_poly_case")
180108
def test_that_manual_update_ensemble_selector_only_shows_ensembles_with_data(
181109
qtbot: QtBot,
182110
) -> None:
@@ -190,7 +118,7 @@ def test_that_manual_update_ensemble_selector_only_shows_ensembles_with_data(
190118
notifier._storage._setup_mocked_run(
191119
"mock_ensemble_no_data",
192120
"mock_experiment2",
193-
[realization_failed, realization_failed, realization_failed],
121+
[REALIZATION_UNDEFINED, REALIZATION_UNDEFINED, REALIZATION_UNDEFINED],
194122
)
195123

196124
panel = ManualUpdatePanel(

0 commit comments

Comments
 (0)