jm81-svn-fixture 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,65 @@
1
+ module SvnFixture
2
+ # A Revision of the Repository. It can be added via Repository#revision to
3
+ # a specific Repository
4
+ #
5
+ # repo = SvnFixture::Repository.get('test') do
6
+ # revision(1, 'log msg')
7
+ # end
8
+ # repo.commit
9
+ #
10
+ # or specified in Repository#commit:
11
+ #
12
+ # rev = SvnFixture::Revision.new(1, 'log msg')
13
+ # SvnFixture::Repository.get('test').commit(rev)
14
+ class Revision
15
+ attr_reader :name
16
+
17
+ # Initialize a Revision (normally called by Repository#revision).
18
+ #
19
+ # - +name+: A name of the Revision, can be given in Array to
20
+ # Repository#commit instead of the Revision itself. Can be a revision
21
+ # number, but this does not affect the actual revision number in the
22
+ # Subversion repository.
23
+ # - +message+: Log message. Defaults to empty String.
24
+ # - +options+:
25
+ # - +:author+: The Revision's author
26
+ # - +:date+: The date and time of the commit
27
+ # - Optionally accepts a block. The block, if given, is run at the time
28
+ # #commit is called, within the context of the root directory of the
29
+ # Repository, which is an instance of SvnFixture::Directory. For example:
30
+ #
31
+ # SvnFixture::Revision.new(1, 'log msg') do
32
+ # dir('test') # Or any other SvnFixture::Directory instance method.
33
+ # end
34
+ def initialize(name, message = "", options = {}, &block)
35
+ @name, @message, @block = name, message, block
36
+ @author = options.delete(:author)
37
+ @date = SvnFixture.svn_time(options.delete(:date))
38
+ end
39
+
40
+ # Processes the changes made in this revision. Normally these would be made
41
+ # in a block given to Revision.new. #commit runs that block against the root
42
+ # directory of the working copy. This method is usually called by
43
+ # Repository#commit instead of directly. Also sets Revision properties for
44
+ # log message and, optionally, author and date, based on arguments
45
+ # to +.new+. If there are no changes, the commit fails and a warning to that
46
+ # effect.
47
+ #
48
+ # Only argument is an instance of SvnFixture::Repository that is the
49
+ # Repository to which this revision is committed.
50
+ def commit(repo)
51
+ root = Directory.new(repo.ctx, repo.wc_path)
52
+ root.instance_eval(&@block) if @block
53
+ ci = repo.ctx.ci(repo.wc_path)
54
+ unless ci.revision == Svn::Core::INVALID_REVNUM
55
+ rev = ci.revision
56
+ repo.repos.fs.set_prop('svn:log', @message, rev) if @message
57
+ repo.repos.fs.set_prop('svn:author', @author, rev) if @author
58
+ repo.repos.fs.set_prop('svn:date', @date, rev) if @date
59
+ else
60
+ puts "Warning: No change in revision #{name} (SvnFixture::Revision#commit)"
61
+ end
62
+ return true
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec'
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ require 'svn-fixture'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "SvnFixture.config" do
4
+ before(:each) do
5
+ # Force to default state
6
+ SvnFixture.instance_variable_set(:@config, nil)
7
+ end
8
+
9
+ after(:all) do
10
+ # Force to default state for other specs
11
+ SvnFixture.instance_variable_set(:@config, nil)
12
+ end
13
+
14
+ it 'should initialize with CONFIG_DEFAULTS' do
15
+ SvnFixture.config.should == SvnFixture::CONFIG_DEFAULTS
16
+ end
17
+
18
+ it 'should be writable' do
19
+ SvnFixture.config[:base_path] = '/tmp/elsewhere'
20
+ SvnFixture.instance_variable_get(:@config)[:base_path].
21
+ should == '/tmp/elsewhere'
22
+ end
23
+
24
+ describe ':base_path' do
25
+ it 'should default to "#{Dir.tmpdir)/#{svn-fixture}"' do
26
+ SvnFixture.config[:base_path].should == File.join(Dir.tmpdir, 'svn-fixture')
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,194 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe SvnFixture::Directory do
4
+ before(:each) do
5
+ @klass = SvnFixture::Directory
6
+ SvnFixture::Repository.destroy_all
7
+
8
+ # Set up repo
9
+ @repos = SvnFixture::repo('dir_test') do
10
+ revision(1, 'create directory and file') do
11
+ dir('test-dir') do
12
+ dir('subdir')
13
+ file('file.txt')
14
+ end
15
+ end
16
+ end
17
+ @repos.commit
18
+ @repos_path = @repos.instance_variable_get(:@repos_path)
19
+ @wc_path = @repos.instance_variable_get(:@wc_path)
20
+ @ctx = @repos.ctx
21
+ end
22
+
23
+ before(:each) do
24
+ @path = File.join(@wc_path, 'test-dir')
25
+ @full_repos_path = "file://#{File.join(@repos_path, 'test-dir')}"
26
+ @dir = @klass.new(@ctx, @path)
27
+ end
28
+
29
+ after(:all) do
30
+ SvnFixture::Repository.destroy_all
31
+ end
32
+
33
+ describe '#initialize' do
34
+ it 'should set ctx and path' do
35
+ dir = @klass.new(@ctx, '/tmp/path/')
36
+ dir.instance_variable_get(:@ctx).should == @ctx
37
+ dir.instance_variable_get(:@path).should == '/tmp/path/'
38
+ end
39
+
40
+ it 'should add a trailing slash to path if needed' do
41
+ dir = @klass.new(@ctx, '/tmp/path')
42
+ dir.instance_variable_get(:@path).should == '/tmp/path/'
43
+ end
44
+ end
45
+
46
+ describe '#dir' do
47
+ before(:each) do
48
+ @subdir_path = File.join(@path, 'subdir')
49
+ end
50
+
51
+ it 'should create a new directory if needed (and add to Subversion)' do
52
+ new_path = File.join(@path, 'subdir2')
53
+ File.exist?(new_path).should be_false
54
+ new_dir = @dir.dir('subdir2')
55
+ @ctx.commit(@wc_path)
56
+ File.exist?(new_path).should be_true
57
+ @repos.repos.fs.root.dir?('test-dir/subdir2').should be_true
58
+ end
59
+
60
+ it 'should use an existing directory' do
61
+ FileUtils.should_not_receive(:mkdir_p)
62
+ @ctx.should_not_receive(:add)
63
+ @dir.dir('subdir')
64
+ end
65
+
66
+ it 'should setup a new SvnFixture::Directory' do
67
+ SvnFixture::Directory.should_receive(:new).with(@ctx, @subdir_path)
68
+ @dir.dir('subdir')
69
+ end
70
+
71
+ it 'should return the Directory' do
72
+ sub = @dir.dir('subdir')
73
+ sub.should be_kind_of(SvnFixture::Directory)
74
+ sub.instance_variable_get(:@path).should == @subdir_path + '/'
75
+ end
76
+
77
+ it 'should run block if given' do
78
+ SvnFixture::File.should_receive(:new).with(@ctx, File.join(@subdir_path, 'test.txt'))
79
+ @dir.dir('subdir') do
80
+ file('test.txt')
81
+ end
82
+ end
83
+ end
84
+
85
+ describe '#file' do
86
+ before(:each) do
87
+ @file_path = File.join(@path, 'file.txt')
88
+ end
89
+
90
+ it 'should create a new file if needed (and add to Subversion)' do
91
+ new_path = File.join(@path, 'file2.txt')
92
+ File.exist?(new_path).should be_false
93
+ f = @dir.file('file2.txt')
94
+ @ctx.commit(@wc_path)
95
+ File.exist?(new_path).should be_true
96
+ @repos.repos.fs.root.file?('test-dir/file2.txt').should be_true
97
+ end
98
+
99
+ it 'should use an existing file' do
100
+ FileUtils.should_not_receive(:touch)
101
+ @ctx.should_not_receive(:add)
102
+ @dir.file('file.txt')
103
+ end
104
+
105
+ it 'should setup a new SvnFixture::File' do
106
+ SvnFixture::File.should_receive(:new).with(@ctx, @file_path)
107
+ @dir.file('file.txt')
108
+ end
109
+
110
+ it 'should return the File' do
111
+ f = @dir.file('file.txt')
112
+ f.should be_kind_of(SvnFixture::File)
113
+ f.instance_variable_get(:@path).should == @file_path
114
+ end
115
+
116
+ it 'should run block if given' do
117
+ @dir.file('file.txt') do
118
+ body('Test')
119
+ end
120
+ File.read(@file_path).should == 'Test'
121
+ end
122
+ end
123
+
124
+ describe '#move' do
125
+ before(:each) do
126
+ @file_path = File.join(@path, 'file.txt')
127
+ end
128
+
129
+ it 'should move node in FS and Subversion' do
130
+ new_path = File.join(@path, 'subdir', 'file2.txt')
131
+ File.exist?(new_path).should be_false
132
+ File.exist?(@file_path).should be_true
133
+ @dir.move('file.txt', 'subdir/file2.txt')
134
+ File.exist?(new_path).should be_true
135
+ File.exist?(@file_path).should be_false
136
+ @ctx.commit(@wc_path)
137
+ @repos.repos.fs.root.file?('test-dir/file.txt').should be_false
138
+ @repos.repos.fs.root.file?('test-dir/subdir/file2.txt').should be_true
139
+ end
140
+ end
141
+
142
+ describe '#copy' do
143
+ before(:each) do
144
+ @file_path = File.join(@path, 'file.txt')
145
+ end
146
+
147
+ it 'should copy node in FS and Subversion' do
148
+ new_path = File.join(@path, 'subdir', 'file2.txt')
149
+ File.exist?(new_path).should be_false
150
+ File.exist?(@file_path).should be_true
151
+ @dir.copy('file.txt', 'subdir/file2.txt')
152
+ File.exist?(new_path).should be_true
153
+ File.exist?(@file_path).should be_true
154
+ @ctx.commit(@wc_path)
155
+ @repos.repos.fs.root.file?('test-dir/file.txt').should be_true
156
+ @repos.repos.fs.root.file?('test-dir/subdir/file2.txt').should be_true
157
+ end
158
+ end
159
+
160
+ describe '#delete' do
161
+ before(:each) do
162
+ @file_path = File.join(@path, 'file.txt')
163
+ end
164
+
165
+ it 'should copy node in FS and Subversion' do
166
+ File.exist?(@file_path).should be_true
167
+ @dir.delete('file.txt')
168
+ File.exist?(@file_path).should be_false
169
+ @ctx.commit(@wc_path)
170
+ @repos.repos.fs.root.file?('test-dir/file.txt').should be_false
171
+ end
172
+ end
173
+
174
+ describe '#prop' do
175
+ it 'should set a property' do
176
+ @dir.prop('prop:name', 'Prop Value')
177
+ rev = @ctx.ci(@wc_path).revision
178
+ @ctx.propget('prop:name', @path, rev)[@full_repos_path].should ==
179
+ 'Prop Value'
180
+
181
+ @dir.prop('prop:name', 'New Value')
182
+ rev = @ctx.ci(@wc_path).revision
183
+ @ctx.propget('prop:name', @path, rev)[@full_repos_path].should ==
184
+ 'New Value'
185
+ end
186
+
187
+ it 'should format a Time correctly' do
188
+ @dir.prop('prop:timeval', Time.parse('2009-06-18 14:00'))
189
+ rev = @ctx.ci(@wc_path).revision
190
+ @ctx.propget('prop:timeval', @path, rev)[@full_repos_path].should ==
191
+ '2009-06-18T14:00:00.000000Z'
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,65 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe SvnFixture::File do
4
+ before(:all) do
5
+ @klass = SvnFixture::File
6
+ SvnFixture::Repository.destroy_all
7
+
8
+ # Set up repo
9
+ @repos = SvnFixture::repo('file_test') do
10
+ revision(1, 'create file') do
11
+ file('test.txt')
12
+ end
13
+ end
14
+ @repos.commit
15
+ @repos_path = @repos.instance_variable_get(:@repos_path)
16
+ @wc_path = @repos.instance_variable_get(:@wc_path)
17
+ @ctx = @repos.ctx
18
+ end
19
+
20
+ before(:each) do
21
+ @path = File.join(@wc_path, 'test.txt')
22
+ @full_repos_path = "file://#{File.join(@repos_path, 'test.txt')}"
23
+ @file = @klass.new(@ctx, @path)
24
+ end
25
+
26
+ after(:all) do
27
+ SvnFixture::Repository.destroy_all
28
+ end
29
+
30
+ describe '#initialize' do
31
+ it 'should set ctx and path' do
32
+ file = @klass.new(@ctx, '/tmp/path')
33
+ file.instance_variable_get(:@ctx).should == @ctx
34
+ file.instance_variable_get(:@path).should == '/tmp/path'
35
+ end
36
+ end
37
+
38
+ describe '#prop' do
39
+ it 'should set a property' do
40
+ @file.prop('prop:name', 'Prop Value')
41
+ rev = @ctx.ci(@wc_path).revision
42
+ @ctx.propget('prop:name', @path, rev)[@full_repos_path].should ==
43
+ 'Prop Value'
44
+
45
+ @file.prop('prop:name', 'New Value')
46
+ rev = @ctx.ci(@wc_path).revision
47
+ @ctx.propget('prop:name', @path, rev)[@full_repos_path].should ==
48
+ 'New Value'
49
+ end
50
+
51
+ it 'should format a Time correctly' do
52
+ @file.prop('prop:timeval', Time.parse('2009-06-18 14:00'))
53
+ rev = @ctx.ci(@wc_path).revision
54
+ @ctx.propget('prop:timeval', @path, rev)[@full_repos_path].should ==
55
+ '2009-06-18T14:00:00.000000Z'
56
+ end
57
+ end
58
+
59
+ describe '#body' do
60
+ it "should update the File's contents" do
61
+ @file.body('Test Content')
62
+ File.read(@path).should == 'Test Content'
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,43 @@
1
+ # For use by integration_spec
2
+
3
+ SvnFixture::repo('hello_world') do
4
+ revision(1, 'Create directories',
5
+ :date => Time.parse('2009-01-01 12:00:00Z')) do
6
+ dir 'app'
7
+ dir 'docs'
8
+ dir 'lib'
9
+ end
10
+
11
+ revision 2, 'Add some files' do
12
+ dir 'app' do
13
+ prop 'full_name', 'Application'
14
+
15
+ file 'hello.rb' do
16
+ prop 'is_ruby', 'Yes'
17
+ body 'puts "Hello World"'
18
+ end
19
+
20
+ file 'goodbye.rb' do
21
+ body 'puts "Goodbye World"'
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ SvnFixture::repo('hello_world') do
28
+ revision 3, 'Edit hello.rb', :author => "the.author" do
29
+ dir 'app' do
30
+ file 'hello.rb' do
31
+ prop 'is_ruby', 'Probably'
32
+ body 'puts "Howdy World"'
33
+ end
34
+ end
35
+ end
36
+
37
+ revision 4, 'Copy and move' do
38
+ dir 'app' do
39
+ move 'goodbye.rb', 'bye.rb'
40
+ copy 'hello.rb', 'hello2.rb'
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,102 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ # Test again fixtures/hello_world.rb to follow a complete fixture generation.
4
+ describe 'SvnFixture integration' do
5
+ before(:all) do
6
+ SvnFixture::Repository.instance_variable_set(:@repositories, {})
7
+ load File.dirname(__FILE__) + '/fixtures/hello_world.rb'
8
+ SvnFixture::repo('hello_world').commit
9
+ repos_path = File.join(Dir.tmpdir, 'svn-fixture', 'repo_hello_world')
10
+ @repos = ::Svn::Repos.open(repos_path)
11
+ @fs = @repos.fs
12
+ end
13
+
14
+ after(:all) do
15
+ SvnFixture::Repository.destroy_all
16
+ end
17
+
18
+ describe 'revision 1' do
19
+ before(:each) do
20
+ @root = @fs.root(1)
21
+ end
22
+
23
+ it 'should have 3 directories' do
24
+ @root.dir?('app').should be_true
25
+ @root.dir?('docs').should be_true
26
+ @root.dir?('lib').should be_true
27
+ end
28
+
29
+ it 'should not have files' do
30
+ @root.file?('app/hello.rb').should be_false
31
+ end
32
+
33
+ it 'should have specified date at rev 1' do
34
+ @fs.prop(Svn::Core::PROP_REVISION_DATE, 1).should ==
35
+ Time.parse('2009-01-01 12:00:00Z')
36
+ end
37
+ end
38
+
39
+ describe 'revision 2' do
40
+ before(:each) do
41
+ @root = @fs.root(2)
42
+ end
43
+
44
+ it 'should have files' do
45
+ @root.file?('app/hello.rb').should be_true
46
+ @root.file_contents('app/hello.rb') do |f|
47
+ f.read.should == 'puts "Hello World"'
48
+ end
49
+ @root.file?('app/goodbye.rb').should be_true
50
+ end
51
+
52
+ it 'should have property for hello.rb' do
53
+ @root.node_proplist('app/hello.rb')['is_ruby'].should == 'Yes'
54
+ end
55
+ end
56
+
57
+ describe 'revision 3' do
58
+ before(:each) do
59
+ @root = @fs.root(3)
60
+ end
61
+
62
+ it 'should change text for hello.rb' do
63
+ @root.file_contents('app/hello.rb') do |f|
64
+ f.read.should == 'puts "Howdy World"'
65
+ end
66
+ end
67
+
68
+ it 'should change property for hello.rb' do
69
+ @root.node_proplist('app/hello.rb')['is_ruby'].should == 'Probably'
70
+ end
71
+
72
+ it 'should set author' do
73
+ @fs.prop(Svn::Core::PROP_REVISION_AUTHOR, 3).should ==
74
+ 'the.author'
75
+ end
76
+ end
77
+
78
+ describe 'revision 4' do
79
+ before(:each) do
80
+ @root = @fs.root(4)
81
+ end
82
+
83
+ it 'should copy/move files' do
84
+ @root.file?('app/hello.rb').should be_true
85
+ @root.file?('app/hello2.rb').should be_true
86
+ @root.file_contents('app/hello2.rb') do |f|
87
+ f.read.should == 'puts "Howdy World"'
88
+ end
89
+ @root.file?('app/goodbye.rb').should be_false
90
+ @root.file?('app/bye.rb').should be_true
91
+ end
92
+
93
+ it 'should have expected dirs, files' do
94
+ @root.dir?('app').should be_true
95
+ @root.file?('app/hello.rb').should be_true
96
+ @root.file?('app/hello2.rb').should be_true
97
+ @root.file?('app/bye.rb').should be_true
98
+ @root.dir?('docs').should be_true
99
+ @root.dir?('lib').should be_true
100
+ end
101
+ end
102
+ end