static_web_server/
testing.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2// This file is part of Static Web Server.
3// See https://static-web-server.net/ for more information
4// Copyright (C) 2019-present Jose Quintana <joseluisq.net>
5
6//! Development utilities for testing of SWS.
7//!
8
9/// SWS fixtures module.
10#[doc(hidden)]
11pub mod fixtures {
12    use std::{path::PathBuf, sync::Arc};
13
14    use crate::{
15        handler::{RequestHandler, RequestHandlerOpts},
16        settings::cli::General,
17        settings::Advanced,
18        Settings,
19    };
20
21    /// Testing Remote address
22    pub const REMOTE_ADDR: &str = "127.0.0.1:1234";
23
24    /// Load the fixture TOML settings and return it.
25    pub fn fixture_settings(fixture_toml: &str) -> Settings {
26        // Replace default config file and load the fixture TOML settings
27        let f = PathBuf::from("tests/fixtures").join(fixture_toml);
28        std::env::set_var("SERVER_CONFIG_FILE", f);
29        Settings::get_unparsed(false).unwrap()
30    }
31
32    /// Create a `RequestHandlerOpts` from the given options (fixture).
33    pub fn fixture_req_handler_opts(
34        general: General,
35        advanced: Option<Advanced>,
36    ) -> RequestHandlerOpts {
37        #[cfg(not(any(
38            feature = "compression",
39            feature = "compression-gzip",
40            feature = "compression-brotli",
41            feature = "compression-zstd",
42            feature = "compression-deflate"
43        )))]
44        let compression = false;
45        #[cfg(not(any(
46            feature = "compression",
47            feature = "compression-gzip",
48            feature = "compression-brotli",
49            feature = "compression-zstd",
50            feature = "compression-deflate"
51        )))]
52        let compression_static = false;
53        #[cfg(any(
54            feature = "compression",
55            feature = "compression-gzip",
56            feature = "compression-brotli",
57            feature = "compression-zstd",
58            feature = "compression-deflate"
59        ))]
60        let compression = general.compression;
61        #[cfg(any(
62            feature = "compression",
63            feature = "compression-gzip",
64            feature = "compression-brotli",
65            feature = "compression-zstd",
66            feature = "compression-deflate"
67        ))]
68        let compression_static = general.compression_static;
69
70        RequestHandlerOpts {
71            root_dir: general.root,
72            compression,
73            compression_static,
74            #[cfg(any(
75                feature = "compression",
76                feature = "compression-gzip",
77                feature = "compression-brotli",
78                feature = "compression-zstd",
79                feature = "compression-deflate"
80            ))]
81            compression_level: general.compression_level,
82            #[cfg(feature = "directory-listing")]
83            dir_listing: general.directory_listing,
84            #[cfg(feature = "directory-listing")]
85            dir_listing_order: general.directory_listing_order,
86            #[cfg(feature = "directory-listing")]
87            dir_listing_format: general.directory_listing_format,
88            #[cfg(feature = "directory-listing-download")]
89            dir_listing_download: general.directory_listing_download,
90            // TODO: add support or `cors` when required
91            cors: None,
92            security_headers: general.security_headers,
93            cache_control_headers: general.cache_control_headers,
94            page404: general.page404,
95            page50x: general.page50x,
96            // TODO: add support or `page_fallback` when required
97            #[cfg(feature = "fallback-page")]
98            page_fallback: vec![],
99            #[cfg(feature = "basic-auth")]
100            basic_auth: general.basic_auth,
101            log_remote_address: general.log_remote_address,
102            log_x_real_ip: general.log_x_real_ip,
103            log_forwarded_for: general.log_forwarded_for,
104            trusted_proxies: general.trusted_proxies,
105            redirect_trailing_slash: general.redirect_trailing_slash,
106            ignore_hidden_files: general.ignore_hidden_files,
107            disable_symlinks: general.disable_symlinks,
108            index_files: vec![general.index_files],
109            health: general.health,
110            #[cfg(all(unix, feature = "experimental"))]
111            experimental_metrics: general.experimental_metrics,
112            maintenance_mode: general.maintenance_mode,
113            maintenance_mode_status: general.maintenance_mode_status,
114            maintenance_mode_file: general.maintenance_mode_file,
115            #[cfg(feature = "experimental")]
116            memory_cache: None,
117            advanced_opts: advanced,
118        }
119    }
120
121    /// Create a `RequestHandler` from a custom TOML config file (fixture).
122    pub fn fixture_req_handler(req_handler_opts: RequestHandlerOpts) -> RequestHandler {
123        RequestHandler {
124            opts: Arc::from(req_handler_opts),
125        }
126    }
127}