Skip to content

Commit 301a12b

Browse files
WeltraumschafZero3141
authored andcommitted
#36 Implement validation for config env vars
Signed-off-by: Sven Strittmatter <sven.strittmatter@iteratec.com>
1 parent e24d259 commit 301a12b

File tree

3 files changed

+108
-14
lines changed

3 files changed

+108
-14
lines changed

src/main/java/io/securecodebox/persistence/defectdojo/config/Config.java

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package io.securecodebox.persistence.defectdojo.config;
66

7+
import io.securecodebox.persistence.defectdojo.exception.ConfigException;
78
import lombok.*;
89

910
import java.util.Optional;
@@ -18,7 +19,7 @@ public final class Config {
1819
/**
1920
* Default for {@link #maxPageCountForGets}
2021
*/
21-
private static final int DEFAULT_MAX_PAGE_COUNT_FOR_GETS = 100;
22+
static final int DEFAULT_MAX_PAGE_COUNT_FOR_GETS = 100;
2223
/**
2324
* URL of the host which serves the DefectDojo API.
2425
* <p>
@@ -116,23 +117,53 @@ public Config(final String url, final String apiKey, final String username, fina
116117
* @return never {@code null}
117118
*/
118119
public static Config fromEnv() {
119-
final var url = System.getenv(EnvVars.DEFECTDOJO_URL.literal);
120-
final var username = System.getenv(EnvVars.DEFECTDOJO_USERNAME.literal);
121-
final var apiKey = System.getenv(EnvVars.DEFECTDOJO_APIKEY.literal);
122-
final var userId = Optional.ofNullable(System.getenv(EnvVars.DEFECTDOJO_USER_ID.literal))
123-
.map(Long::parseLong).orElse(null);
120+
final var url = findRequiredEnvVar(EnvVars.DEFECTDOJO_URL);
121+
final var username = findRequiredEnvVar(EnvVars.DEFECTDOJO_USERNAME);
122+
final var apiKey = findRequiredEnvVar(EnvVars.DEFECTDOJO_APIKEY);
123+
final Long userId;
124+
125+
try {
126+
userId = Optional.ofNullable(findEnvVar(EnvVars.DEFECTDOJO_USER_ID))
127+
.map(Long::parseLong).orElse(null);
128+
} catch (final NumberFormatException e) {
129+
throw new ConfigException(
130+
String.format("Given user id for environment variable '%s' is not a valid id! Given was '%s'.", EnvVars.DEFECTDOJO_USER_ID.literal, findEnvVar(EnvVars.DEFECTDOJO_USER_ID)),
131+
e);
132+
}
124133

125134
final int maxPageCountForGets;
126135

127-
if (System.getenv(EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS.literal) != null) {
128-
maxPageCountForGets = Integer.parseInt(System.getenv(EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS.literal));
136+
if (hasEnvVar(EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS)) {
137+
try {
138+
maxPageCountForGets = Integer.parseInt(findEnvVar(EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS));
139+
} catch (final NumberFormatException e) {
140+
throw new ConfigException(String.format("Given value for environment variable '%s' is not a valid number! Given was '%s'.", EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS.literal, findEnvVar(EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS)),
141+
e);
142+
}
129143
} else {
130144
maxPageCountForGets = DEFAULT_MAX_PAGE_COUNT_FOR_GETS;
131145
}
132146

133147
return new Config(url, apiKey, username, maxPageCountForGets, userId);
134148
}
135149

150+
private static boolean hasEnvVar(final @NonNull EnvVars name) {
151+
return findEnvVar(name) != null;
152+
}
153+
154+
private static String findEnvVar(final @NonNull EnvVars name) {
155+
return System.getenv(name.literal);
156+
}
157+
158+
private static String findRequiredEnvVar(final @NonNull EnvVars name) {
159+
final var envVar = System.getenv(name.literal);
160+
161+
if (envVar == null) {
162+
throw new ConfigException(String.format("Missing environment variable '%s'!", name.literal));
163+
}
164+
return envVar;
165+
}
166+
136167
/**
137168
* Enumerates the available environment variables to configure the client
138169
*/
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright 2021 iteratec GmbH
2+
// SPDX-FileCopyrightText: 2023 iteratec GmbH
3+
//
4+
// SPDX-License-Identifier: Apache-2.0
5+
6+
package io.securecodebox.persistence.defectdojo.exception;
7+
8+
/**
9+
* Indicates a missing {@link io.securecodebox.persistence.defectdojo.config.Config config property}
10+
*/
11+
public final class ConfigException extends RuntimeException {
12+
public ConfigException(final String message) {
13+
super(message);
14+
}
15+
public ConfigException(final String message, final Throwable cause) {
16+
super(message, cause);
17+
}
18+
}

src/test/java/io/securecodebox/persistence/defectdojo/config/ConfigTest.java

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package io.securecodebox.persistence.defectdojo.config;
66

7+
import io.securecodebox.persistence.defectdojo.exception.ConfigException;
78
import org.junit.jupiter.api.Disabled;
89
import org.junit.jupiter.api.Test;
910
import org.junit.jupiter.api.extension.ExtendWith;
@@ -83,27 +84,71 @@ void fromEnv() {
8384
}
8485

8586
@Test
86-
@Disabled("Not implemented yet!")
8787
void fromEnv_throwsExceptionIfNoUrlSet() {
88+
environmentVariables.set("DEFECTDOJO_USERNAME", "username")
89+
.set("DEFECTDOJO_APIKEY", "apikey")
90+
.set("DEFECTDOJO_USER_ID", "42");
91+
92+
final var thrown = assertThrows(ConfigException.class, Config::fromEnv);
93+
94+
assertThat(thrown.getMessage(), is("Missing environment variable 'DEFECTDOJO_URL'!"));
8895
}
8996

9097
@Test
91-
@Disabled("Not implemented yet!")
9298
void fromEnv_throwsExceptionIfNoUserNameSet() {
99+
environmentVariables.set("DEFECTDOJO_URL", "url")
100+
.set("DEFECTDOJO_APIKEY", "apikey")
101+
.set("DEFECTDOJO_USER_ID", "42");
102+
103+
final var thrown = assertThrows(ConfigException.class, Config::fromEnv);
104+
105+
assertThat(thrown.getMessage(), is("Missing environment variable 'DEFECTDOJO_USERNAME'!"));
93106
}
94107

95108
@Test
96-
@Disabled("Not implemented yet!")
97109
void fromEnv_throwsExceptionIfNoApiKeySet() {
110+
environmentVariables.set("DEFECTDOJO_URL", "url")
111+
.set("DEFECTDOJO_USERNAME", "username")
112+
.set("DEFECTDOJO_USER_ID", "42");
113+
114+
final var thrown = assertThrows(ConfigException.class, Config::fromEnv);
115+
116+
assertThat(thrown.getMessage(), is("Missing environment variable 'DEFECTDOJO_APIKEY'!"));
98117
}
99118

100119
@Test
101-
@Disabled("Not implemented yet!")
102-
void fromEnv_throwsExceptionIfNoUserIdSet() {
120+
void fromEnv_throwsExceptionIfUserIdIsNotParsableToLong() {
121+
environmentVariables.set("DEFECTDOJO_URL", "url")
122+
.set("DEFECTDOJO_USERNAME", "username")
123+
.set("DEFECTDOJO_APIKEY", "apikey")
124+
.set("DEFECTDOJO_USER_ID", "foo");
125+
126+
final var thrown = assertThrows(ConfigException.class, Config::fromEnv);
127+
128+
assertThat(thrown.getMessage(), is("Given user id for environment variable 'DEFECTDOJO_USER_ID' is not a valid id! Given was 'foo'."));
103129
}
104130

105131
@Test
106-
@Disabled("Not implemented yet!")
107132
void fromEnv_usesDefaultIfNoMaxPageCountForGetSet() {
133+
environmentVariables.set("DEFECTDOJO_URL", "url")
134+
.set("DEFECTDOJO_USERNAME", "username")
135+
.set("DEFECTDOJO_APIKEY", "apikey")
136+
.set("DEFECTDOJO_USER_ID", "42");
137+
138+
final var sut = Config.fromEnv();
139+
assertThat(sut.getMaxPageCountForGets(), is(Config.DEFAULT_MAX_PAGE_COUNT_FOR_GETS));
140+
}
141+
142+
@Test
143+
void fromEnv_throwsExceptionIfMaxPageCountForGetIsNotParseableToInteger() {
144+
environmentVariables.set("DEFECTDOJO_URL", "url")
145+
.set("DEFECTDOJO_USERNAME", "username")
146+
.set("DEFECTDOJO_APIKEY", "apikey")
147+
.set("DEFECTDOJO_USER_ID", "42")
148+
.set("DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS", "foo");
149+
150+
final var thrown = assertThrows(ConfigException.class, Config::fromEnv);
151+
152+
assertThat(thrown.getMessage(), is("Given value for environment variable 'DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS' is not a valid number! Given was 'foo'."));
108153
}
109154
}

0 commit comments

Comments
 (0)