Skip to content

Commit 27846fb

Browse files
Tolerate temporary directory cleanup failures
1 parent 9540e78 commit 27846fb

3 files changed

Lines changed: 68 additions & 2 deletions

File tree

lib/sus/fixtures/temporary_directory_context.rb

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# Copyright, 2025-2026, by Samuel Williams.
55

66
require "tmpdir"
7+
require "fileutils"
78

89
module Sus
910
module Fixtures
@@ -12,16 +13,29 @@ module TemporaryDirectoryContext
1213
# Set up a temporary directory before the test and clean it up after.
1314
# @yields {|&block| ...} The test block to execute.
1415
def around(&block)
15-
Dir.mktmpdir do |root|
16+
root = Dir.mktmpdir
17+
18+
begin
1619
@root = root
20+
1721
super(&block)
22+
ensure
1823
@root = nil
24+
25+
# Ignore failures:
26+
remove_temporary_directory(root) rescue nil
1927
end
2028
end
2129

2230
# @attribute [String] The path to the temporary directory root.
2331
attr :root
32+
33+
private
34+
35+
# Remove the temporary directory recursively.
36+
def remove_temporary_directory(root)
37+
FileUtils.rm_rf(root)
38+
end
2439
end
2540
end
2641
end
27-

releases.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Releases
22

3+
## Unreleased
4+
5+
- Make `Sus::Fixtures::TemporaryDirectoryContext` ignore temporary directory cleanup failures.
6+
37
## v0.37.1
48

59
- Fixed `Sus::Mock#wrap` to forward blocks to the original method, and fixed `receive(...).with_block(...)` to use the supplied predicate.

test/sus/fixtures/temporary_directory_context.rb

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
describe Sus::Fixtures::TemporaryDirectoryContext do
99
include Sus::Fixtures::TemporaryDirectoryContext
1010

11+
let(:assertions) {Sus::Assertions.new(output: Sus::Output.buffered)}
12+
1113
it "creates a temporary directory" do
1214
expect(root).not.to be(:nil?)
1315
expect(root).to be_a(String)
@@ -26,4 +28,50 @@
2628
expect(File.exist?(test_file)).to be == true
2729
expect(File.read(test_file)).to be == "test content"
2830
end
31+
32+
it "removes the temporary directory after use" do
33+
context = Sus.base("temporary directory")
34+
context.include(Sus::Fixtures::TemporaryDirectoryContext)
35+
instance = context.new(assertions)
36+
37+
root = nil
38+
39+
instance.around do
40+
root = instance.root
41+
42+
expect(File.directory?(root)).to be == true
43+
end
44+
45+
expect(File.exist?(root)).to be == false
46+
end
47+
48+
it "tolerates already removed temporary directories" do
49+
context = Sus.base("temporary directory")
50+
context.include(Sus::Fixtures::TemporaryDirectoryContext)
51+
instance = context.new(assertions)
52+
53+
root = Dir.mktmpdir
54+
FileUtils.rm_rf(root)
55+
56+
expect do
57+
instance.send(:remove_temporary_directory, root)
58+
end.not.to raise_exception
59+
end
60+
61+
it "ignores cleanup failures" do
62+
context = Sus.base("temporary directory")
63+
context.include(Sus::Fixtures::TemporaryDirectoryContext)
64+
instance = context.new(assertions)
65+
66+
root = Dir.mktmpdir
67+
68+
expect(instance).to receive(:remove_temporary_directory).and_raise(Errno::ENOENT, root)
69+
70+
expect do
71+
instance.around do
72+
end
73+
end.not.to raise_exception
74+
ensure
75+
FileUtils.remove_entry(root) if root && File.exist?(root)
76+
end
2977
end

0 commit comments

Comments
 (0)