dm-svn 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,213 @@
1
+ require 'spec_helper'
2
+ require 'dm-svn/mock_models'
3
+
4
+ describe DmSvn::Svn do
5
+ before(:all) do
6
+ DmSvn::Model.auto_migrate!
7
+ MockArticle.auto_migrate!
8
+ end
9
+
10
+ before(:each) do
11
+ @article = MockArticle.new
12
+ end
13
+
14
+ it "should add svn_* properties" do
15
+ fields = %w{name created_at updated_at created_rev updated_rev created_by updated_by}
16
+ fields.each do | field |
17
+ MockArticleNoSvn.properties["svn_#{field}"].should be_nil
18
+ MockArticle.properties["svn_#{field}"].should be_kind_of(DataMapper::Property)
19
+ end
20
+ end
21
+
22
+ it "should assign @config to an instance of DmSvn::Config" do
23
+ c = MockArticle.config
24
+ c.should be_kind_of(DmSvn::Config)
25
+ c.should be(MockArticle.config)
26
+ end
27
+
28
+ it "should add an :body_property options to including class" do
29
+ MockArticle.config.body_property.should == "contents"
30
+ end
31
+
32
+ it "should alias svn_name as name" do
33
+ m = MockArticle.new
34
+ m.svn_name = 'path/to/name'
35
+ m.name.should == 'path/to/name'
36
+ end
37
+
38
+ it "should alias svn_name as path" do
39
+ m = MockArticle.new
40
+ m.svn_name = 'path/to/name'
41
+ m.path.should == 'path/to/name'
42
+ end
43
+
44
+ describe '#path=' do
45
+ it "should set svn_name" do
46
+ @article.should_receive(:attribute_set).with(:svn_name, 'short/path')
47
+ @article.path = 'short/path'
48
+ end
49
+ end
50
+
51
+ describe '#update_from_svn' do
52
+ before(:each) do
53
+ @node = mock(DmSvn::Svn::Node)
54
+ end
55
+
56
+ it 'should update path, body and other properties' do
57
+ @node.should_receive(:body).twice.and_return('body')
58
+ @node.should_receive(:short_path).and_return('short/path')
59
+ @node.should_receive(:properties).and_return(
60
+ {'title' => 'Title', 'svn_updated_by' => 'jmorgan'}
61
+ )
62
+
63
+ @article.should_receive(:attribute_set).with(:svn_name, 'short/path')
64
+ @article.should_receive(:attribute_set).with('contents', 'body')
65
+ @article.should_receive(:title=).with('Title')
66
+ @article.should_receive(:svn_updated_by=).with('jmorgan')
67
+
68
+ @article.should_receive(:save)
69
+ @article.update_from_svn(@node)
70
+ end
71
+
72
+ end
73
+
74
+ describe "#move_to" do
75
+ it 'should update the path and save' do
76
+ @article.should_receive(:path=).with('new/path')
77
+ @article.should_receive(:save)
78
+ @article.move_to('new/path')
79
+ end
80
+ end
81
+
82
+ describe ".svn_repository" do
83
+ before(:each) do
84
+ @svn_model = mock(DmSvn::Model)
85
+ @svn_model.stub!(:config=)
86
+ MockArticle.instance_variable_set("@svn_repository", nil)
87
+ end
88
+
89
+ it "should return an already set repository" do
90
+ DmSvn::Model.should_not_receive(:first)
91
+ DmSvn::Model.should_not_receive(:create)
92
+ MockArticle.instance_variable_set("@svn_repository", @svn_model)
93
+ MockArticle.svn_repository.should be(@svn_model)
94
+ end
95
+
96
+ it "should find an existing DmSvn::Model" do
97
+ DmSvn::Model.should_receive(:first).with(:name => 'MockArticle').
98
+ and_return(@svn_model)
99
+ DmSvn::Model.should_not_receive(:create)
100
+ MockArticle.svn_repository.should be(@svn_model)
101
+ end
102
+
103
+ it "should create an new DmSvn::Model if needed" do
104
+ DmSvn::Model.should_receive(:first).with(:name => 'MockArticle').
105
+ and_return(nil)
106
+ DmSvn::Model.should_receive(:create).with(:name => 'MockArticle', :revision => 0).
107
+ and_return(@svn_model)
108
+ MockArticle.svn_repository.should be(@svn_model)
109
+ end
110
+
111
+ it "should really create a new DmSvn::Model" do
112
+ DmSvn::Model.all.each {|m| m.destroy }
113
+ DmSvn::Model.count.should == 0
114
+ MockArticle.svn_repository
115
+ DmSvn::Model.count.should == 1
116
+ MockArticle.instance_variable_set("@svn_repository", nil)
117
+ MockArticle.svn_repository
118
+ DmSvn::Model.count.should == 1
119
+ end
120
+
121
+ it "should assign @config to the DmSvn::Model" do
122
+ DmSvn::Model.should_receive(:first).with(:name => 'MockArticle').
123
+ and_return(@svn_model)
124
+ @svn_model.should_receive(:config=).with(MockArticle.config)
125
+ MockArticle.svn_repository
126
+ end
127
+
128
+ it "should run sync" do
129
+ DmSvn::Model.should_receive(:first).with(:name => 'MockArticle').
130
+ and_return(@svn_model)
131
+ sync = mock(DmSvn::Svn::Sync)
132
+ DmSvn::Svn::Sync.should_receive(:new).with(@svn_model).and_return(sync)
133
+ sync.should_receive(:run)
134
+ MockArticle.sync
135
+ end
136
+
137
+ end
138
+
139
+ describe ".get" do
140
+ it "should get instance by path" do
141
+ MockArticle.should_receive(:get_by_path).
142
+ with('path/to/name').
143
+ and_return(nil)
144
+
145
+ MockArticle.get('path/to/name')
146
+ end
147
+
148
+ it "should get instance by id" do
149
+ MockArticle.should_not_receive(:get_by_path)
150
+ MockArticle.should_receive(:first).and_return(nil)
151
+ MockArticle.get(1)
152
+ end
153
+ end
154
+
155
+ describe ".get_or_create" do
156
+ it "should get an existing instance by path" do
157
+ MockArticle.should_receive(:get_by_path).
158
+ with('path/to/name').
159
+ and_return(1)
160
+
161
+ MockArticle.get_or_create('path/to/name').should == 1
162
+ end
163
+
164
+ it "should create a new instance, setting path" do
165
+ MockArticle.should_receive(:get_by_path).
166
+ with('path/to/name').
167
+ and_return(nil)
168
+
169
+ m = MockArticle.new
170
+ MockArticle.should_receive(:create).and_return(m)
171
+
172
+ MockArticle.get_or_create('path/to/name')
173
+ m.path.should == 'path/to/name'
174
+ end
175
+ end
176
+
177
+ describe ".get_by_path" do
178
+ it "should get an instance by path" do
179
+ MockArticle.should_receive(:first).
180
+ with(:svn_name => 'path/to/name').
181
+ and_return(nil)
182
+
183
+ MockArticle.get_by_path('path/to/name')
184
+ end
185
+ end
186
+
187
+ describe "hooks" do
188
+ it "should update svn_created_* properties before create" do
189
+ a = MockArticle.new
190
+
191
+ a.svn_updated_at = Time.parse("2008-08-10 05:00:00")
192
+ a.svn_updated_rev = 10
193
+ a.svn_updated_by = "jmorgan"
194
+ a.save
195
+
196
+ at = a.svn_updated_at
197
+
198
+ a.svn_created_at.should == at
199
+ a.svn_created_rev.should == 10.to_s
200
+ a.svn_created_by.should == "jmorgan"
201
+
202
+ a.svn_updated_at = Time.parse("2008-08-12 05:00:00")
203
+ a.svn_updated_rev = 12
204
+ a.svn_updated_by = "someone_else"
205
+ a.save
206
+
207
+ # should not have changed.
208
+ a.svn_created_at.should == at
209
+ a.svn_created_rev.should == 10.to_s
210
+ a.svn_created_by.should == "jmorgan"
211
+ end
212
+ end
213
+ end
data/spec/spec.opts ADDED
File without changes
@@ -0,0 +1,23 @@
1
+ require 'spec'
2
+ require 'dm-svn'
3
+
4
+ gem 'jm81-svn-fixture'
5
+ require 'svn-fixture'
6
+
7
+ DataMapper.setup(:default, 'sqlite3::memory:')
8
+
9
+ Spec::Runner.configure do |config|
10
+
11
+ end
12
+
13
+ # for temporarily disabling one set of specs.
14
+ def dont_describe(*args)
15
+ nil
16
+ end
17
+
18
+ # Load a fixture and return the repos uri.
19
+ def load_svn_fixture(name)
20
+ script = File.expand_path(File.join(File.dirname(__FILE__), "dm-svn", "fixtures", "#{name}.rb" ))
21
+ load script
22
+ return SvnFixture.repo(name).uri + "/articles"
23
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dm-svn
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Jared Morgan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-11 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: dm-core
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.10.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: dm-aggregates
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.10.0
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: dm-validations
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.10.0
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: jm81-svn-fixture
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.1.1
54
+ version:
55
+ description: |-
56
+ dm-svn allows you to store data in a Subversion
57
+ repository, then sync that data to a DataMapper model (for example, to a
58
+ relational database. Essentially, it allows you app quicker access to the
59
+ Subversion data.
60
+ email: jmorgan@morgancreative.net
61
+ executables: []
62
+
63
+ extensions: []
64
+
65
+ extra_rdoc_files: []
66
+
67
+ files:
68
+ - .gitignore
69
+ - Rakefile
70
+ - VERSION
71
+ - dm-svn.gemspec
72
+ - lib/dm-svn.rb
73
+ - lib/dm-svn/config.rb
74
+ - lib/dm-svn/model.rb
75
+ - lib/dm-svn/svn.rb
76
+ - lib/dm-svn/svn/categorized.rb
77
+ - lib/dm-svn/svn/changeset.rb
78
+ - lib/dm-svn/svn/node.rb
79
+ - lib/dm-svn/svn/sync.rb
80
+ - spec/dm-svn/config_spec.rb
81
+ - spec/dm-svn/database.yml
82
+ - spec/dm-svn/fixtures/articles_comments.rb
83
+ - spec/dm-svn/mock_models.rb
84
+ - spec/dm-svn/model_spec.rb
85
+ - spec/dm-svn/spec_helper.rb
86
+ - spec/dm-svn/svn/categorized_spec.rb
87
+ - spec/dm-svn/svn/changeset_spec.rb
88
+ - spec/dm-svn/svn/node_spec.rb
89
+ - spec/dm-svn/svn/sync_spec.rb
90
+ - spec/dm-svn/svn_spec.rb
91
+ - spec/spec.opts
92
+ - spec/spec_helper.rb
93
+ has_rdoc: true
94
+ homepage: http://github.com/jm81/dm-svn
95
+ licenses: []
96
+
97
+ post_install_message:
98
+ rdoc_options:
99
+ - --charset=UTF-8
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: "0"
107
+ version:
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: "0"
113
+ version:
114
+ requirements: []
115
+
116
+ rubyforge_project:
117
+ rubygems_version: 1.3.5
118
+ signing_key:
119
+ specification_version: 3
120
+ summary: Sync content from a Subversion repository to a DataMapper model
121
+ test_files:
122
+ - spec/dm-svn/config_spec.rb
123
+ - spec/dm-svn/fixtures/articles_comments.rb
124
+ - spec/dm-svn/mock_models.rb
125
+ - spec/dm-svn/model_spec.rb
126
+ - spec/dm-svn/spec_helper.rb
127
+ - spec/dm-svn/svn/categorized_spec.rb
128
+ - spec/dm-svn/svn/changeset_spec.rb
129
+ - spec/dm-svn/svn/node_spec.rb
130
+ - spec/dm-svn/svn/sync_spec.rb
131
+ - spec/dm-svn/svn_spec.rb
132
+ - spec/spec_helper.rb