docs(config): audit test configs and add full.yaml reference#1338
Conversation
Audit all YAML configs in clash-bin/tests/data/config/: - Add one-line purpose comment to every client config file - Remove stale 'experimental.ignore-resolve-fail' (field not in config def; the Experimental struct only has tcp_buffer_size) - Strip copy-pasted commented-out DNS boilerplate from protocol-specific configs (hysteria2, vless, wg, ss, uot) that obscured their actual content - Remove unreachable 'ss-02' proxy from tor.yaml - Collapse noisy commented-out rule/proxy entries in server.yaml, socks5.yaml - Fix rules.yaml experimental section to use the real tcp-buffer-size field Add clash-bin/tests/data/config/full.yaml (781 lines): - Comprehensive reference covering every clash-rs config option - Sections: ports, network, mode, logging, external-controller, geo-dbs, profile, hosts, experimental, DNS (all listeners + modes), TUN, listeners, all proxy types (ss/vmess/vless/trojan/socks5/wg/hysteria2/tuic/anytls/ shadowquic/ssh/tor/tailscale), all group types, proxy-providers, rule-providers, all rule types - Marked as NOT a working config; values are examples/placeholders Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (11)
📒 Files selected for processing (53)
💤 Files with no reviewable changes (37)
✅ Files skipped from review due to trivial changes (2)
📝 WalkthroughWalkthroughMany test fixture files were removed or simplified; numerous dockerized Rust test runners were updated to generate server configs at runtime (write embedded config to NamedTempFile and mount into containers); a comprehensive non-runnable reference YAML Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant Test as Test harness
participant Temp as NamedTempFile
participant Docker as Docker container
participant Runner as DockerTestRunner
Test->>Temp: create NamedTempFile + write embedded config (io::Write)
Test->>Docker: mount temp file at container config path (e.g. /etc/...)
Test->>Docker: mount cert/key from `certs/...`
Test->>Runner: await builder().await to start container
Test->>Temp: drop file handle
Runner-->>Test: return built runner
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@clash-bin/tests/data/config/full.yaml`:
- Around line 200-205: The example value for the device-id key is inconsistent:
it currently uses "dev://utun1989" (mixing Linux dev:// with macOS utun naming).
Update the device-id example to a correct macOS form by changing the value to
"utun1989" (or, if you prefer the Linux example, change it to "dev://tun0");
modify the device-id entry so it matches one of the documented formats (refer to
the device-id key and the example values shown).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 5bf5b21c-6121-4324-9edf-6d60806c8340
📒 Files selected for processing (19)
clash-bin/tests/data/config/config.test.yamlclash-bin/tests/data/config/dns.yamlclash-bin/tests/data/config/empty.yamlclash-bin/tests/data/config/full.yamlclash-bin/tests/data/config/hysteria2.yamlclash-bin/tests/data/config/listeners/tunnel.yamlclash-bin/tests/data/config/rules.yamlclash-bin/tests/data/config/server.yamlclash-bin/tests/data/config/shadowquic.yamlclash-bin/tests/data/config/simple.yamlclash-bin/tests/data/config/socks5.yamlclash-bin/tests/data/config/ss.yamlclash-bin/tests/data/config/tor.yamlclash-bin/tests/data/config/tproxy.yamlclash-bin/tests/data/config/tun.yamlclash-bin/tests/data/config/uot.yamlclash-bin/tests/data/config/vless-tcp-reality.yamlclash-bin/tests/data/config/vless.yamlclash-bin/tests/data/config/wg.yaml
| # Device identifier: | ||
| # "utun1989" — macOS (utun prefix required by the OS) | ||
| # "dev://tun0" — Linux explicit device | ||
| # "fd://3" — use an existing open file descriptor | ||
| device-id: "dev://utun1989" | ||
|
|
There was a problem hiding this comment.
Fix inconsistent TUN device-id example format.
Line 204 mixes the Linux dev:// prefix with a macOS utun identifier (dev://utun1989), which conflicts with the formats documented in Lines 201-203.
Suggested fix
- device-id: "dev://utun1989"
+ device-id: "utun1989"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@clash-bin/tests/data/config/full.yaml` around lines 200 - 205, The example
value for the device-id key is inconsistent: it currently uses "dev://utun1989"
(mixing Linux dev:// with macOS utun naming). Update the device-id example to a
correct macOS form by changing the value to "utun1989" (or, if you prefer the
Linux example, change it to "dev://tun0"); modify the device-id entry so it
matches one of the documented formats (refer to the device-id key and the
example values shown).
…yaml Nameservers support URL fragment parameters: proxy=<name> route DNS queries through a named outbound proxy interface=<name> bind to a specific network interface <bare name> shorthand for proxy=<name> These apply to nameserver, fallback, nameserver-policy values, and proxy-server-nameserver. Adds examples showing DNS-over-HTTPS via proxy. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…e audit Remove hallucinated fields not in config structs; add missing supported fields found in def.rs and implementation code. - interface-name → interface: the Config struct field is `pub interface`, which serde maps to the YAML key `interface` (not `interface-name`); the old name was silently dropped by serde - dns.listen.dot.hostname removed: DoTConfig (clash-dns/src/lib.rs) has no `hostname` field — only DoHConfig and DoH3Config do; the key was accepted but silently ignored - listeners: document `allow-lan` and `fw-mark` from CommonInboundOpts (config/internal/listener.rs) which were missing from all examples Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…se audit
Remove hallucinated proxy fields; add missing supported options found in
converter structs and config def. Correct rule type names.
Changes:
- proxy/vmess: use primary field name 'server-name' (not alias 'servername');
fix comment direction — alias is 'servername', primary is 'server-name'
(OutboundVmess: #[serde(alias = "servername")] pub server_name)
- proxy/vless: same server-name fix for vless-ws-tls, vless-grpc, vless-reality
(OutboundVless: #[serde(alias = "servername")] pub server_name)
- proxy-providers: remove hallucinated 'timeout' from health-check block —
HealthCheck struct has no timeout field (enable/url/interval/lazy only)
- rule-providers: add 'format' field (yaml | text | mrs) — supported by
both FileRuleProvider and HttpRuleProvider as Option<RuleSetFormat>
- rules: add explicit IP-CIDR6 example — supported as alias for IP-CIDR
in rule parser ('IP-CIDR' | 'IP-CIDR6' both handled by RuleType::IpCidr)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
… unused test data files - Delete 17 unused client YAML/data files (manual test artifacts, mmdb auto-downloaded) - Move cert files to certs/ subdirectory and update all Rust references - Inline all docker server configs (JSON/TOML/YAML) as Rust const strings written to NamedTempFile for container mounting - Result: clash-bin/tests/data/config/ contains only certs/, ssh/, wg_config/, listeners/, public/, empty.yaml, full.yaml, server.yaml, rules.yaml, and rule-set*.yaml Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
clash-lib/src/proxy/socks/outbound/mod.rs (1)
334-383: Build the auth fixture fromUSER/PASSWORDinstead of duplicating literals.Right now the container config hardcodes
"user"and"password"while the client side usesUSERandPASSWORD. That makes this test easy to break with a one-sided edit.♻️ Possible cleanup
- const SOCKS5_AUTH_SERVER_CONFIG: &str = r#"{ - "log": { - "loglevel": "debug" - }, - "inbounds": [ - { - "port": 10002, - "listen": "0.0.0.0", - "protocol": "socks", - "settings": { - "auth": "password", - "accounts": [ - { - "user": "user", - "pass": "password" - } - ], - "udp": true, - "ip": "0.0.0.0" - } - } - ], - "outbounds": [ - { - "protocol": "freedom" - } - ] -}"#; + fn socks5_auth_server_config() -> String { + format!( + r#"{{ + "log": {{ + "loglevel": "debug" + }}, + "inbounds": [ + {{ + "port": 10002, + "listen": "0.0.0.0", + "protocol": "socks", + "settings": {{ + "auth": "password", + "accounts": [ + {{ + "user": "{USER}", + "pass": "{PASSWORD}" + }} + ], + "udp": true, + "ip": "0.0.0.0" + }} + }} + ], + "outbounds": [ + {{ + "protocol": "freedom" + }} + ] +}}"# + ) + } @@ - let config = if auth { - SOCKS5_AUTH_SERVER_CONFIG + let config = if auth { + socks5_auth_server_config() } else { - SOCKS5_NOAUTH_SERVER_CONFIG + SOCKS5_NOAUTH_SERVER_CONFIG.to_owned() }; @@ - tmp.write_all(config.as_bytes())?; + tmp.write_all(config.as_bytes())?;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@clash-lib/src/proxy/socks/outbound/mod.rs` around lines 334 - 383, The SOCKS5_AUTH_SERVER_CONFIG literal duplicates the credentials instead of using the test USER/PASSWORD constants, which can cause one-sided edits to break tests; update get_socks5_runner so the auth server config is generated from the shared USER and PASSWORD (e.g., build the JSON string or serde_json value using USER and PASSWORD) rather than hardcoded "user"/"password", ensuring the container config and the client use the same credentials.clash-lib/src/proxy/vless/mod.rs (1)
258-331: Consider moving the embedded VLESS server fixture into test-only code.This JSON block is now large enough that it makes the handler module harder to scan. A docker test file under
clash-lib/tests/or a shared test fixture helper would keep the runtime module focused.Based on learnings: Place integration tests in clash_lib/tests/ directory with separate files for smoke_tests, api_tests, and Docker-based protocol tests.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@clash-lib/src/proxy/vless/mod.rs` around lines 258 - 331, Extract the large JSON const VLESS_WS_TLS_SERVER_CONFIG out of the runtime handler (mod.rs) and into test-only code: create a dedicated test fixture module (annotated with #[cfg(test)]) or a shared test helper in the tests crate and move the string there, replacing the in-module const with a lightweight reference or a private accessor used only by tests; update any test imports to use the new fixture symbol and remove the embedded JSON from the production handler so mod.rs no longer contains the large VLESS_WS_TLS_SERVER_CONFIG constant.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@clash-lib/src/proxy/anytls/mod.rs`:
- Around line 844-860: The temp file created with tempfile::NamedTempFile (tmp)
is dropped right after DockerTestRunnerBuilder::build().await, which can remove
the bind-mounted config before the container process reads it; keep the temp
file alive for the container lifetime by moving the NamedTempFile into the
runner state instead of dropping it (e.g. store tmp on the DockerTestRunner
struct or return a wrapper that owns the NamedTempFile), or alternatively write
the config to a stable test fixture directory rather than using NamedTempFile;
update the code that builds/returns the runner
(DockerTestRunnerBuilder::build()/DockerTestRunner) to hold ownership of the
file so drop(tmp) is removed and the file remains on disk while the container
runs.
---
Nitpick comments:
In `@clash-lib/src/proxy/socks/outbound/mod.rs`:
- Around line 334-383: The SOCKS5_AUTH_SERVER_CONFIG literal duplicates the
credentials instead of using the test USER/PASSWORD constants, which can cause
one-sided edits to break tests; update get_socks5_runner so the auth server
config is generated from the shared USER and PASSWORD (e.g., build the JSON
string or serde_json value using USER and PASSWORD) rather than hardcoded
"user"/"password", ensuring the container config and the client use the same
credentials.
In `@clash-lib/src/proxy/vless/mod.rs`:
- Around line 258-331: Extract the large JSON const VLESS_WS_TLS_SERVER_CONFIG
out of the runtime handler (mod.rs) and into test-only code: create a dedicated
test fixture module (annotated with #[cfg(test)]) or a shared test helper in the
tests crate and move the string there, replacing the in-module const with a
lightweight reference or a private accessor used only by tests; update any test
imports to use the new fixture symbol and remove the embedded JSON from the
production handler so mod.rs no longer contains the large
VLESS_WS_TLS_SERVER_CONFIG constant.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 303ce47b-9d3f-452c-b9f2-18d89036b679
⛔ Files ignored due to path filters (2)
clash-bin/tests/data/config/certs/example.org-key.pemis excluded by!**/*.pemclash-bin/tests/data/config/certs/example.org.pemis excluded by!**/*.pem
📒 Files selected for processing (40)
clash-bin/tests/data/config/Country-asn.mmdbclash-bin/tests/data/config/GeoLite2-ASN.mmdbclash-bin/tests/data/config/anytls.jsonclash-bin/tests/data/config/certs/dns.crtclash-bin/tests/data/config/certs/dns.keyclash-bin/tests/data/config/config.test.yamlclash-bin/tests/data/config/dns.yamlclash-bin/tests/data/config/full.yamlclash-bin/tests/data/config/hysteria.jsonclash-bin/tests/data/config/hysteria2.yamlclash-bin/tests/data/config/shadowquic.yamlclash-bin/tests/data/config/simple.yamlclash-bin/tests/data/config/socks5-auth.jsonclash-bin/tests/data/config/socks5-noauth.jsonclash-bin/tests/data/config/socks5.yamlclash-bin/tests/data/config/ss.jsonclash-bin/tests/data/config/ss.yamlclash-bin/tests/data/config/tor.yamlclash-bin/tests/data/config/tproxy.yamlclash-bin/tests/data/config/trojan-grpc.jsonclash-bin/tests/data/config/trojan-ws.jsonclash-bin/tests/data/config/tuic.tomlclash-bin/tests/data/config/tun.yamlclash-bin/tests/data/config/uot.yamlclash-bin/tests/data/config/vless-tcp-reality.yamlclash-bin/tests/data/config/vless-ws-tls.jsonclash-bin/tests/data/config/vless.yamlclash-bin/tests/data/config/vmess-grpc.jsonclash-bin/tests/data/config/vmess-http2.jsonclash-bin/tests/data/config/vmess-ws.jsonclash-bin/tests/data/config/wg.yamlclash-lib/src/proxy/anytls/mod.rsclash-lib/src/proxy/hysteria2/mod.rsclash-lib/src/proxy/shadowquic/mod.rsclash-lib/src/proxy/shadowsocks/outbound/mod.rsclash-lib/src/proxy/socks/outbound/mod.rsclash-lib/src/proxy/trojan/mod.rsclash-lib/src/proxy/tuic/mod.rsclash-lib/src/proxy/vless/mod.rsclash-lib/src/proxy/vmess/mod.rs
💤 Files with no reviewable changes (26)
- clash-bin/tests/data/config/simple.yaml
- clash-bin/tests/data/config/anytls.json
- clash-bin/tests/data/config/hysteria.json
- clash-bin/tests/data/config/vmess-http2.json
- clash-bin/tests/data/config/trojan-ws.json
- clash-bin/tests/data/config/socks5-noauth.json
- clash-bin/tests/data/config/socks5-auth.json
- clash-bin/tests/data/config/vmess-ws.json
- clash-bin/tests/data/config/ss.json
- clash-bin/tests/data/config/vmess-grpc.json
- clash-bin/tests/data/config/dns.yaml
- clash-bin/tests/data/config/trojan-grpc.json
- clash-bin/tests/data/config/socks5.yaml
- clash-bin/tests/data/config/vless-ws-tls.json
- clash-bin/tests/data/config/tor.yaml
- clash-bin/tests/data/config/wg.yaml
- clash-bin/tests/data/config/ss.yaml
- clash-bin/tests/data/config/tproxy.yaml
- clash-bin/tests/data/config/tuic.toml
- clash-bin/tests/data/config/vless.yaml
- clash-bin/tests/data/config/tun.yaml
- clash-bin/tests/data/config/config.test.yaml
- clash-bin/tests/data/config/shadowquic.yaml
- clash-bin/tests/data/config/vless-tcp-reality.yaml
- clash-bin/tests/data/config/hysteria2.yaml
- clash-bin/tests/data/config/uot.yaml
✅ Files skipped from review due to trivial changes (1)
- clash-bin/tests/data/config/full.yaml
| let mut tmp = tempfile::NamedTempFile::new()?; | ||
| tmp.write_all(ANYTLS_SERVER_CONFIG.as_bytes())?; | ||
|
|
||
| let result = DockerTestRunnerBuilder::new() | ||
| .image(IMAGE_SINGBOX) | ||
| .cmd(&["run", "-c", "/etc/sing-box/config.json"]) | ||
| .mounts(&[ | ||
| (conf.to_str().unwrap(), "/etc/sing-box/config.json"), | ||
| (tmp.path().to_str().unwrap(), "/etc/sing-box/config.json"), | ||
| (cert.to_str().unwrap(), "/etc/ssl/v2ray/fullchain.pem"), | ||
| (key.to_str().unwrap(), "/etc/ssl/v2ray/privkey.pem"), | ||
| ]) | ||
| .host_port(host_port, 10002) | ||
| .build() | ||
| .await | ||
| .await; | ||
| drop(tmp); | ||
| result | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== Locate docker runner source files =="
fd -i 'docker_runner.*\.rs$'
echo
echo "== Inspect builder/runner lifecycle symbols =="
rg -n --type=rust -C6 \
'\bstruct\s+DockerTestRunnerBuilder\b|\bimpl\s+DockerTestRunnerBuilder\b|\basync\s+fn\s+build\b|\bfn\s+build\b|\basync\s+fn\s+start\b|\bfn\s+start\b|\bmounts\s*\(|\bhost_port\s*\(' \
$(fd -i 'docker_runner.*\.rs$')
echo
echo "== Inspect where docker process/container start actually occurs =="
rg -n --type=rust -C6 \
'Command::new\("docker"\)|\bdocker\b.*\brun\b|\bcreate\b|\bstart\b|\bspawn\b' \
$(fd -i 'docker_runner.*\.rs$')Repository: Watfaq/clash-rs
Length of output: 4415
🏁 Script executed:
cat -n clash-lib/src/proxy/utils/test_utils/docker_utils/docker_runner.rs | sed -n '100,250p'Repository: Watfaq/clash-rs
Length of output: 6307
🏁 Script executed:
cat -n clash-lib/src/proxy/utils/test_utils/docker_utils/docker_runner.rs | sed -n '80,180p'Repository: Watfaq/clash-rs
Length of output: 4445
🏁 Script executed:
rg -n --type=rust -A50 'async fn try_new' clash-lib/src/proxy/utils/test_utils/docker_utils/docker_runner.rsRepository: Watfaq/clash-rs
Length of output: 2106
🏁 Script executed:
cat -n clash-lib/src/proxy/anytls/mod.rs | sed -n '820,880p'Repository: Watfaq/clash-rs
Length of output: 2516
🏁 Script executed:
rg -n --type=rust -B10 -A15 'DockerTestRunnerBuilder::new' clash-lib/src/proxy/anytls/mod.rs | head -80Repository: Watfaq/clash-rs
Length of output: 1124
Keep temp config file alive until container is fully started.
At line 858, drop(tmp) removes the temp config file immediately after build().await. This is unsafe because Docker's start_container() API only signals the container to start—it does not block until the container process has read the config file. The file must remain on the filesystem for the bind mount to work when the container process actually starts.
Move the temp file into the runner state or convert it to a persistent test fixture so it remains alive for the container's lifetime:
- Store
NamedTempFileinDockerTestRunneror wrap the runner to keep the file alive - Or write the config to a stable test directory instead of using a temporary file
Current code
let mut tmp = tempfile::NamedTempFile::new()?;
tmp.write_all(ANYTLS_SERVER_CONFIG.as_bytes())?;
let result = DockerTestRunnerBuilder::new()
.image(IMAGE_SINGBOX)
.cmd(&["run", "-c", "/etc/sing-box/config.json"])
.mounts(&[
(tmp.path().to_str().unwrap(), "/etc/sing-box/config.json"),
(cert.to_str().unwrap(), "/etc/ssl/v2ray/fullchain.pem"),
(key.to_str().unwrap(), "/etc/ssl/v2ray/privkey.pem"),
])
.host_port(host_port, 10002)
.build()
.await;
drop(tmp);
result
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@clash-lib/src/proxy/anytls/mod.rs` around lines 844 - 860, The temp file
created with tempfile::NamedTempFile (tmp) is dropped right after
DockerTestRunnerBuilder::build().await, which can remove the bind-mounted config
before the container process reads it; keep the temp file alive for the
container lifetime by moving the NamedTempFile into the runner state instead of
dropping it (e.g. store tmp on the DockerTestRunner struct or return a wrapper
that owns the NamedTempFile), or alternatively write the config to a stable test
fixture directory rather than using NamedTempFile; update the code that
builds/returns the runner (DockerTestRunnerBuilder::build()/DockerTestRunner) to
hold ownership of the file so drop(tmp) is removed and the file remains on disk
while the container runs.
…er certs/ move - Delete listeners/, public/, rules.yaml, server.yaml, rule-set*.yaml from clash-bin/tests/data/config/ — none referenced by any automated test - Fix clash-lib/tests/data/config/client/rules.yaml: update 6 dns.crt/dns.key relative paths to certs/dns.crt and certs/dns.key after the certs/ rename Final clash-bin/tests/data/config/ layout: certs/ — shared TLS certs and keys ssh/ — SSH docker test host keys wg_config/ — WireGuard docker test keys and config empty.yaml — minimal clash config for docker test framework full.yaml — reference config documentation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
📊 Proxy Throughput Results
Tests ran 5 variant(s) in parallel; each direction transfers the full payload. Full test logDownload the |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Two-way sync barrier prevents TCP coalescing from biasing download timer - Fix cert paths to use certs/ subdir (post-#1338 cleanup) - Require container_ip() for .no_port() runners (socks5, ssh, tuic, vless) - netem sidecar: disable auto_remove to reliably detect exit failure - format_throughput.py: canonical transport ordering + run URL always appended Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Two-way sync barrier prevents TCP coalescing from biasing download timer - Fix cert paths to use certs/ subdir (post-#1338 cleanup) - Require container_ip() for .no_port() runners (socks5, ssh, tuic, vless) - netem sidecar: disable auto_remove to reliably detect exit failure - format_throughput.py: canonical transport ordering + run URL always appended Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Audit all YAML configs in clash-bin/tests/data/config/:
Add clash-bin/tests/data/config/full.yaml (781 lines):
What does this PR do?
Type
Checklist
Summary by CodeRabbit
Documentation
Tests