#!/usr/bin/env bats load 'libs/bats-support/load' load 'libs/bats-assert/load' load 'helpers/common' SCRIPT="$REPO_ROOT/zip_images_resize_recursive.sh" setup() { setup_mock_env } teardown() { teardown_mock_env } @test "errors when argument is not a directory" { run "$SCRIPT" /nonexistent/path assert_failure assert_output --partial "Error:" } @test "defaults to current directory when no argument given" { make_zip "$TEST_WORKDIR/archive.zip" "$FIXTURES/unprocessed.jpg" run bash -c "cd '$TEST_WORKDIR' && '$SCRIPT'" assert_success assert_output --partial "Resized" } @test "processes all ZIPs in a flat directory" { make_zip "$TEST_WORKDIR/a.zip" "$FIXTURES/unprocessed.jpg" make_zip "$TEST_WORKDIR/b.zip" "$FIXTURES/unprocessed.jpg" run "$SCRIPT" "$TEST_WORKDIR" assert_success assert_equal "$(grep -c 'Resized' <<<"$output")" "2" } @test "skips already-processed ZIPs in a flat directory" { make_zip "$TEST_WORKDIR/done.zip" "$FIXTURES/processed.jpg" make_zip "$TEST_WORKDIR/todo.zip" "$FIXTURES/unprocessed.jpg" run "$SCRIPT" "$TEST_WORKDIR" assert_success assert_output --partial "Skipping" assert_output --partial "Resized" } @test "finds ZIPs recursively in subdirectories" { mkdir -p "$TEST_WORKDIR/sub/deep" make_zip "$TEST_WORKDIR/sub/a.zip" "$FIXTURES/unprocessed.jpg" make_zip "$TEST_WORKDIR/sub/deep/b.zip" "$FIXTURES/unprocessed.jpg" run "$SCRIPT" "$TEST_WORKDIR" assert_success assert_equal "$(grep -c 'Resized' <<<"$output")" "2" } @test "processes ZIPs in descending size order" { # Create ZIPs of different sizes by varying image dimensions local small medium large small="$TEST_WORKDIR/small.zip" medium="$TEST_WORKDIR/medium.zip" large="$TEST_WORKDIR/large.zip" convert -size 50x50 xc:gray "$TEST_WORKDIR/s.jpg" convert -size 100x100 xc:gray "$TEST_WORKDIR/m.jpg" convert -size 200x200 xc:gray "$TEST_WORKDIR/l.jpg" (cd "$TEST_WORKDIR" && zip -q small.zip s.jpg) (cd "$TEST_WORKDIR" && zip -q medium.zip m.jpg) (cd "$TEST_WORKDIR" && zip -q large.zip l.jpg) run "$SCRIPT" "$TEST_WORKDIR" assert_success # Extract the order ZIPs were processed from the output local order order=$(grep 'Processing file' <<<"$output" | grep -o '[a-z]*.zip' | tr '\n' ' ') assert_equal "$order" "large.zip medium.zip small.zip " } @test "no temp files left in /dev/shm after recursive run" { make_zip "$TEST_WORKDIR/a.zip" "$FIXTURES/unprocessed.jpg" make_zip "$TEST_WORKDIR/b.zip" "$FIXTURES/processed.jpg" local before after before=$(find /dev/shm -maxdepth 1 -name 'tmp.*' | sort) run "$SCRIPT" "$TEST_WORKDIR" after=$(find /dev/shm -maxdepth 1 -name 'tmp.*' | sort) assert_equal "$before" "$after" }