Skip to content

Commit

Permalink
#36 Implement validation for config env vars
Browse files Browse the repository at this point in the history
Signed-off-by: Sven Strittmatter <[email protected]>
  • Loading branch information
Weltraumschaf authored and Zero3141 committed Jul 21, 2023
1 parent e24d259 commit 301a12b
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

package io.securecodebox.persistence.defectdojo.config;

import io.securecodebox.persistence.defectdojo.exception.ConfigException;
import lombok.*;

import java.util.Optional;
Expand All @@ -18,7 +19,7 @@ public final class Config {
/**
* Default for {@link #maxPageCountForGets}
*/
private static final int DEFAULT_MAX_PAGE_COUNT_FOR_GETS = 100;
static final int DEFAULT_MAX_PAGE_COUNT_FOR_GETS = 100;
/**
* URL of the host which serves the DefectDojo API.
* <p>
Expand Down Expand Up @@ -116,23 +117,53 @@ public Config(final String url, final String apiKey, final String username, fina
* @return never {@code null}
*/
public static Config fromEnv() {
final var url = System.getenv(EnvVars.DEFECTDOJO_URL.literal);
final var username = System.getenv(EnvVars.DEFECTDOJO_USERNAME.literal);
final var apiKey = System.getenv(EnvVars.DEFECTDOJO_APIKEY.literal);
final var userId = Optional.ofNullable(System.getenv(EnvVars.DEFECTDOJO_USER_ID.literal))
.map(Long::parseLong).orElse(null);
final var url = findRequiredEnvVar(EnvVars.DEFECTDOJO_URL);
final var username = findRequiredEnvVar(EnvVars.DEFECTDOJO_USERNAME);
final var apiKey = findRequiredEnvVar(EnvVars.DEFECTDOJO_APIKEY);
final Long userId;

try {
userId = Optional.ofNullable(findEnvVar(EnvVars.DEFECTDOJO_USER_ID))
.map(Long::parseLong).orElse(null);
} catch (final NumberFormatException e) {
throw new ConfigException(
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)),
e);
}

final int maxPageCountForGets;

if (System.getenv(EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS.literal) != null) {
maxPageCountForGets = Integer.parseInt(System.getenv(EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS.literal));
if (hasEnvVar(EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS)) {
try {
maxPageCountForGets = Integer.parseInt(findEnvVar(EnvVars.DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS));
} catch (final NumberFormatException e) {
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)),
e);
}
} else {
maxPageCountForGets = DEFAULT_MAX_PAGE_COUNT_FOR_GETS;
}

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

private static boolean hasEnvVar(final @NonNull EnvVars name) {
return findEnvVar(name) != null;
}

private static String findEnvVar(final @NonNull EnvVars name) {
return System.getenv(name.literal);
}

private static String findRequiredEnvVar(final @NonNull EnvVars name) {
final var envVar = System.getenv(name.literal);

if (envVar == null) {
throw new ConfigException(String.format("Missing environment variable '%s'!", name.literal));
}
return envVar;
}

/**
* Enumerates the available environment variables to configure the client
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright 2021 iteratec GmbH
// SPDX-FileCopyrightText: 2023 iteratec GmbH
//
// SPDX-License-Identifier: Apache-2.0

package io.securecodebox.persistence.defectdojo.exception;

/**
* Indicates a missing {@link io.securecodebox.persistence.defectdojo.config.Config config property}
*/
public final class ConfigException extends RuntimeException {
public ConfigException(final String message) {
super(message);
}
public ConfigException(final String message, final Throwable cause) {
super(message, cause);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

package io.securecodebox.persistence.defectdojo.config;

import io.securecodebox.persistence.defectdojo.exception.ConfigException;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand Down Expand Up @@ -83,27 +84,71 @@ void fromEnv() {
}

@Test
@Disabled("Not implemented yet!")
void fromEnv_throwsExceptionIfNoUrlSet() {
environmentVariables.set("DEFECTDOJO_USERNAME", "username")
.set("DEFECTDOJO_APIKEY", "apikey")
.set("DEFECTDOJO_USER_ID", "42");

final var thrown = assertThrows(ConfigException.class, Config::fromEnv);

assertThat(thrown.getMessage(), is("Missing environment variable 'DEFECTDOJO_URL'!"));
}

@Test
@Disabled("Not implemented yet!")
void fromEnv_throwsExceptionIfNoUserNameSet() {
environmentVariables.set("DEFECTDOJO_URL", "url")
.set("DEFECTDOJO_APIKEY", "apikey")
.set("DEFECTDOJO_USER_ID", "42");

final var thrown = assertThrows(ConfigException.class, Config::fromEnv);

assertThat(thrown.getMessage(), is("Missing environment variable 'DEFECTDOJO_USERNAME'!"));
}

@Test
@Disabled("Not implemented yet!")
void fromEnv_throwsExceptionIfNoApiKeySet() {
environmentVariables.set("DEFECTDOJO_URL", "url")
.set("DEFECTDOJO_USERNAME", "username")
.set("DEFECTDOJO_USER_ID", "42");

final var thrown = assertThrows(ConfigException.class, Config::fromEnv);

assertThat(thrown.getMessage(), is("Missing environment variable 'DEFECTDOJO_APIKEY'!"));
}

@Test
@Disabled("Not implemented yet!")
void fromEnv_throwsExceptionIfNoUserIdSet() {
void fromEnv_throwsExceptionIfUserIdIsNotParsableToLong() {
environmentVariables.set("DEFECTDOJO_URL", "url")
.set("DEFECTDOJO_USERNAME", "username")
.set("DEFECTDOJO_APIKEY", "apikey")
.set("DEFECTDOJO_USER_ID", "foo");

final var thrown = assertThrows(ConfigException.class, Config::fromEnv);

assertThat(thrown.getMessage(), is("Given user id for environment variable 'DEFECTDOJO_USER_ID' is not a valid id! Given was 'foo'."));
}

@Test
@Disabled("Not implemented yet!")
void fromEnv_usesDefaultIfNoMaxPageCountForGetSet() {
environmentVariables.set("DEFECTDOJO_URL", "url")
.set("DEFECTDOJO_USERNAME", "username")
.set("DEFECTDOJO_APIKEY", "apikey")
.set("DEFECTDOJO_USER_ID", "42");

final var sut = Config.fromEnv();
assertThat(sut.getMaxPageCountForGets(), is(Config.DEFAULT_MAX_PAGE_COUNT_FOR_GETS));
}

@Test
void fromEnv_throwsExceptionIfMaxPageCountForGetIsNotParseableToInteger() {
environmentVariables.set("DEFECTDOJO_URL", "url")
.set("DEFECTDOJO_USERNAME", "username")
.set("DEFECTDOJO_APIKEY", "apikey")
.set("DEFECTDOJO_USER_ID", "42")
.set("DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS", "foo");

final var thrown = assertThrows(ConfigException.class, Config::fromEnv);

assertThat(thrown.getMessage(), is("Given value for environment variable 'DEFECTDOJO_MAX_PAGE_COUNT_FOR_GETS' is not a valid number! Given was 'foo'."));
}
}

0 comments on commit 301a12b

Please sign in to comment.