active-fedora 1.2.6 → 1.2.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,13 @@
1
1
  <mods version="3.0" xsi:schemaLocation="http://www.loc.gov/mods/v3
2
- http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2
+ http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3
3
 
4
4
  <titleInfo>
5
5
  <nonSort>THE</nonSort>
6
- <title>ARTICLE TITLE HYDRANGEA ARTICLE 1</title>
6
+ <title>ARTICLE TITLE</title>
7
7
  <subTitle>SUBTITLE</subTitle>
8
8
  </titleInfo>
9
- <titleInfo lang="finnish">
10
- <title>Artikkelin otsikko Hydrangea artiklan 1</title>
9
+ <titleInfo type="alternative">
10
+ <title>VARYING FORM OF TITLE</title>
11
11
  </titleInfo>
12
12
 
13
13
  <name type="personal">
@@ -17,23 +17,31 @@
17
17
  <displayForm>NAME AS IT APPEARS</displayForm>
18
18
  <affiliation>FACULTY, UNIVERSITY</affiliation>
19
19
  <role>
20
- <roleTerm authority="marcrelator" type="text">creator</roleTerm>
21
- </role>
22
- <role>
23
- <roleTerm type="text">submitter</roleTerm>
20
+ <roleTerm authority="marcrelator" type="text">Creator</roleTerm>
24
21
  </role>
25
22
  </name>
26
-
27
23
  <name type="personal">
28
- <namePart type="family">Gautama</namePart>
29
- <namePart type="given">Siddartha</namePart>
30
- <namePart type="termsOfAddress">Prince</namePart>
31
- <affiliation>Nirvana</affiliation>
32
- <role>
33
- <roleTerm authority="marcrelator" type="text">teacher</roleTerm>
24
+ <namePart type="family">Lacks</namePart>
25
+ <namePart type="given">Henrietta</namePart>
26
+ <displayForm>HeLa</displayForm>
27
+ <affiliation>Baltimore</affiliation>
28
+ <role>
29
+ <roleTerm authority="marcrelator" type="text">Contributor</roleTerm>
34
30
  </role>
35
31
  </name>
36
-
32
+ <name type="corporate">
33
+ <namePart>NSF</namePart>
34
+ <role>
35
+ <roleTerm authority="marcrelator" type="text">Funder</roleTerm>
36
+ </role>
37
+ </name>
38
+ <name type="conference">
39
+ <namePart>some conference</namePart>
40
+ <role>
41
+ <roleTerm authority="marcrelator" type="text">Host</roleTerm>
42
+ </role>
43
+ </name>
44
+
37
45
  <typeOfResource>text</typeOfResource>
38
46
  <genre authority="local">journal article</genre>
39
47
 
@@ -5,6 +5,10 @@ class MockAFBaseRelationship < ActiveFedora::Base
5
5
  has_relationship "testing2", :has_member, :type=>MockAFBaseRelationship
6
6
  has_relationship "testing_inbound", :has_part, :type=>MockAFBaseRelationship, :inbound=>true
7
7
  has_relationship "testing_inbound2", :has_member, :type=>MockAFBaseRelationship, :inbound=>true
8
+ has_bidirectional_relationship "testing_bidirectional", :has_collection_member, :is_member_of_collection
9
+ #next 2 used to test objects on opposite end of bidirectional relationship
10
+ has_relationship "testing_inbound3", :has_collection_member, :inbound=>true
11
+ has_relationship "testing3", :is_member_of_collection
8
12
  end
9
13
 
10
14
  class MockAFBaseDatastream < ActiveFedora::Base
@@ -208,6 +212,33 @@ describe ActiveFedora::Base do
208
212
  rexml.root.elements["rdf:Description/isMemberOf[@rdf:resource='info:fedora/demo:10']"].attributes["xmlns"].should == 'info:fedora/fedora-system:def/relations-external#'
209
213
  end
210
214
  end
215
+
216
+ describe '.add_file_datastream' do
217
+
218
+ it "should set the correct mimeType if :mime_type, :mimeType, or :content_type passed in and path does not contain correct extension" do
219
+ f = File.new(File.join( File.dirname(__FILE__), "../fixtures/dino_jpg_no_file_ext" ))
220
+ @test_object.add_file_datastream(f)
221
+ @test_object.save
222
+ test_obj = ActiveFedora::Base.load_instance(@test_object.pid)
223
+ #check case where nothing passed in does not have correct mime type
224
+ test_obj.datastreams["DS1"].attributes["mimeType"].should == "application/octet-stream"
225
+ @test_object2 = ActiveFedora::Base.new
226
+ @test_object2.add_file_datastream(f,{:mimeType=>"image/jpeg"})
227
+ @test_object2.save
228
+ test_obj = ActiveFedora::Base.load_instance(@test_object2.pid)
229
+ test_obj.datastreams["DS1"].attributes["mimeType"].should == "image/jpeg"
230
+ @test_object3 = ActiveFedora::Base.new
231
+ @test_object3.add_file_datastream(f,{:mime_type=>"image/jpeg"})
232
+ @test_object3.save
233
+ test_obj = ActiveFedora::Base.load_instance(@test_object3.pid)
234
+ test_obj.datastreams["DS1"].attributes["mimeType"].should == "image/jpeg"
235
+ @test_object4 = ActiveFedora::Base.new
236
+ @test_object4.add_file_datastream(f,{:content_type=>"image/jpeg"})
237
+ @test_object4.save
238
+ test_obj = ActiveFedora::Base.load_instance(@test_object4.pid)
239
+ test_obj.datastreams["DS1"].attributes["mimeType"].should == "image/jpeg"
240
+ end
241
+ end
211
242
 
212
243
  describe '.add_datastream' do
213
244
 
@@ -284,29 +315,41 @@ describe ActiveFedora::Base do
284
315
  model_rel = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>ActiveFedora::ContentModel.pid_from_ruby_class(MockAFBaseRelationship))
285
316
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
286
317
  @test_object2.named_relationships(false).should == {:self=>{"testing"=>[r3.object],
287
- "testing2"=>[r4.object]},
288
- :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[]}}
289
- @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
318
+ "testing2"=>[r4.object],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
319
+ :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[],
320
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
321
+ @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
290
322
  :inbound=>{"testing_inbound"=>[r2.object],
291
- "testing_inbound2"=>[r5.object]}}
292
- @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
293
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object]}}
323
+ "testing_inbound2"=>[r5.object],
324
+ "testing_bidirectional_inbound"=>[],
325
+ "testing_inbound3"=>[]}}
326
+ @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
327
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object],
328
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
294
329
  @test_object5.named_relationships(false).should == {:self=>{"testing"=>[r2.object],
295
- "testing2"=>[r3.object]},
296
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[]}}
330
+ "testing2"=>[r3.object],
331
+ "testing_bidirectional_outbound"=>[],
332
+ "testing3"=>[]},
333
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[],
334
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
297
335
  @test_object2.delete
298
336
  #need to reload since removed from rels_ext in memory
299
337
  @test_object5 = MockAFBaseRelationship.load_instance(@test_object5.pid)
300
338
 
301
339
  #check any test_object2 inbound rels gone from source
302
- @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
340
+ @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
303
341
  :inbound=>{"testing_inbound"=>[],
304
- "testing_inbound2"=>[r5.object]}}
305
- @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
306
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[]}}
342
+ "testing_inbound2"=>[r5.object],
343
+ "testing_bidirectional_inbound"=>[],
344
+ "testing_inbound3"=>[]}}
345
+ @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
346
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[],
347
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
307
348
  @test_object5.named_relationships(false).should == {:self=>{"testing"=>[],
308
- "testing2"=>[r3.object]},
309
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[]}}
349
+ "testing2"=>[r3.object],
350
+ "testing_bidirectional_outbound"=>[],"testing3"=>[]},
351
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[],
352
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
310
353
 
311
354
  end
312
355
  end
@@ -354,8 +397,10 @@ describe ActiveFedora::Base do
354
397
  #append to named relationship 'testing'
355
398
  @test_object2.testing_append(@test_object3)
356
399
  @test_object2.testing2_append(@test_object4)
400
+ @test_object2.testing3_append(@test_object5)
357
401
  @test_object5.testing_append(@test_object2)
358
402
  @test_object5.testing2_append(@test_object3)
403
+ @test_object5.testing_bidirectional_append(@test_object4)
359
404
  @test_object2.save
360
405
  @test_object5.save
361
406
  r2 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object2)
@@ -366,26 +411,30 @@ describe ActiveFedora::Base do
366
411
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
367
412
  @test_object2.relationships(false).should == {:self=>{:has_model=>[model_rel.object],
368
413
  :has_part=>[r3.object],
369
- :has_member=>[r4.object]},
414
+ :has_member=>[r4.object],
415
+ :is_member_of_collection=>[r5.object]},
370
416
  :inbound=>{:has_part=>[r5.object]}}
371
417
  @test_object3.relationships(false).should == {:self=>{:has_model=>[model_rel.object]},
372
418
  :inbound=>{:has_part=>[r2.object],
373
419
  :has_member=>[r5.object]}}
374
420
  @test_object4.relationships(false).should == {:self=>{:has_model=>[model_rel.object]},
375
- :inbound=>{:has_member=>[r2.object]}}
421
+ :inbound=>{:has_member=>[r2.object],:has_collection_member=>[r5.object]}}
376
422
  @test_object5.relationships(false).should == {:self=>{:has_model=>[model_rel.object],
377
423
  :has_part=>[r2.object],
378
- :has_member=>[r3.object]},
379
- :inbound=>{}}
424
+ :has_member=>[r3.object],
425
+ :has_collection_member=>[r4.object]},
426
+ :inbound=>{:is_member_of_collection=>[r2.object]}}
380
427
  #all inbound should now be empty if no parameter supplied to relationships
381
428
  @test_object2.relationships.should == {:self=>{:has_model=>[model_rel.object],
382
429
  :has_part=>[r3.object],
383
- :has_member=>[r4.object]}}
430
+ :has_member=>[r4.object],
431
+ :is_member_of_collection=>[r5.object]}}
384
432
  @test_object3.relationships.should == {:self=>{:has_model=>[model_rel.object]}}
385
433
  @test_object4.relationships.should == {:self=>{:has_model=>[model_rel.object]}}
386
434
  @test_object5.relationships.should == {:self=>{:has_model=>[model_rel.object],
387
435
  :has_part=>[r2.object],
388
- :has_member=>[r3.object]}}
436
+ :has_member=>[r3.object],
437
+ :has_collection_member=>[r4.object]}}
389
438
  end
390
439
  end
391
440
 
@@ -408,6 +457,7 @@ describe ActiveFedora::Base do
408
457
  @test_object2.testing2_append(@test_object4)
409
458
  @test_object5.testing_append(@test_object2)
410
459
  @test_object5.testing2_append(@test_object3)
460
+ #@test_object5.testing_bidirectional_append(@test_object4)
411
461
  @test_object2.save
412
462
  @test_object5.save
413
463
  r2 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object2)
@@ -450,10 +500,14 @@ describe ActiveFedora::Base do
450
500
  r5 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object5)
451
501
  model_rel = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>ActiveFedora::ContentModel.pid_from_ruby_class(MockAFBaseRelationship))
452
502
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
453
- @test_object2.named_inbound_relationships.should == {"testing_inbound"=>[r5.object],"testing_inbound2"=>[]}
454
- @test_object3.named_inbound_relationships.should == {"testing_inbound"=>[r2.object],"testing_inbound2"=>[r5.object]}
455
- @test_object4.named_inbound_relationships.should == {"testing_inbound"=>[],"testing_inbound2"=>[r2.object]}
456
- @test_object5.named_inbound_relationships.should == {"testing_inbound"=>[],"testing_inbound2"=>[]}
503
+ @test_object2.named_inbound_relationships.should == {"testing_inbound"=>[r5.object],"testing_inbound2"=>[],
504
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}
505
+ @test_object3.named_inbound_relationships.should == {"testing_inbound"=>[r2.object],"testing_inbound2"=>[r5.object],
506
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}
507
+ @test_object4.named_inbound_relationships.should == {"testing_inbound"=>[],"testing_inbound2"=>[r2.object],
508
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}
509
+ @test_object5.named_inbound_relationships.should == {"testing_inbound"=>[],"testing_inbound2"=>[],
510
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}
457
511
  end
458
512
  end
459
513
 
@@ -485,23 +539,32 @@ describe ActiveFedora::Base do
485
539
  model_rel = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>ActiveFedora::ContentModel.pid_from_ruby_class(MockAFBaseRelationship))
486
540
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
487
541
  @test_object2.named_relationships(false).should == {:self=>{"testing"=>[r3.object],
488
- "testing2"=>[r4.object]},
489
- :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[]}}
490
- @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
542
+ "testing2"=>[r4.object],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
543
+ :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[],
544
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
545
+ @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
491
546
  :inbound=>{"testing_inbound"=>[r2.object],
492
- "testing_inbound2"=>[r5.object]}}
493
- @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
494
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object]}}
547
+ "testing_inbound2"=>[r5.object],
548
+ "testing_bidirectional_inbound"=>[],
549
+ "testing_inbound3"=>[]}}
550
+ @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
551
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object],
552
+ "testing_bidirectional_inbound"=>[], "testing_inbound3"=>[]}}
495
553
  @test_object5.named_relationships(false).should == {:self=>{"testing"=>[r2.object],
496
- "testing2"=>[r3.object]},
497
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[]}}
554
+ "testing2"=>[r3.object],
555
+ "testing_bidirectional_outbound"=>[],
556
+ "testing3"=>[]},
557
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[],
558
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
498
559
  #all inbound should now be empty if no parameter supplied to relationships
499
560
  @test_object2.named_relationships.should == {:self=>{"testing"=>[r3.object],
500
- "testing2"=>[r4.object]}}
501
- @test_object3.named_relationships.should == {:self=>{"testing"=>[],"testing2"=>[]}}
502
- @test_object4.named_relationships.should == {:self=>{"testing"=>[],"testing2"=>[]}}
561
+ "testing2"=>[r4.object],
562
+ "testing_bidirectional_outbound"=>[],
563
+ "testing3"=>[]}}
564
+ @test_object3.named_relationships.should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]}}
565
+ @test_object4.named_relationships.should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]}}
503
566
  @test_object5.named_relationships.should == {:self=>{"testing"=>[r2.object],
504
- "testing2"=>[r3.object]}}
567
+ "testing2"=>[r3.object],"testing_bidirectional_outbound"=>[],"testing3"=>[]}}
505
568
  end
506
569
  end
507
570
 
@@ -533,16 +596,23 @@ describe ActiveFedora::Base do
533
596
  model_rel = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>ActiveFedora::ContentModel.pid_from_ruby_class(MockAFBaseRelationship))
534
597
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
535
598
  @test_object2.named_relationships(false).should == {:self=>{"testing"=>[r3.object],
536
- "testing2"=>[r4.object]},
537
- :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[]}}
538
- @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
599
+ "testing2"=>[r4.object],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
600
+ :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[],
601
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
602
+ @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
539
603
  :inbound=>{"testing_inbound"=>[r2.object],
540
- "testing_inbound2"=>[r5.object]}}
541
- @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
542
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object]}}
604
+ "testing_inbound2"=>[r5.object],
605
+ "testing_bidirectional_inbound"=>[],
606
+ "testing_inbound3"=>[]}}
607
+ @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
608
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object],
609
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
543
610
  @test_object5.named_relationships(false).should == {:self=>{"testing"=>[r2.object],
544
- "testing2"=>[r3.object]},
545
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[]}}
611
+ "testing2"=>[r3.object],
612
+ "testing_bidirectional_outbound"=>[],
613
+ "testing3"=>[]},
614
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[],
615
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
546
616
  end
547
617
  end
548
618
 
@@ -574,30 +644,45 @@ describe ActiveFedora::Base do
574
644
  model_rel = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>ActiveFedora::ContentModel.pid_from_ruby_class(MockAFBaseRelationship))
575
645
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
576
646
  @test_object2.named_relationships(false).should == {:self=>{"testing"=>[r3.object],
577
- "testing2"=>[r4.object]},
578
- :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[]}}
579
- @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
647
+ "testing2"=>[r4.object],
648
+ "testing_bidirectional_outbound"=>[],"testing3"=>[]},
649
+ :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[],
650
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
651
+ @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
580
652
  :inbound=>{"testing_inbound"=>[r2.object],
581
- "testing_inbound2"=>[r5.object]}}
582
- @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
583
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object]}}
653
+ "testing_inbound2"=>[r5.object],
654
+ "testing_bidirectional_inbound"=>[],
655
+ "testing_inbound3"=>[]}}
656
+ @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
657
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object],
658
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
584
659
  @test_object5.named_relationships(false).should == {:self=>{"testing"=>[r2.object],
585
- "testing2"=>[r3.object]},
586
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[]}}
660
+ "testing2"=>[r3.object],
661
+ "testing_bidirectional_outbound"=>[],
662
+ "testing3"=>[]},
663
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[],
664
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
587
665
  @test_object2.remove_named_relationship("testing",@test_object3)
588
666
  @test_object2.save
589
667
  #check now removed for both outbound and inbound
590
668
  @test_object2.named_relationships(false).should == {:self=>{"testing"=>[],
591
- "testing2"=>[r4.object]},
592
- :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[]}}
593
- @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
669
+ "testing2"=>[r4.object],
670
+ "testing_bidirectional_outbound"=>[],
671
+ "testing3"=>[]},
672
+ :inbound=>{"testing_inbound"=>[r5.object],"testing_inbound2"=>[],
673
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
674
+ @test_object3.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
594
675
  :inbound=>{"testing_inbound"=>[],
595
- "testing_inbound2"=>[r5.object]}}
596
- @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[]},
597
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object]}}
676
+ "testing_inbound2"=>[r5.object],
677
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
678
+ @test_object4.named_relationships(false).should == {:self=>{"testing"=>[],"testing2"=>[],"testing_bidirectional_outbound"=>[],"testing3"=>[]},
679
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[r2.object],
680
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
598
681
  @test_object5.named_relationships(false).should == {:self=>{"testing"=>[r2.object],
599
- "testing2"=>[r3.object]},
600
- :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[]}}
682
+ "testing2"=>[r3.object],
683
+ "testing_bidirectional_outbound"=>[],"testing3"=>[]},
684
+ :inbound=>{"testing_inbound"=>[],"testing_inbound2"=>[],
685
+ "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[]}}
601
686
 
602
687
  end
603
688
  end
@@ -0,0 +1,60 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+ require "hydra"
3
+ require "solrizer"
4
+
5
+ describe ActiveFedora::NokogiriDatastream do
6
+
7
+ before(:all) do
8
+ class HydrangeaArticle2 < ActiveFedora::Base
9
+
10
+ has_relationship "parts", :is_part_of, :inbound => true
11
+
12
+ # Uses the Hydra Rights Metadata Schema for tracking access permissions & copyright
13
+ # has_metadata :name => "rightsMetadata", :type => Hydra::RightsMetadata
14
+
15
+ # Uses the Hydra MODS Article profile for tracking most of the descriptive metadata
16
+ has_metadata :name => "descMetadata", :type => Hydra::SampleModsDatastream
17
+
18
+ # A place to put extra metadata values
19
+ has_metadata :name => "properties", :type => ActiveFedora::MetadataDatastream do |m|
20
+ m.field 'collection', :string
21
+ end
22
+ end
23
+
24
+ @pid = "hydrangea:fixture_mods_article1"
25
+ @test_solr_object = HydrangeaArticle2.load_instance_from_solr(@pid)
26
+ @test_object = HydrangeaArticle2.load_instance(@pid)
27
+ end
28
+
29
+ describe '.term_values' do
30
+
31
+ it "should return the same values whether getting from solr or Fedora" do
32
+ @test_solr_object.datastreams["descMetadata"].term_values(:name,:role,:text).should == ["Creator","Contributor","Funder","Host"]
33
+ @test_solr_object.datastreams["descMetadata"].term_values({:name=>0},:role,:text).should == ["Creator"]
34
+ @test_solr_object.datastreams["descMetadata"].term_values({:name=>1},:role,:text).should == ["Contributor"]
35
+ @test_solr_object.datastreams["descMetadata"].term_values({:name=>0},{:role=>0},:text).should == ["Creator"]
36
+ @test_solr_object.datastreams["descMetadata"].term_values({:name=>1},{:role=>0},:text).should == ["Contributor"]
37
+ @test_solr_object.datastreams["descMetadata"].term_values({:name=>1},{:role=>1},:text).should == []
38
+ ar = @test_solr_object.datastreams["descMetadata"].term_values(:name,{:role=>0},:text)
39
+ ar.length.should == 4
40
+ ar.include?("Creator").should == true
41
+ ar.include?("Contributor").should == true
42
+ ar.include?("Funder").should == true
43
+ ar.include?("Host").should == true
44
+
45
+ @test_object.datastreams["descMetadata"].term_values(:name,:role,:text).should == ["Creator","Contributor","Funder","Host"]
46
+ @test_object.datastreams["descMetadata"].term_values({:name=>0},:role,:text).should == ["Creator"]
47
+ @test_object.datastreams["descMetadata"].term_values({:name=>1},:role,:text).should == ["Contributor"]
48
+ @test_object.datastreams["descMetadata"].term_values({:name=>0},{:role=>0},:text).should == ["Creator"]
49
+ @test_object.datastreams["descMetadata"].term_values({:name=>1},{:role=>0},:text).should == ["Contributor"]
50
+ @test_object.datastreams["descMetadata"].term_values({:name=>1},{:role=>1},:text).should == []
51
+ ar = @test_object.datastreams["descMetadata"].term_values(:name,{:role=>0},:text)
52
+ ar.length.should == 4
53
+ ar.include?("Creator").should == true
54
+ ar.include?("Contributor").should == true
55
+ ar.include?("Funder").should == true
56
+ ar.include?("Host").should == true
57
+ end
58
+ end
59
+
60
+ end
@@ -5,6 +5,8 @@ require "active_fedora"
5
5
 
6
6
  describe ActiveFedora::Base do
7
7
 
8
+ @@last_pid = 0
9
+
8
10
  def increment_pid
9
11
  @@last_pid += 1
10
12
  end
@@ -577,4 +579,4 @@ describe ActiveFedora::Base do
577
579
  @test_object2.should respond_to(:external_ids)
578
580
  end
579
581
  end
580
- end
582
+ end
@@ -10,7 +10,8 @@ describe ActiveFedora::NokogiriDatastream do
10
10
  :empty_field => {:values => {}}
11
11
  }
12
12
  @sample_xml = XmlSimple.xml_in("<fields><coverage>coverage1</coverage><coverage>coverage2</coverage><creation_date>fake-date</creation_date><mydate>fake-date</mydate><publisher>publisher1</publisher></fields>")
13
-
13
+
14
+ @solr_doc = {"id"=>"hydrange_article1","name_role_roleTerm_t"=>["creator","submitter","teacher"],"name_0_role_t"=>"\r\ncreator\r\nsubmitter\r\n","name_1_role_t"=>"\r\n teacher \r\n","name_0_role_0_roleTerm_t"=>"creator","name_0_role_1_roleTerm_t"=>"submitter","name_1_role_0_roleTerm_t"=>["teacher"]}
14
15
  end
15
16
 
16
17
  before(:each) do
@@ -98,7 +99,7 @@ describe ActiveFedora::NokogiriDatastream do
98
99
  end
99
100
 
100
101
  it "should return the new index of any added values" do
101
- @mods_ds.get_values([{:title_info=>0},:main_title]).should == ["ARTICLE TITLE HYDRANGEA ARTICLE 1", "TITLE OF HOST JOURNAL"]
102
+ @mods_ds.get_values([{:title_info=>0},:main_title]).should == ["ARTICLE TITLE", "TITLE OF HOST JOURNAL"]
102
103
  result = @mods_ds.update_indexed_attributes [{"title_info"=>"0"},"main_title"]=>{"-1"=>"mork"}
103
104
  result.should == {"title_info_0_main_title"=>{"2"=>"mork"}}
104
105
  end
@@ -157,7 +158,7 @@ describe ActiveFedora::NokogiriDatastream do
157
158
  # end
158
159
 
159
160
  it "should set @dirty to true" do
160
- @mods_ds.get_values([{:title_info=>0},:main_title]).should == ["ARTICLE TITLE HYDRANGEA ARTICLE 1", "TITLE OF HOST JOURNAL"]
161
+ @mods_ds.get_values([{:title_info=>0},:main_title]).should == ["ARTICLE TITLE", "TITLE OF HOST JOURNAL"]
161
162
  @mods_ds.update_indexed_attributes [{"title_info"=>"0"},"main_title"]=>{"-1"=>"mork"}
162
163
  @mods_ds.dirty?.should be_true
163
164
  end
@@ -278,5 +279,110 @@ describe ActiveFedora::NokogiriDatastream do
278
279
  @test_ds.set_blob_for_save
279
280
  end
280
281
  end
281
-
282
+
283
+ describe '.from_solr' do
284
+ it "should set the internal_solr_doc attribute to the solr document passed in" do
285
+ @test_ds.from_solr(@solr_doc)
286
+ @test_ds.internal_solr_doc.should == @solr_doc
287
+ end
288
+ end
289
+
290
+ describe '.get_values_from_solr' do
291
+ before(:each) do
292
+ @mods_ds = ActiveFedora::NokogiriDatastream.new(:blob=>fixture(File.join("mods_articles","hydrangea_article1.xml")))
293
+ end
294
+
295
+ it "should return empty array if internal_solr_doc not set" do
296
+ @mods_ds.get_values_from_solr(:name,:role,:roleTerm)
297
+ end
298
+
299
+ it "should return correct values from solr_doc given different term pointers" do
300
+ mock_term = mock("OM::XML::Term")
301
+ mock_term.stubs(:data_type).returns(:text)
302
+ mock_terminology = mock("OM::XML::Terminology")
303
+ mock_terminology.stubs(:retrieve_term).returns(mock_term)
304
+ ActiveFedora::NokogiriDatastream.stubs(:terminology).returns(mock_terminology)
305
+ @mods_ds.from_solr(@solr_doc)
306
+ term_pointer = [:name,:role,:roleTerm]
307
+ @mods_ds.get_values_from_solr(:name,:role,:roleTerm).should == ["creator","submitter","teacher"]
308
+ ar = @mods_ds.get_values_from_solr({:name=>0},:role,:roleTerm)
309
+ ar.length.should == 2
310
+ ar.include?("creator").should == true
311
+ ar.include?("submitter").should == true
312
+ @mods_ds.get_values_from_solr({:name=>1},:role,:roleTerm).should == ["teacher"]
313
+ @mods_ds.get_values_from_solr({:name=>0},{:role=>0},:roleTerm).should == ["creator"]
314
+ @mods_ds.get_values_from_solr({:name=>0},{:role=>1},:roleTerm).should == ["submitter"]
315
+ @mods_ds.get_values_from_solr({:name=>0},{:role=>2},:roleTerm).should == []
316
+ @mods_ds.get_values_from_solr({:name=>1},{:role=>0},:roleTerm).should == ["teacher"]
317
+ @mods_ds.get_values_from_solr({:name=>1},{:role=>1},:roleTerm).should == []
318
+ ar = @mods_ds.get_values_from_solr(:name,{:role=>0},:roleTerm)
319
+ ar.length.should == 2
320
+ ar.include?("creator").should == true
321
+ ar.include?("teacher").should == true
322
+ @mods_ds.get_values_from_solr(:name,{:role=>1},:roleTerm).should == ["submitter"]
323
+ end
324
+ end
325
+
326
+ describe '.has_solr_name?' do
327
+ it "should return true if the given key exists in the solr document passed in" do
328
+ @test_ds.has_solr_name?("name_0_role_0_roleTerm_t",@solr_doc).should == true
329
+ @test_ds.has_solr_name?(:name_0_role_0_roleTerm_t,@solr_doc).should == true
330
+ @test_ds.has_solr_name?("name_1_role_1_roleTerm_t",@solr_doc).should == false
331
+ #if not doc passed in should be new empty solr doc and always return false
332
+ @test_ds.has_solr_name?("name_0_role_0_roleTerm_t").should == false
333
+ end
334
+ end
335
+
336
+ describe '.is_hierarchical_term_pointer?' do
337
+ it "should return true only if the pointer passed in is an array that contains a hash" do
338
+ @test_ds.is_hierarchical_term_pointer?(*[:image,{:tag1=>1},:tag2]).should == true
339
+ @test_ds.is_hierarchical_term_pointer?(*[:image,:tag1,{:tag2=>1}]).should == true
340
+ @test_ds.is_hierarchical_term_pointer?(*[:image,:tag1,:tag2]).should == false
341
+ @test_ds.is_hierarchical_term_pointer?(nil).should == false
342
+ end
343
+ end
344
+
345
+ describe '.update_values' do
346
+ before(:each) do
347
+ @mods_ds = ActiveFedora::NokogiriDatastream.new(:blob=>fixture(File.join("mods_articles","hydrangea_article1.xml")))
348
+ end
349
+
350
+ it "should throw an exception if we have initialized the internal_solr_doc." do
351
+ @mods_ds.from_solr(@solr_doc)
352
+ found_exception = false
353
+ begin
354
+ @mods_ds.update_values([{":person"=>"0"}, "role", "text"]=>{"0"=>"role1", "1"=>"role2", "2"=>"role3"})
355
+ rescue
356
+ found_exception = true
357
+ end
358
+ found_exception.should == true
359
+ end
360
+
361
+ it "should update a value internally call OM::XML::TermValueOperators::update_values if internal_solr_doc is not set" do
362
+ @mods_ds.stubs(:om_update_values).once()
363
+ term_pointer = [:name,:role,:roleTerm]
364
+ @mods_ds.update_values([{":person"=>"0"}, "role", "text"]=>{"0"=>"role1", "1"=>"role2", "2"=>"role3"})
365
+ end
366
+ end
367
+
368
+ describe '.term_values' do
369
+
370
+ before(:each) do
371
+ @mods_ds = ActiveFedora::NokogiriDatastream.new(:blob=>fixture(File.join("mods_articles","hydrangea_article1.xml")))
372
+ end
373
+
374
+ it "should call OM::XML::term_values if internal_solr_doc is not set and return values from xml" do
375
+ @mods_ds.stubs(:om_term_values).once()
376
+ term_pointer = [:name,:role,:roleTerm]
377
+ @mods_ds.term_values(*term_pointer)
378
+ end
379
+
380
+ # we will know this is working because solr_doc and xml are not synced so that wrong return mechanism can be detected
381
+ it "should call get_values_from_solr if internal_solr_doc is set" do
382
+ @mods_ds.from_solr(@solr_doc)
383
+ term_pointer = [:name,:role,:roleTerm]
384
+ @mods_ds.stubs(:get_values_from_solr).once()
385
+ @mods_ds.term_values(*term_pointer)
386
+ end
387
+ end
282
388
  end