active-fedora 13.1.2 → 13.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/.github_changelog_generator +2 -0
  3. data/CHANGELOG.md +3362 -0
  4. data/CONTRIBUTING.md +23 -1
  5. data/README.md +4 -0
  6. data/active-fedora.gemspec +14 -13
  7. data/lib/active_fedora/version.rb +1 -1
  8. metadata +104 -206
  9. data/spec/config_helper.rb +0 -17
  10. data/spec/fixtures/dino.jpg +0 -0
  11. data/spec/fixtures/dino_jpg_no_file_ext +0 -0
  12. data/spec/fixtures/minivan.jpg +0 -0
  13. data/spec/fixtures/rails_root/config/fake_fedora.yml +0 -7
  14. data/spec/fixtures/rails_root/config/fedora.yml +0 -12
  15. data/spec/fixtures/rails_root/config/solr.yml +0 -15
  16. data/spec/fixtures/rails_root/config/solr_mappings.yml +0 -16
  17. data/spec/fixtures/rails_root/config/solr_mappings_af_0.1.yml +0 -9
  18. data/spec/fixtures/rails_root/config/solr_mappings_bl_2.4.yml +0 -17
  19. data/spec/integration/associations/rdf_spec.rb +0 -61
  20. data/spec/integration/associations_spec.rb +0 -680
  21. data/spec/integration/attached_files_spec.rb +0 -146
  22. data/spec/integration/attributes_spec.rb +0 -73
  23. data/spec/integration/autosave_association_spec.rb +0 -24
  24. data/spec/integration/base_spec.rb +0 -184
  25. data/spec/integration/basic_contains_association_spec.rb +0 -121
  26. data/spec/integration/belongs_to_association_spec.rb +0 -260
  27. data/spec/integration/caching_spec.rb +0 -59
  28. data/spec/integration/clean_connection_spec.rb +0 -21
  29. data/spec/integration/collection_association_spec.rb +0 -166
  30. data/spec/integration/date_time_properties_spec.rb +0 -41
  31. data/spec/integration/delete_all_spec.rb +0 -64
  32. data/spec/integration/direct_container_spec.rb +0 -250
  33. data/spec/integration/directly_contains_one_association_spec.rb +0 -96
  34. data/spec/integration/eradicate_spec.rb +0 -52
  35. data/spec/integration/fedora_solr_sync_spec.rb +0 -30
  36. data/spec/integration/file_fixity_spec.rb +0 -36
  37. data/spec/integration/file_spec.rb +0 -221
  38. data/spec/integration/generators/fedora_generator_spec.rb +0 -26
  39. data/spec/integration/generators/solr_generator_spec.rb +0 -23
  40. data/spec/integration/gone_spec.rb +0 -41
  41. data/spec/integration/has_and_belongs_to_many_associations_spec.rb +0 -414
  42. data/spec/integration/has_many_associations_spec.rb +0 -436
  43. data/spec/integration/has_subresource_spec.rb +0 -34
  44. data/spec/integration/indexing/descendant_fetcher_spec.rb +0 -64
  45. data/spec/integration/indexing_spec.rb +0 -110
  46. data/spec/integration/indirect_container_spec.rb +0 -290
  47. data/spec/integration/json_serialization_spec.rb +0 -32
  48. data/spec/integration/marshal_spec.rb +0 -39
  49. data/spec/integration/nested_attribute_spec.rb +0 -177
  50. data/spec/integration/nested_hash_resources_spec.rb +0 -43
  51. data/spec/integration/persistence_spec.rb +0 -37
  52. data/spec/integration/query_result_builder_spec.rb +0 -37
  53. data/spec/integration/rdf_nested_attributes_spec.rb +0 -85
  54. data/spec/integration/relation_delegation_spec.rb +0 -52
  55. data/spec/integration/relation_spec.rb +0 -117
  56. data/spec/integration/scoped_query_spec.rb +0 -134
  57. data/spec/integration/scoping_spec.rb +0 -48
  58. data/spec/integration/solr_hit_spec.rb +0 -32
  59. data/spec/integration/versionable_spec.rb +0 -256
  60. data/spec/integration/with_metadata_spec.rb +0 -111
  61. data/spec/lib/active_fedora/null_logger_spec.rb +0 -10
  62. data/spec/rcov.opts +0 -2
  63. data/spec/spec.opts +0 -5
  64. data/spec/spec_helper.rb +0 -106
  65. data/spec/support/an_active_model.rb +0 -29
  66. data/spec/unit/active_fedora/indexing/inserter_spec.rb +0 -35
  67. data/spec/unit/active_fedora_spec.rb +0 -118
  68. data/spec/unit/aggregation/list_source_spec.rb +0 -134
  69. data/spec/unit/aggregation/ordered_reader_spec.rb +0 -43
  70. data/spec/unit/association_hash_spec.rb +0 -64
  71. data/spec/unit/attached_files_spec.rb +0 -218
  72. data/spec/unit/attributes_spec.rb +0 -146
  73. data/spec/unit/base_active_model_spec.rb +0 -28
  74. data/spec/unit/base_cma_spec.rb +0 -15
  75. data/spec/unit/base_extra_spec.rb +0 -33
  76. data/spec/unit/base_spec.rb +0 -328
  77. data/spec/unit/builder/has_and_belongs_to_many_spec.rb +0 -8
  78. data/spec/unit/callback_spec.rb +0 -65
  79. data/spec/unit/change_set_spec.rb +0 -60
  80. data/spec/unit/checksum_spec.rb +0 -25
  81. data/spec/unit/code_configurator_spec.rb +0 -41
  82. data/spec/unit/collection_proxy_spec.rb +0 -25
  83. data/spec/unit/config_spec.rb +0 -18
  84. data/spec/unit/core/fedora_id_translator_spec.rb +0 -29
  85. data/spec/unit/core/fedora_uri_translator_spec.rb +0 -19
  86. data/spec/unit/core/logger_spec.rb +0 -18
  87. data/spec/unit/core_spec.rb +0 -242
  88. data/spec/unit/default_model_mapper_spec.rb +0 -39
  89. data/spec/unit/fedora_spec.rb +0 -31
  90. data/spec/unit/file/streaming_spec.rb +0 -33
  91. data/spec/unit/file_configurator_spec.rb +0 -295
  92. data/spec/unit/file_io_spec.rb +0 -137
  93. data/spec/unit/file_path_builder_spec.rb +0 -18
  94. data/spec/unit/file_spec.rb +0 -489
  95. data/spec/unit/files_hash_spec.rb +0 -52
  96. data/spec/unit/filter_spec.rb +0 -133
  97. data/spec/unit/finder_methods_spec.rb +0 -154
  98. data/spec/unit/fixity_service_spec.rb +0 -128
  99. data/spec/unit/forbidden_attributes_protection_spec.rb +0 -50
  100. data/spec/unit/has_and_belongs_to_many_association_spec.rb +0 -125
  101. data/spec/unit/has_many_association_spec.rb +0 -131
  102. data/spec/unit/indexers/global_indexer_spec.rb +0 -41
  103. data/spec/unit/indexing/map/index_object_spec.rb +0 -25
  104. data/spec/unit/indexing/map_spec.rb +0 -27
  105. data/spec/unit/indexing_service_spec.rb +0 -28
  106. data/spec/unit/indexing_spec.rb +0 -86
  107. data/spec/unit/inheritance_spec.rb +0 -60
  108. data/spec/unit/ldp_resource_spec.rb +0 -15
  109. data/spec/unit/loadable_from_json_spec.rb +0 -40
  110. data/spec/unit/logger_spec.rb +0 -19
  111. data/spec/unit/model_classifier_spec.rb +0 -49
  112. data/spec/unit/ordered_spec.rb +0 -367
  113. data/spec/unit/orders/list_node_spec.rb +0 -151
  114. data/spec/unit/orders/ordered_list_spec.rb +0 -335
  115. data/spec/unit/orders/reflection_spec.rb +0 -22
  116. data/spec/unit/pathing_spec.rb +0 -35
  117. data/spec/unit/persistence_spec.rb +0 -115
  118. data/spec/unit/property_predicate_spec.rb +0 -35
  119. data/spec/unit/property_spec.rb +0 -25
  120. data/spec/unit/query_result_builder_spec.rb +0 -31
  121. data/spec/unit/query_spec.rb +0 -307
  122. data/spec/unit/querying_spec.rb +0 -24
  123. data/spec/unit/rdf/indexing_service_spec.rb +0 -114
  124. data/spec/unit/rdf_vocab_spec.rb +0 -30
  125. data/spec/unit/readonly_spec.rb +0 -24
  126. data/spec/unit/reflection_spec.rb +0 -42
  127. data/spec/unit/rspec_matchers/belong_to_associated_active_fedora_object_matcher_spec.rb +0 -37
  128. data/spec/unit/rspec_matchers/have_many_associated_active_fedora_objects_matcher_spec.rb +0 -38
  129. data/spec/unit/rspec_matchers/have_predicate_matcher_spec.rb +0 -38
  130. data/spec/unit/schema_indexing_strategy_spec.rb +0 -68
  131. data/spec/unit/scoping_spec.rb +0 -67
  132. data/spec/unit/serializers_spec.rb +0 -19
  133. data/spec/unit/solr_config_options_spec.rb +0 -57
  134. data/spec/unit/solr_hit_spec.rb +0 -57
  135. data/spec/unit/solr_query_builder_spec.rb +0 -18
  136. data/spec/unit/solr_service_spec.rb +0 -165
  137. data/spec/unit/sparql_insert_spec.rb +0 -31
  138. data/spec/unit/validations_spec.rb +0 -92
  139. data/spec/unit/with_metadata/default_metadata_class_factory_spec.rb +0 -29
  140. data/spec/unit/with_metadata/metadata_node_spec.rb +0 -69
@@ -1,52 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Base do
4
- before(:all) do
5
- class TestClass < ActiveFedora::Base
6
- property :foo, predicate: ::RDF::URI('http://example.com/foo')
7
- property :bar, predicate: ::RDF::URI('http://example.com/bar') do |index|
8
- index.as :stored_searchable
9
- end
10
-
11
- def to_solr(doc = {})
12
- doc = super
13
- doc[ActiveFedora.index_field_mapper.solr_name('foo', :sortable)] = doc[ActiveFedora.index_field_mapper.solr_name('foo', type: :string)]
14
- doc
15
- end
16
- end
17
- end
18
-
19
- after(:all) do
20
- Object.send(:remove_const, :TestClass)
21
- end
22
-
23
- describe "with multiple objects" do
24
- let!(:instance1) { TestClass.create!(foo: ['Beta'], bar: ['Chips']) }
25
- let!(:instance2) { TestClass.create!(foo: ['Alpha'], bar: ['Peanuts']) }
26
- let!(:instance3) { TestClass.create!(foo: ['Sigma'], bar: ['Peanuts']) }
27
-
28
- subject(:peanuts) { TestClass.where(bar: 'Peanuts') }
29
-
30
- it "maps" do
31
- expect(peanuts.map(&:id)).to contain_exactly instance2.id, instance3.id
32
- end
33
-
34
- it "collects" do
35
- expect(peanuts.collect(&:id)).to contain_exactly instance2.id, instance3.id
36
- end
37
-
38
- it "has each" do
39
- expect(peanuts.each.to_a.length).to eq 2
40
- end
41
-
42
- it "has all?" do
43
- expect(peanuts.all? { |t| t.foo == ['Alpha'] }).to be false
44
- expect(peanuts.all? { |t| t.bar == ['Peanuts'] }).to be true
45
- end
46
-
47
- it "has include?" do
48
- expect(peanuts.include?(instance1)).to be false
49
- expect(peanuts.include?(instance2)).to be true
50
- end
51
- end
52
- end
@@ -1,117 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Base do
4
- before :all do
5
- class Library < ActiveFedora::Base
6
- has_many :books
7
- end
8
- class Book < ActiveFedora::Base
9
- belongs_to :library, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.isPartOf
10
- end
11
- end
12
-
13
- after :all do
14
- Object.send(:remove_const, :Library)
15
- Object.send(:remove_const, :Book)
16
- end
17
-
18
- subject(:libraries) { Library.all }
19
-
20
- it "is a relation" do
21
- expect(libraries.class).to be ActiveFedora::Relation
22
- end
23
-
24
- it { is_expected.to respond_to(:each_with_index) }
25
- it { expect(libraries.any?).to eq false }
26
- it { is_expected.to be_blank }
27
- it { is_expected.to be_empty }
28
- it { is_expected.not_to be_present }
29
-
30
- context "when some records exist" do
31
- before do
32
- Library.create
33
- end
34
-
35
- let!(:library1) { Library.create }
36
-
37
- describe "is cached" do
38
- before do
39
- libraries.to_a # trigger initial load
40
- end
41
-
42
- it { is_expected.to be_loaded }
43
-
44
- it "does not reload" do
45
- expect_any_instance_of(ActiveFedora::Relation).to_not receive :find_each
46
- libraries[0]
47
- end
48
-
49
- it "does not reload" do
50
- expect_any_instance_of(ActiveFedora::Relation).to_not receive :find_each
51
- libraries.each { |l| l.id }
52
- end
53
- end
54
-
55
- it { expect(libraries.any?).to eq true }
56
- it { is_expected.not_to be_blank }
57
- it { is_expected.not_to be_empty }
58
- it { is_expected.to be_present }
59
-
60
- describe '#each' do
61
- before { Book.create }
62
-
63
- it 'returns an enumerator' do
64
- expect(libraries.each).to be_a Enumerator
65
- end
66
-
67
- it 'yields the items' do
68
- expect { |b| libraries.each(&b) }
69
- .to yield_successive_args(*Library.all.to_a)
70
- end
71
-
72
- it 'when called from Base yields all items' do
73
- expect { |b| ActiveFedora::Base.all.each(&b) }
74
- .to yield_successive_args(*(Library.all.to_a + Book.all.to_a))
75
- end
76
-
77
- context 'when cached' do
78
- it 'returns an enumerator' do
79
- expect(libraries.each).to be_a Enumerator
80
- end
81
-
82
- it 'yields the items' do
83
- expect { |b| libraries.each(&b) }
84
- .to yield_successive_args(*Library.all.to_a)
85
- end
86
- end
87
- end
88
-
89
- describe "#find" do
90
- it "finds one of them" do
91
- expect(libraries.find(library1.id)).to eq library1
92
- end
93
- it "finds with a block" do
94
- expect(libraries.find { |l| l.id == library1.id }).to eq library1
95
- end
96
- end
97
-
98
- describe "#select" do
99
- it "finds with a block" do
100
- expect(libraries.select { |l| l.id == library1.id }).to eq [library1]
101
- end
102
- end
103
-
104
- context "unpermitted methods" do
105
- it "excludes them" do
106
- expect { libraries.sort! }.to raise_error NoMethodError
107
- end
108
- end
109
-
110
- context "when limit is applied" do
111
- subject(:libraries) { Library.create books: [Book.create, Book.create] }
112
- it "limits the number of books" do
113
- expect(libraries.books.limit(1).size).to eq 1
114
- end
115
- end
116
- end
117
- end
@@ -1,134 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Querying do
4
- before do
5
- module ModelIntegrationSpec
6
- class Basic < ActiveFedora::Base
7
- property :foo, predicate: ::RDF::URI('http://example.com/foo') do |index|
8
- index.as :stored_searchable
9
- end
10
- property :bar, predicate: ::RDF::URI('http://example.com/bar') do |index|
11
- index.as :stored_searchable
12
- end
13
- property :baz, predicate: ::RDF::URI('http://example.com/baz')
14
-
15
- def to_solr(doc = {})
16
- doc = super
17
- doc[ActiveFedora.index_field_mapper.solr_name('foo', :sortable)] = doc[ActiveFedora.index_field_mapper.solr_name('foo', type: :string)]
18
- doc
19
- end
20
- end
21
- end
22
- end
23
-
24
- after do
25
- Object.send(:remove_const, :ModelIntegrationSpec)
26
- end
27
-
28
- describe "When there is one object in the store" do
29
- let!(:test_instance) { ModelIntegrationSpec::Basic.create! }
30
-
31
- after do
32
- test_instance.delete
33
- end
34
-
35
- describe ".all" do
36
- it "returns an array of instances of the calling Class" do
37
- result = ModelIntegrationSpec::Basic.all.to_a
38
- expect(result).to be_instance_of(Array)
39
- # this test is meaningless if the array length is zero
40
- expect(result.length).to be > 0
41
- expect(result).to all(be_an(ModelIntegrationSpec::Basic))
42
- end
43
- end
44
-
45
- describe ".first" do
46
- it "returns one instance of the calling class" do
47
- expect(ModelIntegrationSpec::Basic.first).to eq test_instance
48
- end
49
- end
50
- end
51
-
52
- describe "with multiple objects" do
53
- let!(:test_instance1) { ModelIntegrationSpec::Basic.create!(foo: ['Beta'], bar: ['Chips']) }
54
- let!(:test_instance2) { ModelIntegrationSpec::Basic.create!(foo: ['Alpha'], bar: ['Peanuts']) }
55
- let!(:test_instance3) { ModelIntegrationSpec::Basic.create!(foo: ['Sigma'], bar: ['Peanuts']) }
56
-
57
- describe "when the objects are in fedora" do
58
- after do
59
- test_instance1.delete
60
- test_instance2.delete
61
- test_instance3.delete
62
- end
63
-
64
- it "queries" do
65
- field = ActiveFedora.index_field_mapper.solr_name('foo', type: :string)
66
- expect(ModelIntegrationSpec::Basic.where(field => 'Beta')).to eq [test_instance1]
67
- expect(ModelIntegrationSpec::Basic.where('foo' => 'Beta')).to eq [test_instance1]
68
- expect(ModelIntegrationSpec::Basic.where('foo' => ['Beta', 'Alpha'])).to eq [test_instance1, test_instance2]
69
- end
70
- it "orders" do
71
- expect(ModelIntegrationSpec::Basic.order(ActiveFedora.index_field_mapper.solr_name('foo', :sortable) + ' asc')).to contain_exactly test_instance2, test_instance1, test_instance3
72
- end
73
- it "limits" do
74
- expect(ModelIntegrationSpec::Basic.limit(1)).to eq [test_instance1]
75
- end
76
- it "offsets" do
77
- expect(ModelIntegrationSpec::Basic.offset(1)).to contain_exactly test_instance2, test_instance3
78
- end
79
-
80
- it "chains queries" do
81
- expect(ModelIntegrationSpec::Basic.where(ActiveFedora.index_field_mapper.solr_name('bar', type: :string) => 'Peanuts').order(ActiveFedora.index_field_mapper.solr_name('foo', :sortable) + ' asc').limit(1)).to eq [test_instance2]
82
- end
83
-
84
- it "wraps string conditions with parentheses" do
85
- expect(ModelIntegrationSpec::Basic.where("foo:bar OR bar:baz").where_values).to eq ["(foo:bar OR bar:baz)"]
86
- end
87
-
88
- it "chains where queries" do
89
- first_condition = { ActiveFedora.index_field_mapper.solr_name('bar', type: :string) => 'Peanuts' }
90
- second_condition = "foo_tesim:bar"
91
- where_values = ModelIntegrationSpec::Basic.where(first_condition)
92
- .where(second_condition).where_values
93
- expect(where_values).to eq ["_query_:\"{!field f=bar_tesim}Peanuts\"",
94
- "(foo_tesim:bar)"]
95
- end
96
-
97
- it "chains count" do
98
- expect(ModelIntegrationSpec::Basic.where(ActiveFedora.index_field_mapper.solr_name('bar', type: :string) => 'Peanuts').count).to eq 2
99
- end
100
-
101
- it "calling first should not affect the relation's ability to get all results later" do
102
- relation = ModelIntegrationSpec::Basic.where(ActiveFedora.index_field_mapper.solr_name('bar', type: :string) => 'Peanuts')
103
- expect { relation.first }.not_to change { relation.to_a.size }
104
- end
105
-
106
- it "calling where should not affect the relation's ability to get all results later" do
107
- relation = ModelIntegrationSpec::Basic.where(ActiveFedora.index_field_mapper.solr_name('bar', type: :string) => 'Peanuts')
108
- expect { relation.where(ActiveFedora.index_field_mapper.solr_name('foo', type: :string) => 'bar') }.not_to change { relation.to_a.size }
109
- end
110
-
111
- it "calling order should not affect the original order of the relation later" do
112
- relation = ModelIntegrationSpec::Basic.order(ActiveFedora.index_field_mapper.solr_name('foo', :sortable) + ' asc')
113
- expect { relation.order(ActiveFedora.index_field_mapper.solr_name('foo', :sortable) + ' desc') }.not_to change { relation.to_a }
114
- end
115
- end
116
-
117
- describe "when one of the objects in solr isn't in fedora" do
118
- let!(:id) { test_instance2.id }
119
- before { Ldp::Resource::RdfSource.new(ActiveFedora.fedora.connection, test_instance2.uri).delete }
120
- after do
121
- ActiveFedora::SolrService.instance.conn.tap do |conn|
122
- conn.delete_by_query "id:\"#{id}\""
123
- conn.commit
124
- end
125
- test_instance1.delete
126
- test_instance3.delete
127
- end
128
- it "logs an error" do
129
- expect(ActiveFedora::Base.logger).to receive(:error).with("Although #{id} was found in Solr, it doesn't seem to exist in Fedora. The index is out of synch.")
130
- expect(ModelIntegrationSpec::Basic.all).to contain_exactly test_instance1, test_instance3
131
- end
132
- end
133
- end
134
- end
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Scoping::Named do
4
- before(:all) do
5
- class TestClass < ActiveFedora::Base; end
6
- class OtherClass < ActiveFedora::Base; end
7
- end
8
- after(:all) do
9
- Object.send(:remove_const, :TestClass)
10
- Object.send(:remove_const, :OtherClass)
11
- end
12
-
13
- let!(:test_instance) { TestClass.create! }
14
- after { test_instance.delete }
15
-
16
- describe "#all" do
17
- it "returns an array of instances of the calling Class" do
18
- result = TestClass.all.to_a
19
- expect(result).to be_instance_of(Array)
20
- # this test is meaningless if the array length is zero
21
- expect(result).to_not be_empty
22
- result.each do |obj|
23
- expect(obj.class).to eq TestClass
24
- end
25
- end
26
- end
27
-
28
- describe '#find' do
29
- describe "a valid id without cast" do
30
- subject { ActiveFedora::Base.find(test_instance.id) }
31
- it { is_expected.to be_instance_of TestClass }
32
- end
33
- describe "a valid id with cast of false" do
34
- subject { ActiveFedora::Base.find(test_instance.id, cast: false) }
35
- it { is_expected.to be_instance_of ActiveFedora::Base }
36
- end
37
- describe "a valid id without cast on a model extending Base" do
38
- subject { TestClass.find(test_instance.id) }
39
- it { is_expected.to be_instance_of TestClass }
40
- end
41
- it "a valid id on an incompatible class raises ModelMismatch" do
42
- expect { OtherClass.find(test_instance.id) }.to raise_error(ActiveFedora::ModelMismatch)
43
- end
44
- it "invalid id raises ObjectNotFoundError" do
45
- expect { TestClass.find('some_unused_identifier') }.to raise_error(ActiveFedora::ObjectNotFoundError)
46
- end
47
- end
48
- end
@@ -1,32 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::SolrHit do
4
- before do
5
- class Foo < ActiveFedora::Base
6
- property :title, predicate: ::RDF::Vocab::DC.title, multiple: false
7
- end
8
- end
9
-
10
- after do
11
- Object.send(:remove_const, :Foo)
12
- end
13
-
14
- subject(:solr_hit) { described_class.new(doc) }
15
- let(:another) { Foo.create }
16
-
17
- let!(:obj) { Foo.create!(
18
- id: 'test-123',
19
- title: 'My Title'
20
- ) }
21
-
22
- let(:doc) { obj.to_solr }
23
-
24
- describe "#reify" do
25
- let(:solr_reified) { solr_hit.reify }
26
-
27
- it "finds the document in solr" do
28
- expect(solr_reified).to be_instance_of Foo
29
- expect(solr_reified.title).to eq 'My Title'
30
- end
31
- end
32
- end
@@ -1,256 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Versionable do
4
- context "For ActiveFedora::Base" do
5
- before do
6
- class WithVersions < ActiveFedora::Base
7
- property :title, predicate: ::RDF::Vocab::DC.title
8
- end
9
- end
10
-
11
- after do
12
- Object.send(:remove_const, :WithVersions)
13
- end
14
-
15
- subject(:object) { WithVersions.new }
16
-
17
- let(:current_year) { DateTime.now.year.to_s }
18
-
19
- context "saved with no versions" do
20
- it "does not have versions" do
21
- object.update(title: ["Greetings Earthlings"])
22
- expect(object).not_to have_versions
23
- end
24
- end
25
-
26
- context "saved with versions" do
27
- it "has versions" do
28
- object.update(title: ["Greetings Earthlings"])
29
- object.create_version
30
- expect(object).to have_versions
31
- end
32
- end
33
-
34
- describe 'sorting versions' do
35
- subject(:graph) { ActiveFedora::VersionsGraph.new }
36
-
37
- before do
38
- allow(graph).to receive(:fedora_versions) { versions }
39
- end
40
-
41
- let(:version1) { instance_double(ActiveFedora::VersionsGraph::ResourceVersion, uri: 'http://localhost:8983/fedora/rest/test/84/61/63/98/84616398-f63a-4572-ba01-0689339e4fcb/fcr:versions/87a0a8c317f1e711aa993d-e1d2-4a65-93ee-3a12fc9541ab', label: 'version1', created: '2015-04-02T19:54:45.962Z') }
42
- let(:version2) { instance_double(ActiveFedora::VersionsGraph::ResourceVersion, uri: 'http://localhost:8983/fedora/rest/test/84/61/63/98/84616398-f63a-4572-ba01-0689339e4fcb/fcr:versions/87a0a8c317f1e790373a67-c9ee-447d-b740-4faa882b1a1f', label: 'version2', created: '2015-04-02T19:54:45.96Z') }
43
- let(:versions) { [version1, version2] }
44
-
45
- it 'sorts by DateTime' do
46
- expect(graph.first).to eq version2
47
- end
48
-
49
- context 'with an unparseable created date' do
50
- let(:version2) { instance_double(ActiveFedora::VersionsGraph::ResourceVersion, uri: 'http://localhost:8983/fedora/rest/test/84/61/63/98/84616398-f63a-4572-ba01-0689339e4fcb/fcr:versions/87a0a8c317f1e790373a67-c9ee-447d-b740-4faa882b1a1f', label: 'version2', created: '') }
51
-
52
- it 'raises an exception' do
53
- expect { graph.first }.to raise_error(ActiveFedora::VersionLacksCreateDate)
54
- end
55
- end
56
-
57
- context 'with a missing created date' do
58
- before do
59
- # Because mocks raise RSpec::Mocks::MockExpectationError instead
60
- allow(version2).to receive(:created) { raise NoMethodError }
61
- end
62
-
63
- let(:version2) { instance_double(ActiveFedora::VersionsGraph::ResourceVersion, uri: 'http://localhost:8983/fedora/rest/test/84/61/63/98/84616398-f63a-4572-ba01-0689339e4fcb/fcr:versions/87a0a8c317f1e790373a67-c9ee-447d-b740-4faa882b1a1f', label: 'version2') }
64
-
65
- it 'raises an exception' do
66
- expect { graph.first }.to raise_error(ActiveFedora::VersionLacksCreateDate)
67
- end
68
- end
69
- end
70
-
71
- context "after saving" do
72
- before do
73
- object.title = ["Greetings Earthlings"]
74
- object.save
75
- object.create_version
76
- end
77
-
78
- it { is_expected.to have_versions }
79
-
80
- it "has one version" do
81
- expect(object.versions).to be_kind_of ActiveFedora::VersionsGraph
82
- expect(object.versions.all.first).to be_kind_of ActiveFedora::VersionsGraph::ResourceVersion
83
- expect(object.versions.all.first.label).to eql "version1"
84
- expect(object.versions.all.first.created).to start_with current_year
85
- end
86
-
87
- context "two times" do
88
- before do
89
- object.title = ["Surrender and prepare to be boarded"]
90
- object.save
91
- object.create_version
92
- end
93
-
94
- it "has two versions" do
95
- expect(object.versions.all.size).to eq 2
96
- object.versions.all.each_index do |index|
97
- expect(object.versions.all[index].label).to end_with "version" + (index + 1).to_s
98
- expect(object.versions.all[index].created).to start_with current_year
99
- end
100
- end
101
-
102
- context "then restoring" do
103
- let(:first_version) { "version1" }
104
- before do
105
- object.restore_version(first_version)
106
- end
107
-
108
- it "will return to the first version's values" do
109
- expect(object.title).to eq(["Greetings Earthlings"])
110
- end
111
-
112
- context "and creating additional versions" do
113
- before do
114
- object.title = ["Now, surrender and prepare to be boarded"]
115
- object.save!
116
- object.create_version
117
- end
118
-
119
- it "has three versions" do
120
- expect(object.versions.all.size).to eq 3
121
- expect(object.title).to eq(["Now, surrender and prepare to be boarded"])
122
- end
123
- end
124
- end
125
- end
126
- end
127
- end
128
-
129
- describe ActiveFedora::File do
130
- before(:all) do
131
- class BinaryDatastream < ActiveFedora::File
132
- end
133
-
134
- class MockAFBase < ActiveFedora::Base
135
- has_subresource "content", class_name: 'BinaryDatastream', autocreate: true
136
- end
137
- end
138
-
139
- after(:all) do
140
- Object.send(:remove_const, :MockAFBase)
141
- Object.send(:remove_const, :BinaryDatastream)
142
- end
143
-
144
- let(:content) { test_object.content }
145
-
146
- let(:current_year) { DateTime.now.year.to_s }
147
-
148
- context "that exists in the repository" do
149
- let(:test_object) { MockAFBase.create }
150
-
151
- context "before creating the file" do
152
- it "does not have versions" do
153
- expect(content.versions).to be_empty
154
- end
155
- end
156
-
157
- context "after creating the file" do
158
- let(:first_file) { File.new(File.join(File.dirname(__FILE__), "../fixtures/dino.jpg")) }
159
- let(:first_name) { "dino.jpg" }
160
- before do
161
- content.content = first_file
162
- content.original_name = first_name
163
- content.save
164
- content.create_version
165
- end
166
-
167
- it "links to versions endpoint" do
168
- expect(content.metadata.ldp_source.graph.query(predicate: ::RDF::Vocab::Fcrepo4.hasVersions).objects).to_not be_empty
169
- end
170
-
171
- it "has one version" do
172
- expect(content.versions.all.size).to eq 1
173
- expect(content.original_name).to eql(first_name)
174
- expect(content.content.size).to eq first_file.size
175
- expect(content.versions.first.label).to eql "version1"
176
- expect(content.versions.first.created).to start_with current_year
177
- end
178
-
179
- context "two times" do
180
- let(:second_file) { File.new(File.join(File.dirname(__FILE__), "../fixtures/minivan.jpg")) }
181
- let(:second_name) { "minivan.jpg" }
182
- before do
183
- content.content = second_file
184
- content.original_name = second_name
185
- content.save
186
- content.create_version
187
- end
188
-
189
- it "has two unique versions" do
190
- expect(content.versions.all.size).to eq 2
191
- expect(content.original_name).to eql(second_name)
192
- expect(content.content.size).to eq second_file.size
193
- content.versions.all.each_index do |index|
194
- expect(content.versions.all[index].label).to end_with "version" + (index + 1).to_s
195
- expect(content.versions.all[index].created).to start_with current_year
196
- end
197
- end
198
-
199
- context "with fixity checking" do
200
- let(:results) do
201
- results = []
202
- content.versions.all.each do |version|
203
- results << ActiveFedora::FixityService.new(version.uri).check
204
- end
205
- return results
206
- end
207
-
208
- it "reports on the fixity of each version" do
209
- results.each do |result|
210
- expect(result).to be true
211
- end
212
- end
213
- end
214
-
215
- context "then restoring" do
216
- let(:first_version) { "version1" }
217
- before do
218
- content.restore_version(first_version)
219
- end
220
-
221
- it "stills have two unique versions" do
222
- expect(content.versions.all.size).to eq 2
223
- end
224
-
225
- it "loads the restored file's content" do
226
- expect(content.content.size).to eq first_file.size
227
- end
228
-
229
- it "loads the restored file's original name" do
230
- expect(content.original_name).to eql(first_name)
231
- end
232
-
233
- context "and creating additional versions" do
234
- before do
235
- content.content = first_file
236
- content.original_name = first_name
237
- content.save
238
- content.create_version
239
- end
240
-
241
- it "has three unique versions" do
242
- expect(content.versions.all.size).to eq 3
243
- expect(content.original_name).to eql(first_name)
244
- expect(content.content.size).to eq first_file.size
245
- content.versions.all.each_index do |index|
246
- expect(content.versions.all[index].label).to end_with "version" + (index + 1).to_s
247
- expect(content.versions.all[index].created).to start_with current_year
248
- end
249
- end
250
- end
251
- end
252
- end
253
- end
254
- end
255
- end
256
- end