newspaper_works 0.1.0

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 (461) hide show
  1. checksums.yaml +7 -0
  2. data/.fcrepo_wrapper +4 -0
  3. data/.gitignore +43 -0
  4. data/.rubocop.yml +143 -0
  5. data/.solr_wrapper +8 -0
  6. data/.travis.yml +50 -0
  7. data/Gemfile +47 -0
  8. data/LICENSE +203 -0
  9. data/README.md +159 -0
  10. data/Rakefile +38 -0
  11. data/app/actors/hyrax/actors/newspaper_article_actor.rb +8 -0
  12. data/app/actors/hyrax/actors/newspaper_container_actor.rb +8 -0
  13. data/app/actors/hyrax/actors/newspaper_issue_actor.rb +8 -0
  14. data/app/actors/hyrax/actors/newspaper_page_actor.rb +8 -0
  15. data/app/actors/hyrax/actors/newspaper_title_actor.rb +8 -0
  16. data/app/actors/newspaper_works/actors/newspaper_works_upload_actor.rb +88 -0
  17. data/app/assets/config/newspaper_works_manifest.js +2 -0
  18. data/app/assets/images/newspaper_works/.keep +0 -0
  19. data/app/assets/javascripts/newspaper_works/autocomplete_fix.js +33 -0
  20. data/app/assets/javascripts/newspaper_works/ocr_search.js.erb +6 -0
  21. data/app/assets/javascripts/newspaper_works/thumbnail_highlights.js.erb +102 -0
  22. data/app/assets/javascripts/newspaper_works.js +4 -0
  23. data/app/assets/stylesheets/newspaper_works/_issue_search.scss +13 -0
  24. data/app/assets/stylesheets/newspaper_works/_issues_calendar.scss +18 -0
  25. data/app/assets/stylesheets/newspaper_works/_newspaper_works.scss +4 -0
  26. data/app/assets/stylesheets/newspaper_works/_newspapers_search.scss +38 -0
  27. data/app/assets/stylesheets/newspaper_works/_search_results.scss +12 -0
  28. data/app/controllers/hyrax/newspaper_articles_controller.rb +14 -0
  29. data/app/controllers/hyrax/newspaper_containers_controller.rb +14 -0
  30. data/app/controllers/hyrax/newspaper_issues_controller.rb +14 -0
  31. data/app/controllers/hyrax/newspaper_pages_controller.rb +14 -0
  32. data/app/controllers/hyrax/newspaper_titles_controller.rb +13 -0
  33. data/app/controllers/newspaper_works/newspapers_controller.rb +117 -0
  34. data/app/controllers/newspaper_works/newspapers_search_controller.rb +26 -0
  35. data/app/forms/hyrax/newspaper_article_form.rb +11 -0
  36. data/app/forms/hyrax/newspaper_container_form.rb +11 -0
  37. data/app/forms/hyrax/newspaper_issue_form.rb +11 -0
  38. data/app/forms/hyrax/newspaper_page_form.rb +15 -0
  39. data/app/forms/hyrax/newspaper_title_form.rb +12 -0
  40. data/app/forms/newspaper_works/newspaper_core_form_data.rb +17 -0
  41. data/app/helpers/hyrax/newspaper_articles_helper.rb +5 -0
  42. data/app/helpers/hyrax/newspaper_containers_helper.rb +5 -0
  43. data/app/helpers/hyrax/newspaper_issues_helper.rb +5 -0
  44. data/app/helpers/hyrax/newspaper_pages_helper.rb +5 -0
  45. data/app/helpers/newspaper_works/application_helper.rb +5 -0
  46. data/app/helpers/newspaper_works/breadcrumb_helper.rb +92 -0
  47. data/app/helpers/newspaper_works/newspaper_works_helper_behavior.rb +103 -0
  48. data/app/helpers/newspaper_works/newspapers_helper.rb +5 -0
  49. data/app/indexers/concerns/newspaper_works/indexes_full_text.rb +17 -0
  50. data/app/indexers/concerns/newspaper_works/indexes_place_of_publication.rb +67 -0
  51. data/app/indexers/concerns/newspaper_works/indexes_publication_date_range.rb +35 -0
  52. data/app/indexers/concerns/newspaper_works/indexes_relationships.rb +125 -0
  53. data/app/indexers/newspaper_article_indexer.rb +16 -0
  54. data/app/indexers/newspaper_container_indexer.rb +18 -0
  55. data/app/indexers/newspaper_issue_indexer.rb +26 -0
  56. data/app/indexers/newspaper_page_indexer.rb +9 -0
  57. data/app/indexers/newspaper_title_indexer.rb +19 -0
  58. data/app/indexers/newspaper_works/newspaper_core_indexer.rb +21 -0
  59. data/app/jobs/newspaper_works/application_job.rb +4 -0
  60. data/app/jobs/newspaper_works/compose_issue_pdf_job.rb +13 -0
  61. data/app/jobs/newspaper_works/create_issue_pages_job.rb +19 -0
  62. data/app/mailers/newspaper_works/application_mailer.rb +8 -0
  63. data/app/models/concerns/newspaper_works/blacklight_iiif_search/annotation_behavior.rb +82 -0
  64. data/app/models/concerns/newspaper_works/blacklight_iiif_search/search_behavior.rb +27 -0
  65. data/app/models/concerns/newspaper_works/newspaper_core_metadata.rb +67 -0
  66. data/app/models/concerns/newspaper_works/place_of_publication_behavior.rb +15 -0
  67. data/app/models/concerns/newspaper_works/scanned_media_metadata.rb +43 -0
  68. data/app/models/concerns/newspaper_works/solr/document.rb +25 -0
  69. data/app/models/file_set.rb +10 -0
  70. data/app/models/newspaper_article.rb +158 -0
  71. data/app/models/newspaper_container.rb +86 -0
  72. data/app/models/newspaper_issue.rb +115 -0
  73. data/app/models/newspaper_page.rb +70 -0
  74. data/app/models/newspaper_title.rb +111 -0
  75. data/app/models/newspaper_works/application_record.rb +6 -0
  76. data/app/models/newspaper_works/derivative_attachment.rb +8 -0
  77. data/app/models/newspaper_works/ingest_file_relation.rb +14 -0
  78. data/app/presenters/hyrax/newspaper_article_presenter.rb +38 -0
  79. data/app/presenters/hyrax/newspaper_container_presenter.rb +11 -0
  80. data/app/presenters/hyrax/newspaper_issue_presenter.rb +62 -0
  81. data/app/presenters/hyrax/newspaper_page_presenter.rb +72 -0
  82. data/app/presenters/hyrax/newspaper_title_presenter.rb +86 -0
  83. data/app/presenters/newspaper_works/iiif_manifest_presenter_behavior.rb +29 -0
  84. data/app/presenters/newspaper_works/issue_info_presenter.rb +29 -0
  85. data/app/presenters/newspaper_works/newspaper_core_presenter.rb +9 -0
  86. data/app/presenters/newspaper_works/persistent_url_presenter_behavior.rb +16 -0
  87. data/app/presenters/newspaper_works/place_of_publication_presenter_behavior.rb +8 -0
  88. data/app/presenters/newspaper_works/scanned_media_presenter.rb +7 -0
  89. data/app/presenters/newspaper_works/title_info_presenter.rb +13 -0
  90. data/app/search_builders/concerns/newspaper_works/exclude_models.rb +16 -0
  91. data/app/search_builders/concerns/newspaper_works/highlight_search_params.rb +14 -0
  92. data/app/search_builders/newspaper_works/newspapers_search_builder.rb +26 -0
  93. data/app/services/hyrax/article_genre_service.rb +9 -0
  94. data/app/services/newspaper_works/jp2_derivative_service.rb +120 -0
  95. data/app/services/newspaper_works/newspaper_page_derivative_service.rb +91 -0
  96. data/app/services/newspaper_works/pdf_derivative_service.rb +45 -0
  97. data/app/services/newspaper_works/pluggable_derivative_service.rb +114 -0
  98. data/app/services/newspaper_works/text_extraction_derivative_service.rb +56 -0
  99. data/app/services/newspaper_works/text_formats_from_alto_service.rb +77 -0
  100. data/app/services/newspaper_works/tiff_derivative_service.rb +54 -0
  101. data/app/validators/newspaper_works/publication_date_start_end_validator.rb +48 -0
  102. data/app/validators/newspaper_works/publication_date_validator.rb +16 -0
  103. data/app/views/catalog/_index_gallery_newspaper_article_wrapper.html.erb +9 -0
  104. data/app/views/catalog/_index_gallery_newspaper_page_wrapper.html.erb +9 -0
  105. data/app/views/catalog/_index_header_gallery_newspaper_article.html.erb +23 -0
  106. data/app/views/catalog/_index_header_gallery_newspaper_page.html.erb +23 -0
  107. data/app/views/catalog/_index_header_list_newspaper_article.html.erb +7 -0
  108. data/app/views/catalog/_index_header_list_newspaper_page.html.erb +7 -0
  109. data/app/views/catalog/_snippets_more.html.erb +16 -0
  110. data/app/views/catalog/_thumbnail_list_newspaper_article.html.erb +6 -0
  111. data/app/views/catalog/_thumbnail_list_newspaper_page.html.erb +6 -0
  112. data/app/views/hyrax/file_sets/_actions.html.erb +45 -0
  113. data/app/views/hyrax/newspaper_articles/_newspaper_article.html.erb +2 -0
  114. data/app/views/hyrax/newspaper_articles/show.html.erb +1 -0
  115. data/app/views/hyrax/newspaper_containers/_newspaper_container.html.erb +2 -0
  116. data/app/views/hyrax/newspaper_containers/show.html.erb +1 -0
  117. data/app/views/hyrax/newspaper_issues/_newspaper_issue.html.erb +2 -0
  118. data/app/views/hyrax/newspaper_issues/show.html.erb +1 -0
  119. data/app/views/hyrax/newspaper_pages/_newspaper_page.html.erb +2 -0
  120. data/app/views/hyrax/newspaper_pages/show.html.erb +1 -0
  121. data/app/views/hyrax/newspaper_titles/_all_front_pages_form.html.erb +5 -0
  122. data/app/views/hyrax/newspaper_titles/_issue_search_form.html.erb +33 -0
  123. data/app/views/hyrax/newspaper_titles/_issues_calendar.html.erb +63 -0
  124. data/app/views/hyrax/newspaper_titles/_newspaper_title.html.erb +2 -0
  125. data/app/views/hyrax/newspaper_titles/show.html.erb +54 -0
  126. data/app/views/newspaper_works/base/_attribute_rows.html.erb +42 -0
  127. data/app/views/newspaper_works/base/_attributes.html.erb +16 -0
  128. data/app/views/newspaper_works/base/_metadata.html.erb +6 -0
  129. data/app/views/newspaper_works/base/_newspaper_hierarchy.html.erb +14 -0
  130. data/app/views/newspaper_works/base/_persistent_url.html.erb +1 -0
  131. data/app/views/newspaper_works/base/_show.html.erb +45 -0
  132. data/app/views/newspaper_works/newspapers_search/_date_fields.html.erb +29 -0
  133. data/app/views/newspaper_works/newspapers_search/_facet_layout.html.erb +8 -0
  134. data/app/views/newspaper_works/newspapers_search/_facet_limit.html.erb +17 -0
  135. data/app/views/newspaper_works/newspapers_search/_front_pages_input.html.erb +5 -0
  136. data/app/views/newspaper_works/newspapers_search/_keyword_input.html.erb +18 -0
  137. data/app/views/newspaper_works/newspapers_search/_newspapers_facets.html.erb +5 -0
  138. data/app/views/newspaper_works/newspapers_search/_newspapers_search_form.html.erb +13 -0
  139. data/app/views/newspaper_works/newspapers_search/_newspapers_search_help.html.erb +8 -0
  140. data/app/views/newspaper_works/newspapers_search/search.html.erb +13 -0
  141. data/app/views/records/edit_fields/_alternate_title.html.erb +4 -0
  142. data/app/views/records/edit_fields/_genre.html.erb +4 -0
  143. data/app/views/records/edit_fields/_place_of_publication.html.erb +14 -0
  144. data/app/views/records/edit_fields/_subtitle.html.erb +4 -0
  145. data/bin/rails +13 -0
  146. data/config/fcrepo_wrapper_test.yml +5 -0
  147. data/config/initializers/assets.rb +2 -0
  148. data/config/locales/newspaper_article.de.yml +12 -0
  149. data/config/locales/newspaper_article.en.yml +12 -0
  150. data/config/locales/newspaper_article.es.yml +12 -0
  151. data/config/locales/newspaper_article.fr.yml +12 -0
  152. data/config/locales/newspaper_article.it.yml +12 -0
  153. data/config/locales/newspaper_article.pt-BR.yml +12 -0
  154. data/config/locales/newspaper_article.zh.yml +12 -0
  155. data/config/locales/newspaper_container.de.yml +8 -0
  156. data/config/locales/newspaper_container.en.yml +8 -0
  157. data/config/locales/newspaper_container.es.yml +8 -0
  158. data/config/locales/newspaper_container.fr.yml +8 -0
  159. data/config/locales/newspaper_container.it.yml +8 -0
  160. data/config/locales/newspaper_container.pt-BR.yml +8 -0
  161. data/config/locales/newspaper_container.zh.yml +8 -0
  162. data/config/locales/newspaper_issue.de.yml +8 -0
  163. data/config/locales/newspaper_issue.en.yml +8 -0
  164. data/config/locales/newspaper_issue.es.yml +8 -0
  165. data/config/locales/newspaper_issue.fr.yml +8 -0
  166. data/config/locales/newspaper_issue.it.yml +8 -0
  167. data/config/locales/newspaper_issue.pt-BR.yml +8 -0
  168. data/config/locales/newspaper_issue.zh.yml +8 -0
  169. data/config/locales/newspaper_page.de.yml +15 -0
  170. data/config/locales/newspaper_page.en.yml +15 -0
  171. data/config/locales/newspaper_page.es.yml +15 -0
  172. data/config/locales/newspaper_page.fr.yml +15 -0
  173. data/config/locales/newspaper_page.it.yml +15 -0
  174. data/config/locales/newspaper_page.pt-BR.yml +15 -0
  175. data/config/locales/newspaper_page.zh.yml +15 -0
  176. data/config/locales/newspaper_title.de.yml +8 -0
  177. data/config/locales/newspaper_title.en.yml +8 -0
  178. data/config/locales/newspaper_title.es.yml +8 -0
  179. data/config/locales/newspaper_title.fr.yml +8 -0
  180. data/config/locales/newspaper_title.it.yml +8 -0
  181. data/config/locales/newspaper_title.pt-BR.yml +8 -0
  182. data/config/locales/newspaper_title.zh.yml +8 -0
  183. data/config/locales/newspaper_works.de.yml +50 -0
  184. data/config/locales/newspaper_works.en.yml +52 -0
  185. data/config/locales/newspaper_works.es.yml +52 -0
  186. data/config/locales/newspaper_works.fr.yml +52 -0
  187. data/config/locales/newspaper_works.it.yml +52 -0
  188. data/config/locales/newspaper_works.pt-BR.yml +52 -0
  189. data/config/locales/newspaper_works.zh.yml +52 -0
  190. data/config/routes.rb +9 -0
  191. data/config/solr_wrapper_test.yml +9 -0
  192. data/config/test-fixture/solr-config/_rest_managed.json +3 -0
  193. data/config/test-fixture/solr-config/admin-extra.html +31 -0
  194. data/config/test-fixture/solr-config/elevate.xml +36 -0
  195. data/config/test-fixture/solr-config/mapping-ISOLatin1Accent.txt +246 -0
  196. data/config/test-fixture/solr-config/protwords.txt +21 -0
  197. data/config/test-fixture/solr-config/schema.xml +366 -0
  198. data/config/test-fixture/solr-config/scripts.conf +24 -0
  199. data/config/test-fixture/solr-config/solrconfig.xml +322 -0
  200. data/config/test-fixture/solr-config/spellings.txt +2 -0
  201. data/config/test-fixture/solr-config/stopwords.txt +58 -0
  202. data/config/test-fixture/solr-config/stopwords_en.txt +58 -0
  203. data/config/test-fixture/solr-config/synonyms.txt +31 -0
  204. data/config/test-fixture/solr-config/xslt/example.xsl +132 -0
  205. data/config/test-fixture/solr-config/xslt/example_atom.xsl +67 -0
  206. data/config/test-fixture/solr-config/xslt/example_rss.xsl +66 -0
  207. data/config/test-fixture/solr-config/xslt/luke.xsl +337 -0
  208. data/config/vendor/imagemagick-6-policy.xml +76 -0
  209. data/db/migrate/20181214181358_create_newspaper_works_derivative_attachments.rb +12 -0
  210. data/db/migrate/20190107165909_create_newspaper_works_ingest_file_relations.rb +11 -0
  211. data/lib/generators/newspaper_works/assets_generator.rb +29 -0
  212. data/lib/generators/newspaper_works/blacklight_advanced_search_generator.rb +44 -0
  213. data/lib/generators/newspaper_works/blacklight_iiif_search_generator.rb +41 -0
  214. data/lib/generators/newspaper_works/catalog_controller_generator.rb +60 -0
  215. data/lib/generators/newspaper_works/install_generator.rb +97 -0
  216. data/lib/generators/newspaper_works/templates/annotation_behavior.rb +6 -0
  217. data/lib/generators/newspaper_works/templates/config/authorities/newspaper_article_genres.yml +86 -0
  218. data/lib/generators/newspaper_works/templates/config/initializers/newspaper_works.rb +12 -0
  219. data/lib/generators/newspaper_works/templates/config/initializers/patch_blacklight_advanced_search.rb +74 -0
  220. data/lib/generators/newspaper_works/templates/custom_search_builder.rb +23 -0
  221. data/lib/generators/newspaper_works/templates/newspaper_works.scss +1 -0
  222. data/lib/generators/newspaper_works/templates/newspaper_works_helper.rb +3 -0
  223. data/lib/generators/newspaper_works/templates/search_behavior.rb +6 -0
  224. data/lib/newspaper_works/configuration.rb +14 -0
  225. data/lib/newspaper_works/data/fileset_helper.rb +25 -0
  226. data/lib/newspaper_works/data/path_helper.rb +40 -0
  227. data/lib/newspaper_works/data/work_derivatives.rb +314 -0
  228. data/lib/newspaper_works/data/work_file.rb +92 -0
  229. data/lib/newspaper_works/data/work_files.rb +181 -0
  230. data/lib/newspaper_works/data.rb +35 -0
  231. data/lib/newspaper_works/engine.rb +42 -0
  232. data/lib/newspaper_works/errors.rb +14 -0
  233. data/lib/newspaper_works/ingest/base_ingest.rb +69 -0
  234. data/lib/newspaper_works/ingest/base_publication_info.rb +35 -0
  235. data/lib/newspaper_works/ingest/batch_ingest_helper.rb +44 -0
  236. data/lib/newspaper_works/ingest/batch_issue_ingester.rb +129 -0
  237. data/lib/newspaper_works/ingest/chronam_publication_info.rb +133 -0
  238. data/lib/newspaper_works/ingest/from_command.rb +52 -0
  239. data/lib/newspaper_works/ingest/image_ingest_issues.rb +43 -0
  240. data/lib/newspaper_works/ingest/issue_images.rb +51 -0
  241. data/lib/newspaper_works/ingest/lc_publication_info.rb +144 -0
  242. data/lib/newspaper_works/ingest/named_issue_metadata.rb +60 -0
  243. data/lib/newspaper_works/ingest/ndnp/batch_ingester.rb +64 -0
  244. data/lib/newspaper_works/ingest/ndnp/batch_xml_ingest.rb +72 -0
  245. data/lib/newspaper_works/ingest/ndnp/container_ingest.rb +99 -0
  246. data/lib/newspaper_works/ingest/ndnp/container_ingester.rb +84 -0
  247. data/lib/newspaper_works/ingest/ndnp/container_metadata.rb +87 -0
  248. data/lib/newspaper_works/ingest/ndnp/issue_ingest.rb +81 -0
  249. data/lib/newspaper_works/ingest/ndnp/issue_ingester.rb +101 -0
  250. data/lib/newspaper_works/ingest/ndnp/issue_metadata.rb +96 -0
  251. data/lib/newspaper_works/ingest/ndnp/ndnp_asset_helper.rb +20 -0
  252. data/lib/newspaper_works/ingest/ndnp/ndnp_mets_helper.rb +70 -0
  253. data/lib/newspaper_works/ingest/ndnp/page_ingest.rb +47 -0
  254. data/lib/newspaper_works/ingest/ndnp/page_ingester.rb +157 -0
  255. data/lib/newspaper_works/ingest/ndnp/page_metadata.rb +112 -0
  256. data/lib/newspaper_works/ingest/ndnp.rb +21 -0
  257. data/lib/newspaper_works/ingest/newspaper_issue_ingest.rb +56 -0
  258. data/lib/newspaper_works/ingest/newspaper_page_ingest.rb +6 -0
  259. data/lib/newspaper_works/ingest/page_image.rb +52 -0
  260. data/lib/newspaper_works/ingest/path_enumeration.rb +52 -0
  261. data/lib/newspaper_works/ingest/pdf_images.rb +85 -0
  262. data/lib/newspaper_works/ingest/pdf_issue.rb +20 -0
  263. data/lib/newspaper_works/ingest/pdf_issues.rb +39 -0
  264. data/lib/newspaper_works/ingest/pdf_pages.rb +114 -0
  265. data/lib/newspaper_works/ingest/pub_finder.rb +89 -0
  266. data/lib/newspaper_works/ingest/publication_info.rb +44 -0
  267. data/lib/newspaper_works/ingest.rb +90 -0
  268. data/lib/newspaper_works/issue_pdf_composer.rb +111 -0
  269. data/lib/newspaper_works/logging.rb +54 -0
  270. data/lib/newspaper_works/page_finder.rb +62 -0
  271. data/lib/newspaper_works/resource_fetcher.rb +78 -0
  272. data/lib/newspaper_works/text_extraction/alto_reader.rb +122 -0
  273. data/lib/newspaper_works/text_extraction/page_ocr.rb +100 -0
  274. data/lib/newspaper_works/text_extraction/render_alto.rb +84 -0
  275. data/lib/newspaper_works/text_extraction/word_coords_builder.rb +30 -0
  276. data/lib/newspaper_works/text_extraction.rb +10 -0
  277. data/lib/newspaper_works/version.rb +3 -0
  278. data/lib/newspaper_works.rb +19 -0
  279. data/lib/tasks/newspaper_works_tasks.rake +39 -0
  280. data/newspaper_works.gemspec +49 -0
  281. data/spec/.keep.txt +1 -0
  282. data/spec/actors/newspaper_works/actors/newspaper_works_upload_actor_spec.rb +69 -0
  283. data/spec/controllers/catalog_controller_spec.rb +63 -0
  284. data/spec/controllers/newspaper_works/newspapers_controller_spec.rb +114 -0
  285. data/spec/controllers/newspaper_works/newspapers_search_controller_spec.rb +21 -0
  286. data/spec/factories/ability.rb +6 -0
  287. data/spec/factories/newspaper_issue.rb +7 -0
  288. data/spec/factories/newspaper_issue_ingest.rb +6 -0
  289. data/spec/factories/newspaper_page.rb +7 -0
  290. data/spec/factories/newspaper_page_ingest.rb +6 -0
  291. data/spec/factories/newspaper_page_solr_document.rb +12 -0
  292. data/spec/factories/newspaper_title.rb +8 -0
  293. data/spec/factories/uploaded_pdf_file.rb +9 -0
  294. data/spec/factories/user.rb +13 -0
  295. data/spec/features/front_pages_for_title_spec.rb +19 -0
  296. data/spec/features/newspaper_title_search_spec.rb +30 -0
  297. data/spec/features/newspapers_search_spec.rb +49 -0
  298. data/spec/features/search_results_thumbnail_highlights_spec.rb +33 -0
  299. data/spec/features_shared.rb +71 -0
  300. data/spec/fixtures/files/4.1.07.jp2 +0 -0
  301. data/spec/fixtures/files/4.1.07.tiff +0 -0
  302. data/spec/fixtures/files/README.md +7 -0
  303. data/spec/fixtures/files/alto-2-0.xsd +714 -0
  304. data/spec/fixtures/files/broken-truncated.pdf +0 -0
  305. data/spec/fixtures/files/credits.md +16 -0
  306. data/spec/fixtures/files/lowres-gray-via-ndnp-sample.tiff +0 -0
  307. data/spec/fixtures/files/minimal-1-page.pdf +0 -0
  308. data/spec/fixtures/files/minimal-2-page.pdf +0 -0
  309. data/spec/fixtures/files/minimal-alto.xml +31 -0
  310. data/spec/fixtures/files/ndnp-alto-sample.xml +24 -0
  311. data/spec/fixtures/files/ndnp-sample1-json.json +1 -0
  312. data/spec/fixtures/files/ndnp-sample1-txt.txt +1 -0
  313. data/spec/fixtures/files/ndnp-sample1.pdf +0 -0
  314. data/spec/fixtures/files/ocr_alto.xml +202 -0
  315. data/spec/fixtures/files/ocr_alto_scaled_4pts_per_px.xml +202 -0
  316. data/spec/fixtures/files/ocr_color.tiff +0 -0
  317. data/spec/fixtures/files/ocr_gray.jp2 +0 -0
  318. data/spec/fixtures/files/ocr_gray.tiff +0 -0
  319. data/spec/fixtures/files/ocr_mono.tiff +0 -0
  320. data/spec/fixtures/files/page1.tiff +0 -0
  321. data/spec/fixtures/files/resource_mocks/chronam/http404-expected +0 -0
  322. data/spec/fixtures/files/resource_mocks/chronam/sn84038814.rdf +1028 -0
  323. data/spec/fixtures/files/resource_mocks/chronam/sn93059126.rdf +36 -0
  324. data/spec/fixtures/files/resource_mocks/chronam/sn94051019.rdf +37 -0
  325. data/spec/fixtures/files/resource_mocks/geonames/Chicopee +1104 -0
  326. data/spec/fixtures/files/resource_mocks/geonames/Denver +1104 -0
  327. data/spec/fixtures/files/resource_mocks/geonames/Marysville +279 -0
  328. data/spec/fixtures/files/resource_mocks/geonames/Marysville2 +279 -0
  329. data/spec/fixtures/files/resource_mocks/geonames/SLC +1104 -0
  330. data/spec/fixtures/files/resource_mocks/lccn/sn2099999999 +1 -0
  331. data/spec/fixtures/files/resource_mocks/lccn/sn82014496 +2 -0
  332. data/spec/fixtures/files/resource_mocks/lccn/sn83020109 +1 -0
  333. data/spec/fixtures/files/resource_mocks/lccn/sn83021453 +2 -0
  334. data/spec/fixtures/files/resource_mocks/lccn/sn83045396 +2 -0
  335. data/spec/fixtures/files/resource_mocks/lccn/sn84038814 +2 -0
  336. data/spec/fixtures/files/resource_mocks/lccn/sn93059126 +1 -0
  337. data/spec/fixtures/files/resource_mocks/lccn/sn94051019 +1 -0
  338. data/spec/fixtures/files/resource_mocks/lccn/sn99999999 +1 -0
  339. data/spec/fixtures/files/resource_mocks/urls.json +82 -0
  340. data/spec/fixtures/files/sample-4page-issue.pdf +0 -0
  341. data/spec/fixtures/files/sample-color-newsletter.pdf +0 -0
  342. data/spec/fixtures/files/thumbnail.jpg +0 -0
  343. data/spec/forms/hyrax/newspaper_article_form_spec.rb +33 -0
  344. data/spec/forms/hyrax/newspaper_container_form_spec.rb +30 -0
  345. data/spec/forms/hyrax/newspaper_issue_form_spec.rb +31 -0
  346. data/spec/forms/hyrax/newspaper_page_form_spec.rb +28 -0
  347. data/spec/forms/hyrax/newspaper_title_form_spec.rb +31 -0
  348. data/spec/forms/newspaper_works/newspaper_core_form_data_spec.rb +12 -0
  349. data/spec/helpers/newspaper_works/breadcrumb_helper_spec.rb +82 -0
  350. data/spec/helpers/newspaper_works_helper_spec.rb +57 -0
  351. data/spec/indexers/concerns/newspaper_works/indexes_full_text_spec.rb +31 -0
  352. data/spec/indexers/concerns/newspaper_works/indexes_place_of_publication_spec.rb +53 -0
  353. data/spec/indexers/concerns/newspaper_works/indexes_publication_date_range_spec.rb +39 -0
  354. data/spec/indexers/concerns/newspaper_works/indexes_relationships_spec.rb +86 -0
  355. data/spec/indexers/newspaper_article_indexer_spec.rb +29 -0
  356. data/spec/indexers/newspaper_issue_indexer_spec.rb +19 -0
  357. data/spec/indexers/newspaper_title_indexer_spec.rb +22 -0
  358. data/spec/indexers/newspaper_works/newspaper_core_indexer_spec.rb +23 -0
  359. data/spec/lib/newspaper_works/configuration_spec.rb +18 -0
  360. data/spec/lib/newspaper_works/data/work_derivatives_spec.rb +245 -0
  361. data/spec/lib/newspaper_works/data/work_file_spec.rb +99 -0
  362. data/spec/lib/newspaper_works/data/work_files_spec.rb +224 -0
  363. data/spec/lib/newspaper_works/ingest/batch_issue_ingester_spec.rb +158 -0
  364. data/spec/lib/newspaper_works/ingest/chronam_publication_info_spec.rb +35 -0
  365. data/spec/lib/newspaper_works/ingest/from_command_spec.rb +75 -0
  366. data/spec/lib/newspaper_works/ingest/image_ingest_issues_spec.rb +62 -0
  367. data/spec/lib/newspaper_works/ingest/ingest_shared.rb +75 -0
  368. data/spec/lib/newspaper_works/ingest/issue_images_spec.rb +65 -0
  369. data/spec/lib/newspaper_works/ingest/lc_publication_info_spec.rb +34 -0
  370. data/spec/lib/newspaper_works/ingest/ndnp/batch_ingester_spec.rb +131 -0
  371. data/spec/lib/newspaper_works/ingest/ndnp/batch_xml_ingest_spec.rb +64 -0
  372. data/spec/lib/newspaper_works/ingest/ndnp/container_ingest_spec.rb +44 -0
  373. data/spec/lib/newspaper_works/ingest/ndnp/container_ingester_spec.rb +126 -0
  374. data/spec/lib/newspaper_works/ingest/ndnp/container_metadata_spec.rb +36 -0
  375. data/spec/lib/newspaper_works/ingest/ndnp/issue_ingest_spec.rb +108 -0
  376. data/spec/lib/newspaper_works/ingest/ndnp/issue_ingester_spec.rb +155 -0
  377. data/spec/lib/newspaper_works/ingest/ndnp/issue_metadata_spec.rb +84 -0
  378. data/spec/lib/newspaper_works/ingest/ndnp/page_ingest_spec.rb +79 -0
  379. data/spec/lib/newspaper_works/ingest/ndnp/page_ingester_spec.rb +184 -0
  380. data/spec/lib/newspaper_works/ingest/ndnp/page_metadata_spec.rb +85 -0
  381. data/spec/lib/newspaper_works/ingest/newspaper_issue_ingest_spec.rb +83 -0
  382. data/spec/lib/newspaper_works/ingest/newspaper_page_ingest_spec.rb +77 -0
  383. data/spec/lib/newspaper_works/ingest/page_image_spec.rb +29 -0
  384. data/spec/lib/newspaper_works/ingest/pdf_images_spec.rb +32 -0
  385. data/spec/lib/newspaper_works/ingest/pdf_issue_spec.rb +29 -0
  386. data/spec/lib/newspaper_works/ingest/pdf_issues_spec.rb +62 -0
  387. data/spec/lib/newspaper_works/ingest/pdf_pages_spec.rb +110 -0
  388. data/spec/lib/newspaper_works/ingest/pub_finder_spec.rb +58 -0
  389. data/spec/lib/newspaper_works/ingest/publication_info_spec.rb +61 -0
  390. data/spec/lib/newspaper_works/ingest_spec.rb +45 -0
  391. data/spec/lib/newspaper_works/issue_pdf_composer_spec.rb +101 -0
  392. data/spec/lib/newspaper_works/logging_spec.rb +53 -0
  393. data/spec/lib/newspaper_works/page_finder_spec.rb +53 -0
  394. data/spec/lib/newspaper_works/resource_fetcher_spec.rb +65 -0
  395. data/spec/lib/newspaper_works/text_extraction/alto_reader_spec.rb +49 -0
  396. data/spec/lib/newspaper_works/text_extraction/page_ocr_spec.rb +84 -0
  397. data/spec/lib/newspaper_works/text_extraction/render_alto_spec.rb +54 -0
  398. data/spec/lib/newspaper_works/text_extraction/word_coords_builder_spec.rb +30 -0
  399. data/spec/lib/tasks/newspaper_works_rake_spec.rb +124 -0
  400. data/spec/misc_shared.rb +109 -0
  401. data/spec/model_shared.rb +134 -0
  402. data/spec/models/concerns/newspaper_works/blacklight_iiif_search/annotation_behavior_spec.rb +45 -0
  403. data/spec/models/concerns/newspaper_works/blacklight_iiif_search/search_behavior_spec.rb +27 -0
  404. data/spec/models/concerns/newspaper_works/newspaper_core_metadata_spec.rb +45 -0
  405. data/spec/models/concerns/newspaper_works/place_of_publication_behavior_spec.rb +17 -0
  406. data/spec/models/concerns/newspaper_works/scanned_media_metadata_spec.rb +35 -0
  407. data/spec/models/newspaper_article_spec.rb +73 -0
  408. data/spec/models/newspaper_container_spec.rb +111 -0
  409. data/spec/models/newspaper_issue_spec.rb +91 -0
  410. data/spec/models/newspaper_page_spec.rb +44 -0
  411. data/spec/models/newspaper_title_spec.rb +116 -0
  412. data/spec/models/newspaper_works/derivative_attachment_spec.rb +37 -0
  413. data/spec/models/newspaper_works/ingest_file_relation_spec.rb +56 -0
  414. data/spec/models/solr_document_spec.rb +14 -0
  415. data/spec/ndnp_shared.rb +48 -0
  416. data/spec/presenters/hyrax/newspaper_article_presenter_spec.rb +53 -0
  417. data/spec/presenters/hyrax/newspaper_container_presenter_spec.rb +20 -0
  418. data/spec/presenters/hyrax/newspaper_issue_presenter_spec.rb +65 -0
  419. data/spec/presenters/hyrax/newspaper_page_presenter_spec.rb +75 -0
  420. data/spec/presenters/hyrax/newspaper_title_presenter_spec.rb +153 -0
  421. data/spec/presenters/newspaper_works/iiif_manifest_presenter_behavior_spec.rb +32 -0
  422. data/spec/presenters/newspaper_works/issue_info_presenter_spec.rb +51 -0
  423. data/spec/presenters/newspaper_works/newspaper_core_presenter_spec.rb +22 -0
  424. data/spec/presenters/newspaper_works/persistent_url_presenter_behavior_spec.rb +24 -0
  425. data/spec/presenters/newspaper_works/place_of_publication_presenter_behavior_spec.rb +17 -0
  426. data/spec/presenters/newspaper_works/scanned_media_presenter_spec.rb +18 -0
  427. data/spec/presenters/newspaper_works/title_info_presenter_spec.rb +23 -0
  428. data/spec/routing/route_spec.rb +52 -0
  429. data/spec/search_builders/custom_search_builder_spec.rb +34 -0
  430. data/spec/search_builders/newspaper_works/newspapers_search_builder_spec.rb +33 -0
  431. data/spec/services/hyrax/article_genre_service_spec.rb +12 -0
  432. data/spec/services/hyrax/resource_types_service_spec.rb +12 -0
  433. data/spec/services/newspaper_works/jp2_derivative_service_spec.rb +62 -0
  434. data/spec/services/newspaper_works/newspaper_page_derivative_service_spec.rb +125 -0
  435. data/spec/services/newspaper_works/pdf_derivative_service_spec.rb +62 -0
  436. data/spec/services/newspaper_works/pluggable_derivative_service_spec.rb +204 -0
  437. data/spec/services/newspaper_works/text_extraction_derivative_service_spec.rb +82 -0
  438. data/spec/services/newspaper_works/text_formats_from_alto_service_spec.rb +129 -0
  439. data/spec/services/newspaper_works/tiff_derivative_service_spec.rb +58 -0
  440. data/spec/spec_helper.rb +261 -0
  441. data/spec/support/controller_level_helpers.rb +28 -0
  442. data/spec/test_app_templates/lib/generators/test_app_generator.rb +22 -0
  443. data/spec/views/catalog/_index_gallery_newspaper_page_wrapper.html.erb_spec.rb +36 -0
  444. data/spec/views/catalog/_index_header_list_newspaper_page.html.erb_spec.rb +26 -0
  445. data/spec/views/catalog/_thumbnail_list_newspaper_page.html.erb_spec.rb +35 -0
  446. data/spec/views/hyrax/newspaper_titles/_all_front_pages_form.html.erb_spec.rb +16 -0
  447. data/spec/views/hyrax/newspaper_titles/_issue_search_form.html.erb_spec.rb +33 -0
  448. data/spec/views/hyrax/newspaper_titles/_issues_calendar.html.erb_spec.rb +37 -0
  449. data/spec/views/hyrax/newspaper_titles/show.html.erb_spec.rb +87 -0
  450. data/spec/views/newspaper_works/base/_attribute_rows.html.erb_spec.rb +60 -0
  451. data/spec/views/newspaper_works/base/_newspaper_hierarchy.html.erb_spec.rb +80 -0
  452. data/spec/views/newspaper_works/base/_show.html.erb_spec.rb +78 -0
  453. data/spec/views/newspaper_works/newspapers_search/search.html.erb_spec.rb +54 -0
  454. data/spec/views/records/edit_fields/_place_of_publication.html.erb_spec.rb +26 -0
  455. data/tasks/newspaperworks_dev.rake +26 -0
  456. data/test/integration/navigation_test.rb +7 -0
  457. data/test/lib/generators/newspaper_works/install_generator_test.rb +16 -0
  458. data/test/newspaper_works_test.rb +7 -0
  459. data/test/test_helper.rb +17 -0
  460. data/tmp/.keep +0 -0
  461. metadata +1037 -0
@@ -0,0 +1,261 @@
1
+ require 'json'
2
+
3
+ # testing environent:
4
+ ENV['RAILS_ENV'] ||= 'test'
5
+
6
+ require 'coveralls'
7
+ Coveralls.wear!
8
+
9
+ require 'shoulda/matchers'
10
+ Shoulda::Matchers.configure do |config|
11
+ config.integrate do |with|
12
+ with.test_framework :rspec
13
+ end
14
+ end
15
+
16
+ # engine_cart:
17
+ require 'bundler/setup'
18
+ require 'engine_cart'
19
+ EngineCart.load_application!
20
+
21
+ # webmock
22
+ require 'webmock'
23
+ # include WebMock API makes stub_request available in initial config, not
24
+ # just inside tests:
25
+ include WebMock::API
26
+ # Allow connections to pass through by default, so that any before(:suite)
27
+ # hook that runs before WebMock config isn't affected:
28
+ WebMock.allow_net_connect!
29
+
30
+ # test account for Geonames-related specs
31
+ Qa::Authorities::Geonames.username = 'newspaper_works'
32
+
33
+ require 'rails-controller-testing'
34
+ require 'rspec/rails'
35
+ require 'support/controller_level_helpers'
36
+ require 'rspec/active_model/mocks'
37
+ require 'selenium-webdriver'
38
+ require 'webdrivers'
39
+
40
+ # @note In January 2018, TravisCI disabled Chrome sandboxing in its Linux
41
+ # container build environments to mitigate Meltdown/Spectre
42
+ # vulnerabilities, at which point Hyrax could no longer use the
43
+ # Capybara-provided :selenium_chrome_headless driver (which does not
44
+ # include the `--no-sandbox` argument).
45
+ Capybara.register_driver :selenium_chrome_headless_sandboxless do |app|
46
+ browser_options = ::Selenium::WebDriver::Chrome::Options.new
47
+ browser_options.args << '--headless'
48
+ browser_options.args << '--disable-gpu'
49
+ browser_options.args << '--no-sandbox'
50
+ Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
51
+ end
52
+
53
+ Capybara.default_driver = :rack_test # This is a faster driver
54
+ Capybara.javascript_driver = :selenium_chrome_headless_sandboxless # This is slower
55
+
56
+ # FIXME: Pin to older version of chromedriver to avoid issue with clicking non-visible elements
57
+ Webdrivers::Chromedriver.required_version = '72.0.3626.69'
58
+
59
+ ActiveJob::Base.queue_adapter = :test
60
+
61
+ module EngineRoutes
62
+ def self.included(base)
63
+ base.routes { NewspaperWorks::Engine.routes }
64
+ end
65
+ end
66
+
67
+ RSpec.configure do |config|
68
+ # enable FactoryBot:
69
+ require 'factory_bot'
70
+ config.include FactoryBot::Syntax::Methods
71
+ # auto-detect and load all factories in spec/factories:
72
+ FactoryBot.find_definitions
73
+
74
+ config.infer_spec_type_from_file_location!
75
+
76
+ # Transactional
77
+ config.use_transactional_fixtures = false
78
+ config.include Devise::Test::ControllerHelpers, type: :controller
79
+
80
+ # require shared examples
81
+ require 'lib/newspaper_works/ingest/ingest_shared'
82
+
83
+ config.include(ControllerLevelHelpers, type: :helper)
84
+ config.before(:each, type: :helper) { initialize_controller_helpers(helper) }
85
+
86
+ config.include(ControllerLevelHelpers, type: :view)
87
+ config.before(:each, type: :view) { initialize_controller_helpers(view) }
88
+
89
+ config.before(:all, type: :feature) do
90
+ # Assets take a long time to compile. This causes two problems:
91
+ # 1) the profile will show the first feature test taking much longer than it
92
+ # normally would.
93
+ # 2) The first feature test will trigger rack-timeout
94
+ #
95
+ # Precompile the assets to prevent these issues.
96
+ visit "/assets/application.css"
97
+ visit "/assets/application.js"
98
+ end
99
+
100
+ config.include EngineRoutes, type: :controller
101
+
102
+ # ensure Hyrax has active sipity workflow for default admin set:
103
+ config.before(:suite) do
104
+ begin
105
+ # ensure permission template actually exists in RDBMS:
106
+ id = 'admin_set/default'
107
+ no_template = Hyrax::PermissionTemplate.find_by(source_id: id).nil?
108
+ Hyrax::PermissionTemplate.create!(source_id: id) if no_template
109
+ # ensure workflows exist, presumes permission template does first:
110
+ Hyrax::Workflow::WorkflowImporter.load_workflows
111
+ # Default admin set needs to exist in Fedora, with relation to its
112
+ # PermissionTemplate object:
113
+ begin
114
+ admin_set = AdminSet.find(AdminSet.find_or_create_default_admin_set_id)
115
+ admin_set.save!
116
+ rescue ActiveRecord::RecordNotUnique
117
+ admin_set = AdminSet.find(AdminSet::DEFAULT_ID)
118
+ end
119
+ permission_template = admin_set.permission_template
120
+ workflow = permission_template.available_workflows.where(
121
+ name: 'default'
122
+ ).first
123
+ Sipity::Workflow.activate!(
124
+ permission_template: permission_template,
125
+ workflow_id: workflow.id
126
+ )
127
+ rescue Faraday::ConnectionFailed
128
+ STDERR.puts "Attempting to run test suite without Fedora and/or Solr..."
129
+ end
130
+ end
131
+
132
+ # enable WebMock, but make sure it is opt-in for stubs, allowing non-stubbed
133
+ # HTTP requests to proceed normally
134
+ config.before(:suite) do
135
+ WebMock.enable!
136
+ WebMock.allow_net_connect!
137
+ # Load stubs from manifest
138
+ fixtures = File.join(NewspaperWorks::GEM_PATH, 'spec', 'fixtures', 'files')
139
+ manifest_path = File.join(fixtures, 'resource_mocks', 'urls.json')
140
+ manifest = JSON.parse(File.read(manifest_path))
141
+ manifest['urls'].each do |r|
142
+ path = File.join(fixtures, 'resource_mocks', r['local'])
143
+ status = r['status'] || 200
144
+ stub_request(:any, r['url']).to_return(
145
+ body: File.open(path),
146
+ status: status
147
+ )
148
+ end
149
+ end
150
+ # ensure HTTP connections allowed by webmock between/before tests:
151
+ config.before { WebMock.allow_net_connect! }
152
+
153
+ # :perform_enqueued config setting below copied from Hyrax spec_helper.rb
154
+ config.before(:example, :perform_enqueued) do |example|
155
+ ActiveJob::Base.queue_adapter.filter = example.metadata[:perform_enqueued].try(:to_a)
156
+ ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
157
+ ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = true
158
+ end
159
+ config.after(:example, :perform_enqueued) do
160
+ ActiveJob::Base.queue_adapter.filter = nil
161
+ ActiveJob::Base.queue_adapter.enqueued_jobs = []
162
+ ActiveJob::Base.queue_adapter.performed_jobs = []
163
+ ActiveJob::Base.queue_adapter.perform_enqueued_jobs = false
164
+ ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = false
165
+ end
166
+
167
+ # rspec-expectations config goes here. You can use an alternate
168
+ # assertion/expectation library such as wrong or the stdlib/minitest
169
+ # assertions if you prefer.
170
+ config.expect_with :rspec do |expectations|
171
+ # This option will default to `true` in RSpec 4. It makes the `description`
172
+ # and `failure_message` of custom matchers include text for helper methods
173
+ # defined using `chain`, e.g.:
174
+ # be_bigger_than(2).and_smaller_than(4).description
175
+ # # => "be bigger than 2 and smaller than 4"
176
+ # ...rather than:
177
+ # # => "be bigger than 2"
178
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
179
+ end
180
+
181
+ # rspec-mocks config goes here. You can use an alternate test double
182
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
183
+ config.mock_with :rspec do |mocks|
184
+ # Prevents you from mocking or stubbing a method that does not exist on
185
+ # a real object. This is generally recommended, and will default to
186
+ # `true` in RSpec 4.
187
+ mocks.verify_partial_doubles = true
188
+ end
189
+
190
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
191
+ # have no way to turn it off -- the option exists only for backwards
192
+ # compatibility in RSpec 3). It causes shared context metadata to be
193
+ # inherited by the metadata hash of host groups and examples, rather than
194
+ # triggering implicit auto-inclusion in groups with matching metadata.
195
+ config.shared_context_metadata_behavior = :apply_to_host_groups
196
+
197
+ # The settings below are suggested to provide a good initial experience
198
+ # with RSpec, but feel free to customize to your heart's content.
199
+
200
+ # This allows you to limit a spec run to individual examples or groups
201
+ # you care about by tagging them with `:focus` metadata. When nothing
202
+ # is tagged with `:focus`, all examples get run. RSpec also provides
203
+ # aliases for `it`, `describe`, and `context` that include `:focus`
204
+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
205
+ # config.filter_run_when_matching :focus
206
+
207
+ # Allows RSpec to persist some state between runs in order to support
208
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
209
+ # you configure your source control system to ignore this file.
210
+ # config.example_status_persistence_file_path = "spec/examples.txt"
211
+
212
+ # Limits the available syntax to the non-monkey patched syntax that is
213
+ # recommended. For more details, see:
214
+ # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
215
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
216
+ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
217
+ # config.disable_monkey_patching!
218
+
219
+ # Many RSpec users commonly either run the entire suite or an individual
220
+ # file, and it's useful to allow more verbose output when running an
221
+ # individual spec file.
222
+ # if config.files_to_run.one?
223
+ # Use the documentation formatter for detailed output,
224
+ # unless a formatter has already been configured
225
+ # (e.g. via a command-line flag).
226
+ # config.default_formatter = "doc"
227
+ # end
228
+
229
+ # Print the 10 slowest examples and example groups at the
230
+ # end of the spec run, to help surface which specs are running
231
+ # particularly slow.
232
+ # config.profile_examples = 10
233
+
234
+ # Run specs in random order to surface order dependencies. If you find an
235
+ # order dependency and want to debug it, you can fix the order by providing
236
+ # the seed, which is printed after each run.
237
+ # --seed 1234
238
+ # config.order = :random
239
+
240
+ # Seed global randomization in this process using the `--seed` CLI option.
241
+ # Setting this allows you to use `--seed` to deterministically reproduce
242
+ # test failures related to randomization by passing the same `--seed` value
243
+ # as the one that triggered the failure.
244
+ # Kernel.srand config.seed
245
+ # end
246
+ end
247
+
248
+ # ===
249
+ # Means to suppress pending by running something like:
250
+ # $ SUPPRESS_PENDING=1 rspec -fd
251
+ # ===
252
+ module SuccinctFormatterOverrides
253
+ def example_pending(_) end
254
+
255
+ def dump_pending(_) end
256
+ end
257
+
258
+ unless ENV['SUPPRESS_PENDING'].nil?
259
+ RSpec::Core::Formatters::DocumentationFormatter.prepend SuccinctFormatterOverrides
260
+ RSpec::Core::Formatters::ProgressFormatter.prepend SuccinctFormatterOverrides
261
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ # copied from Hyrax
3
+
4
+ module ControllerLevelHelpers
5
+ # This provides some common mock methods for view tests.
6
+ # These are normally provided by the controller.
7
+ module ControllerViewHelpers
8
+ def search_state
9
+ @search_state ||= CatalogController.search_state_class.new(params, blacklight_config, controller)
10
+ end
11
+
12
+ # This allows you to set the configuration
13
+ # @example: view.blacklight_config = Blacklight::Configuration.new
14
+ attr_writer :blacklight_config
15
+
16
+ def blacklight_config
17
+ @blacklight_config ||= CatalogController.blacklight_config
18
+ end
19
+
20
+ def blacklight_configuration_context
21
+ @blacklight_configuration_context ||= Blacklight::Configuration::Context.new(controller)
22
+ end
23
+ end
24
+
25
+ def initialize_controller_helpers(helper)
26
+ helper.extend ControllerViewHelpers
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ # Test App Generator
2
+ require 'rails/generators'
3
+
4
+ class TestAppGenerator < Rails::Generators::Base
5
+ source_root './spec/test_app_templates'
6
+
7
+ def install_hyrax
8
+ generate 'hyrax:install', '-f'
9
+ end
10
+
11
+ def install_engine
12
+ generate 'newspaper_works:install'
13
+ end
14
+
15
+ def db_migrations
16
+ rake 'db:migrate'
17
+ end
18
+
19
+ def configure_browse_everything
20
+ generate 'browse_everything:config'
21
+ end
22
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ RSpec.describe 'catalog/_index_gallery_newspaper_page_wrapper.html.erb', type: :view do
3
+ let(:query) { 'suffrage' }
4
+ let(:document) { build(:newspaper_page_solr_document) }
5
+ let(:current_search_session) { Search.new(query_params: { q: query }) }
6
+
7
+ let(:page) do
8
+ render 'catalog/index_gallery_newspaper_page_wrapper',
9
+ document: document,
10
+ current_search_session: current_search_session,
11
+ document_counter: 0
12
+ end
13
+
14
+ before do
15
+ allow(document).to receive(:has_highlight_field?).and_return(false)
16
+ # we need without_partial_double_verification or we get error:
17
+ # View doesn't implement #current_search_session
18
+ without_partial_double_verification do
19
+ allow(view).to receive(:current_search_session).and_return(current_search_session)
20
+ end
21
+ end
22
+
23
+ it 'renders the thumbnail' do
24
+ expect(page).to have_selector("img[src='#{document[:thumbnail_path_ss]}']")
25
+ end
26
+
27
+ it 'renders links with the IIIF search anchor' do
28
+ expect(page).to have_link(document[:title_tesim].first,
29
+ href: "/concern/newspaper_pages/#{document[:id]}#?h=#{query}")
30
+ end
31
+
32
+ it 'has data attributes for thumbnail highlighting' do
33
+ expect(page).to have_selector("div[data-fileset='#{document[:file_set_ids_ssim].first}']")
34
+ expect(page).to have_selector("div[data-query='#{query}']")
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ RSpec.describe 'catalog/_index_header_list_newspaper_page.html.erb', type: :view do
3
+ let(:query) { 'suffrage' }
4
+ let(:document) { build(:newspaper_page_solr_document) }
5
+ let(:current_search_session) { Search.new(query_params: { q: query }) }
6
+
7
+ let(:page) do
8
+ render 'catalog/index_header_list_newspaper_page',
9
+ document: document,
10
+ current_search_session: current_search_session,
11
+ document_counter: 0
12
+ end
13
+
14
+ before do
15
+ # we need without_partial_double_verification or we get error:
16
+ # View doesn't implement #current_search_session
17
+ without_partial_double_verification do
18
+ allow(view).to receive(:current_search_session).and_return(current_search_session)
19
+ end
20
+ end
21
+
22
+ it 'renders the links with the IIIF search anchor' do
23
+ expect(page).to have_link(document[:title_tesim].first,
24
+ href: "/concern/newspaper_pages/#{document[:id]}#?h=#{query}")
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+ RSpec.describe 'catalog/_thumbnail_list_newspaper_page.html.erb', type: :view do
3
+ let(:query) { 'suffrage' }
4
+ let(:document) { build(:newspaper_page_solr_document) }
5
+ let(:current_search_session) { Search.new(query_params: { q: query }) }
6
+
7
+ let(:page) do
8
+ render 'catalog/thumbnail_list_newspaper_page',
9
+ document: document,
10
+ current_search_session: current_search_session,
11
+ document_counter: 0
12
+ end
13
+
14
+ before do
15
+ allow(document).to receive(:has_highlight_field?).and_return(false)
16
+ # we need without_partial_double_verification or we get error:
17
+ # View doesn't implement #current_search_session
18
+ without_partial_double_verification do
19
+ allow(view).to receive(:current_search_session).and_return(current_search_session)
20
+ end
21
+ end
22
+
23
+ it 'renders the thumbnail' do
24
+ expect(page).to have_selector("img[src='#{document[:thumbnail_path_ss]}']")
25
+ end
26
+
27
+ it 'renders the link with the IIIF search anchor' do
28
+ expect(page).to have_selector("a[href='/concern/newspaper_pages/#{document[:id]}#?h=#{query}']")
29
+ end
30
+
31
+ it 'has data attributes for thumbnail highlighting' do
32
+ expect(page).to have_selector("div[data-fileset='#{document[:file_set_ids_ssim].first}']")
33
+ expect(page).to have_selector("div[data-query='#{query}']")
34
+ end
35
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+ RSpec.describe 'hyrax/newspaper_titles/_all_front_pages_form.html.erb', type: :view do
3
+ let(:presenter) { double }
4
+
5
+ before do
6
+ allow(presenter).to receive(:front_page_search_params).and_return(f: { "publication_title_ssi" => ["Wall Street Journal"], "first_page_bsi" => [true] })
7
+ assign(:presenter, presenter)
8
+ render
9
+ end
10
+
11
+ let(:page) { Capybara::Node::Simple.new(rendered) }
12
+
13
+ it "has a link to the front pages view" do
14
+ expect(page).to have_link("View all front pages", href: main_app.search_catalog_path(presenter.front_page_search_params))
15
+ end
16
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ RSpec.describe 'hyrax/newspaper_titles/_issue_search_form.html.erb', type: :view do
3
+ let(:presenter) { double }
4
+
5
+ before do
6
+ allow(view).to receive(:search_form_action).and_return("/catalog")
7
+ allow(view).to receive(:search_state).and_return(search_state)
8
+ allow(view).to receive(:current_search_parameters).and_return(nil)
9
+ allow(view).to receive(:current_user).and_return(nil)
10
+
11
+ allow(presenter).to receive(:title_search_params).and_return(f: { "publication_title_ssi" => ["Wall Street Journal"] })
12
+ assign(:presenter, presenter)
13
+ render
14
+ end
15
+ let(:search_state) { double('SearchState', params_for_search: {}) }
16
+ let(:page) { Capybara::Node::Simple.new(rendered) }
17
+
18
+ it "has a hidden `f[publication_title_ssi][]` form field" do
19
+ expect(page).to have_selector("[name='f\[publication_title_ssi\]\[\]'][value='Wall Street Journal']", visible: false)
20
+ end
21
+
22
+ it "has hidden `all_fields` form field" do
23
+ expect(page).to have_selector("[name='search_field'][value='all_fields']", visible: false)
24
+ end
25
+
26
+ it "has a `q` form field for query" do
27
+ expect(page).to have_field("q")
28
+ end
29
+
30
+ it "has a checkbox to limit to front pages" do
31
+ expect(page).to have_field("f_first_page_bsi_")
32
+ end
33
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+ # require 'model_shared'
3
+ RSpec.describe 'hyrax/newspaper_titles/_issue_calendar.html.erb', type: :view do
4
+ let!(:issues) do
5
+ [
6
+ SolrDocument.new(id: '123',
7
+ publication_date_dtsi: '2019-02-13T:00:00:00Z'),
8
+ SolrDocument.new(id: '456',
9
+ publication_date_dtsi: '2019-03-05T:00:00:00Z')
10
+ ]
11
+ end
12
+
13
+ let(:years) do
14
+ { current: 2019, previous: nil, next: nil }
15
+ end
16
+
17
+ it 'shows calendar' do
18
+ render partial: "issues_calendar.html.erb", locals: { issues: issues, years: years }
19
+ expect(rendered).to have_content 'January'
20
+ end
21
+
22
+ it 'has link on dates with issues' do
23
+ render partial: "issues_calendar.html.erb", locals: { issues: issues, years: years }
24
+ links = {}
25
+ issues.each do |issue|
26
+ links[Date.parse(issue["publication_date_dtsi"]).strftime("%-d")] = hyrax_newspaper_issue_path(issue)
27
+ end
28
+ links.each do |day, path|
29
+ expect(rendered).to have_link(day, href: path)
30
+ end
31
+ end
32
+
33
+ it 'displays the year' do
34
+ render partial: "issues_calendar.html.erb", locals: { issues: issues, years: years }
35
+ expect(rendered).to have_content "Issues: 2019"
36
+ end
37
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+ RSpec.describe 'hyrax/newspaper_titles/show.html.erb', type: :view do
3
+ let(:work_solr_document) do
4
+ SolrDocument.new(id: '999',
5
+ title_tesim: ['My Title'],
6
+ creator_tesim: ['Doe, John', 'Doe, Jane'],
7
+ date_modified_dtsi: '2011-04-01',
8
+ has_model_ssim: ['NewspaperTitle'],
9
+ depositor_tesim: depositor.user_key,
10
+ description_tesim: ['Lorem ipsum lorem ipsum.'],
11
+ keyword_tesim: ['bacon', 'sausage', 'eggs'],
12
+ rights_statement_tesim: ['http://example.org/rs/1'],
13
+ date_created_tesim: ['2019-01-02'])
14
+ end
15
+
16
+ let(:file_set_solr_document) do
17
+ SolrDocument.new(id: '123',
18
+ title_tesim: ['My FileSet'],
19
+ depositor_tesim: depositor.user_key)
20
+ end
21
+
22
+ let(:ability) { double }
23
+
24
+ let(:request) { double('request', host: 'test.host') }
25
+
26
+ let(:presenter) do
27
+ Hyrax::NewspaperTitlePresenter.new(work_solr_document, ability, request)
28
+ end
29
+
30
+ let(:workflow_presenter) do
31
+ double('workflow_presenter', badge: 'Foobar')
32
+ end
33
+
34
+ let(:representative_presenter) do
35
+ Hyrax::FileSetPresenter.new(file_set_solr_document, ability)
36
+ end
37
+
38
+ let(:page) { Capybara::Node::Simple.new(rendered) }
39
+
40
+ let(:depositor) do
41
+ stub_model(User,
42
+ user_key: 'bob',
43
+ twitter_handle: 'bot4lib')
44
+ end
45
+
46
+ before do
47
+ allow(presenter).to receive(:year).and_return('2019')
48
+ allow(presenter).to receive(:workflow).and_return(workflow_presenter)
49
+ allow(presenter).to receive(:representative_presenter).and_return(representative_presenter)
50
+ allow(presenter).to receive(:representative_id).and_return('123')
51
+ allow(presenter).to receive(:tweeter).and_return("@#{depositor.twitter_handle}")
52
+ allow(presenter).to receive(:human_readable_type).and_return("Work")
53
+ allow(controller).to receive(:current_user).and_return(depositor)
54
+ allow(User).to receive(:find_by_user_key).and_return(depositor.user_key)
55
+ allow(view).to receive(:blacklight_config).and_return(Blacklight::Configuration.new)
56
+ allow(view).to receive(:signed_in?)
57
+ allow(view).to receive(:on_the_dashboard?).and_return(false)
58
+ stub_template 'hyrax/base/_metadata.html.erb' => ''
59
+ stub_template 'hyrax/base/_relationships.html.erb' => ''
60
+ stub_template 'hyrax/base/_show_actions.html.erb' => ''
61
+ stub_template 'hyrax/base/_social_media.html.erb' => ''
62
+ stub_template 'hyrax/base/_citations.html.erb' => ''
63
+ stub_template 'hyrax/base/_items.html.erb' => ''
64
+ stub_template 'hyrax/base/_workflow_actions_widget.html.erb' => ''
65
+ stub_template 'hyrax/base/_work_type.html.erb' => ''
66
+ stub_template 'hyrax/base/_work_title.html.erb' => ''
67
+ stub_template '_masthead.html.erb' => ''
68
+ stub_template 'hyrax/newspaper_titles/_issues_calendar' => 'Issues List In Calendar'
69
+ assign(:presenter, presenter)
70
+ # render template: 'hyrax/base/show.html.erb', layout: 'layouts/hyrax/1_column'
71
+ end
72
+
73
+ it 'shows the issue search form partial' do
74
+ render
75
+ expect(rendered).to render_template(partial: 'hyrax/newspaper_titles/_issue_search_form')
76
+ end
77
+
78
+ it 'shows the front page search form partial' do
79
+ render
80
+ expect(rendered).to render_template(partial: 'hyrax/newspaper_titles/_all_front_pages_form')
81
+ end
82
+
83
+ it 'shows the issue calendar partial' do
84
+ render
85
+ expect(rendered).to render_template(partial: '_issues_calendar')
86
+ end
87
+ end
@@ -0,0 +1,60 @@
1
+ # hyrax/spec/views/hyrax/base/_attribute_rows.html.erb_spec.rb
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe 'newspaper_works/base/_attribute_rows.html.erb', type: :view do
5
+ let(:url) { "http://example.com" }
6
+ let(:title) { "There and Back Again" }
7
+ let(:issn) { "2049-3630" }
8
+ let(:place_of_publication_label) { "Salt Lake City, Utah, United States" }
9
+ let(:publication_date) { "2019-01-24" }
10
+ let(:rights_statement_uri) { 'http://rightsstatements.org/vocab/InC/1.0/' }
11
+ let(:ability) { double }
12
+ let(:request) { double(host: 'example.org') }
13
+ let(:work) do
14
+ stub_model(NewspaperIssue,
15
+ title: [title],
16
+ issn: issn,
17
+ place_of_publication_label: [place_of_publication_label],
18
+ publication_date: [publication_date],
19
+ related_url: [url],
20
+ rights_statement: [rights_statement_uri])
21
+ end
22
+ let(:solr_document) do
23
+ SolrDocument.new(has_model_ssim: 'NewspaperIssue',
24
+ title_tesim: [title],
25
+ issn_tesim: [issn],
26
+ place_of_publication_label_tesim: [place_of_publication_label],
27
+ publication_date_dtsi: publication_date,
28
+ rights_statement_tesim: [rights_statement_uri],
29
+ related_url_tesim: [url],
30
+ publication_unique_id_ssi: 'sn1234567')
31
+ end
32
+
33
+ let(:presenter) { Hyrax::NewspaperIssuePresenter.new(solr_document, ability, request) }
34
+
35
+ let(:page) do
36
+ render 'newspaper_works/base/attribute_rows', presenter: presenter
37
+ Capybara::Node::Simple.new(rendered)
38
+ end
39
+
40
+ it 'shows issn of the work' do
41
+ expect(page).to have_text("2049-3630")
42
+ end
43
+
44
+ it 'shows place of publication label of the work' do
45
+ expect(page).to have_text("Place of publication")
46
+ expect(page).to have_text("Salt Lake City, Utah, United States")
47
+ end
48
+
49
+ it 'shows publication date of the work' do
50
+ expect(page).to have_text("01/24/2019")
51
+ end
52
+
53
+ it 'shows rights statement with link to statement URL' do
54
+ expect(page).to have_link("In Copyright", href: rights_statement_uri)
55
+ end
56
+
57
+ it 'shows the permalink' do
58
+ expect(page).to have_text('/newspapers/sn1234567/2019-01-24/ed-1')
59
+ end
60
+ end