active-fedora 9.13.0 → 10.0.0.beta1

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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -19
  3. data/lib/active_fedora.rb +0 -17
  4. data/lib/active_fedora/associations.rb +0 -16
  5. data/lib/active_fedora/associations/builder/association.rb +3 -19
  6. data/lib/active_fedora/associations/builder/has_and_belongs_to_many.rb +1 -3
  7. data/lib/active_fedora/attached_files.rb +2 -108
  8. data/lib/active_fedora/attributes.rb +4 -100
  9. data/lib/active_fedora/core.rb +0 -6
  10. data/lib/active_fedora/datastreams.rb +0 -2
  11. data/lib/active_fedora/errors.rb +0 -9
  12. data/lib/active_fedora/file.rb +9 -22
  13. data/lib/active_fedora/file_configurator.rb +1 -32
  14. data/lib/active_fedora/identifiable.rb +0 -6
  15. data/lib/active_fedora/ldp_resource.rb +0 -12
  16. data/lib/active_fedora/qualified_dublin_core_datastream.rb +1 -1
  17. data/lib/active_fedora/query_result_builder.rb +0 -17
  18. data/lib/active_fedora/rdf/datastream_indexing.rb +0 -11
  19. data/lib/active_fedora/rdf/indexing_service.rb +1 -1
  20. data/lib/active_fedora/rdf/rdf_datastream.rb +0 -10
  21. data/lib/active_fedora/relation/finder_methods.rb +2 -21
  22. data/lib/active_fedora/solr_query_builder.rb +0 -16
  23. data/lib/active_fedora/solr_service.rb +2 -89
  24. data/lib/active_fedora/version.rb +1 -1
  25. data/lib/active_fedora/versionable.rb +0 -8
  26. data/spec/config_helper.rb +0 -4
  27. data/spec/integration/attached_files_spec.rb +1 -108
  28. data/spec/integration/attributes_spec.rb +14 -94
  29. data/spec/integration/direct_container_spec.rb +2 -2
  30. data/spec/integration/file_spec.rb +23 -13
  31. data/spec/integration/indexing_spec.rb +4 -4
  32. data/spec/integration/json_serialization_spec.rb +4 -57
  33. data/spec/integration/ntriples_datastream_spec.rb +77 -139
  34. data/spec/integration/relation_delegation_spec.rb +16 -18
  35. data/spec/integration/{model_spec.rb → scoping_spec.rb} +10 -14
  36. data/spec/integration/solr_hit_spec.rb +4 -20
  37. data/spec/integration/solr_instance_loader_spec.rb +1 -13
  38. data/spec/integration/versionable_spec.rb +0 -9
  39. data/spec/samples/models/mods_article.rb +1 -6
  40. data/spec/spec_helper.rb +0 -3
  41. data/spec/unit/attached_files_spec.rb +29 -127
  42. data/spec/unit/attributes_spec.rb +51 -475
  43. data/spec/unit/base_active_model_spec.rb +12 -47
  44. data/spec/unit/base_extra_spec.rb +1 -1
  45. data/spec/unit/code_configurator_spec.rb +2 -10
  46. data/spec/unit/core_spec.rb +3 -18
  47. data/spec/unit/file_configurator_spec.rb +0 -80
  48. data/spec/unit/file_spec.rb +0 -6
  49. data/spec/unit/has_and_belongs_to_many_association_spec.rb +0 -7
  50. data/spec/unit/inheritance_spec.rb +0 -12
  51. data/spec/unit/ntriples_datastream_spec.rb +2 -74
  52. data/spec/unit/property_spec.rb +0 -3
  53. data/spec/unit/query_spec.rb +0 -7
  54. data/spec/unit/querying_spec.rb +24 -0
  55. data/spec/unit/rdf/indexing_service_spec.rb +32 -20
  56. data/spec/unit/rdf_resource_datastream_spec.rb +37 -97
  57. data/spec/unit/solr_query_builder_spec.rb +0 -8
  58. data/spec/unit/solr_service_spec.rb +0 -13
  59. metadata +6 -19
  60. data/config/predicate_mappings.yml +0 -51
  61. data/lib/active_fedora/attributes/om_attribute.rb +0 -26
  62. data/lib/active_fedora/attributes/rdf_datastream_attribute.rb +0 -44
  63. data/lib/active_fedora/attributes/stream_attribute.rb +0 -43
  64. data/lib/active_fedora/datastream.rb +0 -9
  65. data/lib/active_fedora/model.rb +0 -31
  66. data/lib/active_fedora/predicates.rb +0 -122
  67. data/lib/active_fedora/simple_datastream.rb +0 -92
  68. data/spec/fixtures/rails_root/config/predicate_mappings.yml +0 -31
  69. data/spec/integration/field_to_solr_name_spec.rb +0 -36
  70. data/spec/unit/base_datastream_management_spec.rb +0 -19
  71. data/spec/unit/model_spec.rb +0 -30
  72. data/spec/unit/predicates_spec.rb +0 -126
  73. data/spec/unit/simple_datastream_spec.rb +0 -101
@@ -11,12 +11,7 @@ describe ActiveFedora::SolrInstanceLoader do
11
11
  end
12
12
 
13
13
  class Foo < ActiveFedora::Base
14
- extend Deprecation
15
14
  has_subresource 'descMetadata', class_name: 'MyDS'
16
- Deprecation.silence(ActiveFedora::Attributes) do
17
- has_attributes :foo, datastream: 'descMetadata', multiple: true
18
- has_attributes :bar, datastream: 'descMetadata', multiple: false
19
- end
20
15
  property :title, predicate: ::RDF::Vocab::DC.title, multiple: false
21
16
  property :description, predicate: ::RDF::Vocab::DC.description
22
17
  belongs_to :another, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.isPartOf, class_name: 'Foo'
@@ -33,8 +28,6 @@ describe ActiveFedora::SolrInstanceLoader do
33
28
 
34
29
  let!(:obj) { Foo.create!(
35
30
  id: 'test-123',
36
- foo: ["baz"],
37
- bar: 'quix',
38
31
  title: 'My Title',
39
32
  description: ['first desc', 'second desc'],
40
33
  another_id: another.id,
@@ -58,7 +51,6 @@ describe ActiveFedora::SolrInstanceLoader do
58
51
  expect(subject.title).to eq 'My Title'
59
52
  expect(subject.description).to match_array ['first desc', 'second desc']
60
53
  expect(subject.another_id).to eq another.id
61
- expect(subject.bar).to eq 'quix'
62
54
  end
63
55
 
64
56
  it "does not be mutable" do
@@ -78,19 +70,15 @@ describe ActiveFedora::SolrInstanceLoader do
78
70
  let(:loader) { described_class.new(ActiveFedora::Base, obj.id) }
79
71
 
80
72
  it "finds the document in solr" do
81
- expect_any_instance_of(ActiveFedora::Datastream).to_not receive(:retrieve_content)
73
+ expect_any_instance_of(ActiveFedora::File).to_not receive(:retrieve_content)
82
74
  expect_any_instance_of(Ldp::Client).to_not receive(:get)
83
75
  object = loader.object
84
76
  expect(object).to be_instance_of Foo
85
77
  expect(object.title).to eq 'My Title' # object assertion
86
- expect(object.foo).to eq ['baz'] # datastream assertion
87
78
 
88
79
  # and it's frozen
89
80
  expect { object.title = 'changed' }.to raise_error ActiveFedora::ReadOnlyRecord
90
81
  expect(object.title).to eq 'My Title'
91
-
92
- expect { object.foo = ['changed'] }.to raise_error ActiveFedora::ReadOnlyRecord
93
- expect(object.foo).to eq ['baz']
94
82
  end
95
83
  end
96
84
 
@@ -124,15 +124,6 @@ describe ActiveFedora::Versionable do
124
124
  end
125
125
  end
126
126
  end
127
-
128
- describe ".has_many_versions" do
129
- it "has a warning" do
130
- expect(Deprecation).to receive(:warn)
131
- class WithVersions < ActiveFedora::Base
132
- has_many_versions
133
- end
134
- end
135
- end
136
127
  end
137
128
 
138
129
  describe ActiveFedora::NtriplesRDFDatastream do
@@ -5,10 +5,5 @@ require_relative '../hydra-mods_article_datastream.rb'
5
5
  #
6
6
  # See lib/samples/sample_thing.rb for a fuller, annotated example of an ActiveFedora Model
7
7
  class ModsArticle < ActiveFedora::Base
8
- # Mute deprecation of has_metadata
9
- @original_behavior = Deprecation.default_deprecation_behavior
10
- Deprecation.default_deprecation_behavior = :silence
11
- has_metadata name: "descMetadata", type: Hydra::ModsArticleDatastream
12
- has_metadata name: "properties", type: ActiveFedora::SimpleDatastream
13
- Deprecation.default_deprecation_behavior = @original_behavior
8
+ has_subresource "descMetadata", class_name: 'Hydra::ModsArticleDatastream'
14
9
  end
@@ -35,9 +35,6 @@ def restore_spec_configuration
35
35
  end
36
36
  restore_spec_configuration
37
37
 
38
- # Shut those Rails deprecation warnings up
39
- ActiveSupport::Deprecation.behavior = proc { |_message, _callstack| }
40
-
41
38
  require 'active_fedora/cleaner'
42
39
  RSpec.configure do |config|
43
40
  # Stub out test stuff.
@@ -35,82 +35,6 @@ describe ActiveFedora::AttachedFiles do
35
35
  end
36
36
  end
37
37
 
38
- describe '.has_metadata' do
39
- before do
40
- class Z < ActiveFedora::File
41
- end
42
- class FooHistory < ActiveFedora::Base
43
- extend Deprecation
44
- Deprecation.silence(FooHistory) do
45
- has_metadata name: 'dsid', type: ActiveFedora::QualifiedDublinCoreDatastream
46
- has_metadata 'complex_ds', autocreate: true, type: 'Z'
47
- end
48
- end
49
- end
50
- after do
51
- Object.send(:remove_const, :FooHistory)
52
- Object.send(:remove_const, :Z)
53
- end
54
-
55
- it "has a child_resource_reflection" do
56
- expect(FooHistory.child_resource_reflections).to have_key(:dsid)
57
- end
58
-
59
- it "has reasonable defaults" do
60
- expect(FooHistory.child_resource_reflections[:dsid].options).to include(class_name: 'ActiveFedora::QualifiedDublinCoreDatastream')
61
- end
62
-
63
- it "lets you override defaults" do
64
- expect(FooHistory.child_resource_reflections[:complex_ds].options).to include(autocreate: true)
65
- expect(FooHistory.child_resource_reflections[:complex_ds].class_name).to eq 'Z'
66
- end
67
-
68
- it "raises an error if you don't give a type" do
69
- expect {
70
- Deprecation.silence(FooHistory) do
71
- FooHistory.has_metadata "bob"
72
- end
73
- }.to raise_error ArgumentError,
74
- "You must provide a :type property for the datastream 'bob'"
75
- end
76
-
77
- it "raises an error if you don't give a dsid" do
78
- expect {
79
- Deprecation.silence(FooHistory) do
80
- FooHistory.has_metadata type: ActiveFedora::QualifiedDublinCoreDatastream
81
- end
82
- }.to raise_error ArgumentError,
83
- "You must provide a path name (f.k.a. dsid) for the resource"
84
- end
85
-
86
- describe "creates accessors" do
87
- subject { FooHistory.new }
88
- it "exists on the instance" do
89
- expect(subject.dsid).to eq subject.attached_files['dsid']
90
- end
91
- end
92
- end
93
-
94
- describe '.has_file_datastream' do
95
- before do
96
- class FooHistory < ActiveFedora::Base
97
- extend Deprecation
98
- Deprecation.silence(FooHistory) do
99
- has_file_datastream name: 'dsid'
100
- has_file_datastream 'another'
101
- end
102
- end
103
- end
104
- after do
105
- Object.send(:remove_const, :FooHistory)
106
- end
107
-
108
- it "has reasonable defaults" do
109
- expect(FooHistory.child_resource_reflections[:dsid].klass).to eq ActiveFedora::File
110
- expect(FooHistory.child_resource_reflections[:another].klass).to eq ActiveFedora::File
111
- end
112
- end
113
-
114
38
  describe "#add_file" do
115
39
  before do
116
40
  class Bar < ActiveFedora::File; end
@@ -126,24 +50,6 @@ describe ActiveFedora::AttachedFiles do
126
50
  end
127
51
  let(:container) { FooHistory.new }
128
52
 
129
- describe "#add_file_datastream" do
130
- context "a reflection matches the :dsid property" do
131
- it "builds the reflection" do
132
- expect(Deprecation).to receive(:warn)
133
- container.add_file_datastream('blah', path: 'content')
134
- expect(container.content).to be_instance_of Bar
135
- expect(container.content.content).to eq 'blah'
136
- end
137
- end
138
- end
139
- context "with the deprecated :dsid property" do
140
- it "builds the reflection" do
141
- expect(Deprecation).to receive(:warn)
142
- container.add_file('blah', dsid: 'content')
143
- expect(container.content).to be_instance_of Bar
144
- expect(container.content.content).to eq 'blah'
145
- end
146
- end
147
53
  context "a reflection matches the :path property" do
148
54
  it "builds the reflection" do
149
55
  container.add_file('blah', path: 'content')
@@ -152,24 +58,6 @@ describe ActiveFedora::AttachedFiles do
152
58
  end
153
59
  end
154
60
 
155
- context "the deprecated 3 args erasure" do
156
- it "builds the reflection" do
157
- expect(Deprecation).to receive(:warn)
158
- container.add_file('blah', 'content', 'name.png')
159
- expect(container.content).to be_instance_of Bar
160
- expect(container.content.content).to eq 'blah'
161
- end
162
- end
163
-
164
- context "the deprecated 4 args erasure" do
165
- it "builds the reflection" do
166
- expect(Deprecation).to receive(:warn)
167
- container.add_file('blah', 'content', 'name.png', 'image/png')
168
- expect(container.content).to be_instance_of Bar
169
- expect(container.content.content).to eq 'blah'
170
- end
171
- end
172
-
173
61
  context "no reflection matches the :path property" do
174
62
  it "creates a singleton reflection and build it" do
175
63
  container.add_file('blah', path: 'fizz')
@@ -244,28 +132,42 @@ describe ActiveFedora::AttachedFiles do
244
132
  end
245
133
 
246
134
  describe "#attach_file" do
247
- let(:dsid) { 'Abc' }
248
135
  let(:file) { ActiveFedora::File.new }
249
- before do
250
- subject.attach_file(file, dsid)
136
+
137
+ it "does not call save on the file" do
138
+ expect(file).to receive(:save).never
139
+ subject.attach_file(file, 'part1')
251
140
  end
252
141
 
253
- it "adds the datastream to the object" do
254
- expect(subject.attached_files['Abc']).to eq file
142
+ it "adds the file to the attached_files hash" do
143
+ expect {
144
+ subject.attach_file(file, 'part1')
145
+ }.to change { subject.attached_files.key?(:part1) }.from(false).to(true)
255
146
  end
256
147
 
257
- describe "dynamic accessors" do
258
- context "when the file is named with dash" do
259
- let(:dsid) { 'eac-cpf' }
260
- it "converts dashes to underscores" do
261
- expect(subject.eac_cpf).to eq file
262
- end
148
+ context "after attaching the file" do
149
+ let(:dsid) { 'Abc' }
150
+ before do
151
+ subject.attach_file(file, dsid)
263
152
  end
264
153
 
265
- context "when the file is named with underscore" do
266
- let(:dsid) { 'foo_bar' }
267
- it "preserves the underscore" do
268
- expect(subject.foo_bar).to eq file
154
+ it "adds the datastream to the object" do
155
+ expect(subject.attached_files['Abc']).to eq file
156
+ end
157
+
158
+ describe "dynamic accessors" do
159
+ context "when the file is named with dash" do
160
+ let(:dsid) { 'eac-cpf' }
161
+ it "converts dashes to underscores" do
162
+ expect(subject.eac_cpf).to eq file
163
+ end
164
+ end
165
+
166
+ context "when the file is named with underscore" do
167
+ let(:dsid) { 'foo_bar' }
168
+ it "preserves the underscore" do
169
+ expect(subject.foo_bar).to eq file
170
+ end
269
171
  end
270
172
  end
271
173
  end
@@ -1,517 +1,85 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActiveFedora::Base do
4
- context "with an om datastream" do
4
+ context "when properties are defined on an object" do
5
5
  before :all do
6
- class BarStream2 < ActiveFedora::OmDatastream
7
- set_terminology do |t|
8
- t.root(path: "animals", xmlns: "urn:zoobar")
9
- t.waterfowl do
10
- t.ducks do
11
- t.duck
12
- end
13
- end
14
- t.donkey
15
- t.cow
16
- t.pig
17
- t.horse
18
- end
19
-
20
- def self.xml_template
21
- Nokogiri::XML::Document.parse '<animals xmlns="urn:zoobar">
22
- <waterfowl>
23
- <ducks>
24
- <duck/>
25
- </ducks>
26
- </waterfowl>
27
- <cow></cow>
28
- </animals>'
6
+ class BarHistory4 < ActiveFedora::Base
7
+ property :title, predicate: ::RDF::Vocab::DC.title do |index|
8
+ index.as :symbol
29
9
  end
10
+ property :abstract, predicate: ::RDF::Vocab::DC.abstract, multiple: false
30
11
  end
31
12
  end
13
+
32
14
  after :all do
33
- Object.send(:remove_const, :BarStream2)
15
+ Object.send(:remove_const, :BarHistory4)
34
16
  end
35
17
 
36
- describe "#property" do
37
- context "with an xml property (default cardinality)" do
38
- before do
39
- class BarHistory4 < ActiveFedora::Base
40
- has_subresource 'xmlish', class_name: 'BarStream2'
41
- Deprecation.silence(ActiveFedora::Attributes) do
42
- property :cow, delegate_to: 'xmlish'
43
- end
44
- end
45
- end
46
- after do
47
- Object.send(:remove_const, :BarHistory4)
48
- end
49
-
50
- let(:obj) { BarHistory4.new }
51
-
52
- before { obj.cow = ['one', 'two'] }
53
- describe "the object accessor" do
54
- subject { obj.cow }
55
- it { is_expected.to eq ['one', 'two'] }
56
- end
57
-
58
- describe "the datastream accessor" do
59
- subject { obj.xmlish.cow }
60
- it { is_expected.to eq ['one', 'two'] }
61
- end
62
- end
63
-
64
- context "with multiple set to false" do
65
- before do
66
- class BarHistory4 < ActiveFedora::Base
67
- has_subresource 'xmlish', class_name: 'BarStream2'
68
- Deprecation.silence(ActiveFedora::Attributes) do
69
- property :cow, delegate_to: 'xmlish', multiple: false
70
- end
71
- end
72
- end
73
- after do
74
- Object.send(:remove_const, :BarHistory4)
75
- end
76
-
77
- let(:obj) { BarHistory4.new }
18
+ let(:obj) { BarHistory4.new(title: ['test1']) }
19
+ subject { obj }
78
20
 
79
- before { obj.cow = 'one' }
80
- describe "the object accessor" do
81
- subject { obj.cow }
82
- it { is_expected.to eq 'one' }
21
+ describe "#attribute_names" do
22
+ context "on an instance" do
23
+ it "lists the attributes" do
24
+ expect(subject.attribute_names).to eq ["title", "abstract"]
83
25
  end
84
26
  end
85
27
 
86
- context "when updating and saving a property" do
87
- before do
88
- class BarHistory4 < ActiveFedora::Base
89
- has_subresource 'xmlish', class_name: 'BarStream2'
90
- Deprecation.silence(ActiveFedora::Attributes) do
91
- property :cow, delegate_to: 'xmlish', multiple: false
92
- end
93
- end
94
- end
95
- after do
96
- Object.send(:remove_const, :BarHistory4)
97
- end
98
-
99
- let(:obj) { BarHistory4.new }
100
-
101
- before do
102
- obj.cow = 'two'
103
- obj.save
104
- obj.attached_files[:xmlish].content
105
- obj.cow = 'three'
106
- obj.save
107
- end
108
- describe "the attached datastream" do
109
- subject { obj.attached_files[:xmlish].content }
110
- it { is_expected.to include '<cow>three</cow>' }
28
+ context "on a class" do
29
+ it "lists the attributes" do
30
+ expect(BarHistory4.attribute_names).to eq ["title", "abstract"]
111
31
  end
112
32
  end
113
33
  end
114
34
 
115
- describe "first level delegation" do
116
- before do
117
- class MyDS1 < ActiveFedora::NtriplesRDFDatastream
118
- property :animal_id, predicate: ::RDF::Vocab::DC.publisher
119
- end
120
- class MyDS2 < ActiveFedora::OmDatastream
121
- set_terminology do |t|
122
- t.root(path: "durh")
123
- t.fubar
124
- end
125
- end
126
- class BarHistory2 < ActiveFedora::Base
127
- has_subresource 'someData', class_name: 'MyDS1'
128
- has_subresource "withText", class_name: 'MyDS2'
129
- has_subresource 'xmlish', class_name: 'BarStream2'
130
- Deprecation.silence(ActiveFedora::Attributes) do
131
- has_attributes :cow, datastream: 'xmlish' # for testing the default value of multiple
132
- has_attributes :fubar, datastream: 'withText', multiple: true # test alternate datastream
133
- has_attributes :pig, datastream: 'xmlish', multiple: false
134
- has_attributes :horse, datastream: 'xmlish', multiple: true
135
- has_attributes :duck, datastream: 'xmlish', at: [:waterfowl, :ducks, :duck], multiple: true
136
- has_attributes :animal_id, datastream: 'someData', multiple: false
137
- end
138
-
139
- property :goose, predicate: ::RDF::URI.new('http://example.com#hasGoose')
140
- end
141
- end
142
-
143
- after do
144
- Object.send(:remove_const, :BarHistory2)
145
- end
146
-
147
- subject { BarHistory2.new }
148
-
149
- describe "#attribute_names" do
150
- context "on an instance" do
151
- it "lists the attributes" do
152
- expect(subject.attribute_names).to eq ["cow", "fubar", "pig", "horse", "duck", "animal_id", "goose"]
153
- end
154
- end
155
-
156
- context "on a class" do
157
- it "lists the attributes" do
158
- expect(BarHistory2.attribute_names).to eq ["cow", "fubar", "pig", "horse", "duck", "animal_id", "goose"]
159
- end
160
- end
161
- end
162
-
163
- describe "inspect" do
164
- it "shows the attributes" do
165
- expect(subject.inspect).to eq "#<BarHistory2 id: nil, cow: \"\", fubar: [], pig: nil, horse: [], duck: [\"\"], animal_id: nil, goose: []>"
166
- end
167
-
168
- describe "with a id" do
169
- before { allow(subject).to receive(:id).and_return('test:123') }
170
-
171
- it "shows a id" do
172
- expect(subject.inspect).to eq "#<BarHistory2 id: \"test:123\", cow: \"\", fubar: [], pig: nil, horse: [], duck: [\"\"], animal_id: nil, goose: []>"
173
- end
174
- end
175
-
176
- describe "with no attributes" do
177
- subject { described_class.new }
178
- it "shows a id" do
179
- expect(subject.inspect).to eq "#<ActiveFedora::Base id: nil>"
180
- end
181
- end
182
-
183
- describe "with relationships" do
184
- before do
185
- class BarHistory3 < BarHistory2
186
- belongs_to :library, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.hasConstituent, class_name: 'BarHistory2'
187
- end
188
- subject.library = library
189
- end
190
-
191
- let(:library) { BarHistory2.create }
192
- subject { BarHistory3.new }
193
-
194
- after do
195
- Object.send(:remove_const, :BarHistory3)
196
- end
197
-
198
- it "shows the library_id" do
199
- expect(subject.inspect).to eq "#<BarHistory3 id: nil, cow: \"\", fubar: [], pig: nil, horse: [], duck: [\"\"], animal_id: nil, goose: [], library_id: \"#{library.id}\">"
200
- end
201
- end
202
- end
203
-
204
- it "reveals the unique properties" do
205
- expect(BarHistory2.unique?(:horse)).to be false
206
- expect(BarHistory2.unique?(:pig)).to be true
207
- expect(BarHistory2.unique?(:cow)).to be true
208
- end
209
-
210
- it "saves a delegated property" do
211
- subject.fubar = ["Quack"]
212
- expect(subject.fubar).to eq ["Quack"]
213
- expect(subject.withText.get_values(:fubar).first).to eq 'Quack'
214
- subject.cow = "Low"
215
- expect(subject.cow).to eq "Low"
216
- expect(subject.xmlish.term_values(:cow).first).to eq 'Low'
217
-
218
- subject.pig = "Oink"
219
- expect(subject.pig).to eq "Oink"
220
- end
221
-
222
- it "allows passing parameters to the delegate accessor" do
223
- subject.fubar = ["one", "two"]
224
- expect(subject.fubar(1)).to eq ['two']
225
- end
226
-
227
- describe "assigning wrong cardinality" do
228
- it "does not allow passing a string to a multiple attribute writer" do
229
- expect { subject.fubar = "Quack" }.to raise_error ArgumentError
230
- expect { subject.fubar = ["Quack"] }.not_to raise_error
231
- expect { subject.fubar = nil }.not_to raise_error
232
- end
233
-
234
- it "does not allow passing an enumerable to a unique attribute writer" do
235
- expect { subject.cow = "Low" }.not_to raise_error
236
- expect { subject.cow = ["Low"]
237
- }.to raise_error ArgumentError, "You attempted to set the attribute `cow' on `BarHistory2' to an enumerable value. However, this attribute is declared as being singular."
238
- expect { subject.cow = nil }.not_to raise_error
239
- end
240
- end
241
-
242
- it "returns an array if marked as multiple" do
243
- subject.horse = ["neigh", "whinny"]
244
- expect(subject.horse).to eq ["neigh", "whinny"]
35
+ describe "#inspect" do
36
+ it "shows the attributes" do
37
+ expect(subject.inspect).to eq "#<BarHistory4 id: nil, title: [\"test1\"], abstract: nil>"
245
38
  end
246
39
 
247
- it "is able to delegate deeply into the terminology" do
248
- subject.duck = ["Quack", "Peep"]
249
- expect(subject.duck).to eq ["Quack", "Peep"]
250
- end
40
+ describe "with a id" do
41
+ before { allow(subject).to receive(:id).and_return('test:123') }
251
42
 
252
- context "change tracking" do
253
- it "works for delegated attributes" do
254
- expect {
255
- subject.fubar = ["Meow"]
256
- }.to change { subject.fubar_changed? }.from(false).to(true)
257
- end
258
-
259
- context "when a change is made to a property" do
260
- it "is marked changed" do
261
- expect {
262
- subject.goose = ["honk!"]
263
- }.to change { subject.goose_changed? }.from(false).to(true)
264
- end
265
- end
266
-
267
- context "when a property is set to the same value" do
268
- before do
269
- subject.goose = ['honk!', 'Honk']
270
- if ActiveModel.version < Gem::Version.new('4.2.0')
271
- subject.send(:reset_changes)
272
- else
273
- subject.send(:clear_changes_information)
274
- end
275
- end
276
-
277
- it "is not marked changed" do
278
- subject.goose = ['honk!', 'Honk']
279
- expect(subject.goose_changed?).to be false
280
- end
281
- end
282
- end
283
-
284
- describe "hash getters and setters" do
285
- it "accepts symbol keys" do
286
- subject[:duck] = ["Cluck", "Gobble"]
287
- expect(subject[:duck]).to eq ["Cluck", "Gobble"]
288
- end
289
-
290
- it "accepts string keys" do
291
- subject['duck'] = ["Cluck", "Gobble"]
292
- expect(subject['duck']).to eq ["Cluck", "Gobble"]
293
- end
294
-
295
- it "accepts field names with _id that are not associations" do
296
- subject['animal_id'] = "lemur"
297
- expect(subject['animal_id']).to eq "lemur"
298
- end
299
-
300
- it "raises an error on the reader when the field isn't delegated" do
301
- expect { subject['donkey'] }.to raise_error ActiveFedora::UnknownAttributeError, "unknown attribute 'donkey' for BarHistory2."
302
- end
303
-
304
- it "raises an error on the setter when the field isn't delegated" do
305
- expect { subject['donkey'] = "bray" }.to raise_error ActiveFedora::UnknownAttributeError, "unknown attribute 'donkey' for BarHistory2."
43
+ it "shows a id" do
44
+ expect(subject.inspect).to eq "#<BarHistory4 id: \"test:123\", title: [\"test1\"], abstract: nil>"
306
45
  end
307
46
  end
308
47
 
309
- describe "attributes=" do
310
- it "raises an error on an invalid attribute" do
311
- expect { subject.attributes = { 'donkey' => "bray" } }.to raise_error ActiveFedora::UnknownAttributeError, "unknown attribute 'donkey' for BarHistory2."
48
+ describe "with no attributes" do
49
+ subject { described_class.new }
50
+ it "shows a id" do
51
+ expect(subject.inspect).to eq "#<ActiveFedora::Base id: nil>"
312
52
  end
313
53
  end
314
54
 
315
- describe "attributes" do
316
- let(:vals) { { 'cow' => "moo", 'pig' => 'oink', 'horse' => ['neigh'], "fubar" => [], 'duck' => ['quack'], 'animal_id' => '', 'goose' => [] } }
317
- before { subject.attributes = vals }
318
- it "returns a hash" do
319
- expect(subject.attributes).to eq(vals.merge('id' => nil))
320
- end
321
- end
322
-
323
- describe '.multiple?', focus: true do
324
- it 'returns false if attribute has not been defined as multi-valued' do
325
- expect(BarHistory2.multiple?(:pig)).to be false
326
- end
327
-
328
- it 'returns true if attribute is a ActiveTriples property' do
329
- expect(BarHistory2.multiple?(:goose)).to be true
330
- end
331
-
332
- it 'returns true if attribute has been defined as multi-valued' do
333
- expect(BarHistory2.multiple?(:horse)).to be true
334
- end
335
-
336
- it 'raises an error if the attribute does not exist' do
337
- expect { BarHistory2.multiple?(:arbitrary_nonexistent_attribute) }.to raise_error ActiveFedora::UnknownAttributeError, "unknown attribute 'arbitrary_nonexistent_attribute' for BarHistory2."
338
- end
339
- end
340
-
341
- describe ".datastream_class_for_name" do
342
- it "returns the specifed class" do
343
- expect(BarHistory2.send(:datastream_class_for_name, 'someData')).to eq MyDS1
344
- end
345
- end
346
- end
347
-
348
- describe "with a superclass" do
349
- before :all do
350
- class BarHistory2 < ActiveFedora::Base
351
- has_subresource 'xmlish', class_name: 'BarStream2'
352
- Deprecation.silence(ActiveFedora::Attributes) do
353
- has_attributes :donkey, :cow, datastream: 'xmlish', multiple: true
55
+ describe "with relationships" do
56
+ before do
57
+ class BarHistory2 < BarHistory4
58
+ belongs_to :library, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.hasConstituent, class_name: 'BarHistory4'
354
59
  end
60
+ subject.library = library
355
61
  end
356
- class BarHistory3 < BarHistory2
357
- end
358
- end
359
-
360
- after :all do
361
- Object.send(:remove_const, :BarHistory3)
362
- Object.send(:remove_const, :BarHistory2)
363
- end
364
-
365
- subject { BarHistory3.new }
366
-
367
- it "is able to delegate deeply into the terminology" do
368
- subject.donkey = ["Bray", "Hee-haw"]
369
- expect(subject.donkey).to eq ["Bray", "Hee-haw"]
370
- end
371
-
372
- it "is able to track change status" do
373
- expect {
374
- subject.cow = ["Moo"]
375
- }.to change { subject.cow_changed? }.from(false).to(true)
376
- end
377
- end
378
- end
379
-
380
- context "with a RDF datastream" do
381
- before :all do
382
- class BarRdfDatastream < ActiveFedora::NtriplesRDFDatastream
383
- property :title, predicate: ::RDF::Vocab::DC.title
384
- property :description, predicate: ::RDF::Vocab::DC.description
385
- end
386
- class BarHistory4 < ActiveFedora::Base
387
- has_subresource 'rdfish', class_name: 'BarRdfDatastream'
388
- Deprecation.silence(ActiveFedora::Attributes) do
389
- has_attributes :title, datastream: 'rdfish', multiple: true
390
- has_attributes :description, datastream: 'rdfish', multiple: false
391
- end
392
- end
393
- end
394
62
 
395
- after :all do
396
- Object.send(:remove_const, :BarHistory4)
397
- Object.send(:remove_const, :BarRdfDatastream)
398
- end
399
-
400
- subject { BarHistory4.new }
401
-
402
- context "with a multivalued field" do
403
- it "is able to track change status" do
404
- expect {
405
- subject.title = ["Title1", "Title2"]
406
- }.to change { subject.title_changed? }.from(false).to(true)
407
- end
408
- end
63
+ let(:library) { BarHistory4.create }
64
+ subject { BarHistory2.new }
409
65
 
410
- context "with a single-valued field" do
411
- it "is able to track change status" do
412
- expect {
413
- subject.description = "A brief description"
414
- }.to change { subject.description_changed? }.from(false).to(true)
415
- end
416
- end
417
- end
418
-
419
- context "without a datastream" do
420
- before :all do
421
- class BarHistory4 < ActiveFedora::Base
422
- end
423
- end
424
-
425
- after :all do
426
- Object.send(:remove_const, :BarHistory4)
427
- end
428
-
429
- subject { BarHistory4 }
430
-
431
- describe "has_attributes" do
432
- it "raises an error" do
433
- Deprecation.silence(ActiveFedora::Attributes) do
434
- expect { subject.has_attributes :title, :description, multiple: true }.to raise_error
435
- end
436
- end
437
- end
438
- end
439
-
440
- context "when an unknown datastream is specified" do
441
- before :all do
442
- class BarHistory4 < ActiveFedora::Base
443
- Deprecation.silence(ActiveFedora::Attributes) do
444
- has_attributes :description, datastream: 'rdfish', multiple: true
66
+ after do
67
+ Object.send(:remove_const, :BarHistory2)
445
68
  end
446
- end
447
- end
448
69
 
449
- after :all do
450
- Object.send(:remove_const, :BarHistory4)
451
- end
452
-
453
- subject { BarHistory4.new }
454
-
455
- let(:error_message) { "Undefined file: `rdfish' in property description" }
456
-
457
- it "raises an error on get" do
458
- expect { subject.description }.to raise_error(ArgumentError, error_message)
459
- end
460
-
461
- it "raises an error on set" do
462
- expect { subject.description = ['Neat'] }.to raise_error(ArgumentError, error_message)
463
- end
464
-
465
- describe ".datastream_class_for_name" do
466
- it "returns the default class" do
467
- expect(BarHistory4.send(:datastream_class_for_name, 'content')).to eq ActiveFedora::File
468
- end
469
- end
470
- end
471
-
472
- context "when a datastream is specified as a symbol" do
473
- before :all do
474
- class BarRdfDatastream < ActiveFedora::NtriplesRDFDatastream
475
- property :title, predicate: ::RDF::Vocab::DC.title
476
- property :description, predicate: ::RDF::Vocab::DC.description
477
- end
478
- class BarHistory4 < ActiveFedora::Base
479
- has_subresource 'rdfish', class_name: 'BarRdfDatastream'
480
- Deprecation.silence(ActiveFedora::Attributes) do
481
- has_attributes :description, datastream: :rdfish
70
+ it "shows the library_id" do
71
+ expect(subject.inspect).to eq "#<BarHistory2 id: nil, title: [], abstract: nil, library_id: \"#{library.id}\">"
482
72
  end
483
73
  end
484
74
  end
485
75
 
486
- after :all do
487
- Object.send(:remove_const, :BarHistory4)
488
- Object.send(:remove_const, :BarRdfDatastream)
489
- end
490
-
491
- subject { BarHistory4.new(description: 'test1') }
492
-
493
- it "is able to access the attributes" do
494
- expect(subject.description).to eq 'test1'
495
- end
496
- end
497
-
498
- context "when properties are defined on an object" do
499
- before :all do
500
- class BarHistory4 < ActiveFedora::Base
501
- property :title, predicate: ::RDF::Vocab::DC.title do |index|
502
- index.as :symbol
503
- end
504
- property :abstract, predicate: ::RDF::Vocab::DC.abstract, multiple: false
76
+ describe "#unique?" do
77
+ it "reveals the unique properties" do
78
+ expect(BarHistory4.unique?(:abstract)).to be true
79
+ expect(BarHistory4.unique?(:title)).to be false
505
80
  end
506
81
  end
507
82
 
508
- after :all do
509
- Object.send(:remove_const, :BarHistory4)
510
- end
511
-
512
- let(:obj) { BarHistory4.new(title: ['test1']) }
513
- subject { obj }
514
-
515
83
  describe "accessing attributes" do
516
84
  context "using generated methods" do
517
85
  it "returns values" do
@@ -550,7 +118,15 @@ describe ActiveFedora::Base do
550
118
  end
551
119
  end
552
120
 
553
- context "indexing" do
121
+ describe 'change tracking' do
122
+ it "is able to track change status" do
123
+ expect {
124
+ subject.abstract = "Moo"
125
+ }.to change { subject.abstract_changed? }.from(false).to(true)
126
+ end
127
+ end
128
+
129
+ describe "indexing" do
554
130
  let(:solr_doc) { obj.to_solr }
555
131
 
556
132
  it "indexs the attributes" do