active-fedora 1.0.5 → 1.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.
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