summaryrefslogtreecommitdiff
path: root/tests/integration/cleanup.rs
diff options
context:
space:
mode:
authorDawid Rycerz <dawid@rycerz.xyz>2026-01-22 22:07:32 +0100
committerDawid Rycerz <dawid@rycerz.xyz>2026-02-10 18:44:26 +0100
commit064a1d01c5c14f5ecc032fa9b8346a4a88b893f6 (patch)
treea2023f9ccd297ed8a41a3a0cc5699c2add09244d /tests/integration/cleanup.rs
witryna 0.1.0 — initial releasev0.1.0
Minimalist Git-based static site deployment orchestrator. Webhook-triggered builds in Podman/Docker containers with atomic symlink publishing, SIGHUP hot-reload, and zero-downtime deploys. See README.md for usage, CHANGELOG.md for details.
Diffstat (limited to 'tests/integration/cleanup.rs')
-rw-r--r--tests/integration/cleanup.rs92
1 files changed, 92 insertions, 0 deletions
diff --git a/tests/integration/cleanup.rs b/tests/integration/cleanup.rs
new file mode 100644
index 0000000..e0cc902
--- /dev/null
+++ b/tests/integration/cleanup.rs
@@ -0,0 +1,92 @@
+use crate::git_helpers::create_local_repo;
+use crate::harness::{SiteBuilder, TestServer};
+use crate::runtime::{skip_without_git, skip_without_runtime};
+use std::time::Duration;
+use witryna::config::Config;
+
+#[tokio::test]
+async fn old_builds_cleaned_up() {
+ skip_without_git!();
+ skip_without_runtime!();
+
+ let tempdir = tempfile::tempdir().unwrap();
+ let base_dir = tempdir.path().to_path_buf();
+
+ let repo_dir = tempdir.path().join("repos");
+ tokio::fs::create_dir_all(&repo_dir).await.unwrap();
+ let repo_url = create_local_repo(&repo_dir, "main").await;
+
+ let site = SiteBuilder::new("cleanup-site", &repo_url, "test-token")
+ .overrides(
+ "alpine:latest",
+ "mkdir -p out && echo '<h1>test</h1>' > out/index.html",
+ "out",
+ )
+ .build();
+
+ // Keep only 2 builds
+ let config = Config {
+ listen_address: "127.0.0.1:0".to_owned(),
+ container_runtime: crate::harness::test_config(base_dir.clone()).container_runtime,
+ base_dir: base_dir.clone(),
+ log_dir: base_dir.join("logs"),
+ log_level: "debug".to_owned(),
+ rate_limit_per_minute: 100,
+ max_builds_to_keep: 2,
+ git_timeout: None,
+ sites: vec![site],
+ };
+
+ let server = TestServer::start(config).await;
+ let builds_dir = base_dir.join("builds/cleanup-site");
+
+ // Run 3 builds sequentially
+ for i in 0..3 {
+ let resp = TestServer::client()
+ .post(server.url("/cleanup-site"))
+ .header("Authorization", "Bearer test-token")
+ .send()
+ .await
+ .unwrap();
+ assert_eq!(resp.status().as_u16(), 202, "build {i} should be accepted");
+
+ // Wait for build to complete
+ let max_wait = Duration::from_secs(120);
+ let start = std::time::Instant::now();
+
+ loop {
+ assert!(start.elapsed() <= max_wait, "build {i} timed out");
+
+ // Check that the site is no longer building
+ if !server
+ .state
+ .build_scheduler
+ .in_progress
+ .contains("cleanup-site")
+ {
+ break;
+ }
+ tokio::time::sleep(Duration::from_millis(200)).await;
+ }
+
+ // Small delay between builds to ensure different timestamps
+ tokio::time::sleep(Duration::from_millis(100)).await;
+ }
+
+ // Count timestamped build directories (excluding "current" symlink)
+ let mut count = 0;
+ if builds_dir.is_dir() {
+ let mut entries = tokio::fs::read_dir(&builds_dir).await.unwrap();
+ while let Some(entry) = entries.next_entry().await.unwrap() {
+ let name = entry.file_name();
+ if name != "current" && name != "current.tmp" {
+ count += 1;
+ }
+ }
+ }
+
+ assert!(
+ count <= 2,
+ "should have at most 2 builds after cleanup, got {count}"
+ );
+}