Skip to content

Commit cda8b73

Browse files
authored
Fix bug with invalid cast while reading non-string setting variables which we override via environment (#41)
Fixed #40 bug in JsonSettingsFile with invalid cast while reading non-string setting variables which we override via environment
1 parent fad9b47 commit cda8b73

File tree

4 files changed

+48
-17
lines changed

4 files changed

+48
-17
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<modelVersion>4.0.0</modelVersion>
66
<groupId>com.github.aquality-automation</groupId>
77
<artifactId>aquality-selenium-core</artifactId>
8-
<version>0.0.2</version>
8+
<version>0.0.3</version>
99
<packaging>jar</packaging>
1010
<name>Aquality Selenium Core</name>
1111
<description>Library with core functions simplifying work with Selenium-controlled applications.</description>

src/main/java/aquality/selenium/core/utilities/JsonSettingsFile.java

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,29 @@ public Object getValue(String jsonPath) {
3333

3434
private Object getEnvValueOrDefault(String jsonPath, boolean throwIfEmpty) {
3535
String envVar = getEnvValue(jsonPath);
36-
if (envVar == null) {
37-
JsonNode node = getJsonNode(jsonPath, throwIfEmpty);
38-
if (node.isBoolean()) {
39-
return node.asBoolean();
40-
} else if (node.isLong()) {
41-
return node.asLong();
42-
} else if (node.isInt()) {
43-
return node.asInt();
44-
} else {
45-
return node.asText();
46-
}
47-
}
36+
JsonNode node = getJsonNode(jsonPath, throwIfEmpty && envVar == null);
37+
return !node.isMissingNode()
38+
? castEnvOrDefaulValue(node, envVar)
39+
: envVar;
40+
}
4841

49-
return envVar;
42+
/**
43+
* Casts envVar to type, defined from JsonNode.
44+
*
45+
* @param node node from json file
46+
* @param envVar value got from environment variable
47+
* @return Value, casted to specific type.
48+
*/
49+
private Object castEnvOrDefaulValue(JsonNode node, String envVar) {
50+
if (node.isBoolean()) {
51+
return envVar == null ? node.asBoolean() : Boolean.parseBoolean(envVar);
52+
} else if (node.isLong()) {
53+
return envVar == null ? node.asLong() : Long.parseLong(envVar);
54+
} else if (node.isInt()) {
55+
return envVar == null ? node.asInt() : Integer.parseInt(envVar);
56+
} else {
57+
return envVar == null ? node.asText() : envVar;
58+
}
5059
}
5160

5261
private String getEnvValue(String jsonPath) {
@@ -109,7 +118,7 @@ private String getFileContent(String filename) {
109118

110119
@Override
111120
public boolean isValuePresent(String path) {
112-
String value = getEnvValueOrDefault(path, false).toString().trim();
113-
return !value.isEmpty();
121+
Object value = getEnvValueOrDefault(path, false);
122+
return value != null && !value.toString().trim().isEmpty();
114123
}
115124
}

src/test/java/tests/utilities/SettingsFileTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,19 @@
1212
import tests.configurations.BaseProfileTest;
1313

1414
import java.util.*;
15+
import java.util.function.BooleanSupplier;
1516
import java.util.function.Consumer;
1617

1718
import static org.testng.Assert.*;
1819

1920
public class SettingsFileTests extends BaseProfileTest {
2021
private static final String TIMEOUT_POLLING_INTERVAL_PATH = "/timeouts/timeoutPollingInterval";
2122
private static final String NULLVALUE_PATH = "/nullValue";
23+
private static final String ABSENTVALUE_PATH = "/absentvalue";
2224
private static final String TIMEOUT_POLLING_INTERVAL_KEY = "timeouts.timeoutPollingInterval";
2325
private static final String LANGUAGE_ENV_KEY = "logger.language";
2426
private static final String ARGUMENTS_ENV_KEY = "arguments.start";
27+
private static final String BOOLEANVALUE_ENV_KEY = "booleanValue";
2528
private static final String PROFILE = "jsontest";
2629
private static final String FILE_NAME = String.format("settings.%s.json", PROFILE);
2730
private ISettingsFile jsonSettingsFile;
@@ -36,6 +39,24 @@ public void before() {
3639
jsonSettingsFile = CustomAqualityServices.getServiceProvider().getInstance(ISettingsFile.class);
3740
}
3841

42+
@Test
43+
public void testShouldBePossibleToOverrideBooleanValueViaEnvironmentVariable() {
44+
BooleanSupplier getCurrentValue = () -> (Boolean) jsonSettingsFile.getValue("/".concat(BOOLEANVALUE_ENV_KEY));
45+
boolean oldValue = getCurrentValue.getAsBoolean();
46+
boolean targetValue = !oldValue;
47+
System.setProperty(BOOLEANVALUE_ENV_KEY, String.valueOf(targetValue));
48+
assertEquals(getCurrentValue.getAsBoolean(), targetValue, "value passed via env var is not used by SettingsFile");
49+
}
50+
51+
@Test
52+
public void testShouldBePossibleToSetValueWhichIsAbsentInJsonFile() {
53+
Assert.assertFalse(jsonSettingsFile.isValuePresent(ABSENTVALUE_PATH), "value should be absent by default");
54+
String targetValue = String.valueOf(true);
55+
System.setProperty(ABSENTVALUE_PATH.substring(1), targetValue);
56+
Assert.assertTrue(jsonSettingsFile.isValuePresent(ABSENTVALUE_PATH), "value should be present after set");
57+
assertEquals(jsonSettingsFile.getValue(ABSENTVALUE_PATH), targetValue, "value passed via env var is not used by SettingsFile");
58+
}
59+
3960
@Test
4061
public void testShouldBePossibleToGetDefaultContent() {
4162
System.clearProperty(PROFILE_KEY);

src/test/resources/settings.jsontest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@
1515
"arguments": {
1616
"start": ["first","second"]
1717
},
18-
"nullValue": null
18+
"nullValue": null,
19+
"booleanValue": true
1920
}

0 commit comments

Comments
 (0)