]> git.wincent.com - mkdtemp.git/blob - spec/mkdtemp_spec.rb
Teach mkdtemp to take optional block parameter
[mkdtemp.git] / spec / mkdtemp_spec.rb
1 # Copyright 2008-2010 Wincent Colaiuta. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are met:
5 #
6 # 1. Redistributions of source code must retain the above copyright notice,
7 #    this list of conditions and the following disclaimer.
8 # 2. Redistributions in binary form must reproduce the above copyright notice,
9 #    this list of conditions and the following disclaimer in the documentation
10 #    and/or other materials provided with the distribution.
11 #
12 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
13 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
16 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
18 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
19 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
20 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22 # POSSIBILITY OF SUCH DAMAGE.
23
24 require File.join(File.dirname(__FILE__), 'spec_helper')
25
26 describe 'Dir.mkdtemp' do
27   before do
28     if not File.exist? '/tmp'
29       pending "cannot run spec because '/tmp' does not exist"
30     elsif not File.directory? '/tmp'
31       pending "cannot run spec because '/tmp' is not a directory"
32     elsif not File.writable? '/tmp'
33       pending "cannot run spec because '/tmp' is not writeable"
34     end
35   end
36
37   it 'should return the modified template path' do
38     path = Dir.mkdtemp
39     path.should be_kind_of(String)
40     path.should_not == '/tmp/temp.XXXXXX'
41   end
42
43   it 'should create the directory corresponding to the template' do
44     path = Dir.mkdtemp
45     File.exist?(path).should == true
46     File.directory?(path).should == true
47   end
48
49   it 'should create the directory with write permissions' do
50     path = Dir.mkdtemp
51     File.writable?(path).should == true
52   end
53
54   it 'should create the directory with read permissions' do
55     path = Dir.mkdtemp
56     File.readable?(path).should == true
57   end
58
59   it 'should create the directory with secure ownership (same user as caller)' do
60     path = Dir.mkdtemp
61     File.owned?(path).should == true
62   end
63
64   it 'should complain if passed a template that includes non-existentent parent directories' do
65     non_existent_dir = '/temp-which-does-not-exist'
66     if File.exist? non_existent_dir
67       pending "cannot run because '#{non_existent_dir}' exists"
68     end
69     lambda { Dir.mkdtemp "/#{non_existent_dir}/temp.XXXXXX" }.should raise_error(SystemCallError)
70   end
71
72   it 'should use "/tmp/temp.XXXXXX" as a template if passed nil' do
73     path = Dir.mkdtemp
74     path.should match(%r{\A/tmp/temp\..{6}\z})
75     path.should_not == '/tmp/temp.XXXXXX'
76   end
77
78   it 'should use substitute random characters for the trailing "Xs" in the template' do
79     path = Dir.mkdtemp '/tmp/test.XXXXXX'
80     path.should_not == '/tmp/test.XXXXXX'
81   end
82
83   it 'should leave the prefix portion of the template unchanged' do
84     path = Dir.mkdtemp '/tmp/test.XXXXXX'
85     path.should match(%r{\A/tmp/test\..{6}\z})
86   end
87
88   context 'with optional block parameter' do
89     it 'performs a Dir.chdir into the created directory' do
90       cd_path = nil
91       path = Dir.mkdtemp do
92         cd_path = Dir.pwd
93       end
94       Pathname.new(path).realpath.should == Pathname.new(cd_path).realpath
95     end
96
97     it 'lets exceptions bubble up to calling context' do
98       expect do
99         Dir.mkdtemp do
100           raise 'bubble'
101         end
102       end.to raise_error(/bubble/)
103     end
104
105     it 'preserves current directory even when an exception occurs' do
106       path = Dir.pwd
107       begin
108         Dir.mkdtemp do
109           raise 'error'
110         end
111       rescue
112       end
113       Dir.pwd.should == path
114     end
115   end
116 end