Skip to content

Commit 92fb08e

Browse files
committed
Check opis on GHA
1 parent 3e3b46a commit 92fb08e

File tree

6 files changed

+232
-90
lines changed

6 files changed

+232
-90
lines changed

.github/dependabot.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "github-actions"
4+
directory: "/"
5+
schedule:
6+
interval: "daily"

.github/workflows/lint.yml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,56 @@
11
name: lint
22
on: [pull_request]
33
jobs:
4+
check-opi-format:
5+
runs-on: "windows-latest"
6+
steps:
7+
- uses: actions/checkout@v4
8+
- uses: actions/setup-python@v5
9+
with:
10+
python-version: '3.11'
11+
- name: OPI checker dependencies
12+
run: python -m pip install -r base/uk.ac.stfc.isis.ibex.opis/requirements.txt
13+
- name: Run OPI checker
14+
run: python base/uk.ac.stfc.isis.ibex.opis/check_opi_format.py -strict -directory base/uk.ac.stfc.isis.ibex.opis
15+
- name: Validate OPIs
16+
run: python base/uk.ac.stfc.isis.ibex.opis/validate_opis.py
17+
18+
check-build:
19+
runs-on: "ubuntu-latest"
20+
steps:
21+
- uses: actions/checkout@v4
22+
- uses: actions/setup-python@v5
23+
with:
24+
python-version: '3.11'
25+
- name: Run check_build
26+
working-directory: ./build
27+
run: python check_build.py ../base
28+
29+
scriptgenerator-tests:
30+
runs-on: "ubuntu-latest"
31+
steps:
32+
- uses: actions/checkout@v4
33+
- uses: actions/setup-python@v5
34+
with:
35+
python-version: '3.11'
36+
- name: Install dependencies
37+
run: python -m pip install -r ./base/uk.ac.stfc.isis.ibex.scriptgenerator/python_support/requirements.txt
38+
- name: Run scriptgenerator tests
39+
working-directory: ./base/uk.ac.stfc.isis.ibex.scriptgenerator/python_support
40+
run: python -m unittest discover
41+
42+
checkstyle:
43+
runs-on: "ubuntu-latest"
44+
steps:
45+
- uses: actions/checkout@v4
46+
- uses: actions/setup-java@v4
47+
with:
48+
distribution: 'temurin'
49+
java-version: '21'
50+
- name: checkstyle
51+
working-directory: ./base/uk.ac.stfc.isis.ibex.client.tycho.parent
52+
run: mvn checkstyle:check
53+
454
code-ql:
555
strategy:
656
matrix:
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
lxml
2+
pyhamcrest
3+
pywin32
4+
xmlrunner
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
genie
2+
gitpython
3+
py4j
4+
pyhamcrest
Lines changed: 104 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,94 @@
11
import unittest
2-
from mock import MagicMock
3-
from script_definition_loader import Generator, ScriptDefinitionWrapper
4-
from typing import Dict, AnyStr, List
2+
from typing import AnyStr, Dict, List
3+
from unittest.mock import MagicMock
4+
55
from hamcrest.core import assert_that, equal_to
6-
from hamcrest.library.text import matches_regexp
6+
from script_definition_loader import Generator, ScriptDefinitionWrapper
77
from test_script_definitions.valid_script_definition import DoRun as ValidDoRun
8-
from pprint import pprint
9-
import pathlib
108

119

1210
class TestGenerator(unittest.TestCase):
13-
14-
def _get_estimates_for_single_action(self, scriptDefinition):
15-
wrapper = ScriptDefinitionWrapper("test", scriptDefinition)
16-
estimates: Dict[int, int] = self.generator.estimateTime([
17-
{"param1": "param1Val", "param2": "param2Val"}
18-
], wrapper, {})
11+
def _get_estimates_for_single_action(self, script_definition):
12+
wrapper = ScriptDefinitionWrapper("test", script_definition)
13+
estimates: Dict[int, int] = self.generator.estimateTime(
14+
[{"param1": "param1Val", "param2": "param2Val"}], wrapper, {}
15+
)
1916
return estimates
2017

2118
def setUp(self):
2219
self.generator: Generator = Generator(repo_path="test_script_definitions")
2320

2421
def test_GIVEN_script_definitions_return_invalid_WHEN_get_generator_invalidity_reasons_THEN_context_as_expected(
25-
self):
22+
self,
23+
):
2624
# Arrange
2725
mock_script_definition: ScriptDefinitionWrapper = MagicMock()
2826
mock_script_definition.parametersValid.return_value = "invalid reason"
29-
validityCheck: List[Dict[int, AnyStr]] = self.generator.getValidityErrors({}, [
30-
{"param1": "param1Val", "param2": "param2Val"},
31-
{"param1": "param1Val", "param2": "param2Val"}
32-
], mock_script_definition)
27+
validity_check: List[Dict[int, AnyStr]] = self.generator.getValidityErrors(
28+
{},
29+
[
30+
{"param1": "param1Val", "param2": "param2Val"},
31+
{"param1": "param1Val", "param2": "param2Val"},
32+
],
33+
mock_script_definition,
34+
)
3335
# Act and Assert
34-
assert_that(validityCheck, equal_to([{}, {0: "invalid reason", 1: "invalid reason"}]),
35-
"2 actions, both invalid with reason")
36+
assert_that(
37+
validity_check,
38+
equal_to([{}, {0: "invalid reason", 1: "invalid reason"}]),
39+
"2 actions, both invalid with reason",
40+
)
3641

3742
def test_GIVEN_script_definitions_return_invalid_WHEN_get_generator_invalidity_reasons_with_global_THEN_context_as_expected(
38-
self):
43+
self,
44+
):
3945
# Arrange
4046
mock_script_definition: ScriptDefinitionWrapper = MagicMock()
4147
mock_script_definition.parametersValid.return_value = "invalid reason"
4248
mock_script_definition.globalParamsValid.return_value = "invalid reason"
43-
validityCheck: List[Dict[int, AnyStr]] = self.generator.getValidityErrors({"global1": "global1Val"}, [
44-
{"param1": "param1Val", "param2": "param2Val"},
45-
{"param1": "param1Val", "param2": "param2Val"}
46-
], mock_script_definition)
49+
validity_check: List[Dict[int, AnyStr]] = self.generator.getValidityErrors(
50+
{"global1": "global1Val"},
51+
[
52+
{"param1": "param1Val", "param2": "param2Val"},
53+
{"param1": "param1Val", "param2": "param2Val"},
54+
],
55+
mock_script_definition,
56+
)
4757
# Act and Assert
48-
assert_that(validityCheck, equal_to([{0: 'invalid reason'}, {0: "invalid reason", 1: "invalid reason"}]),
49-
"1 global, 2 actions, all invalid with reason")
50-
51-
def test_GIVEN_script_definition_return_valid_WHEN_get_generator_invalidity_reasons_THEN_no_content(self):
58+
assert_that(
59+
validity_check,
60+
equal_to([{0: "invalid reason"}, {0: "invalid reason", 1: "invalid reason"}]),
61+
"1 global, 2 actions, all invalid with reason",
62+
)
63+
64+
def test_GIVEN_script_definition_return_valid_WHEN_get_generator_invalidity_reasons_THEN_no_content(
65+
self,
66+
):
5267
# Arrange
5368
mock_script_definition: ScriptDefinitionWrapper = MagicMock()
5469
mock_script_definition.parametersValid.return_value = None
55-
validityCheck: List[Dict[int, AnyStr]] = self.generator.getValidityErrors({}, [
56-
{"param1": "param1Val", "param2": "param2Val"},
57-
{"param1": "param1Val", "param2": "param2Val"}
58-
], mock_script_definition)
70+
validity_check: List[Dict[int, AnyStr]] = self.generator.getValidityErrors(
71+
{},
72+
[
73+
{"param1": "param1Val", "param2": "param2Val"},
74+
{"param1": "param1Val", "param2": "param2Val"},
75+
],
76+
mock_script_definition,
77+
)
5978
# Act and Assert
60-
assert_that(validityCheck, equal_to([{}, {}]), "2 actions, both valid")
79+
assert_that(validity_check, equal_to([{}, {}]), "2 actions, both valid")
6180

62-
def test_GIVEN_script_definition_return_valid_WHEN_get_generator_global_invalidity_reasons_THEN_no_content(self):
81+
def test_GIVEN_script_definition_return_valid_WHEN_get_generator_global_invalidity_reasons_THEN_no_content(
82+
self,
83+
):
6384
# Arrange
6485
mock_script_definition: ScriptDefinitionWrapper = MagicMock()
6586
mock_script_definition.globalParamsValid.return_value = None
66-
validityCheck: List[Dict[int, AnyStr]] = self.generator.getValidityErrors(
67-
{"param1": "param1Val", "param2": "param2Val"}, [],
68-
mock_script_definition)
87+
validity_check: List[Dict[int, AnyStr]] = self.generator.getValidityErrors(
88+
{"param1": "param1Val", "param2": "param2Val"}, [], mock_script_definition
89+
)
6990
# Act and Assert
70-
assert_that(validityCheck, equal_to([{}, {}]), "2 globals, both valid")
91+
assert_that(validity_check, equal_to([{}, {}]), "2 globals, both valid")
7192

7293
# Allows us to return whether invalid or not based on passed vals
7394
def params_valid_side_effect(self, params, global_params) -> AnyStr:
@@ -77,39 +98,46 @@ def params_valid_side_effect(self, params, global_params) -> AnyStr:
7798
return "invalid"
7899

79100
def test_GIVEN_script_definition_return_valid_and_invalid_WHEN_get_generator_invalidity_reasons_THEN_content_as_expected(
80-
self):
101+
self,
102+
):
81103
# Arrange
82104
mock_script_definition: ScriptDefinitionWrapper = MagicMock()
83105
mock_script_definition.parametersValid.side_effect = self.params_valid_side_effect
84-
validityCheck: List[Dict[int, AnyStr]] = self.generator.getValidityErrors({}, [
85-
{"param1": "param1Val"}, {"param2": "param2Val"}
86-
], mock_script_definition)
106+
validity_check: List[Dict[int, AnyStr]] = self.generator.getValidityErrors(
107+
{}, [{"param1": "param1Val"}, {"param2": "param2Val"}], mock_script_definition
108+
)
87109
# Act and Assert
88-
assert_that(validityCheck, equal_to([{}, {1: "invalid"}]), "2 actions, one invalid with reason")
110+
assert_that(
111+
validity_check, equal_to([{}, {1: "invalid"}]), "2 actions, one invalid with reason"
112+
)
89113

90114
def test_GIVEN_valid_parameters_and_int_estimate_WHEN_estimate_time_THEN_return_estimate(self):
91115
# Arrange
92-
mock_script_definition: ScriptDefinition = MagicMock()
116+
mock_script_definition = MagicMock()
93117
mock_script_definition.parameters_valid.return_value = None
94118
mock_script_definition.estimate_time.return_value = 2
95119
estimates = self._get_estimates_for_single_action(mock_script_definition)
96120

97121
# Act and Assert
98122
assert_that(estimates, equal_to({0: 2}))
99123

100-
def test_GIVEN_valid_parameters_and_float_estimate_WHEN_estimate_time_THEN_round_estimate_and_return_it(self):
124+
def test_GIVEN_valid_parameters_and_float_estimate_WHEN_estimate_time_THEN_round_estimate_and_return_it(
125+
self,
126+
):
101127
# Arrange
102-
mock_script_definition: ScriptDefinition = MagicMock()
128+
mock_script_definition = MagicMock()
103129
mock_script_definition.parameters_valid.return_value = None
104130
mock_script_definition.estimate_time.return_value = 2.0
105131
estimates = self._get_estimates_for_single_action(mock_script_definition)
106132

107133
# Act and Assert
108134
assert_that(estimates, equal_to({0: 2}))
109135

110-
def test_GIVEN_valid_parameters_and_string_estimate_WHEN_estimate_time_THEN_return_empty_dict(self):
136+
def test_GIVEN_valid_parameters_and_string_estimate_WHEN_estimate_time_THEN_return_empty_dict(
137+
self,
138+
):
111139
# Arrange
112-
mock_script_definition: ScriptDefinition = MagicMock()
140+
mock_script_definition = MagicMock()
113141
mock_script_definition.parameters_valid.return_value = None
114142
mock_script_definition.estimate_time.return_value = "wrong type"
115143
estimates = self._get_estimates_for_single_action(mock_script_definition)
@@ -119,17 +147,19 @@ def test_GIVEN_valid_parameters_and_string_estimate_WHEN_estimate_time_THEN_retu
119147

120148
def test_GIVEN_valid_parameters_and_no_estimate_WHEN_estimate_time_THEN_return_empty_dict(self):
121149
# Arrange
122-
mock_script_definition: ScriptDefinition = MagicMock()
150+
mock_script_definition = MagicMock()
123151
mock_script_definition.parameters_valid.return_value = None
124152
mock_script_definition.estimate_time.return_value = None
125153
estimates = self._get_estimates_for_single_action(mock_script_definition)
126154

127155
# Act and Assert
128156
assert_that(estimates, equal_to({}))
129157

130-
def test_GIVEN_invalid_parameters_and_int_estimate_WHEN_estimate_time_THEN_return_empty_dict(self):
158+
def test_GIVEN_invalid_parameters_and_int_estimate_WHEN_estimate_time_THEN_return_empty_dict(
159+
self,
160+
):
131161
# Arrange
132-
mock_script_definition: ScriptDefinition = MagicMock()
162+
mock_script_definition = MagicMock()
133163
mock_script_definition.parameters_valid.return_value = "some error"
134164
mock_script_definition.estimate_time.return_value = 2
135165
estimates = self._get_estimates_for_single_action(mock_script_definition)
@@ -139,8 +169,7 @@ def test_GIVEN_invalid_parameters_and_int_estimate_WHEN_estimate_time_THEN_retur
139169

140170
def test_GIVEN_valid_script_definition_WHEN_generate_THEN_new_script_is_as_expected(self):
141171
# Arrange
142-
expected_script_lines: List[AnyStr] = \
143-
"""# pylint: skip-file
172+
expected_script_lines: List[AnyStr] = """# pylint: skip-file
144173
145174
from genie_python import genie as g
146175
@@ -187,27 +216,39 @@ def runscript():
187216
188217
value = b'789c030000000001'""".split("\n")
189218
params = [{"param1": "1", "param2": "2"}, {"param1": "1", "param2": "2"}]
190-
script_definition: ScriptDefinitionWrapper = ScriptDefinitionWrapper(name="valid_script_definition",
191-
script_definition=ValidDoRun())
219+
script_definition: ScriptDefinitionWrapper = ScriptDefinitionWrapper(
220+
name="valid_script_definition", script_definition=ValidDoRun()
221+
)
192222
# Act
193223
generated_script: str = self.generator.generate(params, "", {}, script_definition)
194224
# Assert
195-
self.assertIsNotNone(generated_script, "ScriptDefinitionWrapper is valid, so should not return None")
225+
self.assertIsNotNone(
226+
generated_script, "ScriptDefinitionWrapper is valid, so should not return None"
227+
)
196228

197229
generated_lines = generated_script.split("\n")
198-
assert_that(len(generated_lines), equal_to(len(expected_script_lines)),
199-
"Should have the same amount of lines if they match")
230+
assert_that(
231+
len(generated_lines),
232+
equal_to(len(expected_script_lines)),
233+
"Should have the same amount of lines if they match",
234+
)
200235

201236
for i in range(len(generated_lines)):
202-
assert_that(generated_lines[i], equal_to(expected_script_lines[i]),
203-
"Each line of the generated script should match the expected line")
237+
assert_that(
238+
generated_lines[i],
239+
equal_to(expected_script_lines[i]),
240+
"Each line of the generated script should match the expected line",
241+
)
204242

205243
def test_GIVEN_invalid_script_definition_params_WHEN_generate_THEN_return_none(self):
206244
# Arrange
207245
params = [{"param1": "invalid", "param2": "2"}, {"param1": "1", "param2": "2"}]
208-
script_definition: ScriptDefinitionWrapper = ScriptDefinitionWrapper(name="valid_script_definition",
209-
script_definition=ValidDoRun())
246+
script_definition: ScriptDefinitionWrapper = ScriptDefinitionWrapper(
247+
name="valid_script_definition", script_definition=ValidDoRun()
248+
)
210249
# Act
211250
generated_script: str = self.generator.generate(params, "", {}, script_definition)
212251
# Assert
213-
self.assertIsNone(generated_script, "ScriptDefinitionWrapper is invalid, so should return None")
252+
self.assertIsNone(
253+
generated_script, "ScriptDefinitionWrapper is invalid, so should return None"
254+
)

0 commit comments

Comments
 (0)