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,348 @@
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 User do
12
+ let(:user) { User.new }
13
+
14
+ before {
15
+ developer = double(:role, name: :developer)
16
+ admin = double(:admin, admin: true)
17
+ allow(RecordSchema).to receive(:default_role) { developer }
18
+ allow(RecordSchema).to receive(:roles) { { admin: admin, developer: developer } }
19
+ }
20
+
21
+ describe '#role' do
22
+ it 'should set the default value of the role from the Schema' do
23
+ expect(user.role).to eq 'developer'
24
+ end
25
+ end
26
+
27
+ it 'should generate a authentication_token after creating a user' do
28
+ user.save
29
+ user.reload
30
+ expect(user.authentication_token).to_not be_nil
31
+ end
32
+
33
+ describe "user_sets" do
34
+ describe "custom_find" do
35
+ it "should lookup the UserSet by Mongo ID" do
36
+ expect(user.user_sets).to receive(:find).with('503a95b112575773920005f4')
37
+ user.user_sets.custom_find('503a95b112575773920005f4')
38
+ end
39
+
40
+ it "should lookup the UserSet by URL if param not an ID" do
41
+ expect(user.user_sets).to receive(:where).with(url: 'http://google.com') { [] }
42
+ user.user_sets.custom_find('http://google.com')
43
+ end
44
+ end
45
+ end
46
+
47
+ describe "#sets=" do
48
+ it "creates a new set for the user" do
49
+ user.sets = [{name: "Favourites", privacy: "hidden", priority: 0}]
50
+ expect(user.user_sets.size).to eq 1
51
+ expect(user.user_sets.first.name).to eq "Favourites"
52
+ expect(user.user_sets.first.privacy).to eq "hidden"
53
+ expect(user.user_sets.first.priority).to eq 0
54
+ end
55
+
56
+ it "doesn't create a new set when the sets are nil" do
57
+ user.sets = nil
58
+ expect(user.user_sets.size).to eq 0
59
+ end
60
+ end
61
+
62
+ describe '#name' do
63
+ it "returns the user's name" do
64
+ expect(User.new(name: 'John').name).to eq 'John'
65
+ end
66
+
67
+ it 'returns the username when the name is empty' do
68
+ expect(User.new(username: 'ben').name).to eq 'ben'
69
+ end
70
+ end
71
+
72
+ describe '#updated_today?' do
73
+ it 'should return true if the user was last updated today' do
74
+ user.updated_at = Time.now.beginning_of_day + 10.seconds
75
+ expect(user.updated_today?).to be_truthy
76
+ end
77
+
78
+ it 'should return false when the user was last updated yesterday' do
79
+ user.updated_at = Time.now - 1.day
80
+ expect(user.updated_today?).to be_falsey
81
+ end
82
+ end
83
+
84
+ describe '#check_daily_requests' do
85
+ it "should reset daily requests if it wasn't updated today" do
86
+ user.attributes = { updated_at: Time.now-1.day, daily_requests: 100 }
87
+ user.check_daily_requests
88
+ expect(user.daily_requests).to eq 1
89
+ end
90
+
91
+ it 'should increment daily requests if it was updated today' do
92
+ user.attributes = { updated_at: Time.now, daily_requests: 100 }
93
+ user.check_daily_requests
94
+ expect(user.daily_requests).to eq 101
95
+ end
96
+
97
+
98
+ context 'api limit notifications' do
99
+ before {
100
+ @email = double
101
+ allow(SupplejackApi::RequestLimitMailer).to receive(:at90percent) { @email }
102
+ }
103
+
104
+ it 'should send an email if the user is at 90% daily requests' do
105
+ expect(@email).to receive(:deliver)
106
+ user.attributes = {daily_requests: 89, updated_at: Time.now, max_requests: 100}
107
+ expect(SupplejackApi::RequestLimitMailer).to receive(:at90percent).with(user) {@email}
108
+ user.check_daily_requests
109
+ end
110
+
111
+ it 'should not send an email if the user has past 90%' do
112
+ user.attributes = {daily_requests: 90, updated_at: Time.now, max_requests: 100}
113
+ expect(SupplejackApi::RequestLimitMailer).to_not receive(:at90percent).with(user) {@email}
114
+ user.check_daily_requests
115
+ end
116
+
117
+ it 'should send an email if the user has reached 100%' do
118
+ expect(@email).to receive(:deliver)
119
+ user.attributes = {daily_requests: 99, updated_at: Time.now, max_requests: 100}
120
+ expect(SupplejackApi::RequestLimitMailer).to receive(:at100percent).with(user) {@email}
121
+ user.check_daily_requests
122
+ end
123
+
124
+ it 'should not send an email when the user has past 100%' do
125
+ user.attributes = {daily_requests: 100, updated_at: Time.now, max_requests: 100}
126
+ expect(SupplejackApi::RequestLimitMailer).to_not receive(:at100percent).with(user) {@email}
127
+ user.check_daily_requests
128
+ end
129
+ end
130
+ end
131
+
132
+ describe '#increment_daily_requests' do
133
+ it 'should increment daily_requests by 1' do
134
+ user.attributes = { updated_at: Time.now, daily_requests: 100 }
135
+ user.increment_daily_requests
136
+ expect(user.daily_requests).to eq 101
137
+ end
138
+
139
+ it 'increments daily requests when is nil' do
140
+ user.attributes = { updated_at: Time.now, daily_requests: nil }
141
+ user.increment_daily_requests
142
+ expect(user.daily_requests).to eq 1
143
+ end
144
+ end
145
+
146
+ describe '#update_daily_activity' do
147
+ let(:request) { double(:request, params: { action: ', controller: ' }).as_null_object }
148
+
149
+ it 'sets the daily_activity_stored flag to false' do
150
+ allow(request).to receive(:params) { { action: 'index', controller: 'records' } }
151
+ user.update_daily_activity(request)
152
+ expect(user.daily_activity_stored).to be_falsey
153
+ end
154
+
155
+ context 'records and search requests' do
156
+ it 'updates the search requests' do
157
+ allow(request).to receive(:params) { { action: 'index', controller: 'records' } }
158
+ user.update_daily_activity(request)
159
+ expect(user.daily_activity['search']['records']).to eq 1
160
+ end
161
+
162
+ it 'increases the amount of requests for the day' do
163
+ allow(request).to receive(:params) { {action: 'index', controller: 'records'} }
164
+ user.update_daily_activity(request)
165
+ expect(user.daily_activity['search']['records']).to eq 1
166
+
167
+ user.update_daily_activity(request)
168
+ expect(user.daily_activity['search']['records']).to eq 2
169
+ end
170
+
171
+ it 'updates the requests for the record details' do
172
+ allow(request).to receive(:params) { {action: 'show', controller: 'records'} }
173
+ user.update_daily_activity(request)
174
+ expect(user.daily_activity['records']['show']).to eq 1
175
+ end
176
+
177
+ it 'updates the requests for multiple records' do
178
+ allow(request).to receive(:params) { {action: 'multiple', controller: 'records'} }
179
+ user.update_daily_activity(request)
180
+ expect(user.daily_activity['records']['multiple']).to eq 1
181
+ end
182
+
183
+ it 'updates the requests for the source redirect' do
184
+ allow(request).to receive(:params) { {action: 'source', controller: 'records'} }
185
+ user.update_daily_activity(request)
186
+ expect(user.daily_activity['records']['source']).to eq 1
187
+ end
188
+
189
+ it 'updates the requests for search through a custom search' do
190
+ allow(request).to receive(:params) { {action: 'records', controller: 'custom_searches'} }
191
+ user.update_daily_activity(request)
192
+ expect(user.daily_activity['search']['custom_search']).to eq 1
193
+ end
194
+ end
195
+ end
196
+
197
+ describe '#reset_daily_activity' do
198
+ it 'nullifies the daily_activity' do
199
+ user.reset_daily_activity
200
+ expect(user.daily_activity).to be_nil
201
+ end
202
+
203
+ it 'sets the daily_activity_stored flag to true' do
204
+ user.daily_activity_stored = false
205
+ user.reset_daily_activity
206
+ expect(user.daily_activity_stored).to be_truthy
207
+ end
208
+
209
+ it 'resets the daily requests count' do
210
+ user.daily_requests = 100
211
+ user.reset_daily_activity
212
+ expect(user.daily_requests).to eq 0
213
+ end
214
+ end
215
+
216
+ describe '#over_limit?' do
217
+ context 'user was updated today' do
218
+ before(:each) do
219
+ user.updated_at = Time.now
220
+ end
221
+
222
+ it 'should return true when daily requests is greater than max requests' do
223
+ user.attributes = {daily_requests: 100, max_requests: 99}
224
+ expect(user.over_limit?).to be_truthy
225
+ end
226
+
227
+ it 'should return false when daily requests is less than max requests' do
228
+ user.attributes = {daily_requests: 100, max_requests: 110}
229
+ expect(user.over_limit?).to be_falsey
230
+ end
231
+ end
232
+
233
+ context "user wasn't updated today" do
234
+ it 'should always return false' do
235
+ user.attributes = {updated_at: Time.now-1.day, daily_requests: 100, max_requests: 99}
236
+ expect(user.over_limit?).to be_falsey
237
+ end
238
+ end
239
+ end
240
+
241
+ describe '#calculate_last_30_days_requests' do
242
+ let!(:user) { FactoryGirl.create(:user) }
243
+ let!(:user_activity) { FactoryGirl.create(:user_activity, user_id: user.id, total: 5, created_at: Time.now) }
244
+
245
+ it 'adds up the totals of the last 30 days' do
246
+ FactoryGirl.create(:user_activity, user_id: user.id, total: 2, created_at: Time.now - 5.days)
247
+ expect(user.calculate_last_30_days_requests).to eq 7
248
+ end
249
+
250
+ it 'ignores requests older than 30 days' do
251
+ FactoryGirl.create(:user_activity, user_id: user.id, total: 2, created_at: Time.now - 31.days)
252
+ expect(user.calculate_last_30_days_requests).to eq 5
253
+ end
254
+
255
+ it 'stores the requests in monthly_requests field' do
256
+ user.calculate_last_30_days_requests
257
+ expect(user.monthly_requests).to eq 5
258
+ end
259
+ end
260
+
261
+ describe '#requests_per_day' do
262
+ let!(:user) { FactoryGirl.create(:user) }
263
+
264
+ before do
265
+ FactoryGirl.create(:user_activity, user_id: user.id, total: 5, created_at: Time.now - 1.day)
266
+ FactoryGirl.create(:user_activity, user_id: user.id, total: 2, created_at: Time.now)
267
+ end
268
+
269
+ it 'returns an array with the total requests per day' do
270
+ expect(user.requests_per_day(2)).to eq [5, 2]
271
+ end
272
+
273
+ it "returns 0 for days when there isn't any activity" do
274
+ FactoryGirl.create(:user_activity, user_id: user.id, total: 1, created_at: Time.now - 3.day)
275
+ expect(user.requests_per_day(4)).to eq [1, 0, 5, 2]
276
+ end
277
+ end
278
+
279
+ describe '#name_or_user' do
280
+ it 'should return the name' do
281
+ user.name = 'Federico'
282
+ expect(user.name_or_user).to eq('Federico')
283
+ end
284
+
285
+ it 'should return the username' do
286
+ user.name = ''
287
+ user.username = 'fedegl'
288
+ expect(user.name_or_user).to eq('fedegl')
289
+ end
290
+
291
+ it 'should return the first part of the email address from name if email' do
292
+ user.name = 'chris.mcdowall@dia.govt.nz'
293
+ expect(user.name_or_user).to eq('chris.mcdowall')
294
+ end
295
+
296
+ it 'should return the first part of the email address from username if email' do
297
+ user.name = ''
298
+ user.username = 'chris.mcdowall@dia.govt.nz'
299
+ expect(user.name_or_user).to eq('chris.mcdowall')
300
+ end
301
+ end
302
+
303
+ describe '#find_by_api_key' do
304
+ it 'searches for a user by its api key' do
305
+ expect(User).to receive(:where).with(authentication_token: '1234').and_return([double(:record)])
306
+ User.find_by_api_key('1234')
307
+ end
308
+
309
+ it 'returns nil when user not found' do
310
+ allow(User).to receive(:where).and_return([])
311
+ expect(User.find_by_api_key('1234')).to be_nil
312
+ end
313
+ end
314
+
315
+ describe '#custom_find' do
316
+ let(:user) { FactoryGirl.create(:user) }
317
+
318
+ it 'finds the user by the api_key' do
319
+ expect(User.custom_find(user.api_key)).to eq user
320
+ end
321
+
322
+ it 'should raise a error when a record is not found' do
323
+ expect { User.custom_find('sfsdfsdf') }.to raise_error(Mongoid::Errors::DocumentNotFound)
324
+ end
325
+
326
+ it 'finds the user by the id' do
327
+ expect(User.custom_find(user.id)).to eq user
328
+ end
329
+ end
330
+
331
+ describe "can_change_featured_sets?" do
332
+ context "admin user" do
333
+ before { user.role = 'admin' }
334
+
335
+ it "should return true" do
336
+ expect(user.can_change_featured_sets?).to be_truthy
337
+ end
338
+ end
339
+
340
+ context "user" do
341
+ it "should return false" do
342
+ expect(user.can_change_featured_sets?).to be_falsey
343
+ end
344
+ end
345
+ end
346
+
347
+ end
348
+ 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 'Concepts route', type: :routing do
12
+ routes { SupplejackApi::Engine.routes }
13
+
14
+ it 'routes /concepts/1.format to concepts#index' do
15
+ expect(get '/concepts/1.json').to route_to(controller: 'supplejack_api/concepts', action: 'show', id: '1', format: 'json', version: nil)
16
+ end
17
+
18
+ it 'routes /concepts/1/records.format to records#index' do
19
+ expect(get '/concepts/1/records.json').to route_to(controller: 'supplejack_api/records', action: 'index', concept_id: '1', format: 'json', version: nil)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,66 @@
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 HarvesterConstraint do
12
+ let(:constraint) { HarvesterConstraint.new }
13
+
14
+ describe "#forwarded_ips" do
15
+ it "returns a single ip address in the X-FORWARDED-FOR header" do
16
+ request = double(:request, :env => {"HTTP_X_FORWARDED_FOR" => "192.122.171.246"})
17
+ expect(constraint.forwarded_ips(request)).to eq ["192.122.171.246"]
18
+ end
19
+
20
+ it "returns multiple ip addresses in the X-FORWARDED-FOR header" do
21
+ request = double(:request, :env => {"HTTP_X_FORWARDED_FOR" => "192.122.171.246, 192.122.171.234"})
22
+ expect(constraint.forwarded_ips(request)).to eq ["192.122.171.246", "192.122.171.234"]
23
+ end
24
+
25
+ it "returns multiple ip addresses in the X-FORWARDED-FOR header without spaces" do
26
+ request = double(:request, :env => {"HTTP_X_FORWARDED_FOR" => "192.122.171.246,192.122.171.234"})
27
+ expect(constraint.forwarded_ips(request)).to eq ["192.122.171.246", "192.122.171.234"]
28
+ end
29
+ end
30
+
31
+ describe "#matches?" do
32
+ context "forwarded_ips is empty" do
33
+ it "returns true when the remote_ip is one of the allowed ips" do
34
+ request = double(:request, :env => {"HTTP_X_FORWARDED_FOR" => nil}, :remote_ip => "127.0.0.1")
35
+ expect(constraint.matches?(request)).to be_truthy
36
+ end
37
+
38
+ it "returns false when the remote_ip is not allowed" do
39
+ request = double(:request, :env => {"HTTP_X_FORWARDED_FOR" => nil}, :remote_ip => "192.1.1.1")
40
+ expect(constraint.matches?(request)).to be_falsey
41
+ end
42
+ end
43
+
44
+ context "with some forwarded_ips" do
45
+ it "returns true when the remote_ip and the forwarded_ips are allowed" do
46
+ request = double(:request, :env => {"HTTP_X_FORWARDED_FOR" => "192.1.1.0"}, :remote_ip => "193.1.1.0")
47
+ constraint.instance_variable_set("@ips", ["192.1.1.0", "193.1.1.0"])
48
+ expect(constraint.matches?(request)).to be_truthy
49
+ end
50
+
51
+ it "returns false when the remote_ip is not allowed" do
52
+ request = double(:request, :env => {"HTTP_X_FORWARDED_FOR" => "192.1.1.0"}, :remote_ip => "222.1.1.0")
53
+ constraint.instance_variable_set("@ips", ["192.1.1.0", "193.1.1.0"])
54
+ expect(constraint.matches?(request)).to be_falsey
55
+ end
56
+
57
+ it "returns false when any of the forwarded_ips are not allowed" do
58
+ request = double(:request, :env => {"HTTP_X_FORWARDED_FOR" => "192.1.1.0, 222.1.1.0"}, :remote_ip => "193.1.1.0")
59
+ constraint.instance_variable_set("@ips", ["192.1.1.0", "193.1.1.0", "194.1.1.0"])
60
+ expect(constraint.matches?(request)).to be_falsey
61
+ end
62
+
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,51 @@
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 "Harvester routes", :type => :routing do
12
+ routes { SupplejackApi::Engine.routes }
13
+
14
+ before(:each) do
15
+ allow_any_instance_of(HarvesterConstraint).to receive(:matches?).and_return(true)
16
+ end
17
+
18
+ context "Record routes" do
19
+ it "routes /harvester/records to harvester/records#create" do
20
+ expect(post('/harvester/records.json')).to route_to(controller: 'supplejack_api/harvester/records', action: 'create', format: 'json')
21
+ end
22
+
23
+ it "routes /harvester/records/1 to harvester/records#show" do
24
+ expect(get('/harvester/records/1.json')).to route_to(controller: 'supplejack_api/harvester/records', action: 'show', id: '1', format: 'json')
25
+ end
26
+
27
+ it "routes /harvester/records/1 to harvester/records#update" do
28
+ expect(put('/harvester/records/1.json')).to route_to(controller: 'supplejack_api/harvester/records', action: 'update', id: '1', format: 'json')
29
+ end
30
+
31
+ it "routes /harvester/records/flush to harvester/records#flush" do
32
+ expect(post('/harvester/records/flush')).to route_to('supplejack_api/harvester/records#flush')
33
+ end
34
+
35
+ it "routes /harvester/records/abc123 to harvester/records#delete" do
36
+ expect(put('/harvester/records/delete')).to route_to('supplejack_api/harvester/records#delete')
37
+ end
38
+ end
39
+
40
+ context "Fragment routes" do
41
+ it "routes /harvester/records/1/fragments.json to harvester/fragments#create" do
42
+ expect(post('/harvester/records/1/fragments.json')).to route_to('supplejack_api/harvester/fragments#create', record_id: '1', format: 'json')
43
+ end
44
+
45
+ it "routes /harvester/fragments/1.json to harvester/fragments#destroy" do
46
+ expect(delete('/harvester/fragments/1.json')).to route_to('supplejack_api/harvester/fragments#destroy', id: '1', format: 'json')
47
+ end
48
+ end
49
+
50
+ end
51
+ end