Files
ArchiveBox/archivebox/tests/test_cli_remove.py
2026-01-02 00:22:07 -08:00

196 lines
5.7 KiB
Python

#!/usr/bin/env python3
"""
Comprehensive tests for archivebox remove command.
Verify remove deletes snapshots from DB and filesystem.
"""
import os
import subprocess
import sqlite3
from pathlib import Path
from .fixtures import *
def test_remove_deletes_snapshot_from_db(tmp_path, process, disable_extractors_dict):
"""Test that remove command deletes snapshot from database."""
os.chdir(tmp_path)
# Add a snapshot
subprocess.run(
['archivebox', 'add', '--index-only', '--depth=0', 'https://example.com'],
capture_output=True,
env=disable_extractors_dict,
)
# Verify it exists
conn = sqlite3.connect("index.sqlite3")
c = conn.cursor()
count_before = c.execute("SELECT COUNT(*) FROM core_snapshot").fetchone()[0]
conn.close()
assert count_before == 1
# Remove it
subprocess.run(
['archivebox', 'remove', 'https://example.com', '--yes'],
capture_output=True,
env=disable_extractors_dict,
)
# Verify it's gone
conn = sqlite3.connect("index.sqlite3")
c = conn.cursor()
count_after = c.execute("SELECT COUNT(*) FROM core_snapshot").fetchone()[0]
conn.close()
assert count_after == 0
def test_remove_deletes_archive_directory(tmp_path, process, disable_extractors_dict):
"""Test that remove deletes the archive directory when using --delete flag.
Archive directories are named by timestamp, not by snapshot ID.
"""
os.chdir(tmp_path)
# Add a snapshot
subprocess.run(
['archivebox', 'add', '--index-only', '--depth=0', 'https://example.com'],
capture_output=True,
env=disable_extractors_dict,
)
# Get snapshot timestamp
conn = sqlite3.connect("index.sqlite3")
c = conn.cursor()
timestamp = c.execute("SELECT timestamp FROM core_snapshot").fetchone()[0]
conn.close()
archive_dir = tmp_path / "archive" / str(timestamp)
assert archive_dir.exists()
# Remove snapshot with --delete to remove both DB record and directory
subprocess.run(
['archivebox', 'remove', 'https://example.com', '--yes', '--delete'],
capture_output=True,
env=disable_extractors_dict,
)
# Archive directory should be deleted
assert not archive_dir.exists()
def test_remove_yes_flag_skips_confirmation(tmp_path, process, disable_extractors_dict):
"""Test that --yes flag skips confirmation prompt."""
os.chdir(tmp_path)
subprocess.run(
['archivebox', 'add', '--index-only', '--depth=0', 'https://example.com'],
capture_output=True,
env=disable_extractors_dict,
)
# Remove with --yes should complete without interaction
result = subprocess.run(
['archivebox', 'remove', 'https://example.com', '--yes'],
capture_output=True,
env=disable_extractors_dict,
timeout=30,
)
assert result.returncode == 0
def test_remove_multiple_snapshots(tmp_path, process, disable_extractors_dict):
"""Test removing multiple snapshots at once."""
os.chdir(tmp_path)
# Add multiple snapshots
for url in ['https://example.com', 'https://example.org']:
subprocess.run(
['archivebox', 'add', '--index-only', '--depth=0', url],
capture_output=True,
env=disable_extractors_dict,
)
# Verify both exist
conn = sqlite3.connect("index.sqlite3")
c = conn.cursor()
count_before = c.execute("SELECT COUNT(*) FROM core_snapshot").fetchone()[0]
conn.close()
assert count_before == 2
# Remove both
subprocess.run(
['archivebox', 'remove', 'https://example.com', 'https://example.org', '--yes'],
capture_output=True,
env=disable_extractors_dict,
)
# Verify both are gone
conn = sqlite3.connect("index.sqlite3")
c = conn.cursor()
count_after = c.execute("SELECT COUNT(*) FROM core_snapshot").fetchone()[0]
conn.close()
assert count_after == 0
def test_remove_with_filter(tmp_path, process, disable_extractors_dict):
"""Test removing snapshots using filter."""
os.chdir(tmp_path)
# Add snapshots
subprocess.run(
['archivebox', 'add', '--index-only', '--depth=0', 'https://example.com'],
capture_output=True,
env=disable_extractors_dict,
)
# Remove using filter
result = subprocess.run(
['archivebox', 'remove', '--filter-type=search', '--filter=example.com', '--yes'],
capture_output=True,
env=disable_extractors_dict,
timeout=30,
)
# Should complete (exit code depends on implementation)
assert result.returncode in [0, 1, 2]
def test_remove_nonexistent_url_fails_gracefully(tmp_path, process, disable_extractors_dict):
"""Test that removing non-existent URL fails gracefully."""
os.chdir(tmp_path)
result = subprocess.run(
['archivebox', 'remove', 'https://nonexistent-url-12345.com', '--yes'],
capture_output=True,
env=disable_extractors_dict,
)
# Should fail or show error
assert result.returncode != 0 or 'not found' in result.stdout.lower() or 'no matches' in result.stdout.lower()
def test_remove_after_flag(tmp_path, process, disable_extractors_dict):
"""Test remove --after flag removes snapshots after date."""
os.chdir(tmp_path)
subprocess.run(
['archivebox', 'add', '--index-only', '--depth=0', 'https://example.com'],
capture_output=True,
env=disable_extractors_dict,
)
# Try remove with --after flag (should work or show usage)
result = subprocess.run(
['archivebox', 'remove', '--after=2020-01-01', '--yes'],
capture_output=True,
env=disable_extractors_dict,
timeout=30,
)
# Should complete
assert result.returncode in [0, 1, 2]