Repository: static-web-server/static-web-server (rust)

Issue:
Tests fail because CLI options are parsed
### Search for duplicate issues

- [X] I already searched, and this issue is not a duplicate.

### Issue scope

CLI

### Describe the bug

Some tests load custom settings but also parse the CLI options. When tests are being run with parameters like `--test-threads 1`, some tests fail because static-web-server itself does not have such an option.

### How to reproduce it

`cargo test -- --test-threads 1`

### Expected behavior

Tests succeed.

### Complementary information

The option to specify the test threads is even mentioned in the Rust book: https://doc.rust-lang.org/book/ch11-02-running-tests.html#running-tests-in-parallel-or-consecutively

Failing log:
```
     Running tests/handler.rs (target/x86_64-unknown-linux-gnu/release/deps/handler-c38b80b7779dbedd)

running 2 tests
error: unexpected argument '--test-threads' found

  tip: a similar argument exists: '--security-headers'

Usage: handler-c38b80b7779dbedd <--host <HOST>|--port <PORT>|--fd <FD>|--threads-multiplier <THREADS_MULTIPLIER>|--max-blocking-threads <MAX_BLOCKING_THREADS>|--root <ROOT>|--page50x <PAGE50X>|--page404 <PAGE404>|--page-fallback <PAGE_FALLBACK>|--log-level <LOG_LEVEL>|--cors-allow-origins <CORS_ALLOW_ORIGINS>|--cors-allow-headers <CORS_ALLOW_HEADERS>|--cors-expose-headers <CORS_EXPOSE_HEADERS>|--http2[=<HTTP2>]|--http2-tls-cert <HTTP2_TLS_CERT>|--http2-tls-key <HTTP2_TLS_KEY>|--https-redirect[=<HTTPS_REDIRECT>]|--https-redirect-host <HTTPS_REDIRECT_HOST>|--https-redirect-from-port <HTTPS_REDIRECT_FROM_PORT>|--https-redirect-from-hosts <HTTPS_REDIRECT_FROM_HOSTS>|--index-files <INDEX_FILES>|--compression[=<COMPRESSION>]|--compression-level <COMPRESSION_LEVEL>|--compression-static[=<COMPRESSION_STATIC>]|--directory-listing[=<DIRECTORY_LISTING>]|--directory-listing-order <DIRECTORY_LISTING_ORDER>|--directory-listing-format <DIRECTORY_LISTING_FORMAT>|--security-headers[=<SECURITY_HEADERS>]|--cache-control-headers[=<CACHE_CONTROL_HEADERS>]|--basic-auth <BASIC_AUTH>|--grace-period <GRACE_PERIOD>|--config-file <CONFIG_FILE>|--log-remote-address[=<LOG_REMOTE_ADDRESS>]|--redirect-trailing-slash[=<REDIRECT_TRAILING_SLASH>]|--ignore-hidden-files[=<IGNORE_HIDDEN_FILES>]|--disable-symlinks[=<DISABLE_SYMLINKS>]|--health[=<HEALTH>]|--maintenance-mode[=<MAINTENANCE_MODE>]|--maintenance-mode-status <MAINTENANCE_MODE_STATUS>|--maintenance-mode-file <MAINTENANCE_MODE_FILE>|--version>

For more information, try '--help'.
error: unexpected argument '--test-threads' found

  tip: a similar argument exists: '--security-headers'

Usage: handler-c38b80b7779dbedd <--host <HOST>|--port <PORT>|--fd <FD>|--threads-multiplier <THREADS_MULTIPLIER>|--max-blocking-threads <MAX_BLOCKING_THREADS>|--root <ROOT>|--page50x <PAGE50X>|--page404 <PAGE404>|--page-fallback <PAGE_FALLBACK>|--log-level <LOG_LEVEL>|--cors-allow-origins <CORS_ALLOW_ORIGINS>|--cors-allow-headers <CORS_ALLOW_HEADERS>|--cors-expose-headers <CORS_EXPOSE_HEADERS>|--http2[=<HTTP2>]|--http2-tls-cert <HTTP2_TLS_CERT>|--http2-tls-key <HTTP2_TLS_KEY>|--https-redirect[=<HTTPS_REDIRECT>]|--https-redirect-host <HTTPS_REDIRECT_HOST>|--https-redirect-from-port <HTTPS_REDIRECT_FROM_PORT>|--https-redirect-from-hosts <HTTPS_REDIRECT_FROM_HOSTS>|--index-files <INDEX_FILES>|--compression[=<COMPRESSION>]|--compression-level <COMPRESSION_LEVEL>|--compression-static[=<COMPRESSION_STATIC>]|--directory-listing[=<DIRECTORY_LISTING>]|--directory-listing-order <DIRECTORY_LISTING_ORDER>|--directory-listing-format <DIRECTORY_LISTING_FORMAT>|--security-headers[=<SECURITY_HEADERS>]|--cache-control-headers[=<CACHE_CONTROL_HEADERS>]|--basic-auth <BASIC_AUTH>|--grace-period <GRACE_PERIOD>|--config-file <CONFIG_FILE>|--log-remote-address[=<LOG_REMOTE_ADDRESS>]|--redirect-trailing-slash[=<REDIRECT_TRAILING_SLASH>]|--ignore-hidden-files[=<IGNORE_HIDDEN_FILES>]|--disable-symlinks[=<DISABLE_SYMLINKS>]|--health[=<HEALTH>]|--maintenance-mode[=<MAINTENANCE_MODE>]|--maintenance-mode-status <MAINTENANCE_MODE_STATUS>|--maintenance-mode-file <MAINTENANCE_MODE_FILE>|--version>

For more information, try '--help'.
error: test failed, to rerun pass `--test handler`

Caused by:
  process didn't exit successfully: `/build/source/target/x86_64-unknown-linux-gnu/release/deps/handler-c38b80b7779dbedd --test-threads=24` (exit status: 2)
```

### Build target

Built from source (specify below)

### Environment and specs

- [x] **static-web-server:** v1.32.1

### Additional context

_No response_

Pull request:
Fix test execution issues when running cargo tests passing non-SWS arguments
<!--- Provide a general summary of your changes in the Title above -->

## Description
<!--- Describe your changes but try to be as concise as possible -->

This PR fixes an issue when running tests via Cargo with additional non-SWS arguments.
This was because SWS tried to parse CLI arguments in a test context.

Now, SWS won't parse arguments by default when running tests. So the following command will work as expected (run all tests):

```sh
cargo test -- --test-threads 1 --nocapture
```

## Related Issue
<!--- This project only accepts pull requests related to open issues -->
<!--- If suggesting a new feature or change, please discuss it in an issue first -->
<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
<!--- Please link to the issue here: -->

It fixes #465 

## Motivation and Context
<!--- Why is this change required? What problem does it solve? -->
<!--- If it fixes an open issue, please link to the issue here. -->

## How Has This Been Tested?
<!--- Please describe in detail how you tested your changes. -->
<!--- Include details of your testing environment and the tests you ran to -->
<!--- See how your change affects other areas of the code, etc. -->

## Screenshots (if appropriate):


Patch:
diff --git a/src/settings/mod.rs b/src/settings/mod.rs
index 5f9f76d..7666b29 100644
--- a/src/settings/mod.rs
+++ b/src/settings/mod.rs
@@ -100,7 +100,21 @@ impl Settings {
     /// It also takes care to initialize the logging system with its level
     /// once the `general` settings are determined.
     pub fn get(log_init: bool) -> Result<Settings> {
-        let opts = General::parse();
+        Self::read(log_init, true)
+    }
+
+    /// Reads CLI/Env and config file options returning the server settings
+    /// without parsing arguments useful for testing.
+    pub fn get_unparsed(log_init: bool) -> Result<Settings> {
+        Self::read(log_init, false)
+    }
+
+    fn read(log_init: bool, parse_args: bool) -> Result<Settings> {
+        let opts = if parse_args {
+            General::parse()
+        } else {
+            General::parse_from([""])
+        };
 
         // Define the general CLI/file options
         let version = opts.version;


Test patch:
diff --git a/src/testing.rs b/src/testing.rs
index 3c3459e..b5e4276 100644
--- a/src/testing.rs
+++ b/src/testing.rs
@@ -26,7 +26,7 @@ pub mod fixtures {
         // Replace default config file and load the fixture TOML settings
         let f = PathBuf::from("tests/fixtures").join(fixture_toml);
         std::env::set_var("SERVER_CONFIG_FILE", f);
-        Settings::get(false).unwrap()
+        Settings::get_unparsed(false).unwrap()
     }
 
     /// Create a `RequestHandler` from a custom TOML config file (fixture).
diff --git a/tests/compression.rs b/tests/compression.rs
index 79d593c..ebd80d9 100644
--- a/tests/compression.rs
+++ b/tests/compression.rs
@@ -3,6 +3,7 @@
 #![deny(rust_2018_idioms)]
 #![deny(dead_code)]
 
+#[cfg(test)]
 pub mod tests {
     use headers::HeaderValue;
     use hyper::Request;
diff --git a/tests/handler.rs b/tests/handler.rs
index 669b443..d53c658 100644
--- a/tests/handler.rs
+++ b/tests/handler.rs
@@ -3,6 +3,7 @@
 #![deny(rust_2018_idioms)]
 #![deny(dead_code)]
 
+#[cfg(test)]
 pub mod tests {
     use headers::HeaderValue;
     use hyper::Request;
diff --git a/tests/redirects.rs b/tests/redirects.rs
index c499ab9..50ffce0 100644
--- a/tests/redirects.rs
+++ b/tests/redirects.rs
@@ -3,6 +3,7 @@
 #![deny(rust_2018_idioms)]
 #![deny(dead_code)]
 
+#[cfg(test)]
 pub mod tests {
     use hyper::Request;
     use std::net::SocketAddr;
diff --git a/tests/rewrites.rs b/tests/rewrites.rs
index d33b5a3..3ede500 100644
--- a/tests/rewrites.rs
+++ b/tests/rewrites.rs
@@ -3,6 +3,7 @@
 #![deny(rust_2018_idioms)]
 #![deny(dead_code)]
 
+#[cfg(test)]
 pub mod tests {
     use hyper::Request;
     use std::net::SocketAddr;