active-fedora 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (246) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/.hg/00changelog.i +0 -0
  4. data/.hg/branch +1 -0
  5. data/.hg/branch.cache +2 -0
  6. data/.hg/dirstate +0 -0
  7. data/.hg/hgrc +2 -0
  8. data/.hg/requires +2 -0
  9. data/.hg/store/00changelog.i +0 -0
  10. data/.hg/store/00manifest.i +0 -0
  11. data/.hg/store/data/.hgignore.i +0 -0
  12. data/.hg/store/data/.hgtags.i +0 -0
  13. data/.hg/store/data/_c_o_p_y_i_n_g.txt.i +0 -0
  14. data/.hg/store/data/_c_o_y_i_n_g._l_e_s_s_e_r.txt.i +0 -0
  15. data/.hg/store/data/_history.txt.i +0 -0
  16. data/.hg/store/data/_license.txt.i +0 -0
  17. data/.hg/store/data/_manifest.txt.i +0 -0
  18. data/.hg/store/data/_post_install.txt.i +0 -0
  19. data/.hg/store/data/_r_e_a_d_m_e.rdoc.i +0 -0
  20. data/.hg/store/data/_r_e_a_d_m_e.txt.i +0 -0
  21. data/.hg/store/data/_rakefile.i +0 -0
  22. data/.hg/store/data/_v_e_r_s_i_o_n.i +0 -0
  23. data/.hg/store/data/active-fedora.gemspec.i +0 -0
  24. data/.hg/store/data/active__fedora/_history.txt.i +0 -0
  25. data/.hg/store/data/active__fedora/_manifest.txt.i +0 -0
  26. data/.hg/store/data/active__fedora/_post_install.txt.i +0 -0
  27. data/.hg/store/data/active__fedora/_r_e_a_d_m_e.rdoc.i +0 -0
  28. data/.hg/store/data/active__fedora/_rakefile.i +0 -0
  29. data/.hg/store/data/active__fedora/lib/active__fedora.rb.i +0 -0
  30. data/.hg/store/data/active__fedora/script/console.i +0 -0
  31. data/.hg/store/data/active__fedora/script/destroy.i +0 -0
  32. data/.hg/store/data/active__fedora/script/generate.i +0 -0
  33. data/.hg/store/data/active__fedora/spec/active__fedora__spec.rb.i +0 -0
  34. data/.hg/store/data/active__fedora/spec/spec__helper.rb.i +0 -0
  35. data/.hg/store/data/config/fedora.yml.i +0 -0
  36. data/.hg/store/data/config/solr__mappings.yml.i +0 -0
  37. data/.hg/store/data/config/solr__mappings__af__0.1.yml.i +0 -0
  38. data/.hg/store/data/config/solr__mappings__bl__2.4.yml.i +0 -0
  39. data/.hg/store/data/lib/active-fedora.rb.i +0 -0
  40. data/.hg/store/data/lib/active__fedora.rb.i +0 -0
  41. data/.hg/store/data/lib/active__fedora/base.rb.i +0 -0
  42. data/.hg/store/data/lib/active__fedora/content__model.rb.i +0 -0
  43. data/.hg/store/data/lib/active__fedora/datastream.rb.i +0 -0
  44. data/.hg/store/data/lib/active__fedora/fedora__object.rb.i +0 -0
  45. data/.hg/store/data/lib/active__fedora/metadata__datastream.rb.i +0 -0
  46. data/.hg/store/data/lib/active__fedora/model.rb.i +0 -0
  47. data/.hg/store/data/lib/active__fedora/property.rb.i +0 -0
  48. data/.hg/store/data/lib/active__fedora/qualified__dublin__core__datastream.rb.i +0 -0
  49. data/.hg/store/data/lib/active__fedora/relationship.rb.i +0 -0
  50. data/.hg/store/data/lib/active__fedora/rels__ext__datastream.rb.i +0 -0
  51. data/.hg/store/data/lib/active__fedora/semantic__node.rb.i +0 -0
  52. data/.hg/store/data/lib/active__fedora/solr__mapper.rb.i +0 -0
  53. data/.hg/store/data/lib/active__fedora/solr__service.rb.i +0 -0
  54. data/.hg/store/data/lib/fedora/base.rb.i +0 -0
  55. data/.hg/store/data/lib/fedora/connection.rb.i +0 -0
  56. data/.hg/store/data/lib/fedora/datastream.rb.i +0 -0
  57. data/.hg/store/data/lib/fedora/fedora__object.rb.i +0 -0
  58. data/.hg/store/data/lib/fedora/formats.rb.i +0 -0
  59. data/.hg/store/data/lib/fedora/generic__search.rb.i +0 -0
  60. data/.hg/store/data/lib/fedora/repository.rb.i +0 -0
  61. data/.hg/store/data/lib/ruby-fedora.rb.i +0 -0
  62. data/.hg/store/data/lib/util/class__level__inheritable__attributes.rb.i +0 -0
  63. data/.hg/store/data/script/console.i +0 -0
  64. data/.hg/store/data/script/destroy.i +0 -0
  65. data/.hg/store/data/script/generate.i +0 -0
  66. data/.hg/store/data/solr/config/schema-1.5.xml.i +0 -0
  67. data/.hg/store/data/solr/config/schema.xml.i +0 -0
  68. data/.hg/store/data/solr/config/solrconfig-1.5.xml.i +0 -0
  69. data/.hg/store/data/spec/fixtures/changeme155.xml.i +0 -0
  70. data/.hg/store/data/spec/fixtures/dino.jpg.i +0 -0
  71. data/.hg/store/data/spec/fixtures/minivan.jpg.d +0 -0
  72. data/.hg/store/data/spec/fixtures/minivan.jpg.i +0 -0
  73. data/.hg/store/data/spec/fixtures/test__12.foxml.xml.i +0 -0
  74. data/.hg/store/data/spec/integration/active__fedora/base__spec.rb.i +0 -0
  75. data/.hg/store/data/spec/integration/active__fedora/datastream__spec.rb.i +0 -0
  76. data/.hg/store/data/spec/integration/active__fedora/fedora__object__spec.rb.i +0 -0
  77. data/.hg/store/data/spec/integration/active__fedora/full__featured__model__spec.rb.i +0 -0
  78. data/.hg/store/data/spec/integration/active__fedora/model__spec.rb.i +0 -0
  79. data/.hg/store/data/spec/integration/active__fedora/rels__ext__datastream__spec.rb.i +0 -0
  80. data/.hg/store/data/spec/integration/active__fedora/semantic__node__spec.rb.i +0 -0
  81. data/.hg/store/data/spec/integration/base__file__management__spec.rb.i +0 -0
  82. data/.hg/store/data/spec/integration/base__spec.rb.i +0 -0
  83. data/.hg/store/data/spec/integration/bug__spec.rb.i +0 -0
  84. data/.hg/store/data/spec/integration/datastream__spec.rb.i +0 -0
  85. data/.hg/store/data/spec/integration/datastreams__crud__spec.rb.i +0 -0
  86. data/.hg/store/data/spec/integration/fedora__object__spec.rb.i +0 -0
  87. data/.hg/store/data/spec/integration/full__featured__model__spec.rb.i +0 -0
  88. data/.hg/store/data/spec/integration/model__spec.rb.i +0 -0
  89. data/.hg/store/data/spec/integration/rels__ext__datastream__spec.rb.i +0 -0
  90. data/.hg/store/data/spec/integration/repository__spec.rb.i +0 -0
  91. data/.hg/store/data/spec/integration/rf__fedora__object__spec.rb.i +0 -0
  92. data/.hg/store/data/spec/integration/semantic__node__spec.rb.i +0 -0
  93. data/.hg/store/data/spec/integration/solr__service__spec.rb.i +0 -0
  94. data/.hg/store/data/spec/samples/models/audio__record.rb.i +0 -0
  95. data/.hg/store/data/spec/samples/models/image.rb.i +0 -0
  96. data/.hg/store/data/spec/samples/models/oral__history.rb.i +0 -0
  97. data/.hg/store/data/spec/samples/models/seminar.rb.i +0 -0
  98. data/.hg/store/data/spec/samples/models/seminar__audio__file.rb.i +0 -0
  99. data/.hg/store/data/spec/samples/oh__qdc.xml.i +0 -0
  100. data/.hg/store/data/spec/samples/oral__history.rb.i +0 -0
  101. data/.hg/store/data/spec/samples/oral__history__sample.xml.i +0 -0
  102. data/.hg/store/data/spec/samples/oral__history__sample__model.rb.i +0 -0
  103. data/.hg/store/data/spec/samples/oral__history__xml.xml.i +0 -0
  104. data/.hg/store/data/spec/spec.opts.i +0 -0
  105. data/.hg/store/data/spec/spec__helper.rb.i +0 -0
  106. data/.hg/store/data/spec/unit/active__fedora/base__cma__spec.rb.i +0 -0
  107. data/.hg/store/data/spec/unit/active__fedora/base__extra__spec.rb.i +0 -0
  108. data/.hg/store/data/spec/unit/active__fedora/base__spec.rb.i +0 -0
  109. data/.hg/store/data/spec/unit/active__fedora/content__model__spec.rb.i +0 -0
  110. data/.hg/store/data/spec/unit/active__fedora/datastream__spec.rb.i +0 -0
  111. data/.hg/store/data/spec/unit/active__fedora/inheritance__spec.rb.i +0 -0
  112. data/.hg/store/data/spec/unit/active__fedora/metadata__datastream__spec.rb.i +0 -0
  113. data/.hg/store/data/spec/unit/active__fedora/model__spec.rb.i +0 -0
  114. data/.hg/store/data/spec/unit/active__fedora/property__spec.rb.i +0 -0
  115. data/.hg/store/data/spec/unit/active__fedora/qualified__dublin__core__datastream__spec.rb.i +0 -0
  116. data/.hg/store/data/spec/unit/active__fedora/relationship__spec.rb.i +0 -0
  117. data/.hg/store/data/spec/unit/active__fedora/rels__ext__datastream__spec.rb.i +0 -0
  118. data/.hg/store/data/spec/unit/active__fedora/semantic__node__spec.rb.i +0 -0
  119. data/.hg/store/data/spec/unit/active__fedora/solr__service__spec.rb.i +0 -0
  120. data/.hg/store/data/spec/unit/active__fedora__spec.rb.i +0 -0
  121. data/.hg/store/data/spec/unit/base__cma__spec.rb.i +0 -0
  122. data/.hg/store/data/spec/unit/base__datastream__management__spec.rb.i +0 -0
  123. data/.hg/store/data/spec/unit/base__extra__spec.rb.i +0 -0
  124. data/.hg/store/data/spec/unit/base__file__management__spec.rb.i +0 -0
  125. data/.hg/store/data/spec/unit/base__loader__spec.rb.i +0 -0
  126. data/.hg/store/data/spec/unit/base__spec.rb.i +0 -0
  127. data/.hg/store/data/spec/unit/connection__spec.rb.i +0 -0
  128. data/.hg/store/data/spec/unit/content__model__spec.rb.i +0 -0
  129. data/.hg/store/data/spec/unit/datastream__concurrency__spec.rb.i +0 -0
  130. data/.hg/store/data/spec/unit/datastream__spec.rb.i +0 -0
  131. data/.hg/store/data/spec/unit/fedora__object__spec.rb.i +0 -0
  132. data/.hg/store/data/spec/unit/inheritance__spec.rb.i +0 -0
  133. data/.hg/store/data/spec/unit/metadata__datastream__spec.rb.i +0 -0
  134. data/.hg/store/data/spec/unit/model__spec.rb.i +0 -0
  135. data/.hg/store/data/spec/unit/property__spec.rb.i +0 -0
  136. data/.hg/store/data/spec/unit/qualified__dublin__core__datastream__spec.rb.i +0 -0
  137. data/.hg/store/data/spec/unit/relationship__spec.rb.i +0 -0
  138. data/.hg/store/data/spec/unit/rels__ext__datastream__spec.rb.i +0 -0
  139. data/.hg/store/data/spec/unit/repository__spec.rb.i +0 -0
  140. data/.hg/store/data/spec/unit/rf__datastream__spec.rb.i +0 -0
  141. data/.hg/store/data/spec/unit/semantic__node__spec.rb.i +0 -0
  142. data/.hg/store/data/spec/unit/solr__config__options__spec.rb.i +0 -0
  143. data/.hg/store/data/spec/unit/solr__mapper__spec.rb.i +0 -0
  144. data/.hg/store/data/spec/unit/solr__service__spec.rb.i +0 -0
  145. data/.hg/store/data/tasks/rspec.rake.i +0 -0
  146. data/.hg/store/undo +0 -0
  147. data/.hg/undo.branch +1 -0
  148. data/.hg/undo.dirstate +0 -0
  149. data/.hgignore +7 -0
  150. data/.hgtags +14 -0
  151. data/COPYING.txt +674 -0
  152. data/COYING.LESSER.txt +165 -0
  153. data/History.txt +34 -0
  154. data/LICENSE +20 -0
  155. data/License.txt +58 -0
  156. data/Manifest.txt +1 -1
  157. data/README.rdoc +13 -54
  158. data/README.txt +59 -0
  159. data/Rakefile +35 -0
  160. data/VERSION +1 -0
  161. data/active-fedora.gemspec +359 -0
  162. data/config/fedora.yml +16 -0
  163. data/config/solr_mappings.yml +14 -0
  164. data/config/solr_mappings_af_0.1.yml +16 -0
  165. data/config/solr_mappings_bl_2.4.yml +14 -0
  166. data/lib/active_fedora.rb +66 -6
  167. data/lib/active_fedora/base.rb +59 -23
  168. data/lib/active_fedora/datastream.rb +1 -1
  169. data/lib/active_fedora/metadata_datastream.rb +14 -7
  170. data/lib/active_fedora/model.rb +4 -4
  171. data/lib/active_fedora/rels_ext_datastream.rb +1 -1
  172. data/lib/active_fedora/semantic_node.rb +4 -3
  173. data/lib/active_fedora/solr_mapper.rb +17 -0
  174. data/lib/active_fedora/solr_service.rb +44 -2
  175. data/lib/fedora/base.rb +38 -0
  176. data/lib/fedora/connection.rb +210 -0
  177. data/lib/fedora/datastream.rb +56 -0
  178. data/lib/fedora/fedora_object.rb +161 -0
  179. data/lib/fedora/formats.rb +30 -0
  180. data/lib/fedora/generic_search.rb +71 -0
  181. data/lib/fedora/repository.rb +287 -0
  182. data/lib/ruby-fedora.rb +20 -0
  183. data/lib/util/class_level_inheritable_attributes.rb +23 -0
  184. data/script/console +15 -0
  185. data/script/destroy +14 -0
  186. data/script/generate +14 -0
  187. data/solr/config/schema-1.5.xml +468 -0
  188. data/solr/config/schema.xml +174 -212
  189. data/solr/config/solrconfig-1.5.xml +1069 -0
  190. data/spec/active_fedora_spec.rb +7 -0
  191. data/spec/fixtures/changeme155.xml +255 -0
  192. data/spec/fixtures/dino.jpg +0 -0
  193. data/spec/fixtures/minivan.jpg +0 -0
  194. data/spec/fixtures/test_12.foxml.xml +121 -0
  195. data/spec/integration/base_file_management_spec.rb +20 -0
  196. data/spec/integration/base_spec.rb +196 -0
  197. data/spec/integration/bug_spec.rb +57 -0
  198. data/spec/integration/datastream_spec.rb +60 -0
  199. data/spec/integration/datastreams_crud_spec.rb +208 -0
  200. data/spec/integration/fedora_object_spec.rb +77 -0
  201. data/spec/integration/full_featured_model_spec.rb +207 -0
  202. data/spec/integration/model_spec.rb +54 -0
  203. data/spec/integration/rels_ext_datastream_spec.rb +67 -0
  204. data/spec/integration/repository_spec.rb +297 -0
  205. data/spec/integration/rf_fedora_object_spec.rb +95 -0
  206. data/spec/integration/semantic_node_spec.rb +95 -0
  207. data/spec/integration/solr_service_spec.rb +33 -0
  208. data/spec/samples/models/audio_record.rb +29 -0
  209. data/spec/samples/models/image.rb +5 -0
  210. data/spec/samples/models/oral_history.rb +50 -0
  211. data/spec/samples/models/seminar.rb +29 -0
  212. data/spec/samples/models/seminar_audio_file.rb +34 -0
  213. data/spec/samples/oh_qdc.xml +32 -0
  214. data/spec/samples/oral_history_sample.xml +38 -0
  215. data/spec/samples/oral_history_sample_model.rb +39 -0
  216. data/spec/samples/oral_history_xml.xml +35 -0
  217. data/spec/spec.opts +5 -0
  218. data/spec/spec_helper.rb +41 -0
  219. data/spec/unit/active_fedora_spec.rb +15 -0
  220. data/spec/unit/base_cma_spec.rb +25 -0
  221. data/spec/unit/base_datastream_management_spec.rb +119 -0
  222. data/spec/unit/base_extra_spec.rb +108 -0
  223. data/spec/unit/base_file_management_spec.rb +90 -0
  224. data/spec/unit/base_loader_spec.rb +43 -0
  225. data/spec/unit/base_spec.rb +584 -0
  226. data/spec/unit/connection_spec.rb +25 -0
  227. data/spec/unit/content_model_spec.rb +51 -0
  228. data/spec/unit/datastream_concurrency_spec.rb +59 -0
  229. data/spec/unit/datastream_spec.rb +85 -0
  230. data/spec/unit/fedora_object_spec.rb +66 -0
  231. data/spec/unit/inheritance_spec.rb +46 -0
  232. data/spec/unit/metadata_datastream_spec.rb +290 -0
  233. data/spec/unit/model_spec.rb +186 -0
  234. data/spec/unit/property_spec.rb +50 -0
  235. data/spec/unit/qualified_dublin_core_datastream_spec.rb +177 -0
  236. data/spec/unit/relationship_spec.rb +77 -0
  237. data/spec/unit/rels_ext_datastream_spec.rb +99 -0
  238. data/spec/unit/repository_spec.rb +136 -0
  239. data/spec/unit/rf_datastream_spec.rb +49 -0
  240. data/spec/unit/semantic_node_spec.rb +354 -0
  241. data/spec/unit/solr_config_options_spec.rb +98 -0
  242. data/spec/unit/solr_mapper_spec.rb +31 -0
  243. data/spec/unit/solr_service_spec.rb +83 -0
  244. data/tasks/hoe.rake +0 -0
  245. data/tasks/rspec.rake +29 -0
  246. metadata +373 -55
@@ -0,0 +1,15 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+
3
+ # For testing Module-level methods like ActiveFedora.init
4
+
5
+ describe ActiveFedora do
6
+
7
+ describe ".push_models_to_fedora" do
8
+ it "should push the model definition for each of the ActiveFedora models into Fedora CModel objects" do
9
+ pending
10
+ # find all of the models
11
+ # create a cmodel for each model with the appropriate pid
12
+ # push the model definition into the cmodel's datastream (ie. dsname: oral_history.rb vs dsname: ruby)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+
3
+ describe ActiveFedora::Base do
4
+
5
+ before(:each) do
6
+ Fedora::Repository.instance.stubs(:nextid).returns('_nextid_')
7
+ @test_object = ActiveFedora::Base.new
8
+ end
9
+
10
+ describe '.save' do
11
+
12
+ it "should add hasModel relationship that points to the CModel if @new_object" do
13
+ @test_object.expects(:new_object?).returns(true)
14
+
15
+ @test_object.expects(:add_relationship).with(:has_model, ActiveFedora::ContentModel.pid_from_ruby_class(@test_object.class))
16
+ mock_repo = mock("repository")
17
+ mock_repo.expects(:save).with(@test_object.inner_object)
18
+ Fedora::Repository.stubs(:instance).returns(mock_repo)
19
+ @test_object.stubs(:update_index)
20
+ @test_object.expects(:refresh)
21
+ @test_object.save
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,119 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+
3
+ describe ActiveFedora::Base do
4
+
5
+ before(:each) do
6
+ Fedora::Repository.instance.expects(:nextid).returns("__nextid__")
7
+ @test_object = ActiveFedora::Base.new
8
+ #Fedora::Repository.instance.delete(@test_object.inner_object)
9
+ end
10
+
11
+ describe '.generate_dsid' do
12
+ it "should return a dsid that is not currently in use" do
13
+ dsids = Hash["DS1"=>1, "DS2"=>1]
14
+ @test_object.expects(:datastreams).returns(dsids)
15
+ generated_id = @test_object.generate_dsid
16
+ generated_id.should_not be_nil
17
+ generated_id.should == "DS3"
18
+ end
19
+ it "should accept a prefix argument, default to using DS as prefix" do
20
+ @test_object.generate_dsid("FOO").should == "FOO1"
21
+ end
22
+ end
23
+ describe '.add_datastream' do
24
+ it "should not call Datastream.save" do
25
+ ds = ActiveFedora::Datastream.new(:dsid => 'ds_to_add')
26
+ ds.expects(:save).never
27
+ @test_object.add_datastream(ds)
28
+ end
29
+ it "should add the datastream to the datastreams_in_memory array" do
30
+ ds = ActiveFedora::Datastream.new(:dsID => 'ds_to_add')
31
+ @test_object.datastreams.should_not have_key(ds.dsid)
32
+ @test_object.add_datastream(ds)
33
+ @test_object.datastreams_in_memory.should have_key(ds.dsid)
34
+ end
35
+ it "should auto-assign dsids using auto-incremented integers if dsid is nil or an empty string" do
36
+ ds = ActiveFedora::Datastream.new()
37
+ ds.dsid.should == nil
38
+ ds_emptystringid = ActiveFedora::Datastream.new()
39
+ ds_emptystringid.dsid = ""
40
+ @test_object.expects(:generate_dsid).returns("foo").times(2)
41
+ ds.expects(:dsid=).with("foo")
42
+ @test_object.add_datastream(ds)
43
+ @test_object.add_datastream(ds_emptystringid)
44
+ end
45
+ it "should accept a prefix option and apply it to automatically assigned dsids" do
46
+ ds = ActiveFedora::Datastream.new()
47
+ ds.dsid.should == nil
48
+ @test_object.expects(:generate_dsid).with("FOO")
49
+ @test_object.add_datastream(ds, :prefix => "FOO")
50
+ end
51
+ end
52
+
53
+ describe '.datastreams' do
54
+ it "if the object is not new should call .datastreams_in_fedora and put the result into @datastreams" do
55
+ @test_object.instance_variable_set(:@new_object, false)
56
+ ivar_before = @test_object.instance_variable_get(:@datastreams).dup
57
+ @test_object.expects(:datastreams_in_fedora).returns({:meh=>'feh'})
58
+ datastreams = @test_object.datastreams
59
+ @test_object.instance_variable_get(:@datastreams).values.should == ['feh']
60
+ datastreams.values.should ==['feh']
61
+ @test_object.instance_variable_get(:@datastreams).should_not equal(ivar_before)
62
+ end
63
+ end
64
+
65
+ describe '.datastreams_in_memory' do
66
+ it "should return the @datastreams array" do
67
+ the_ivar = @test_object.instance_variable_set(:@datastreams, {})
68
+ @test_object.datastreams_in_memory.should equal(the_ivar)
69
+ end
70
+ end
71
+
72
+ describe '.datastreams_in_fedora' do
73
+ it "should read the datastreams list from fedora" do
74
+ @test_object.expects(:datastreams_xml).returns(Hash['datastream' => Hash[]])
75
+ @test_object.datastreams_in_fedora
76
+ end
77
+ it "should pull the dsLabel if it is set" do
78
+ @test_object.expects(:datastreams_xml).returns({"datastream"=>[
79
+ {"label"=>"Dublin Core Record for this object", "dsid"=>"DC", "mimeType"=>"text/xml"},
80
+ {"label"=>"", "dsid"=>"RELS-EXT", "mimeType"=>"text/xml"},
81
+ {"label"=>"Sample Image", "dsid"=>"IMAGE1", "mimeType"=>"image/png"}]})
82
+ result = @test_object.datastreams_in_fedora
83
+ result["DC"].label.should == "Dublin Core Record for this object"
84
+ result["RELS-EXT"].label.should == ""
85
+ result["IMAGE1"].label.should == "Sample Image"
86
+ end
87
+
88
+ it "should pull the mimeType if it is set" do
89
+ pending
90
+ # Implementing this would require re-workign the initializer in Fedora::Datastream
91
+ @test_object.expects(:datastreams_xml).returns({"datastream"=>[
92
+ {"label"=>"Dublin Core Record for this object", "dsid"=>"DC", "mimeType"=>"text/xml"},
93
+ {"label"=>"", "dsid"=>"RELS-EXT", "mimeType"=>"text/xml"},
94
+ {"label"=>"Sample Image", "dsid"=>"IMAGE1", "mimeType"=>"image/png"}]})
95
+ result = @test_object.datastreams_in_fedora
96
+ result["DC"].attributes[:mimeType].should == "text/xml"
97
+ result["RELS-EXT"].attributes[:mimeType].should == "text/xml"
98
+ result["IMAGE1"].attributes[:mimeType].should == "image/png"
99
+ end
100
+ end
101
+
102
+ describe 'add' do
103
+ it "should call .add_datastream" do
104
+ @test_object.expects(:add_datastream)
105
+ @test_object.add(stub("datastream").stub_everything)
106
+ end
107
+ end
108
+
109
+ describe 'refresh' do
110
+ it "should pull object attributes from Fedora then merge the contents of .datastreams_in_fedora and .datastreams_in_memory, giving preference to the ones in memory" do
111
+ @test_object.stubs(:datastreams_in_fedora).returns({:foo => "foo", :bar => "bar in fedora"})
112
+ @test_object.stubs(:datastreams_in_memory).returns({:baz => "baz", :bar => "bar in memory"})
113
+ @test_object.inner_object.expects(:load_attributes_from_fedora)
114
+ result = @test_object.refresh
115
+ result.should == {:foo => "foo", :baz => "baz", :bar => "bar in memory"}
116
+ @test_object.instance_variable_get(:@datastreams).should == result
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,108 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+ require 'active_fedora'
3
+ require 'active_fedora/base'
4
+ require 'active_fedora/metadata_datastream'
5
+
6
+ describe ActiveFedora::Base do
7
+
8
+ before(:each) do
9
+ Fedora::Repository.instance.expects(:nextid).returns("__nextid__")
10
+ @test_object = ActiveFedora::Base.new
11
+ #Fedora::Repository.instance.delete(@test_object.inner_object)
12
+ end
13
+
14
+ describe ".metadata_streams" do
15
+ it "should return all of the datastreams from the object that are kinds of MetadataDatastreams " do
16
+ mock_mds1 = mock("metadata ds")
17
+ mock_mds1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
18
+ mock_mds2 = mock("metadata ds")
19
+ mock_mds2.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
20
+ mock_fds = mock("file ds")
21
+ mock_fds.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
22
+ @test_object.expects(:datastreams).returns({:foo => mock_mds1, :bar => mock_mds2, :baz => mock_fds})
23
+
24
+ result = @test_object.metadata_streams
25
+ result.length.should == 2
26
+ result.should include(mock_mds1)
27
+ result.should include(mock_mds2)
28
+ end
29
+ end
30
+
31
+ describe ".file_streams" do
32
+ it "should return all of the datastreams from the object that are kinds of MetadataDatastreams" do
33
+ mock_fds1 = mock("file ds", :dsid => "file1")
34
+ mock_fds1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
35
+ mock_fds2 = mock("file ds", :dsid => "file2")
36
+ mock_fds2.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
37
+ mock_mds = mock("metadata ds")
38
+ mock_mds.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
39
+ @test_object.expects(:datastreams).returns({:foo => mock_fds1, :bar=> mock_fds2, :baz => mock_mds})
40
+
41
+ result = @test_object.file_streams
42
+ result.length.should == 2
43
+ result.should include(mock_fds1)
44
+ result.should include(mock_fds2)
45
+
46
+ end
47
+ it "should skip DC and RELS-EXT datastreams" do
48
+ mock_fds1 = mock("file ds", :dsid => "foo")
49
+ mock_fds1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
50
+ dc = mock("DC", :dsid => "DC")
51
+ dc.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
52
+ rels_ext = mock("RELS-EXT", :dsid => "RELS-EXT")
53
+ rels_ext.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
54
+ @test_object.expects(:datastreams).returns({:foo => mock_fds1, :dc => dc, :rels_ext => rels_ext})
55
+
56
+ result = @test_object.file_streams
57
+ result.length.should == 1
58
+ result.should include(mock_fds1)
59
+ end
60
+ end
61
+
62
+ describe ".update_index" do
63
+ it "should call .to_solr on all MetadataDatastreams AND RelsExtDatastreams and pass the resulting document to solr" do
64
+ ActiveFedora::SolrService.expects(:instance).returns(mock("SolrService", :conn => mock("SolrConnection", :update)))
65
+ # Actually uses self.to_solr internally to gather solr info from all metadata datastreams
66
+ mock1 = mock("ds1", :to_solr)
67
+ mock2 = mock("ds2", :to_solr)
68
+ mock3 = mock("RELS-EXT", :to_solr)
69
+ mock1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
70
+ mock2.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
71
+ mock3.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
72
+ mock3.expects(:kind_of?).with(ActiveFedora::RelsExtDatastream).returns(true)
73
+
74
+ @test_object.expects(:datastreams).returns({:ds1 => mock1, :ds2 => mock2, :rels_ext => mock3})
75
+ @test_object.update_index
76
+ end
77
+
78
+ it "should retrieve a solr Connection and call Connection.update" do
79
+ ActiveFedora::SolrService.expects(:instance).returns(mock("SolrService", :conn => mock("SolrConnection", :update)))
80
+ @test_object.update_index
81
+ end
82
+
83
+ end
84
+
85
+ describe ".delete" do
86
+
87
+ before(:each) do
88
+ end
89
+
90
+ it "should delete object from repository and index" do
91
+ @test_object.expects(:pid).returns("foo")
92
+ ActiveFedora::SolrService.instance.conn.expects(:delete).with("foo")
93
+ Fedora::Repository.any_instance.stubs(:delete).with(@test_object.inner_object)
94
+ @test_object.delete
95
+ end
96
+
97
+ end
98
+
99
+ describe '#pids_from_uris' do
100
+ it "should strip the info:fedora/ out of a given string" do
101
+ ActiveFedora::Base.pids_from_uris("info:fedora/FOOBAR").should == "FOOBAR"
102
+ end
103
+ it "should accept an array of strings"do
104
+ ActiveFedora::Base.pids_from_uris(["info:fedora/FOOBAR", "info:fedora/BAZFOO"]).should == ["FOOBAR", "BAZFOO"]
105
+ end
106
+ end
107
+
108
+ end
@@ -0,0 +1,90 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require "active_fedora"
3
+
4
+ # Some tentative extensions to ActiveFedora::Base
5
+
6
+ describe ActiveFedora::Base do
7
+
8
+ before(:each) do
9
+ Fedora::Repository.stubs(:instance).returns(stub_everything())
10
+ @base = ActiveFedora::Base.new
11
+ @base.stubs(:create_date).returns("2008-07-02T05:09:42.015Z")
12
+ @base.stubs(:modified_date).returns("2008-09-29T21:21:52.892Z")
13
+ end
14
+
15
+ describe ".file_objects" do
16
+ it "should be a supported method" do
17
+ @base.should respond_to("file_objects")
18
+ end
19
+ it "should wrap .collection_members" do
20
+ @base.expects(:collection_members)
21
+ @base.file_objects
22
+ end
23
+ describe "_append" do
24
+ it "should wrap collection_members_append" do
25
+ mocko = mock("object")
26
+ @base.expects(:collection_members_append).with(mocko)
27
+ @base.file_objects_append(mocko)
28
+ end
29
+ end
30
+ describe "_remove" do
31
+ it "should wrap collection_members_remove"
32
+ end
33
+ end
34
+
35
+ describe ".collection_members" do
36
+ it "should return an array" do
37
+ @base.collection_members.should be_kind_of(Array)
38
+ end
39
+ it "should search for all of the :collection_members"
40
+ describe "_append" do
41
+ it "should be a supported method" do
42
+ @base.should respond_to(:collection_members_append)
43
+ end
44
+ it "should assert hasCollectionMember for the given object/pid" do
45
+ mocko = mock("object")
46
+ @base.expects(:add_relationship).with(:has_collection_member, mocko)
47
+ @base.collection_members_append(mocko)
48
+ end
49
+ it "should support << operator" do
50
+ pending
51
+ # I can't remember how to do this, and it's not a deal breaker... (MZ)
52
+ mocko = mock("object")
53
+ @base.expects(:add_relationship).with(:has_collection_member, mocko)
54
+ @base.collection_members << mocko
55
+ end
56
+ end
57
+ describe "_remove" do
58
+ it "should be a supported method" do
59
+ @base.should respond_to(:collection_members_remove)
60
+ end
61
+ it "should remove hasCollectionMember for the given object/pid"
62
+ end
63
+ end
64
+
65
+ describe ".add_file_datastream" do
66
+ it "should create a new datastream with the file as its content" do
67
+ mock_file = mock("File")
68
+ mock_ds = mock("Datastream")
69
+ ActiveFedora::Datastream.expects(:new).with(:dsLabel => "", :controlGroup => 'M', :blob=>mock_file).returns(mock_ds)
70
+ @base.expects(:add_datastream).with(mock_ds)
71
+ @base.add_file_datastream(mock_file)
72
+ end
73
+ it "should apply filename argument to the datastream label if it is provided" do
74
+ mock_file = mock("File")
75
+ mock_ds = mock("Datastream")
76
+ ActiveFedora::Datastream.expects(:new).with(:dsLabel => "My Label", :controlGroup => 'M', :blob=>mock_file).returns(mock_ds)
77
+ @base.expects(:add_datastream).with(mock_ds)
78
+ @base.add_file_datastream(mock_file, :label => "My Label")
79
+ end
80
+ it "should use :dsid if provided" do
81
+ mock_file = mock("File")
82
+ mock_ds = mock("Datastream")
83
+ mock_ds.expects(:dsid=).with("__DSID__")
84
+ ActiveFedora::Datastream.expects(:new).with(:dsLabel => "My Label", :controlGroup => 'M', :blob=>mock_file).returns(mock_ds)
85
+ @base.expects(:add_datastream).with(mock_ds)
86
+ @base.add_file_datastream(mock_file, :label => "My Label", :dsid => "__DSID__")
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,43 @@
1
+ require File.join( File.dirname(__FILE__), "..", "spec_helper" )
2
+ require 'active_fedora'
3
+ require 'active_fedora/base'
4
+ require 'active_fedora/metadata_datastream'
5
+ require 'ruby-debug'
6
+
7
+ # Load Sample OralHistory Model
8
+ require File.join( File.dirname(__FILE__), "..","samples","oral_history_sample_model" )
9
+
10
+
11
+ describe ActiveFedora::Base do
12
+
13
+ # before(:all) do
14
+ # require File.join( File.dirname(__FILE__), "..","samples","oral_history" )
15
+ # end
16
+
17
+ before(:each) do
18
+ @test_object = OralHistorySampleModel.new
19
+ @test_object.save
20
+ end
21
+
22
+ after(:each) do
23
+ @test_object.delete
24
+ end
25
+
26
+ describe "deserialize" do
27
+ it "should return an object whose inner_object is not marked as new. The datastreams should only be marked new if the model expects a datastream that doesn't exist yet in fedora" do
28
+ #mocko = mock("object")
29
+ #ActiveFedora::Base.expects(:new).returns(mocko)
30
+ @test_object.datastreams["sensitive_passages"].delete
31
+ doc = REXML::Document.new(@test_object.inner_object.object_xml, :ignore_whitespace_nodes=>:all)
32
+ result = OralHistorySampleModel.deserialize(doc)
33
+ result.new_object?.should be_false
34
+ result.datastreams_in_memory.should have_key("dublin_core")
35
+ result.datastreams_in_memory.should have_key("properties")
36
+ result.datastreams_in_memory.each do |name,ds|
37
+ ds.new_object?.should be_false unless name == "sensitive_passages"
38
+ end
39
+ result.datastreams_in_memory["sensitive_passages"].new_object?.should be_true
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,584 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+
3
+ require 'active_fedora'
4
+ require 'active_fedora/base'
5
+ require 'active_fedora/metadata_datastream'
6
+ require 'time'
7
+ require 'date'
8
+
9
+ class FooHistory < ActiveFedora::Base
10
+ has_metadata :type=>ActiveFedora::MetadataDatastream, :name=>"someData" do |m|
11
+ m.field "fubar", :string
12
+ m.field "swank", :text
13
+ end
14
+ has_metadata :type=>ActiveFedora::MetadataDatastream, :name=>"withText" do |m|
15
+ m.field "fubar", :text
16
+ end
17
+ has_metadata :type=>ActiveFedora::MetadataDatastream, :name=>"withText2" do |m|
18
+ m.field "fubar", :text
19
+ end
20
+ end
21
+
22
+ describe ActiveFedora::Base do
23
+
24
+ before(:each) do
25
+ Fedora::Repository.instance.stubs(:nextid).returns("_nextid_")
26
+ @test_object = ActiveFedora::Base.new
27
+ @test_object.new_object = true
28
+ end
29
+
30
+ after(:each) do
31
+ begin
32
+ @test_object.delete
33
+ rescue
34
+ end
35
+ end
36
+
37
+ describe '#new' do
38
+ it "should create a new inner object" do
39
+ Fedora::Repository.instance.expects(:save).never
40
+ result = ActiveFedora::Base.new(:pid=>"test:1")
41
+ result.inner_object.should be_kind_of(Fedora::FedoraObject)
42
+ end
43
+
44
+ end
45
+
46
+ describe ".internal_uri" do
47
+ it "should return pid as fedors uri" do
48
+ @test_object.internal_uri.should eql("info:fedora/#{@test_object.pid}")
49
+ end
50
+ end
51
+
52
+ it "should have to_param" do
53
+ @test_object.to_param.should == @test_object.pid
54
+ end
55
+
56
+ it "should respond_to has_metadata" do
57
+ ActiveFedora::Base.respond_to?(:has_metadata).should be_true
58
+ end
59
+
60
+ describe "has_metadata" do
61
+
62
+ it "should create specified datastreams with specified fields" do
63
+ n = FooHistory.new
64
+ n.datastreams["someData"].should_not be_nil
65
+ n.datastreams["someData"].fubar_values='bar'
66
+ n.datastreams["someData"].fubar_values.should == ['bar']
67
+ end
68
+
69
+ end
70
+
71
+ describe ".fields" do
72
+ it "should provide fields" do
73
+ @test_object.should respond_to(:fields)
74
+ end
75
+ it "should add pid, system_create_date and system_modified_date from object attributes" do
76
+ cdate = "2008-07-02T05:09:42.015Z"
77
+ mdate = "2009-07-07T23:37:18.991Z"
78
+ @test_object.expects(:create_date).returns(cdate)
79
+ @test_object.expects(:modified_date).returns(mdate)
80
+ fields = @test_object.fields
81
+ fields[:system_create_date][:values].should eql([cdate])
82
+ fields[:system_modified_date][:values].should eql([mdate])
83
+ fields[:id][:values].should eql([@test_object.pid])
84
+ end
85
+
86
+ it "should add self.class as the :active_fedora_model" do
87
+ fields = @test_object.fields
88
+ fields[:active_fedora_model][:values].should eql([@test_object.class.inspect])
89
+ end
90
+
91
+ it "should call .fields on all MetadataDatastreams and return the resulting document" do
92
+ mock1 = mock("ds1", :fields => {})
93
+ mock2 = mock("ds2", :fields => {})
94
+ mock1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
95
+ mock2.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
96
+
97
+ @test_object.expects(:datastreams).returns({:ds1 => mock1, :ds2 => mock2})
98
+ @test_object.fields
99
+ end
100
+ end
101
+
102
+ it 'should provide #find' do
103
+ ActiveFedora::Base.should respond_to(:find)
104
+ end
105
+
106
+ it "should provide .create_date" do
107
+ @test_object.should respond_to(:create_date)
108
+ end
109
+
110
+ it "should provide .modified_date" do
111
+ @test_object.should respond_to(:modified_date)
112
+ end
113
+
114
+ it 'should respond to .rels_ext' do
115
+ @test_object.should respond_to(:rels_ext)
116
+ end
117
+
118
+ describe '.rels_ext' do
119
+ it 'should create the RELS-EXT datastream if it doesnt exist' do
120
+ mocker = mock("rels-ext")
121
+ ActiveFedora::RelsExtDatastream.expects(:new).returns(mocker)
122
+ @test_object.expects(:add_datastream).with(mocker)
123
+ # Make sure the RELS-EXT datastream does not exist yet
124
+ @test_object.datastreams["RELS-EXT"].should == nil
125
+ @test_object.rels_ext
126
+ # Assume that @test_object.add_datastream actually does its job and adds the datastream to the datastreams array. Not testing that here.
127
+ end
128
+
129
+ it 'should return the RelsExtDatastream object from the datastreams array' do
130
+ @test_object.expects(:datastreams).returns({"RELS-EXT" => "foo"}).at_least_once
131
+ @test_object.rels_ext.should == "foo"
132
+ end
133
+ end
134
+
135
+ it 'should provide #add_relationship' do
136
+ @test_object.should respond_to(:add_relationship)
137
+ end
138
+
139
+ describe '#add_relationship' do
140
+ it 'should call #add_relationship on the rels_ext datastream' do
141
+ mock_relationship = mock("relationship")
142
+ mock_rels_ext = mock("rels-ext", :add_relationship)
143
+ mock_rels_ext.expects(:dirty=).with(true)
144
+ @test_object.expects(:rels_ext).returns(mock_rels_ext).times(2)
145
+ @test_object.add_relationship("predicate", "object")
146
+ end
147
+
148
+ it "should update the RELS-EXT datastream and set the datastream as dirty when relationships are added" do
149
+ mock_ds = mock("Rels-Ext")
150
+ mock_ds.expects(:add_relationship).times(2)
151
+ mock_ds.expects(:dirty=).with(true).times(2)
152
+ @test_object.datastreams["RELS-EXT"] = mock_ds
153
+ test_relationships = [ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/demo:5"),
154
+ ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/demo:10")]
155
+ test_relationships.each do |rel|
156
+ @test_object.add_relationship(rel.predicate, rel.object)
157
+ end
158
+ end
159
+
160
+ end
161
+
162
+ it 'should provide #relationships' do
163
+ @test_object.should respond_to(:relationships)
164
+ end
165
+
166
+ describe '#relationships' do
167
+ it 'should call #relationships on the rels_ext datastream and return that' do
168
+ @test_object.expects(:rels_ext).returns(mock("rels-ext", :relationships))
169
+ @test_object.relationships
170
+ end
171
+ end
172
+
173
+ describe '.save' do
174
+
175
+
176
+ it "should return true if object and datastreams all save successfully" do
177
+ @test_object.expects(:create).returns(true)
178
+ @test_object.save.should == true
179
+ end
180
+
181
+ it "should raise an exception if object fails to save" do
182
+ server_response = mock("Server Error")
183
+ Fedora::Repository.instance.expects(:save).with(@test_object.inner_object).raises(Fedora::ServerError, server_response)
184
+ lambda {@test_object.save}.should raise_error(Fedora::ServerError)
185
+ #lambda {@test_object.save}.should raise_error(Fedora::ServerError, "Error Saving object #{@test_object.pid}. Server Error: RubyFedora Error Msg")
186
+ end
187
+
188
+ it "should raise an exception if any of the datastreams fail to save" do
189
+ Fedora::Repository.instance.expects(:save).with(@test_object.inner_object).returns(true)
190
+ Fedora::Repository.instance.expects(:save).with(kind_of(ActiveFedora::RelsExtDatastream)).raises(Fedora::ServerError, mock("Server Error"))
191
+ lambda {@test_object.save}.should raise_error(Fedora::ServerError)
192
+ end
193
+
194
+ it "should call .save on any datastreams that are dirty" do
195
+ to = FooHistory.new
196
+ to.expects(:update_index)
197
+ Fedora::Repository.instance.expects(:save).with(to.inner_object)
198
+ Fedora::Repository.instance.expects(:save).with(kind_of(ActiveFedora::RelsExtDatastream))
199
+ Fedora::Repository.instance.expects(:save).with(to.datastreams["withText"])
200
+ Fedora::Repository.instance.expects(:save).with(to.datastreams["withText2"])
201
+ to.datastreams["someData"].stubs(:dirty?).returns(true)
202
+ to.datastreams["someData"].stubs(:new_object?).returns(true)
203
+ to.datastreams["someData"].expects(:save)
204
+ to.expects(:refresh)
205
+ to.save
206
+ end
207
+ it "should call .save on any datastreams that are new" do
208
+ ds = ActiveFedora::Datastream.new(:dsid => 'ds_to_add')
209
+ @test_object.add_datastream(ds)
210
+ ds.expects(:save)
211
+ @test_object.instance_variable_set(:@new_object, false)
212
+ Fedora::Repository.instance.expects(:save).with(@test_object.inner_object)
213
+ #Fedora::Repository.instance.expects(:save).with(kind_of(ActiveFedora::RelsExtDatastream))
214
+ @test_object.expects(:refresh)
215
+ @test_object.save
216
+ end
217
+ it "should not call .save on any datastreams that are not dirty" do
218
+ @test_object = FooHistory.new
219
+ @test_object.expects(:update_index)
220
+ @test_object.expects(:refresh)
221
+ @test_object.dc.should be_nil #heh, haven't saved it yet!
222
+ Fedora::Repository.instance.expects(:save).with(@test_object.inner_object)
223
+ Fedora::Repository.instance.expects(:save).with(kind_of(ActiveFedora::RelsExtDatastream))
224
+ Fedora::Repository.instance.expects(:save).with(@test_object.datastreams["withText"])
225
+ Fedora::Repository.instance.expects(:save).with(@test_object.datastreams["withText2"])
226
+ @test_object.datastreams["someData"].should_not be_nil
227
+ @test_object.datastreams['someData'].stubs(:dirty?).returns(false)
228
+ @test_object.datastreams['someData'].stubs(:new_object?).returns(false)
229
+ @test_object.datastreams['someData'].expects(:save).never
230
+ @test_object.save
231
+ end
232
+ it "should update solr index with all metadata if any MetadataDatastreams have changed" do
233
+ Fedora::Repository.instance.stubs(:save)
234
+ mock1 = mock("ds1", :dirty? => true, :save => true, :kind_of? => ActiveFedora::MetadataDatastream)
235
+ mock2 = mock("ds2", :dirty? => false, :new_object? => false)
236
+ @test_object.stubs(:datastreams_in_memory).returns({:ds1 => mock1, :ds2 => mock2})
237
+ @test_object.expects(:update_index)
238
+ @test_object.expects(:refresh)
239
+ @test_object.save
240
+ end
241
+ it "should NOT update solr index if no MetadataDatastreams have changed" do
242
+ Fedora::Repository.instance.stubs(:save)
243
+ mock1 = mock("ds1", :dirty? => false, :new_object? => false)
244
+ mock2 = mock("ds2", :dirty? => false, :new_object? => false)
245
+ @test_object.stubs(:datastreams_in_memory).returns({:ds1 => mock1, :ds2 => mock2})
246
+ @test_object.expects(:update_index).never
247
+ @test_object.expects(:refresh)
248
+ @test_object.instance_variable_set(:@new_object, false)
249
+ @test_object.save
250
+ end
251
+ it "should update solr index if RELS-EXT datastream has changed" do
252
+ Fedora::Repository.instance.stubs(:save)
253
+ mock1 = mock("RELS-EXT", :dirty? => true, :save => true)
254
+ mock1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
255
+ mock1.expects(:instance_of?).with(ActiveFedora::RelsExtDatastream).returns(true)
256
+ mock2 = mock("ds2", :dirty? => false, :new_object? => false)
257
+ @test_object.stubs(:datastreams_in_memory).returns({"RELS-EXT" => mock1, :ds2 => mock2})
258
+ @test_object.instance_variable_set(:@new_object, false)
259
+ @test_object.expects(:refresh)
260
+ @test_object.expects(:update_index)
261
+ @test_object.save
262
+ end
263
+ end
264
+
265
+
266
+ describe ".to_xml" do
267
+ it "should provide .to_xml" do
268
+ @test_object.should respond_to(:to_xml)
269
+ end
270
+
271
+ it "should add pid, system_create_date and system_modified_date from object attributes" do
272
+ @test_object.expects(:create_date).returns("cDate")
273
+ @test_object.expects(:modified_date).returns("mDate")
274
+ solr_doc = @test_object.to_solr
275
+ solr_doc[:system_create_dt].should eql("cDate")
276
+ solr_doc[:system_modified_dt].should eql("mDate")
277
+ solr_doc[:id].should eql(@test_object.pid)
278
+ end
279
+
280
+ it "should add self.class as the :active_fedora_model" do
281
+ solr_doc = @test_object.to_solr
282
+ solr_doc[:active_fedora_model_s].should eql(@test_object.class.inspect)
283
+ end
284
+
285
+ it "should call .to_xml on all MetadataDatastreams and return the resulting document" do
286
+ mock1 = mock("ds1", :to_xml)
287
+ mock2 = mock("ds2", :to_xml)
288
+ mock1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
289
+ mock2.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
290
+
291
+ @test_object.expects(:datastreams).returns({:ds1 => mock1, :ds2 => mock2})
292
+ @test_object.to_xml
293
+ end
294
+ end
295
+
296
+ describe ".to_solr" do
297
+
298
+ # before(:all) do
299
+ # # Revert to default mappings after running tests
300
+ # ActiveFedora::SolrService.load_mappings
301
+ # end
302
+
303
+ after(:all) do
304
+ # Revert to default mappings after running tests
305
+ ActiveFedora::SolrService.load_mappings
306
+ end
307
+
308
+ it "should provide .to_solr" do
309
+ @test_object.should respond_to(:to_solr)
310
+ end
311
+
312
+ it "should add pid, system_create_date and system_modified_date from object attributes" do
313
+ @test_object.expects(:create_date).returns("cDate")
314
+ @test_object.expects(:modified_date).returns("mDate")
315
+ solr_doc = @test_object.to_solr
316
+ puts solr_doc.inspect
317
+ solr_doc[:system_create_dt].should eql("cDate")
318
+ solr_doc[:system_modified_dt].should eql("mDate")
319
+ solr_doc[:id].should eql(@test_object.pid)
320
+ end
321
+
322
+ it "should add self.class as the :active_fedora_model" do
323
+ solr_doc = @test_object.to_solr
324
+ solr_doc[:active_fedora_model_s].should eql(@test_object.class.inspect)
325
+ end
326
+
327
+ it "should use mappings.yml to decide names of solr fields" do
328
+ cdate = "2008-07-02T05:09:42.015Z"
329
+ mdate = "2009-07-07T23:37:18.991Z"
330
+ @test_object.stubs(:create_date).returns(cdate)
331
+ @test_object.stubs(:modified_date).returns(mdate)
332
+ solr_doc = @test_object.to_solr
333
+ solr_doc[:system_create_dt].should eql(cdate)
334
+ solr_doc[:system_modified_dt].should eql(mdate)
335
+ solr_doc[:id].should eql(@test_object.pid)
336
+ solr_doc[:active_fedora_model_s].should eql(@test_object.class.inspect)
337
+
338
+ ActiveFedora::SolrService.load_mappings(File.join(File.dirname(__FILE__), "..", "..", "config", "solr_mappings_af_0.1.yml"))
339
+ solr_doc = @test_object.to_solr
340
+ [:system_create_dt, :system_modified_dt, :active_fedora_model_s].each do |fn|
341
+ solr_doc[fn].should == nil
342
+ end
343
+ solr_doc[:system_create_date].should eql(cdate)
344
+ solr_doc[:system_modified_date].should eql(mdate)
345
+ solr_doc[:id].should eql(@test_object.pid)
346
+ solr_doc[:active_fedora_model_field].should eql(@test_object.class.inspect)
347
+ end
348
+
349
+ it "should call .to_solr on all MetadataDatastreams and pass the resulting document to solr" do
350
+ mock1 = mock("ds1", :to_solr)
351
+ mock2 = mock("ds2", :to_solr)
352
+ mock1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
353
+ mock2.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
354
+
355
+ @test_object.expects(:datastreams).returns({:ds1 => mock1, :ds2 => mock2})
356
+ @test_object.to_solr
357
+ end
358
+ it "should call .to_solr on the RELS-EXT datastream if it is dirty" do
359
+ @test_object.add_relationship(:has_collection_member, "foo member")
360
+ rels_ext = @test_object.datastreams_in_memory["RELS-EXT"]
361
+ rels_ext.dirty?.should == true
362
+ rels_ext.expects(:to_solr)
363
+ @test_object.to_solr
364
+ end
365
+ end
366
+
367
+ describe ".update_index" do
368
+ it "should provide .update_index" do
369
+ @test_object.should respond_to(:update_index)
370
+ end
371
+ end
372
+
373
+ describe ".label" do
374
+ it "should return the label of the inner object" do
375
+ @test_object.inner_object.expects(:label).returns("foo label")
376
+ @test_object.label.should == "foo label"
377
+ end
378
+ end
379
+
380
+ describe ".label=" do
381
+ it "should set the label of the inner object" do
382
+ @test_object.label.should_not == "foo label"
383
+ @test_object.label = "foo label"
384
+ @test_object.label.should == "foo label"
385
+ end
386
+ end
387
+
388
+ it "should get a pid but not save on init" do
389
+ Fedora::Repository.instance.expects(:save).never
390
+ Fedora::Repository.instance.expects(:nextid).returns('mooshoo:24')
391
+ f = FooHistory.new
392
+ f.pid.should_not be_nil
393
+ f.pid.should == 'mooshoo:24'
394
+ end
395
+ it "should not clobber a pid if i'm creating!" do
396
+ FooHistory.any_instance.expects(:configure_defined_datastreams)
397
+ f = FooHistory.new(:pid=>'numbnuts:1')
398
+ f.pid.should == 'numbnuts:1'
399
+
400
+ end
401
+ describe "update_attributes" do
402
+ it "should be able to handle ds's without fields field" do
403
+ class Moo < ActiveFedora::Base;end
404
+ m = Moo.new
405
+ ds = mock('ds')
406
+ m.expects(:datastreams).returns({ :ds1=>ds})
407
+ ds.expects(:fields).returns(Hash.new)
408
+ m.update_attributes(:foo=>'bar')
409
+ end
410
+ it "should be able to update attr on text fields" do
411
+ m = FooHistory.new
412
+ m.should_not be_nil
413
+ m.datastreams['someData'].swank_values.should == []
414
+ m.update_attributes(:swank=>'baz')
415
+ m.should_not be_nil
416
+ m.datastreams['someData'].swank_values.should == ['baz']
417
+ end
418
+
419
+ it "should have update_attributes" do
420
+ n = FooHistory.new
421
+ n.update_attributes(:fubar=>'baz')
422
+ n.datastreams["someData"].fubar_values.should == ['baz']
423
+ n.update_attributes('fubar'=>'bak')
424
+ n.datastreams["someData"].fubar_values.should == ['bak']
425
+ #really? should it hit all matching datastreams?
426
+ n.datastreams["withText"].fubar_values.should == ['bak']
427
+ end
428
+
429
+ it "should allow deleting of values" do
430
+ n = FooHistory.new
431
+ n.datastreams["someData"].fubar_values.should == []
432
+ n.update_attributes(:fubar=>'baz')
433
+ n.datastreams["someData"].fubar_values.should == ['baz']
434
+ n.update_attributes(:fubar=>:delete)
435
+ n.datastreams["someData"].fubar_values.should == []
436
+ n.update_attributes(:fubar=>'baz')
437
+ n.datastreams["someData"].fubar_values.should == ['baz']
438
+ n.update_attributes(:fubar=>"")
439
+ n.datastreams["someData"].fubar_values.should == []
440
+ end
441
+
442
+ it "should take a :datastreams argument" do
443
+ m = FooHistory.new
444
+ m.should_not be_nil
445
+ m.datastreams['someData'].fubar_values.should == []
446
+ m.datastreams['withText'].fubar_values.should == []
447
+ m.datastreams['withText2'].fubar_values.should == []
448
+
449
+ m.update_attributes({:fubar=>'baz'}, :datastreams=>"someData")
450
+ m.should_not be_nil
451
+ m.datastreams['someData'].fubar_values.should == ['baz']
452
+ m.datastreams["withText"].fubar_values.should == []
453
+ m.datastreams['withText2'].fubar_values.should == []
454
+
455
+ m.update_attributes({:fubar=>'baz'}, :datastreams=>["someData", "withText2"])
456
+ m.should_not be_nil
457
+ m.datastreams['someData'].fubar_values.should == ['baz']
458
+ m.datastreams["withText"].fubar_values.should == []
459
+ m.datastreams['withText2'].fubar_values.should == ['baz']
460
+ end
461
+ end
462
+
463
+ describe "update_indexed_attributes" do
464
+ it "should work for text fields" do
465
+ att= {"swank"=>{"-1"=>"mork", "1"=>"york"}}
466
+ n = FooHistory.new
467
+ result = n.update_indexed_attributes(att)
468
+ result.should == {"swank"=>{"1"=>"york", "0"=>"mork"}}
469
+ n.datastreams["someData"].swank_values.should == ['mork', 'york']
470
+ n.datastreams["someData"].swank_values.should == ['mork', 'york']
471
+ att= {"swank"=>{"-1"=>"dork"}}
472
+ result2 = n.update_indexed_attributes(att)
473
+ result2.should == {"swank"=>{"2"=>"dork"}}
474
+ n.datastreams["someData"].swank_values.should == ['mork', 'york', 'dork']
475
+ end
476
+
477
+ it "should return the new index of any added values" do
478
+ n = FooHistory.new
479
+ n.datastreams["someData"].swank_values = ["my_val1","my_val2"]
480
+ result = n.update_indexed_attributes "swank"=>{"-1"=>"mork"}
481
+ result.should == {"swank"=>{"2"=>"mork"}}
482
+ end
483
+
484
+ it "should return accurate response when multiple values have been added in a single run" do
485
+ pending
486
+ att= {"swank"=>{"-1"=>"mork", "0"=>"york"}}
487
+ n = FooHistory.new
488
+ n.update_indexed_attributes(att).should == {"swank"=>{"0"=>"york", "1"=>"mork"}}
489
+ end
490
+
491
+ it "should apply submitted hash to corresponding datastream values" do
492
+ att= {"fubar"=>{"-1"=>"mork", "0"=>"york"}}
493
+ n = FooHistory.new
494
+ n.update_indexed_attributes(att)
495
+ n.datastreams["someData"].fubar_values.should == ['mork', 'york']
496
+ n.datastreams["someData"].fubar_values.should == ['mork', 'york']
497
+
498
+ att= {"fubar"=>{"0"=>"zork", "1"=>"tork", "2"=>'mangle'}}
499
+ n.update_indexed_attributes(att)
500
+ n.datastreams["someData"].fubar_values.should == ['zork', 'tork', 'mangle']
501
+
502
+ att= {"fubar"=>{"0"=>"hork", "1"=>"tork", '-1'=>'dang'}}
503
+ result = n.update_indexed_attributes(att)
504
+ result.should == {"fubar"=>{"0"=>"hork", "1"=>"tork", '3'=>'dang'}}
505
+ n.datastreams["someData"].fubar_values.should == ['hork', 'tork', 'mangle', 'dang']
506
+
507
+ #really? should it hit all matching datastreams?
508
+ n.datastreams["withText"].fubar_values.should == ['hork', 'tork', 'mangle', 'dang']
509
+ end
510
+
511
+ it "should deal gracefully with adding new values at explicitly declared indexes" do
512
+ n = FooHistory.new
513
+ n.datastreams["someData"].fubar_values = ["all", "for", "the"]
514
+ att = {"fubar"=>{"3"=>'glory'}}
515
+ result = n.update_indexed_attributes(att)
516
+ result.should == {"fubar"=>{"3"=>"glory"}}
517
+ n.datastreams["someData"].fubar_values.should == ["all", "for", "the", "glory"]
518
+
519
+ n.datastreams["withText"].fubar_values.should == ["glory"]
520
+ end
521
+
522
+ it "should allow deleting of values and should delete values so that to_xml does not return emtpy nodes" do
523
+ att= {"fubar"=>{"-1"=>"mork", "0"=>"york", "1"=>"mangle"}}
524
+ n = FooHistory.new
525
+ n.update_indexed_attributes(att)
526
+ n.datastreams["someData"].fubar_values.should == ['mork', 'york', 'mangle']
527
+ rexml = REXML::Document.new(n.datastreams["someData"].to_xml)
528
+ #puts rexml.root.elements.each {|el| el.to_s}
529
+ #puts rexml.root.elements.to_a.inspect
530
+ rexml.root.elements.to_a.length.should == 3
531
+ n.update_indexed_attributes({"fubar"=>{"1"=>""}})
532
+ n.datastreams["someData"].fubar_values.should == ['mork', 'mangle']
533
+ rexml = REXML::Document.new(n.datastreams["someData"].to_xml)
534
+ rexml.root.elements.to_a.length.should == 2
535
+ n.update_indexed_attributes({"fubar"=>{"0"=>:delete}})
536
+ n.datastreams["someData"].fubar_values.should == ['mangle']
537
+ rexml = REXML::Document.new(n.datastreams["someData"].to_xml)
538
+ rexml.root.elements.to_a.length.should == 1
539
+
540
+ n.datastreams["someData"].fubar_values = ["val1", nil, "val2"]
541
+ n.update_indexed_attributes({"fubar"=>{"1"=>""}})
542
+ n.datastreams["someData"].fubar_values.should == ["val1", "val2"]
543
+ end
544
+
545
+
546
+ it "should take a :datastreams argument" do
547
+ att= {"fubar"=>{"-1"=>"mork", "0"=>"york", "1"=>"mangle"}}
548
+ m = FooHistory.new
549
+
550
+ m.update_indexed_attributes(att, :datastreams=>"withText")
551
+ m.should_not be_nil
552
+ m.datastreams['someData'].fubar_values.should == []
553
+ m.datastreams["withText"].fubar_values.should == ['mork', 'york', 'mangle']
554
+ m.datastreams['withText2'].fubar_values.should == []
555
+
556
+ att= {"fubar"=>{"-1"=>"tork", "0"=>"work", "1"=>"bork"}}
557
+ m.update_indexed_attributes(att, :datastreams=>["someData", "withText2"])
558
+ m.should_not be_nil
559
+ m.datastreams['someData'].fubar_values.should == ['tork', 'work', 'bork']
560
+ m.datastreams["withText"].fubar_values.should == ['mork', 'york', 'mangle']
561
+ m.datastreams['withText2'].fubar_values.should == ['tork', 'work', 'bork']
562
+ end
563
+ end
564
+
565
+ it "should expose solr for real." do
566
+ sinmock = mock('solr instance')
567
+ conmock = mock("solr conn")
568
+ sinmock.expects(:conn).returns(conmock)
569
+ conmock.expects(:query).with('pid: foobar', {}).returns({:baz=>:bif})
570
+ ActiveFedora::SolrService.expects(:instance).returns(sinmock)
571
+ FooHistory.solr_search("pid: foobar").should == {:baz=>:bif}
572
+ end
573
+ it "should expose solr for real. and pass args through" do
574
+ sinmock = mock('solr instance')
575
+ conmock = mock("solr conn")
576
+ sinmock.expects(:conn).returns(conmock)
577
+ conmock.expects(:query).with('pid: foobar', {:ding, :dang}).returns({:baz=>:bif})
578
+ ActiveFedora::SolrService.expects(:instance).returns(sinmock)
579
+ FooHistory.solr_search("pid: foobar", {:ding=>:dang}).should == {:baz=>:bif}
580
+ end
581
+
582
+
583
+
584
+ end