active-fedora 13.1.2 → 13.1.3

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 (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,22 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe ActiveFedora::Reflection::OrdersReflection do
4
- let(:orders_reflection) { described_class.new(name, scope, options, active_fedora) }
5
- let(:macro) { :orders }
6
- let(:name) { "ordered_member_proxies" }
7
- let(:options) { {} }
8
- let(:scope) { nil }
9
- let(:active_fedora) { instance_double(ActiveFedora::Base) }
10
-
11
- describe "#klass" do
12
- it "is a proxy" do
13
- expect(orders_reflection.klass).to eq ActiveFedora::Orders::ListNode
14
- end
15
- end
16
-
17
- describe "#class_name" do
18
- it "is a list node" do
19
- expect(orders_reflection.class_name).to eq "ActiveFedora::Orders::ListNode"
20
- end
21
- end
22
- end
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Base do
4
- describe ".uri_prefix" do
5
- before do
6
- class FooHistory < ActiveFedora::Base
7
- def uri_prefix
8
- "foo"
9
- end
10
- property :title, predicate: ::RDF::Vocab::DC.title
11
- end
12
- end
13
-
14
- after do
15
- Object.send(:remove_const, :FooHistory)
16
- end
17
-
18
- subject(:history) { FooHistory.new(title: ["Root foo"]) }
19
- let(:path) { "foo" }
20
-
21
- it { is_expected.to have_uri_prefix }
22
-
23
- it "uses the root path in the uri" do
24
- expect(history.uri_prefix).to eql path
25
- end
26
-
27
- context "when the object is saved" do
28
- before { history.save }
29
-
30
- it "persists the path in the uri" do
31
- expect(history.uri.to_s).to include(path)
32
- end
33
- end
34
- end
35
- end
@@ -1,115 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Persistence do
4
- describe '#new_record?' do
5
- context 'with an new object' do
6
- subject(:persistence) { ActiveFedora::Base.new }
7
- it { is_expected.to be_new_record }
8
- end
9
-
10
- context 'with an destroyed object' do
11
- subject(:persistence) { ActiveFedora::Base.create }
12
- before { persistence.delete }
13
- it { is_expected.not_to be_new_record }
14
- end
15
- end
16
-
17
- describe '.delete' do
18
- context 'with an unsaved object' do
19
- subject(:persistence) { ActiveFedora::Base.new }
20
- before { persistence.delete }
21
- it { is_expected.to eq persistence }
22
- end
23
-
24
- context 'with a saved object' do
25
- subject(:persistence) { ActiveFedora::Base.create! }
26
- before { persistence.delete }
27
- it { is_expected.to be_frozen }
28
- end
29
- end
30
-
31
- describe '.create' do
32
- context 'when a block is provided' do
33
- it 'passes the block to initialize' do
34
- expect_any_instance_of(ActiveFedora::Base).to receive(:save)
35
- expect { |b| ActiveFedora::Base.create(&b) }.to yield_with_args(an_instance_of(ActiveFedora::Base))
36
- end
37
- end
38
-
39
- context "when trying to create it again" do
40
- let(:object) { ActiveFedora::Base.create! }
41
-
42
- it "raises an error" do
43
- expect { ActiveFedora::Base.create(id: object.id) }.to raise_error(ActiveFedora::IllegalOperation, "Attempting to recreate existing ldp_source: `#{object.uri}'")
44
- end
45
- end
46
- end
47
-
48
- describe '.destroy' do
49
- subject(:persistence) { ActiveFedora::Base.create! }
50
- context 'with no options' do
51
- before { persistence.destroy }
52
- it 'does not clear the id' do
53
- expect(persistence.id).not_to be_nil
54
- end
55
- end
56
-
57
- context 'with option eradicate: true' do
58
- it 'deletes the tombstone' do
59
- expect(persistence.class).to receive(:eradicate).with(persistence.id).and_return(true)
60
- persistence.destroy(eradicate: true)
61
- end
62
- end
63
- end
64
-
65
- describe "save" do
66
- subject(:persistence) { ActiveFedora::Base.new }
67
-
68
- context "when called with option update_index: false" do
69
- context "on a new record" do
70
- it "does not update the index" do
71
- expect(persistence).to_not receive(:update_index)
72
- persistence.save(update_index: false)
73
- end
74
- end
75
-
76
- context "on a persisted record" do
77
- before do
78
- allow(persistence).to receive(:new_record?) { false }
79
- allow_any_instance_of(Ldp::Orm).to receive(:save) { true }
80
- allow(persistence).to receive(:update_modified_date)
81
- end
82
-
83
- it "does not update the index" do
84
- expect(persistence).to_not receive(:update_index)
85
- persistence.save(update_index: false)
86
- end
87
- end
88
- end
89
-
90
- context "when called with option :update_index=>true" do
91
- context "on create" do
92
- before { allow(persistence).to receive(:create_needs_index?) { false } }
93
-
94
- it "does not override `create_needs_index?'" do
95
- expect(persistence).to_not receive(:update_index)
96
- persistence.save(update_index: true)
97
- end
98
- end
99
-
100
- context "on update" do
101
- before do
102
- allow(persistence).to receive(:new_record?) { false }
103
- allow_any_instance_of(Ldp::Orm).to receive(:save) { true }
104
- allow(persistence).to receive(:update_needs_index?) { false }
105
- allow(persistence).to receive(:update_modified_date)
106
- end
107
-
108
- it "does not override `update_needs_index?'" do
109
- expect(persistence).to_not receive(:update_index)
110
- persistence.save(update_index: true)
111
- end
112
- end
113
- end
114
- end
115
- end
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Base do
4
- describe ".property" do
5
- context "when the same predicate is used for two properties" do
6
- let(:warningMsg) { "Same predicate (http://purl.org/dc/terms/title) used for properties title1 and title2" }
7
-
8
- it "warns" do
9
- # Note that the expect test must be before the class is parsed.
10
- expect(described_class.logger).to receive(:warn).with(warningMsg)
11
-
12
- module TestModel1
13
- class Book < ActiveFedora::Base
14
- property :title1, predicate: ::RDF::Vocab::DC.title
15
- property :title2, predicate: ::RDF::Vocab::DC.title
16
- end
17
- end
18
- end
19
- end
20
-
21
- context "when properties are created with different predicates" do
22
- it "does not warn" do
23
- # Note that the expect test must be before the class is parsed.
24
- expect(described_class.logger).to_not receive(:warn)
25
-
26
- module TestModel2
27
- class Book < ActiveFedora::Base
28
- property :title1, predicate: ::RDF::Vocab::DC.title
29
- property :title2, predicate: ::RDF::Vocab::DC.creator
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Property do
4
- before do
5
- @test_property = described_class.new(instance_double(ActiveFedora::Base), "file_name", :string)
6
- end
7
-
8
- it 'provides .new' do
9
- expect(described_class).to respond_to(:new)
10
- end
11
-
12
- it 'provides .name' do
13
- expect(described_class).to respond_to(:name)
14
- end
15
-
16
- it 'provides .instance_variable_name' do
17
- expect(@test_property).to respond_to(:instance_variable_name)
18
- end
19
-
20
- describe '.instance_variable_name' do
21
- it 'returns the value of the name attribute with an @ appended' do
22
- expect(@test_property.instance_variable_name).to eql("@#{@test_property.name}")
23
- end
24
- end
25
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::QueryResultBuilder do
4
- describe "reify solr results" do
5
- before(:all) do
6
- class AudioRecord < ActiveFedora::Base
7
- attr_accessor :id
8
- def self.connection_for_id(_id); end
9
- end
10
- @sample_solr_hits = [{ "id" => "my:_ID1_", ActiveFedora.index_field_mapper.solr_name("has_model", :symbol) => ["AudioRecord"] },
11
- { "id" => "my:_ID2_", ActiveFedora.index_field_mapper.solr_name("has_model", :symbol) => ["AudioRecord"] },
12
- { "id" => "my:_ID3_", ActiveFedora.index_field_mapper.solr_name("has_model", :symbol) => ["AudioRecord"] }]
13
- end
14
- describe ".reify_solr_results" do
15
- it "uses AudioRecord.find to instantiate objects" do
16
- expect(AudioRecord).to receive(:find).with("my:_ID1_", cast: true)
17
- expect(AudioRecord).to receive(:find).with("my:_ID2_", cast: true)
18
- expect(AudioRecord).to receive(:find).with("my:_ID3_", cast: true)
19
- described_class.reify_solr_results(@sample_solr_hits)
20
- end
21
- end
22
- describe ".lazy_reify_solr_results" do
23
- it "lazilies reify solr results" do
24
- expect(AudioRecord).to receive(:find).with("my:_ID1_", cast: true)
25
- expect(AudioRecord).to receive(:find).with("my:_ID2_", cast: true)
26
- expect(AudioRecord).to receive(:find).with("my:_ID3_", cast: true)
27
- described_class.lazy_reify_solr_results(@sample_solr_hits).each { |r| r }
28
- end
29
- end
30
- end
31
- end
@@ -1,307 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveFedora::Base do
4
- before(:all) do
5
- module SpecModel
6
- class Basic < ActiveFedora::Base
7
- end
8
- end
9
- end
10
- let(:sort_query) { ActiveFedora.index_field_mapper.solr_name("system_create", :stored_sortable, type: :date) + ' asc' }
11
- let(:model_query) { "_query_:\"{!raw f=has_model_ssim}SpecModel::Basic\"" }
12
-
13
- after(:all) do
14
- Object.send(:remove_const, :SpecModel)
15
- end
16
-
17
- describe ":all" do
18
- before { allow(described_class).to receive(:relation).and_return(relation) }
19
- describe "called on a concrete class" do
20
- let(:relation) { ActiveFedora::Relation.new(SpecModel::Basic) }
21
-
22
- it "queries solr for all objects with has_model_ssim of self.class" do
23
- expect(relation).to receive(:load_from_fedora).with("changeme:30", nil)
24
- .and_return("Fake Object1")
25
- expect(relation).to receive(:load_from_fedora).with("changeme:22", nil)
26
- .and_return("Fake Object2")
27
- mock_docs = [{ "id" => "changeme:30" }, { "id" => "changeme:22" }]
28
- expect(mock_docs).to receive(:has_next?).and_return(false)
29
- expect(ActiveFedora::SolrService.instance.conn).to receive(:paginate)
30
- .with(1, 1000, 'select',
31
- params: { q: model_query, qt: 'standard', sort: [sort_query], fl: 'id' })
32
- .and_return('response' => { 'docs' => mock_docs })
33
- expect(SpecModel::Basic.all).to eq ["Fake Object1", "Fake Object2"]
34
- end
35
- end
36
-
37
- describe "called without a specific class" do
38
- let(:relation) { ActiveFedora::Relation.new(described_class) }
39
- it "specifies a q parameter" do
40
- expect(relation).to receive(:load_from_fedora).with("changeme:30", true)
41
- .and_return("Fake Object1")
42
- expect(relation).to receive(:load_from_fedora).with("changeme:22", true)
43
- .and_return("Fake Object2")
44
- mock_docs = [{ "id" => "changeme:30" }, { "id" => "changeme:22" }]
45
- expect(mock_docs).to receive(:has_next?).and_return(false)
46
- expect(ActiveFedora::SolrService.instance.conn).to receive(:paginate)
47
- .with(1, 1000, 'select',
48
- params: { q: '*:*', qt: 'standard', sort: [sort_query], fl: 'id' })
49
- .and_return('response' => { 'docs' => mock_docs })
50
- expect(described_class.all).to eq ["Fake Object1", "Fake Object2"]
51
- end
52
- end
53
- end
54
-
55
- describe '#find' do
56
- describe "with :cast false" do
57
- describe "and an id is specified" do
58
- it "raises an exception if it is not found" do
59
- expect { SpecModel::Basic.find("_ID_") }.to raise_error ActiveFedora::ObjectNotFoundError, "Couldn't find SpecModel::Basic with 'id'=_ID_"
60
- end
61
- end
62
- end
63
-
64
- context "with a blank string" do
65
- it 'raises ActiveFedora::ObjectNotFoundError' do
66
- expect {
67
- SpecModel::Basic.find('')
68
- }.to raise_error(ActiveFedora::ObjectNotFoundError)
69
- end
70
- end
71
- end
72
-
73
- describe "#where" do
74
- before do
75
- allow(described_class).to receive(:relation).and_return(relation)
76
- allow(relation).to receive(:clone).and_return(relation)
77
- end
78
- let(:relation) { ActiveFedora::Relation.new(SpecModel::Basic) }
79
- let(:solr) { ActiveFedora::SolrService.instance.conn }
80
- let(:expected_query) { "#{model_query} AND " \
81
- "_query_:\"{!field f=foo}bar\" AND " \
82
- "(_query_:\"{!field f=baz}quix\" OR " \
83
- "_query_:\"{!field f=baz}quack\")" }
84
- let(:expected_params) { { params: { sort: [sort_query], fl: 'id', q: expected_query, qt: 'standard' } } }
85
- let(:expected_sort_params) { { params: { sort: ["title_t desc"], fl: 'id', q: expected_query, qt: 'standard' } } }
86
- let(:mock_docs) { [{ "id" => "changeme:30" }, { "id" => "changeme:22" }] }
87
-
88
- it "filters by the provided fields" do
89
- expect(relation).to receive(:load_from_fedora).with("changeme:30", nil).and_return("Fake Object1")
90
- expect(relation).to receive(:load_from_fedora).with("changeme:22", nil).and_return("Fake Object2")
91
-
92
- expect(mock_docs).to receive(:has_next?).and_return(false)
93
- expect(solr).to receive(:paginate).with(1, 1000, 'select', expected_params).and_return('response' => { 'docs' => mock_docs })
94
- expect(SpecModel::Basic.where(foo: 'bar', baz: ['quix', 'quack'])).to eq ["Fake Object1", "Fake Object2"]
95
- end
96
-
97
- it "queries for empty strings" do
98
- expect(SpecModel::Basic.where(has_model_ssim: '').count).to eq 0
99
- end
100
-
101
- it 'queries for empty arrays' do
102
- expect(SpecModel::Basic.where(has_model_ssim: []).count).to eq 0
103
- end
104
-
105
- it "adds options" do
106
- expect(relation).to receive(:load_from_fedora).with("changeme:30", nil)
107
- .and_return("Fake Object1")
108
- expect(relation).to receive(:load_from_fedora).with("changeme:22", nil)
109
- .and_return("Fake Object2")
110
-
111
- expect(mock_docs).to receive(:has_next?).and_return(false)
112
- expect(solr).to receive(:paginate).with(1, 1000, 'select', expected_sort_params)
113
- .and_return('response' => { 'docs' => mock_docs })
114
- expect(SpecModel::Basic.where(foo: 'bar', baz: ['quix', 'quack'])
115
- .order('title_t desc')).to eq ["Fake Object1", "Fake Object2"]
116
- end
117
- end
118
-
119
- describe '#find_each' do
120
- before { allow(described_class).to receive(:relation).and_return(relation) }
121
- let(:relation) { ActiveFedora::Relation.new(SpecModel::Basic) }
122
- it "queries solr for all objects with :has_model_ssim of self.class" do
123
- mock_docs = [{ "id" => "changeme-30" }, { "id" => "changeme-22" }]
124
- expect(mock_docs).to receive(:has_next?).and_return(false)
125
- expect(ActiveFedora::SolrService.instance.conn).to receive(:paginate)
126
- .with(1, 1000, 'select',
127
- params: { q: model_query, qt: 'standard', sort: [sort_query], fl: 'id' })
128
- .and_return('response' => { 'docs' => mock_docs })
129
-
130
- allow(relation).to receive(:load_from_fedora).with("changeme-30", nil)
131
- .and_return(SpecModel::Basic.new(id: 'changeme-30'))
132
- allow(relation).to receive(:load_from_fedora).with("changeme-22", nil)
133
- .and_return(SpecModel::Basic.new(id: 'changeme-22'))
134
- SpecModel::Basic.find_each { |obj| obj.class == SpecModel::Basic }
135
- end
136
-
137
- describe "with conditions" do
138
- let(:solr) { ActiveFedora::SolrService.instance.conn }
139
- let(:expected_query) { "#{model_query} AND " \
140
- "_query_:\"{!field f=foo}bar\" AND " \
141
- "(_query_:\"{!field f=baz}quix\" OR " \
142
- "_query_:\"{!field f=baz}quack\")" }
143
- let(:expected_params) { { params: { sort: [sort_query], fl: 'id', q: expected_query, qt: 'standard' } } }
144
- let(:mock_docs) { [{ "id" => "changeme-30" }, { "id" => "changeme-22" }] }
145
-
146
- it "filters by the provided fields" do
147
- expect(relation).to receive(:load_from_fedora).with("changeme-30", nil).and_return(SpecModel::Basic.new(id: 'changeme-30'))
148
- expect(relation).to receive(:load_from_fedora).with("changeme-22", nil).and_return(SpecModel::Basic.new(id: 'changeme-22'))
149
-
150
- expect(mock_docs).to receive(:has_next?).and_return(false)
151
- expect(solr).to receive(:paginate).with(1, 1000, 'select', expected_params).and_return('response' => { 'docs' => mock_docs })
152
- SpecModel::Basic.find_each(foo: 'bar', baz: ['quix', 'quack']) { |obj| obj.class == SpecModel::Basic }
153
- end
154
- end
155
- end
156
-
157
- describe '#search_in_batches' do
158
- describe "with conditions hash" do
159
- let(:solr) { ActiveFedora::SolrService.instance.conn }
160
- let(:expected_query) { "#{model_query} AND " \
161
- "_query_:\"{!field f=foo}bar\" AND " \
162
- "(_query_:\"{!field f=baz}quix\" OR " \
163
- "_query_:\"{!field f=baz}quack\")" }
164
- let(:expected_params) { { params: { sort: [sort_query], fl: 'id', q: expected_query, qt: 'standard' } } }
165
- let(:mock_docs) { double('docs') }
166
-
167
- it "filters by the provided fields" do
168
- expect(mock_docs).to receive(:has_next?).and_return(false)
169
- expect(solr).to receive(:paginate).with(1, 1002, 'select', expected_params).and_return('response' => { 'docs' => mock_docs })
170
- yielded = double("yielded method")
171
- expect(yielded).to receive(:run).with(mock_docs)
172
- SpecModel::Basic.search_in_batches({ foo: 'bar', baz: ['quix', 'quack'] }, batch_size: 1002, fl: 'id') { |group| yielded.run group }
173
- end
174
- end
175
- end
176
-
177
- describe '#count' do
178
- let(:mock_result) { { 'response' => { 'numFound' => 7 } } }
179
-
180
- it "returns a count" do
181
- expect(ActiveFedora::SolrService).to receive(:get)
182
- .with(model_query, rows: 0)
183
- .and_return(mock_result)
184
- expect(SpecModel::Basic.count).to eq 7
185
- end
186
-
187
- it "allows conditions" do
188
- expect(ActiveFedora::SolrService).to receive(:get)
189
- .with("#{model_query} AND (foo:bar)", rows: 0)
190
- .and_return(mock_result)
191
- expect(SpecModel::Basic.count(conditions: 'foo:bar')).to eq 7
192
- end
193
-
194
- it "counts without a class specified" do
195
- expect(ActiveFedora::SolrService).to receive(:get)
196
- .with("(foo:bar)", rows: 0)
197
- .and_return(mock_result)
198
- expect(described_class.count(conditions: 'foo:bar')).to eq 7
199
- end
200
- end
201
-
202
- describe '#last' do
203
- describe 'with multiple objects' do
204
- before do
205
- SpecModel::Basic.create!(id: '0001')
206
- SpecModel::Basic.create!(id: '0002')
207
- @c = SpecModel::Basic.create!(id: '0003')
208
- end
209
-
210
- it 'returns the last object sorted by id' do
211
- expect(SpecModel::Basic.last).to eq @c
212
- end
213
- end
214
-
215
- describe 'with one object' do
216
- it 'equals the first object when there is only one' do
217
- SpecModel::Basic.create!
218
- expect(SpecModel::Basic.first).to eq SpecModel::Basic.last
219
- end
220
- end
221
- end
222
-
223
- describe '#first' do
224
- describe 'with multiple objects' do
225
- before do
226
- @a = SpecModel::Basic.create!(id: '0001')
227
- SpecModel::Basic.create!(id: '0002')
228
- SpecModel::Basic.create!(id: '0003')
229
- end
230
-
231
- it 'returns the first object sorted by id' do
232
- expect(SpecModel::Basic.first).to eq @a
233
- end
234
- end
235
-
236
- describe 'with one object' do
237
- it 'equals the first object when there is only one' do
238
- SpecModel::Basic.create!
239
- expect(SpecModel::Basic.first).to eq SpecModel::Basic.last
240
- end
241
- end
242
- end
243
-
244
- describe '#search_with_conditions' do
245
- subject(:search_with_conditions) { klass.search_with_conditions(conditions) }
246
- let(:mock_result) { double('Result') }
247
- let(:klass) { SpecModel::Basic }
248
-
249
- before do
250
- expect(ActiveFedora::SolrService).to receive(:query)
251
- .with(expected_query, sort: [sort_query]).and_return(mock_result)
252
- end
253
-
254
- context "with a hash of conditions" do
255
- let(:expected_query) { "#{model_query} AND " \
256
- "_query_:\"{!field f=foo}bar\" AND " \
257
- "(_query_:\"{!field f=baz}quix\" OR " \
258
- "_query_:\"{!field f=baz}quack\")" }
259
- let(:conditions) { { foo: 'bar', baz: ['quix', 'quack'] } }
260
-
261
- it "makes a query to solr and returns the results" do
262
- expect(search_with_conditions).to eq mock_result
263
- end
264
- end
265
-
266
- context "with quotes in the params" do
267
- let(:expected_query) { "#{model_query} AND " \
268
- "_query_:\"{!field f=foo}9\\\" Nails\" AND " \
269
- "(_query_:\"{!field f=baz}7\\\" version\" OR " \
270
- "_query_:\"{!field f=baz}quack\")" }
271
- let(:conditions) { { foo: '9" Nails', baz: ['7" version', 'quack'] } }
272
-
273
- it "escapes quotes" do
274
- expect(search_with_conditions).to eq mock_result
275
- end
276
- end
277
-
278
- context "called on AF::Base" do
279
- let(:klass) { described_class }
280
-
281
- context "with a hash" do
282
- let(:conditions) { { baz: 'quack' } }
283
- let(:expected_query) { "_query_:\"{!field f=baz}quack\"" }
284
- it "doesn't use the class if it's called on AF:Base " do
285
- expect(search_with_conditions).to eq mock_result
286
- end
287
- end
288
-
289
- context "called with a string" do
290
- let(:conditions) { 'chunky:monkey' }
291
- let(:expected_query) { '(chunky:monkey)' }
292
- it "uses the query string if it's provided and wrap it in parentheses" do
293
- expect(search_with_conditions).to eq mock_result
294
- end
295
- end
296
- end
297
- end
298
-
299
- describe "#load_from_fedora" do
300
- let(:relation) { ActiveFedora::Relation.new(described_class) }
301
- before { @obj = SpecModel::Basic.create(id: "test_123") }
302
- after { @obj.destroy }
303
- it "casts when klass == ActiveFedora::Base and cast argument is nil" do
304
- expect(relation.send(:load_from_fedora, "test_123", nil)).to be_a SpecModel::Basic
305
- end
306
- end
307
- end