supplejack_api 1

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 (291) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +80 -0
  3. data/Rakefile +42 -0
  4. data/app/assets/javascripts/supplejack_api/application.js +26 -0
  5. data/app/assets/stylesheets/supplejack_api/application.css +30 -0
  6. data/app/controllers/supplejack_api/admin/base_controller.rb +24 -0
  7. data/app/controllers/supplejack_api/admin/sessions_controller.rb +25 -0
  8. data/app/controllers/supplejack_api/admin/site_activities_controller.rb +21 -0
  9. data/app/controllers/supplejack_api/admin/users_controller.rb +55 -0
  10. data/app/controllers/supplejack_api/application_controller.rb +70 -0
  11. data/app/controllers/supplejack_api/concepts_controller.rb +52 -0
  12. data/app/controllers/supplejack_api/concerns/ignore_metrics.rb +14 -0
  13. data/app/controllers/supplejack_api/concerns/records_controller_metrics.rb +26 -0
  14. data/app/controllers/supplejack_api/concerns/set_items_controller_metrics.rb +20 -0
  15. data/app/controllers/supplejack_api/concerns/user_sets_controller_metrics.rb +26 -0
  16. data/app/controllers/supplejack_api/harvester/concepts_controller.rb +41 -0
  17. data/app/controllers/supplejack_api/harvester/fragments_controller.rb +30 -0
  18. data/app/controllers/supplejack_api/harvester/records_controller.rb +68 -0
  19. data/app/controllers/supplejack_api/metrics_api_controller.rb +44 -0
  20. data/app/controllers/supplejack_api/partners_controller.rb +39 -0
  21. data/app/controllers/supplejack_api/records_controller.rb +71 -0
  22. data/app/controllers/supplejack_api/schema_controller.rb +19 -0
  23. data/app/controllers/supplejack_api/set_items_controller.rb +38 -0
  24. data/app/controllers/supplejack_api/sources_controller.rb +67 -0
  25. data/app/controllers/supplejack_api/status_controller.rb +67 -0
  26. data/app/controllers/supplejack_api/user_sets_controller.rb +97 -0
  27. data/app/controllers/supplejack_api/users_controller.rb +49 -0
  28. data/app/helpers/supplejack_api/application_helper.rb +39 -0
  29. data/app/helpers/supplejack_api/facets_helper.rb +30 -0
  30. data/app/mailers/supplejack_api/request_limit_mailer.rb +43 -0
  31. data/app/models/supplejack_api/api_concept/concept_fragment.rb +31 -0
  32. data/app/models/supplejack_api/api_record/record_fragment.rb +15 -0
  33. data/app/models/supplejack_api/concept.rb +46 -0
  34. data/app/models/supplejack_api/concept_search.rb +86 -0
  35. data/app/models/supplejack_api/concerns/queryable_by_date.rb +31 -0
  36. data/app/models/supplejack_api/concerns/record.rb +108 -0
  37. data/app/models/supplejack_api/concerns/record_fragmentable.rb +24 -0
  38. data/app/models/supplejack_api/concerns/searchable.rb +430 -0
  39. data/app/models/supplejack_api/concerns/user_set.rb +219 -0
  40. data/app/models/supplejack_api/daily_metrics.rb +20 -0
  41. data/app/models/supplejack_api/faceted_metrics.rb +55 -0
  42. data/app/models/supplejack_api/fragment.rb +82 -0
  43. data/app/models/supplejack_api/interaction_models/record.rb +60 -0
  44. data/app/models/supplejack_api/interaction_models/set.rb +13 -0
  45. data/app/models/supplejack_api/interaction_updaters/all_usage_metric.rb +41 -0
  46. data/app/models/supplejack_api/interaction_updaters/set_metrics.rb +32 -0
  47. data/app/models/supplejack_api/interaction_updaters/usage_metrics.rb +73 -0
  48. data/app/models/supplejack_api/partner.rb +24 -0
  49. data/app/models/supplejack_api/preview_record.rb +30 -0
  50. data/app/models/supplejack_api/record.rb +18 -0
  51. data/app/models/supplejack_api/record_search.rb +12 -0
  52. data/app/models/supplejack_api/schema_definition.rb +147 -0
  53. data/app/models/supplejack_api/search.rb +14 -0
  54. data/app/models/supplejack_api/set_item.rb +57 -0
  55. data/app/models/supplejack_api/site_activity.rb +59 -0
  56. data/app/models/supplejack_api/source.rb +28 -0
  57. data/app/models/supplejack_api/source_activity.rb +36 -0
  58. data/app/models/supplejack_api/source_authority.rb +42 -0
  59. data/app/models/supplejack_api/supplejack_schema.rb +37 -0
  60. data/app/models/supplejack_api/support/concept/searchable.rb +79 -0
  61. data/app/models/supplejack_api/support/concept/storable.rb +59 -0
  62. data/app/models/supplejack_api/support/fragment_helpers.rb +96 -0
  63. data/app/models/supplejack_api/support/harvestable.rb +105 -0
  64. data/app/models/supplejack_api/support/searchable.rb +115 -0
  65. data/app/models/supplejack_api/support/status_logger.rb +23 -0
  66. data/app/models/supplejack_api/support/storable.rb +49 -0
  67. data/app/models/supplejack_api/support/validation_logger.rb +23 -0
  68. data/app/models/supplejack_api/usage_metrics.rb +25 -0
  69. data/app/models/supplejack_api/user.rb +211 -0
  70. data/app/models/supplejack_api/user_activity.rb +65 -0
  71. data/app/models/supplejack_api/user_set.rb +17 -0
  72. data/app/serializers/supplejack_api/application_serializer.rb +12 -0
  73. data/app/serializers/supplejack_api/concept_record_serializer.rb +23 -0
  74. data/app/serializers/supplejack_api/concept_search_serializer.rb +12 -0
  75. data/app/serializers/supplejack_api/concept_serializer.rb +100 -0
  76. data/app/serializers/supplejack_api/concerns/record_serializable.rb +119 -0
  77. data/app/serializers/supplejack_api/concerns/search_serializable.rb +24 -0
  78. data/app/serializers/supplejack_api/record_search_serializer.rb +64 -0
  79. data/app/serializers/supplejack_api/record_serializer.rb +13 -0
  80. data/app/serializers/supplejack_api/search_serializer.rb +13 -0
  81. data/app/serializers/supplejack_api/source_authority_serializer.rb +23 -0
  82. data/app/serializers/supplejack_api/user_serializer.rb +13 -0
  83. data/app/serializers/supplejack_api/user_set_record_serializer.rb +14 -0
  84. data/app/serializers/supplejack_api/user_set_serializer.rb +77 -0
  85. data/app/services/metrics_api/v3/api.rb +30 -0
  86. data/app/services/metrics_api/v3/endpoints/facets.rb +23 -0
  87. data/app/services/metrics_api/v3/endpoints/global.rb +26 -0
  88. data/app/services/metrics_api/v3/endpoints/helpers.rb +14 -0
  89. data/app/services/metrics_api/v3/endpoints/root.rb +97 -0
  90. data/app/services/metrics_api/v3/presenters/daily_metric.rb +23 -0
  91. data/app/services/metrics_api/v3/presenters/extended_metadata.rb +41 -0
  92. data/app/services/metrics_api/v3/presenters/record.rb +26 -0
  93. data/app/services/metrics_api/v3/presenters/view.rb +28 -0
  94. data/app/views/layouts/supplejack_api/_head.html.erb +17 -0
  95. data/app/views/layouts/supplejack_api/_top_nav.html.erb +33 -0
  96. data/app/views/layouts/supplejack_api/application.html.erb +33 -0
  97. data/app/views/supplejack_api/admin/sessions/new.html.erb +25 -0
  98. data/app/views/supplejack_api/admin/shared/_links.erb +34 -0
  99. data/app/views/supplejack_api/admin/site_activities/index.csv.erb +22 -0
  100. data/app/views/supplejack_api/admin/site_activities/index.html.erb +54 -0
  101. data/app/views/supplejack_api/admin/users/edit.html.erb +16 -0
  102. data/app/views/supplejack_api/admin/users/index.csv.erb +22 -0
  103. data/app/views/supplejack_api/admin/users/index.html.erb +57 -0
  104. data/app/views/supplejack_api/admin/users/show.html.erb +33 -0
  105. data/app/views/supplejack_api/request_limit_mailer/at100percent.text.erb +13 -0
  106. data/app/views/supplejack_api/request_limit_mailer/at100percent_admin.text.erb +1 -0
  107. data/app/views/supplejack_api/request_limit_mailer/at90percent.text.erb +13 -0
  108. data/app/views/supplejack_api/request_limit_mailer/at90percent_admin.text.erb +1 -0
  109. data/app/workers/supplejack_api/daily_metrics_worker.rb +112 -0
  110. data/app/workers/supplejack_api/interaction_metrics_worker.rb +45 -0
  111. data/config/cucumber.yml +16 -0
  112. data/config/initializers/force_eagerload.rb +11 -0
  113. data/config/initializers/interaction_updaters.rb +7 -0
  114. data/config/routes.rb +81 -0
  115. data/db/binding_records.development.json +7 -0
  116. data/db/binding_records.staging.json +7 -0
  117. data/db/concepts.json +33 -0
  118. data/db/concepts_data.json +569745 -0
  119. data/db/source_authorities.json +119 -0
  120. data/lib/generators/supplejack_api/install_generator.rb +124 -0
  121. data/lib/mongoid/paperclip.rb +53 -0
  122. data/lib/mongoid/string.rb +20 -0
  123. data/lib/sunspot/mongoid.rb +51 -0
  124. data/lib/sunspot/resque_session_proxy.rb +72 -0
  125. data/lib/sunspot/sunspot_spellcheck.rb +98 -0
  126. data/lib/supplejack_api.rb +13 -0
  127. data/lib/supplejack_api/admin/sortable.rb +40 -0
  128. data/lib/supplejack_api/engine.rb +46 -0
  129. data/lib/supplejack_api/harvester_constraint.rb +28 -0
  130. data/lib/supplejack_api/stylesheets.rb +36 -0
  131. data/lib/supplejack_api/utils.rb +75 -0
  132. data/lib/supplejack_api/version.rb +11 -0
  133. data/lib/tasks/resque.rake +22 -0
  134. data/lib/url_validator.rb +38 -0
  135. data/spec/controllers/supplejack_api/admin/base_controller_spec.rb +55 -0
  136. data/spec/controllers/supplejack_api/admin/site_activities_controller_spec.rb +43 -0
  137. data/spec/controllers/supplejack_api/admin/users_controller_spec.rb +79 -0
  138. data/spec/controllers/supplejack_api/application_controller_spec.rb +133 -0
  139. data/spec/controllers/supplejack_api/concepts_controller_spec.rb +83 -0
  140. data/spec/controllers/supplejack_api/concerns/records_controller_metrics_spec.rb +60 -0
  141. data/spec/controllers/supplejack_api/harvester/concepts_controller_spec.rb +57 -0
  142. data/spec/controllers/supplejack_api/harvester/records_controller_spec.rb +138 -0
  143. data/spec/controllers/supplejack_api/metrics_api_controller_spec.rb +71 -0
  144. data/spec/controllers/supplejack_api/partners_controller_spec.rb +77 -0
  145. data/spec/controllers/supplejack_api/records_controller_spec.rb +143 -0
  146. data/spec/controllers/supplejack_api/set_items_controller_spec.rb +78 -0
  147. data/spec/controllers/supplejack_api/sources_controller_spec.rb +161 -0
  148. data/spec/controllers/supplejack_api/status_controller_spec.rb +120 -0
  149. data/spec/controllers/supplejack_api/user_sets_controller_spec.rb +233 -0
  150. data/spec/controllers/supplejack_api/users_controller_spec.rb +61 -0
  151. data/spec/dummy/README.rdoc +268 -0
  152. data/spec/dummy/Rakefile +7 -0
  153. data/spec/dummy/app/assets/javascripts/application.js +23 -0
  154. data/spec/dummy/app/assets/stylesheets/application.css +22 -0
  155. data/spec/dummy/app/controllers/application_controller.rb +10 -0
  156. data/spec/dummy/app/helpers/application_helper.rb +9 -0
  157. data/spec/dummy/app/supplejack_api/concept_schema.rb +83 -0
  158. data/spec/dummy/app/supplejack_api/record_schema.rb +64 -0
  159. data/spec/dummy/app/supplejack_api/record_schema.txt +66 -0
  160. data/spec/dummy/app/views/layouts/application.html.erb +23 -0
  161. data/spec/dummy/app/workers/supplejack_api/clear_index_buffer.rb +32 -0
  162. data/spec/dummy/app/workers/supplejack_api/flush_old_records_worker.rb +17 -0
  163. data/spec/dummy/app/workers/supplejack_api/index_buffer.rb +49 -0
  164. data/spec/dummy/app/workers/supplejack_api/index_source_worker.rb +39 -0
  165. data/spec/dummy/app/workers/supplejack_api/index_worker.rb +82 -0
  166. data/spec/dummy/app/workers/supplejack_api/store_user_activity_worker.rb +24 -0
  167. data/spec/dummy/config.ru +11 -0
  168. data/spec/dummy/config/application.rb +76 -0
  169. data/spec/dummy/config/application.yml +31 -0
  170. data/spec/dummy/config/application.yml.example +36 -0
  171. data/spec/dummy/config/boot.rb +17 -0
  172. data/spec/dummy/config/environment.rb +12 -0
  173. data/spec/dummy/config/environments/development.rb +42 -0
  174. data/spec/dummy/config/environments/production.rb +76 -0
  175. data/spec/dummy/config/environments/test.rb +46 -0
  176. data/spec/dummy/config/initializers/backtrace_silencers.rb +14 -0
  177. data/spec/dummy/config/initializers/devise.rb +214 -0
  178. data/spec/dummy/config/initializers/inflections.rb +22 -0
  179. data/spec/dummy/config/initializers/kaminari_config.rb +17 -0
  180. data/spec/dummy/config/initializers/mime_types.rb +12 -0
  181. data/spec/dummy/config/initializers/mongoid.rb +9 -0
  182. data/spec/dummy/config/initializers/quiet_logger.rb +23 -0
  183. data/spec/dummy/config/initializers/resque.rb +18 -0
  184. data/spec/dummy/config/initializers/secret_token.rb +14 -0
  185. data/spec/dummy/config/initializers/session_store.rb +15 -0
  186. data/spec/dummy/config/initializers/simple_form.rb +149 -0
  187. data/spec/dummy/config/initializers/simple_form_foundation.rb +33 -0
  188. data/spec/dummy/config/initializers/state_machine.rb +8 -0
  189. data/spec/dummy/config/initializers/sunspot.rb +32 -0
  190. data/spec/dummy/config/initializers/wrap_parameters.rb +17 -0
  191. data/spec/dummy/config/locales/devise.en.yml +63 -0
  192. data/spec/dummy/config/locales/en.yml +66 -0
  193. data/spec/dummy/config/locales/simple_form.en.yml +33 -0
  194. data/spec/dummy/config/mongoid.travis.yml +34 -0
  195. data/spec/dummy/config/mongoid.yml +36 -0
  196. data/spec/dummy/config/resque-pool.yml +18 -0
  197. data/spec/dummy/config/resque_schedule.yml +12 -0
  198. data/spec/dummy/config/routes.rb +11 -0
  199. data/spec/dummy/config/secrets.yml +8 -0
  200. data/spec/dummy/config/sunspot.yml +38 -0
  201. data/spec/dummy/db/concepts.json +37 -0
  202. data/spec/dummy/db/source_authorities.json +116 -0
  203. data/spec/dummy/public/404.html +35 -0
  204. data/spec/dummy/public/422.html +35 -0
  205. data/spec/dummy/public/500.html +34 -0
  206. data/spec/dummy/public/favicon.ico +8 -0
  207. data/spec/dummy/script/rails +6 -0
  208. data/spec/dummy/solr/collection1/conf/elevate.xml +36 -0
  209. data/spec/dummy/solr/collection1/conf/mapping-FoldToASCII.txt +3813 -0
  210. data/spec/dummy/solr/collection1/conf/schema.xml +292 -0
  211. data/spec/dummy/solr/collection1/conf/solrconfig.xml +1780 -0
  212. data/spec/dummy/solr/collection1/conf/spellings.txt +2 -0
  213. data/spec/dummy/solr/collection1/conf/stopwords.txt +58 -0
  214. data/spec/dummy/solr/collection1/conf/synonyms.txt +31 -0
  215. data/spec/factories/concepts.rb +16 -0
  216. data/spec/factories/daily_metrics.rb +10 -0
  217. data/spec/factories/faceted_metrics.rb +25 -0
  218. data/spec/factories/fragment.rb +14 -0
  219. data/spec/factories/partners.rb +14 -0
  220. data/spec/factories/record_interaction.rb +17 -0
  221. data/spec/factories/records.rb +47 -0
  222. data/spec/factories/set_interaction.rb +15 -0
  223. data/spec/factories/source_authorities.rb +19 -0
  224. data/spec/factories/sources.rb +16 -0
  225. data/spec/factories/usage_metrics.rb +20 -0
  226. data/spec/factories/user_activities.rb +14 -0
  227. data/spec/factories/user_sets.rb +27 -0
  228. data/spec/factories/users.rb +23 -0
  229. data/spec/helpers/application_helper_spec.rb +35 -0
  230. data/spec/models/concept_spec.rb +163 -0
  231. data/spec/models/fragment_spec.rb +15 -0
  232. data/spec/models/site_activity_spec.rb +103 -0
  233. data/spec/models/source_activity_spec.rb +56 -0
  234. data/spec/models/source_authority_spec.rb +42 -0
  235. data/spec/models/supplejack_api/api_concept/concept_fragment_spec.rb +189 -0
  236. data/spec/models/supplejack_api/api_record/record_fragment_spec.rb +189 -0
  237. data/spec/models/supplejack_api/concept_spec.rb +0 -0
  238. data/spec/models/supplejack_api/interaction_updaters/all_usage_metric_spec.rb +41 -0
  239. data/spec/models/supplejack_api/interaction_updaters/set_metrics_spec.rb +32 -0
  240. data/spec/models/supplejack_api/interaction_updaters/usage_metrics_spec.rb +44 -0
  241. data/spec/models/supplejack_api/partner_spec.rb +20 -0
  242. data/spec/models/supplejack_api/record_search_spec.rb +429 -0
  243. data/spec/models/supplejack_api/record_spec.rb +280 -0
  244. data/spec/models/supplejack_api/schema_definition_spec.rb +272 -0
  245. data/spec/models/supplejack_api/search_spec.rb +243 -0
  246. data/spec/models/supplejack_api/set_item_spec.rb +123 -0
  247. data/spec/models/supplejack_api/source_spec.rb +22 -0
  248. data/spec/models/supplejack_api/support/fragment_helpers_spec.rb +216 -0
  249. data/spec/models/supplejack_api/support/harvestable_spec.rb +177 -0
  250. data/spec/models/supplejack_api/support/searchable_spec.rb +85 -0
  251. data/spec/models/supplejack_api/support/storable_spec.rb +18 -0
  252. data/spec/models/supplejack_api/user_activity_spec.rb +88 -0
  253. data/spec/models/supplejack_api/user_set_spec.rb +559 -0
  254. data/spec/models/supplejack_api/user_spec.rb +348 -0
  255. data/spec/routing/concepts_routing_spec.rb +22 -0
  256. data/spec/routing/harvester_constraint_spec.rb +66 -0
  257. data/spec/routing/harvester_routing_spec.rb +51 -0
  258. data/spec/routing/partner_routing_spec.rb +34 -0
  259. data/spec/routing/records_routing_spec.rb +26 -0
  260. data/spec/routing/sets_routing_spec.rb +44 -0
  261. data/spec/routing/source_routing_spec.rb +38 -0
  262. data/spec/routing/users_routing_spec.rb +18 -0
  263. data/spec/serializers/concept_record_serializer_spec.rb +30 -0
  264. data/spec/serializers/supplejack_api/application_serializer_spec.rb +14 -0
  265. data/spec/serializers/supplejack_api/concept_search_serializer_spec.rb +34 -0
  266. data/spec/serializers/supplejack_api/concept_serializer_spec.rb +92 -0
  267. data/spec/serializers/supplejack_api/record_search_serializer_spec.rb +34 -0
  268. data/spec/serializers/supplejack_api/record_serializer_spec.rb +271 -0
  269. data/spec/serializers/supplejack_api/search_serializer_spec.rb +90 -0
  270. data/spec/serializers/supplejack_api/user_serializer_spec.rb +22 -0
  271. data/spec/serializers/supplejack_api/user_set_serializer_spec.rb +96 -0
  272. data/spec/services/metrics_api/v3/api_spec.rb +23 -0
  273. data/spec/services/metrics_api/v3/endpoints/facets_spec.rb +25 -0
  274. data/spec/services/metrics_api/v3/endpoints/global_spec.rb +22 -0
  275. data/spec/services/metrics_api/v3/endpoints/root_spec.rb +49 -0
  276. data/spec/services/metrics_api/v3/presenters/extended_metadata_spec.rb +49 -0
  277. data/spec/spec_helper.rb +70 -0
  278. data/spec/support/api/schemas/metrics/daily_metrics_metadata.json +24 -0
  279. data/spec/support/api/schemas/metrics/extended_metrics.json +26 -0
  280. data/spec/support/api/schemas/metrics/extended_response.json +6 -0
  281. data/spec/support/api/schemas/metrics/facets_response.json +6 -0
  282. data/spec/support/api/schemas/metrics/record_metadata.json +33 -0
  283. data/spec/support/api/schemas/metrics/top_level_response.json +6 -0
  284. data/spec/support/api/schemas/metrics/view_metadata.json +33 -0
  285. data/spec/support/api_schema_matcher.rb +14 -0
  286. data/spec/support/devise.rb +10 -0
  287. data/spec/workers/supplejack_api/daily_metrics_worker_spec.rb +140 -0
  288. data/spec/workers/supplejack_api/flush_old_records_worker_spec.rb +20 -0
  289. data/spec/workers/supplejack_api/index_worker_spec.rb +52 -0
  290. data/spec/workers/supplejack_api/source_index_worker_spec.rb +61 -0
  291. metadata +1231 -0
@@ -0,0 +1,243 @@
1
+ # The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
2
+ # and is licensed under the GNU General Public License, version 3.
3
+ # One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
4
+ #
5
+ # Supplejack was created by DigitalNZ at the National Library of NZ and
6
+ # the Department of Internal Affairs. http://digitalnz.org/supplejack
7
+
8
+ require 'spec_helper'
9
+
10
+ module SupplejackApi
11
+ describe Search do
12
+ before {
13
+ @search = Search.new
14
+ Sunspot.session = SunspotMatchers::SunspotSessionSpy.new(Sunspot.session)
15
+ @session = Sunspot.session
16
+
17
+ allow(Search).to receive(:role_collection_restrictions) { [] }
18
+ }
19
+
20
+ describe '#facet_list' do
21
+ before {
22
+ @search = RecordSearch.new
23
+ allow(@search).to receive(:model_class) { Record }
24
+ }
25
+
26
+ it 'should return a array of facets' do
27
+ @search.options[:facets] = 'name, address'
28
+ expect(@search.facet_list).to eq [:name, :address]
29
+ end
30
+
31
+ it 'should discard any fields not configured as facets' do
32
+ @search.options[:facets] = 'name, address, other_facet'
33
+ expect(@search.facet_list).to eq [:name, :address]
34
+ end
35
+ end
36
+
37
+ describe '#field_list' do
38
+ before {
39
+ @search = RecordSearch.new
40
+ allow(@search).to receive(:schema_class) { RecordSchema }
41
+ }
42
+
43
+ it 'should return a array of fields' do
44
+ @search.options[:fields] = 'name, address'
45
+ expect(@search.field_list).to eq [:name, :address]
46
+ end
47
+
48
+ it 'should only return valid fields' do
49
+ @search.options[:fields] = 'name, something_else'
50
+ expect(@search.field_list).to eq [:name]
51
+ end
52
+ end
53
+
54
+ describe '#group_list' do
55
+ before {
56
+ @search = RecordSearch.new
57
+ allow(@search).to receive(:model_class) { Record }
58
+ }
59
+
60
+ it 'gets the groups from the fields list' do
61
+ @search.options[:fields] = "content_partner, core"
62
+ expect(@search.group_list).to eq [:core]
63
+ end
64
+ end
65
+
66
+ describe '#query_fields' do
67
+ it 'returns nil when no query fields were specified' do
68
+ @search = Search.new
69
+ expect(@search.query_fields).to be_nil
70
+ end
71
+
72
+ it 'returns the query fields from the params' do
73
+ @search = Search.new(query_fields: [:collection])
74
+ expect(@search.query_fields).to eq([:collection])
75
+ end
76
+
77
+ it 'supports the query_fields as comma separated string' do
78
+ @search = Search.new(query_fields: 'collection, creator, publisher')
79
+ expect(@search.query_fields).to eq([:collection, :creator, :publisher])
80
+ end
81
+
82
+ it 'converts an array of strings to symbols' do
83
+ @search = Search.new(query_fields: ['collection','creator'])
84
+ expect(@search.query_fields).to eq([:collection, :creator])
85
+ end
86
+
87
+ it 'returns nil when query_fields is an empty string' do
88
+ @search = Search.new(query_fields: '')
89
+ expect(@search.query_fields).to be_nil
90
+ end
91
+
92
+ it 'returns nil when query_fields is an empty array' do
93
+ @search = Search.new(query_fields: [])
94
+ expect(@search.query_fields).to be_nil
95
+ end
96
+ end
97
+
98
+ describe '#extract_range' do
99
+ it 'extracts the dates from [1900 TO 2000] and return a range' do
100
+ expect(@search.extract_range('[1900 TO 2000]')).to eq(1900..2000)
101
+ end
102
+
103
+ it 'doesn\'t match non numbers' do
104
+ expect(@search.extract_range('[asdasd TO asdads]')).to eq '[asdasd TO asdads]'
105
+ end
106
+
107
+ it 'returns the current value if is not a range and converts it to int' do
108
+ expect(@search.extract_range('1900')).to eq 1900
109
+ end
110
+ end
111
+
112
+ describe '#to_proper_value' do
113
+ it 'returns false for "false" string' do
114
+ expect(@search.to_proper_value('active?', 'false')).to be_falsey
115
+ end
116
+
117
+ it 'returns true for "true" string' do
118
+ expect(@search.to_proper_value('active?', 'true')).to be_truthy
119
+ end
120
+
121
+ it 'returns nil if is a "nil" string' do
122
+ expect(@search.to_proper_value('active?', 'nil')).to be_nil
123
+ end
124
+
125
+ it 'returns nil if is a "null" string' do
126
+ expect(@search.to_proper_value('active?', 'null')).to be_nil
127
+ end
128
+
129
+ it 'returns the value unchanged' do
130
+ expect(@search.to_proper_value('label', 'Black')).to eq('Black')
131
+ end
132
+
133
+ it 'should strip any white space' do
134
+ expect(@search.to_proper_value('label', ' Black Label ')).to eq('Black Label')
135
+ end
136
+ end
137
+
138
+ describe '#text' do
139
+ it 'downcases the text string' do
140
+ expect(Search.new(text: 'McDowall').text).to eq 'mcdowall'
141
+ end
142
+
143
+ ['AND', 'OR', 'NOT'].each do |operator|
144
+ it "downcases everything except the #{operator} operators" do
145
+ expect(Search.new(text: "McDowall #{operator} Dogs").text).to eq "mcdowall #{operator} dogs"
146
+ end
147
+ end
148
+ end
149
+
150
+ describe '#solr_search_object' do
151
+ it 'memoizes the solr search object' do
152
+ sunspot_mock = double(:solr).as_null_object
153
+ expect(@search).to receive(:execute_solr_search).once.and_return(sunspot_mock)
154
+ @search.solr_search_object
155
+ expect(@search.solr_search_object).to eq(sunspot_mock)
156
+ end
157
+
158
+ it 'sets the solr request parameters when debug=true' do
159
+ @search.options[:debug] = 'true'
160
+ allow(@search).to receive(:execute_solr_search) { double(:solr_request, query: double(:query, to_params: {param1: 1})) }
161
+ @search.solr_search_object
162
+ expect(@search.solr_request_params).to eq({:param1 => 1})
163
+ end
164
+
165
+ it "doesn't set the solr request parameters" do
166
+ allow(@search).to receive(:execute_solr_search) { double(:solr_request, query: double(:query, to_params: {param1: 1})) }
167
+ @search.solr_search_object
168
+ expect(@search.solr_request_params).to be_nil
169
+ end
170
+
171
+ it 'returns a empty hash when solr request fails' do
172
+ @search.options[:debug] = 'true'
173
+ allow(@search).to receive(:execute_solr_search) { {} }
174
+ expect(@search.solr_search_object).to eq({})
175
+ end
176
+ end
177
+
178
+ describe '#solr_error_message' do
179
+ before {
180
+ @error = double(:error, response: {status: 400, body: 'Solr error'})
181
+ allow(@error).to receive(:parse_solr_error_response) { 'Solr error' }
182
+ }
183
+
184
+ it 'returns a hash with the solr error title and description' do
185
+ expect(@search.solr_error_message(@error)).to eq({title: '400 Bad Request', body: 'Solr error'})
186
+ end
187
+ end
188
+
189
+ describe '#method_missing' do
190
+ it 'delegates any missing method to the solr_search_object' do
191
+ sso = double(:sso, something_missing: [], hits: [])
192
+ allow(@search).to receive(:solr_search_object).and_return(sso)
193
+ expect(sso).to receive(:something_missing)
194
+ @search.something_missing
195
+ end
196
+
197
+ it 'returns nil when solr request failed' do
198
+ allow(@search).to receive(:solr_search_object).and_return({})
199
+ expect(@search.something_missing).to be_nil
200
+ end
201
+ end
202
+
203
+ describe '#solr_error_message' do
204
+ before(:each) do
205
+ @error = double(:error, response: {status: 400, body: 'Solr error'})
206
+ allow(@error).to receive(:parse_solr_error_response) { 'Solr error' }
207
+ end
208
+
209
+ it 'returns a hash with the solr error title and description' do
210
+ expect(@search.solr_error_message(@error)).to eq({:title => '400 Bad Request', :body => 'Solr error'})
211
+ end
212
+ end
213
+
214
+ describe '#solr_search_object' do
215
+ it 'memoizes the solr search object' do
216
+ sunspot_mock = double(:solr).as_null_object
217
+ expect(@search).to receive(:execute_solr_search).once.and_return(sunspot_mock)
218
+ @search.solr_search_object
219
+ expect(@search.solr_search_object).to eq(sunspot_mock)
220
+ end
221
+
222
+ it 'sets the solr request parameters when debug=true' do
223
+ @search.options[:debug] = 'true'
224
+ allow(@search).to receive(:execute_solr_search) { double(:solr_request, query: double(:query, to_params: {param1: 1})) }
225
+ @search.solr_search_object
226
+ expect(@search.solr_request_params).to eq({:param1 => 1})
227
+ end
228
+
229
+ it "doesn't set the solr request parameters" do
230
+ allow(@search).to receive(:execute_solr_search) { double(:solr_request, query: double(:query, to_params: {param1: 1})) }
231
+ @search.solr_search_object
232
+ expect(@search.solr_request_params).to be_nil
233
+ end
234
+
235
+ it 'returns a empty hash when solr request fails' do
236
+ @search.options[:debug] = 'true'
237
+ allow(@search).to receive(:execute_solr_search) { {} }
238
+ expect(@search.solr_search_object).to eq({})
239
+ end
240
+ end
241
+
242
+ end
243
+ end
@@ -0,0 +1,123 @@
1
+ # The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
2
+ # and is licensed under the GNU General Public License, version 3.
3
+ # One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
4
+ #
5
+ # Supplejack was created by DigitalNZ at the National Library of NZ and
6
+ # the Department of Internal Affairs. http://digitalnz.org/supplejack
7
+
8
+ require 'spec_helper'
9
+
10
+ module SupplejackApi
11
+ describe SetItem do
12
+
13
+ let(:user_set) { FactoryGirl.build(:user_set) }
14
+ let(:set_item) { user_set.set_items.build(record_id: 10, position: 1) }
15
+
16
+ before(:each) do
17
+ allow(user_set).to receive(:record) {double(:record, record_id: 4321)}
18
+ allow(user_set).to receive(:update_record)
19
+ end
20
+
21
+ context "validations" do
22
+ it "should not be valid without a record_id" do
23
+ set_item.record_id = nil
24
+ expect(set_item).to_not be_valid
25
+ end
26
+
27
+ it "should not be valid when record_id is not a number" do
28
+ set_item.record_id = "abc"
29
+ expect(set_item).to_not be_valid
30
+ end
31
+
32
+ it "should be valid when the record_id is a number in string format" do
33
+ set_item.record_id = "1234"
34
+ expect(set_item.record_id).to eq 1234
35
+ expect(set_item).to be_valid
36
+ end
37
+
38
+ it "should not be valid when the record_id already exists in another set item" do
39
+ user_set.set_items.build(record_id: 2, position: 1)
40
+ user_set.save
41
+ set_item = user_set.set_items.build(record_id: 2, position: 2)
42
+ expect(set_item).to_not be_valid
43
+ end
44
+
45
+ it "should not be valid when trying to add a set to itself" do
46
+ allow(user_set).to receive(:record) {double(:record, record_id: 1234)}
47
+ user_set.set_items.build(record_id: 1234, position: 1)
48
+ set_item = user_set.set_items.first
49
+ expect(set_item).to_not be_valid
50
+ end
51
+
52
+ it "should allow set_item to be added to user_set without an associated Record" do
53
+ allow(user_set).to receive(:record)
54
+ user_set.set_items.build(record_id: 1234, position: 1)
55
+ set_item = user_set.set_items.first
56
+ expect(set_item).to be_valid
57
+ end
58
+ end
59
+
60
+ context "callbacks" do
61
+ it "calls set_position before_validation" do
62
+ set_item = user_set.set_items.build(record_id: 20)
63
+ expect(set_item).to receive(:set_position)
64
+ set_item.save
65
+ end
66
+ end
67
+
68
+ it "delegates record fields to the :record object" do
69
+ set_item.record = FactoryGirl.create(:record, record_id: 5)
70
+ set_item.record.fragments.create(name: "Ben", address: "Wellington")
71
+ set_item.record.save
72
+
73
+ expect(set_item.name).to eq "Ben"
74
+ expect(set_item.address).to eq "Wellington"
75
+ end
76
+
77
+ it "returns nil for any record field if the record doesn't exist" do
78
+ [:name, :address].each do |attr|
79
+ expect(set_item.send(attr)).to be_nil
80
+ end
81
+ end
82
+
83
+ describe "#set_position" do
84
+ context "with a set item" do
85
+ before(:each) do
86
+ user_set.set_items.build(record_id: 1, position: 1)
87
+ user_set.save
88
+ end
89
+
90
+ it "positions the set item at the end" do
91
+ set_item = user_set.set_items.build(record_id: 2)
92
+ set_item.set_position
93
+ expect(set_item.position).to eq 2
94
+ end
95
+
96
+ it "doesn't override the position when already set" do
97
+ set_item = user_set.set_items.build(record_id: 2, position: 4)
98
+ set_item.set_position
99
+ expect(set_item.position).to eq 4
100
+ end
101
+ end
102
+
103
+ context "without set items" do
104
+ it "sets the position to 1" do
105
+ set_item = user_set.set_items.build(record_id: 2)
106
+ set_item.set_position
107
+ expect(set_item.position).to eq 1
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "#reindex_record" do
113
+ let(:record) {double(:record)}
114
+
115
+ it "finds the record and calls index" do
116
+ expect(Record).to receive(:custom_find).with(set_item.record_id) {record}
117
+ expect(record).to receive(:index)
118
+ set_item.reindex_record
119
+ end
120
+ end
121
+
122
+ end
123
+ end
@@ -0,0 +1,22 @@
1
+ # The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
2
+ # and is licensed under the GNU General Public License, version 3.
3
+ # One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
4
+ #
5
+ # Supplejack was created by DigitalNZ at the National Library of NZ and
6
+ # the Department of Internal Affairs. http://digitalnz.org/supplejack
7
+
8
+ require 'spec_helper'
9
+
10
+ module SupplejackApi
11
+ describe Source do
12
+
13
+ describe '.suppressed' do
14
+ let!(:active_source) { FactoryGirl.create(:source, status: 'active') }
15
+ let!(:suppressed_source) { FactoryGirl.create(:source, status: 'suppressed') }
16
+
17
+ it 'should return all the suppressed sources' do
18
+ expect(Source.suppressed.to_a).to eq [suppressed_source]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,216 @@
1
+ # The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
2
+ # and is licensed under the GNU General Public License, version 3.
3
+ # One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
4
+ #
5
+ # Supplejack was created by DigitalNZ at the National Library of NZ and
6
+ # the Department of Internal Affairs. http://digitalnz.org/supplejack
7
+
8
+ require 'spec_helper'
9
+
10
+ module SupplejackApi
11
+ module Support
12
+ describe FragmentHelpers do
13
+ let(:record) { FactoryGirl.build(:record_with_fragment, record_id: 1234) }
14
+
15
+ describe '#before_save' do
16
+ it 'should call merge_fragments' do
17
+ expect(record).to receive(:merge_fragments)
18
+ record.save
19
+ end
20
+ end
21
+
22
+ describe "valiations" do
23
+ it "should be valid" do
24
+ expect(record).to be_valid
25
+ end
26
+
27
+ context "duplicate source_ids" do
28
+ before do
29
+ record.fragments << FactoryGirl.build(:record_fragment, source_id: 'source_name')
30
+ end
31
+
32
+ it "should not be valid" do
33
+ expect(record).to_not be_valid
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "#source_ids" do
39
+ it "should return an array with a single source_id" do
40
+ expect(record.source_ids).to eq ['source_name']
41
+ end
42
+
43
+ context "multiple fragments" do
44
+ before do
45
+ record.fragments << FactoryGirl.build(:record_fragment, source_id: 'another_source')
46
+ end
47
+
48
+ it "should return an array with the source_ids" do
49
+ expect(record.source_ids).to eq ['source_name', "another_source"]
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "#duplicate_source_ids?" do
55
+ it "should return false" do
56
+ expect(record.duplicate_source_ids?).to be_falsey
57
+ end
58
+
59
+ context "duplicate source_ids" do
60
+ before do
61
+ record.fragments << FactoryGirl.build(:record_fragment, source_id: 'source_name')
62
+ end
63
+
64
+ it "should return true" do
65
+ expect(record.duplicate_source_ids?).to be_truthy
66
+ end
67
+ end
68
+ end
69
+
70
+ describe '#primary_fragment' do
71
+ let(:record) { FactoryGirl.build(:record) }
72
+ before { record.save }
73
+
74
+ it 'returns the fragment with priority 0' do
75
+ fragment1 = record.fragments.create(name: 'John', priority: 1)
76
+ fragment0 = record.fragments.create(name: 'John', priority: 0)
77
+ expect(record.primary_fragment).to eq fragment0
78
+ end
79
+
80
+ it 'returns a new fragment with priority 0' do
81
+ expect(record.primary_fragment).to be_a ApiRecord::RecordFragment
82
+ expect(record.primary_fragment.priority).to eq 0
83
+ end
84
+
85
+ it 'should build a primary fragment with default attributes' do
86
+ expect(record.primary_fragment(name: 'John').name).to eq 'John'
87
+ end
88
+ end
89
+
90
+ describe 'merge_fragments' do
91
+ let(:record) { FactoryGirl.build(:record_with_fragment) }
92
+ let(:primary) { record.fragments.first }
93
+ let(:secondary) { record.fragments.last }
94
+
95
+ it 'should delete any existing merged fragment' do
96
+ record.merged_fragment = FactoryGirl.build(:record_fragment)
97
+ record.save
98
+ expect(record.merged_fragment).to be_nil
99
+ end
100
+
101
+ context 'one fragment' do
102
+ it 'should not save the merged fragment' do
103
+ record.merge_fragments
104
+ expect(record.merged_fragment).to be_nil
105
+ end
106
+ end
107
+
108
+ context 'multiple fragments' do
109
+ before(:each) do
110
+ record.fragments << FactoryGirl.build(:record_fragment, name: 'James Smith', email: ['jamessmith@example.com'], source_id: 'another_source')
111
+ record.save!
112
+ end
113
+
114
+ it 'unsets the priority field' do
115
+ record.save
116
+ expect(record.merged_fragment.priority).to be_nil
117
+ end
118
+
119
+ context 'single value fields' do
120
+ it 'should store the first non-nil value of the field' do
121
+ primary.name = nil
122
+ record.save
123
+ expect(record.merged_fragment.name).to eq 'James Smith'
124
+ end
125
+ end
126
+
127
+ context 'multi-value fields' do
128
+ it 'should store the merged values of the field' do
129
+ expect(record.merged_fragment.email).to eq ['johndoe@example.com', 'jamessmith@example.com']
130
+ end
131
+
132
+ it 'should not return duplicate values' do
133
+ primary.email = ['johndoe@example.com', 'jamessmith@example.com']
134
+ record.save
135
+ expect(record.merged_fragment.email).to eq ['johndoe@example.com', 'jamessmith@example.com']
136
+ end
137
+
138
+ it 'should not return nil values' do
139
+ secondary.email = nil
140
+ record.save
141
+ expect(record.merged_fragment.email).to eq ['johndoe@example.com']
142
+ end
143
+ end
144
+ end
145
+ end
146
+
147
+ describe '#method_missing' do
148
+ let(:record) { FactoryGirl.create(:record_with_fragment) }
149
+
150
+ context 'no fragments' do
151
+ let(:record) { FactoryGirl.create(:record) }
152
+
153
+ it 'should return nil' do
154
+ expect(record.nz_citizen).to be_nil
155
+ end
156
+ end
157
+
158
+ context 'single fragment' do
159
+ it 'should return a single value field from merged_fragment' do
160
+ expect(record.name).to eq 'John Doe'
161
+ end
162
+
163
+ it 'returns an array for an empty mutli-value field' do
164
+ expect(record.contact).to eq []
165
+ end
166
+ end
167
+
168
+ context 'multiple fragments' do
169
+ before(:each) do
170
+ record.fragments << FactoryGirl.build(:record_fragment, email: ['jamessmith@example.com'], source_id: 'another_source')
171
+ record.save!
172
+ end
173
+
174
+ it 'should return a single value field from merged_fragment' do
175
+ expect(record.name).to eq 'John Doe'
176
+ end
177
+
178
+ it 'should return the multi-value field values from merged_fragment' do
179
+ expect(record.email).to eq ['johndoe@example.com', 'jamessmith@example.com']
180
+ end
181
+ end
182
+
183
+ # context "namespaced field names" do
184
+ # it "should translate namespaced field names into their stored field name" do
185
+ # record.fragments.first.stub(:dc_name) { 'Joe Bloggs' }
186
+ # record.public_send(:'dc:name')).to eq 'Joe Bloggs'
187
+ # end
188
+ # end
189
+ end
190
+
191
+ describe '#sorted_fragments' do
192
+ it 'returns a list of fragments sorted by priority' do
193
+ record.fragments.build(priority: 10)
194
+ record.fragments.build(priority: -1)
195
+ record.fragments.build(priority: 5)
196
+
197
+ expect(record.sorted_fragments.map(&:priority)).to eq [-1,0,5,10]
198
+ end
199
+ end
200
+
201
+ describe '#find_fragment' do
202
+ before { record.save }
203
+
204
+ let!(:fragment) { record.fragments.create(source_id: 'thumbnails_enrichment') }
205
+
206
+ it 'should find a fragment by source_id' do
207
+ expect(record.find_fragment('thumbnails_enrichment')).to eq fragment
208
+ end
209
+
210
+ it "should return nil when it doesn't find a fragment" do
211
+ expect(record.find_fragment('nlnzcat')).to be_nil
212
+ end
213
+ end
214
+ end
215
+ end
216
+ end