lcms-engine 0.3.1 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (328) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +25 -0
  3. data/.eslintignore +2 -1
  4. data/.eslintrc +23 -73
  5. data/.nvmrc +1 -1
  6. data/.overcommit.yml +8 -2
  7. data/.prettierrc +7 -0
  8. data/.rubocop.yml +5 -2
  9. data/.ruby-version +1 -1
  10. data/.stylelintignore +9 -0
  11. data/.stylelintrc +8 -0
  12. data/CHANGELOG.md +42 -2
  13. data/Dockerfile +3 -3
  14. data/Gemfile.lock +345 -298
  15. data/README.md +21 -33
  16. data/app/assets/config/lcms_engine_manifest.js +4 -2
  17. data/app/assets/javascripts/lcms/engine/admin/{application.js → lcms_engine_application.js} +1 -3
  18. data/app/assets/javascripts/lcms/engine/initializers/foundation.js +1 -1
  19. data/app/assets/javascripts/lcms/engine/{application.js → lcms_engine_application.js} +0 -0
  20. data/app/assets/stylesheets/lcms/engine/admin/collections.scss +2 -1
  21. data/app/assets/stylesheets/lcms/engine/admin/components.scss +60 -19
  22. data/app/assets/stylesheets/lcms/engine/admin/curriculums.scss +12 -10
  23. data/app/assets/stylesheets/lcms/engine/admin/lessons.scss +21 -15
  24. data/app/assets/stylesheets/lcms/engine/admin/materials.scss +25 -17
  25. data/app/assets/stylesheets/lcms/engine/admin/resources.scss +8 -7
  26. data/app/assets/stylesheets/lcms/engine/admin/standards.scss +4 -1
  27. data/app/assets/stylesheets/lcms/engine/admin/users.scss +1 -1
  28. data/app/assets/stylesheets/lcms/engine/base/_colors.scss +8 -10
  29. data/app/assets/stylesheets/lcms/engine/base/_ld-colors.scss +10 -10
  30. data/app/assets/stylesheets/lcms/engine/components/_assoc-picker.scss +4 -5
  31. data/app/assets/stylesheets/lcms/engine/components/lesson/_activity.scss +6 -2
  32. data/app/assets/stylesheets/lcms/engine/components/lesson/_callout.scss +19 -5
  33. data/app/assets/stylesheets/lcms/engine/components/lesson/_columns.scss +4 -3
  34. data/app/assets/stylesheets/lcms/engine/components/lesson/_curriculum-map.scss +16 -7
  35. data/app/assets/stylesheets/lcms/engine/components/lesson/_def.scss +2 -2
  36. data/app/assets/stylesheets/lcms/engine/components/lesson/_expand.scss +9 -9
  37. data/app/assets/stylesheets/lcms/engine/components/lesson/_foundational-divider.scss +0 -1
  38. data/app/assets/stylesheets/lcms/engine/components/lesson/_group.scss +3 -1
  39. data/app/assets/stylesheets/lcms/engine/components/lesson/_icons.scss +1 -1
  40. data/app/assets/stylesheets/lcms/engine/components/lesson/_image-wrap.scss +2 -2
  41. data/app/assets/stylesheets/lcms/engine/components/lesson/_inset.scss +7 -2
  42. data/app/assets/stylesheets/lcms/engine/components/lesson/_materials.scss +1 -1
  43. data/app/assets/stylesheets/lcms/engine/components/lesson/_multiple-choice.scss +4 -1
  44. data/app/assets/stylesheets/lcms/engine/components/lesson/_override.scss +28 -9
  45. data/app/assets/stylesheets/lcms/engine/components/lesson/_pd.scss +7 -7
  46. data/app/assets/stylesheets/lcms/engine/components/lesson/_pv.scss +5 -4
  47. data/app/assets/stylesheets/lcms/engine/components/lesson/_section.scss +10 -3
  48. data/app/assets/stylesheets/lcms/engine/components/lesson/_selection-control.scss +14 -8
  49. data/app/assets/stylesheets/lcms/engine/components/lesson/_sidebar.scss +25 -10
  50. data/app/assets/stylesheets/lcms/engine/components/lesson/_title.scss +3 -1
  51. data/app/assets/stylesheets/lcms/engine/components/lesson/_unit-map.scss +1 -1
  52. data/app/assets/stylesheets/lcms/engine/components/material/_material.scss +3 -3
  53. data/app/assets/stylesheets/lcms/engine/components/material/_overlay.scss +12 -4
  54. data/app/assets/stylesheets/lcms/engine/components/material/_preview.scss +1 -1
  55. data/app/assets/stylesheets/lcms/engine/components/support/_survey.scss +3 -1
  56. data/app/assets/stylesheets/lcms/engine/layout/_footer.scss +29 -11
  57. data/app/assets/stylesheets/lcms/engine/layout/_header.scss +5 -5
  58. data/app/assets/stylesheets/lcms/engine/layout/_navigation.scss +4 -6
  59. data/app/assets/stylesheets/lcms/engine/layout/_page.scss +2 -2
  60. data/app/assets/stylesheets/lcms/engine/{admin.scss → lcms_engine_admin.scss} +26 -15
  61. data/app/assets/stylesheets/lcms/engine/lcms_engine_application.scss +9 -0
  62. data/app/assets/stylesheets/lcms/engine/pdf.scss +5 -26
  63. data/app/assets/stylesheets/lcms/engine/pdf_plain.scss +5 -23
  64. data/app/assets/stylesheets/lcms/engine/print/_base.scss +41 -12
  65. data/app/assets/stylesheets/lcms/engine/print/_cover.scss +12 -12
  66. data/app/assets/stylesheets/lcms/engine/print/_footer.scss +8 -3
  67. data/app/assets/stylesheets/lcms/engine/print/_gdoc-base.scss +10 -37
  68. data/app/assets/stylesheets/lcms/engine/print/_helpers.scss +5 -2
  69. data/app/assets/stylesheets/lcms/engine/print/_lesson-base.scss +2 -14
  70. data/app/assets/stylesheets/lcms/engine/print/_material-base.scss +1 -3
  71. data/app/assets/stylesheets/lcms/engine/print/_print.scss +15 -8
  72. data/app/assets/stylesheets/lcms/engine/print/_toc.scss +24 -9
  73. data/app/assets/stylesheets/lcms/engine/print/gdoc/_base-typography.scss +24 -6
  74. data/app/assets/stylesheets/lcms/engine/print/gdoc/_base.scss +10 -3
  75. data/app/assets/stylesheets/lcms/engine/print/gdoc/_colors.scss +3 -3
  76. data/app/assets/stylesheets/lcms/engine/print/gdoc/_header.scss +2 -2
  77. data/app/assets/stylesheets/lcms/engine/print/gdoc/_helpers.scss +1 -0
  78. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_activity.scss +1 -1
  79. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_agenda.scss +8 -2
  80. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_callout.scss +16 -6
  81. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_def.scss +1 -1
  82. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_dialogue.scss +3 -1
  83. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_expand.scss +5 -2
  84. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_image-wrap.scss +5 -3
  85. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_image.scss +1 -1
  86. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_optbreak.scss +1 -0
  87. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_section.scss +4 -1
  88. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_smp.scss +1 -0
  89. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_tables.scss +11 -3
  90. data/app/assets/stylesheets/lcms/engine/print/gdoc/material/_header.scss +5 -2
  91. data/app/assets/stylesheets/lcms/engine/print/lesson/_base-typography.scss +33 -9
  92. data/app/assets/stylesheets/lcms/engine/print/lesson/_group.scss +3 -1
  93. data/app/assets/stylesheets/lcms/engine/print/lesson/_image.scss +3 -1
  94. data/app/assets/stylesheets/lcms/engine/print/lesson/_materials.scss +1 -1
  95. data/app/assets/stylesheets/lcms/engine/print/lesson/_pd.scss +8 -4
  96. data/app/assets/stylesheets/lcms/engine/print/lesson/_section.scss +1 -1
  97. data/app/assets/stylesheets/lcms/engine/print/material/_header.scss +4 -1
  98. data/app/assets/stylesheets/lcms/engine/themes/_material.scss +11 -11
  99. data/app/assets/stylesheets/lcms/engine/utils/_colorcodes.scss +15 -5
  100. data/app/assets/stylesheets/lcms/engine/utils/_functions.scss +1 -1
  101. data/app/assets/stylesheets/lcms/engine/utils/_helpers.scss +23 -11
  102. data/app/assets/stylesheets/lcms/engine/utils/_placeholders.scss +1 -1
  103. data/app/assets/stylesheets/lcms/engine/utils/_variables.scss +11 -11
  104. data/app/assets/stylesheets/lcms/engine/vendors/{mathjax.css → mathjax.scss} +0 -0
  105. data/app/assets/stylesheets/lcms/engine/vendors/react-tagsinput.css +48 -0
  106. data/app/controllers/concerns/lcms/engine/reimportable.rb +1 -1
  107. data/app/controllers/lcms/engine/admin/access_codes_controller.rb +8 -3
  108. data/app/controllers/lcms/engine/admin/admin_controller.rb +5 -39
  109. data/app/controllers/lcms/engine/admin/association_picker_controller.rb +4 -1
  110. data/app/controllers/lcms/engine/admin/batch_reimports_controller.rb +2 -2
  111. data/app/controllers/lcms/engine/admin/curriculums_controller.rb +21 -2
  112. data/app/controllers/lcms/engine/admin/documents_controller.rb +26 -14
  113. data/app/controllers/lcms/engine/admin/materials_controller.rb +23 -13
  114. data/app/controllers/lcms/engine/admin/resource_bulk_edits_controller.rb +2 -2
  115. data/app/controllers/lcms/engine/admin/resources_controller.rb +9 -7
  116. data/app/controllers/lcms/engine/admin/settings_controller.rb +1 -1
  117. data/app/controllers/lcms/engine/admin/standards_controller.rb +2 -2
  118. data/app/controllers/lcms/engine/admin/users_controller.rb +10 -7
  119. data/app/controllers/lcms/engine/application_controller.rb +1 -1
  120. data/app/controllers/lcms/engine/resources_controller.rb +5 -5
  121. data/app/controllers/lcms/engine/welcome_controller.rb +11 -0
  122. data/app/entities/lcms/engine/hierarchical_position.rb +1 -2
  123. data/app/entities/lcms/engine/media_embed.rb +1 -1
  124. data/app/entities/lcms/engine/pagination.rb +14 -10
  125. data/app/entities/lcms/engine/roman_numerals.rb +1 -1
  126. data/app/exceptions/lcms/engine/document_error.rb +8 -0
  127. data/app/exceptions/lcms/engine/material_error.rb +8 -0
  128. data/app/helpers/admin/components_helper.rb +1 -1
  129. data/app/helpers/lcms/engine/path_helper.rb +32 -0
  130. data/app/helpers/lcms/engine/resource_helper.rb +1 -1
  131. data/app/helpers/lcms/engine/view_helper.rb +0 -8
  132. data/app/interactors/lcms/engine/explore_curriculum_interactor.rb +1 -1
  133. data/app/javascript/components/admin/ImportStatus.jsx +88 -58
  134. data/app/javascript/components/admin/Initializer.jsx +33 -35
  135. data/app/javascript/components/admin/MultiSelectedOperation.jsx +43 -19
  136. data/app/javascript/components/admin/association-picker/AssociationPicker.jsx +68 -48
  137. data/app/javascript/components/admin/association-picker/AssociationPickerItem.jsx +18 -7
  138. data/app/javascript/components/admin/association-picker/AssociationPickerResults.jsx +42 -18
  139. data/app/javascript/components/admin/association-picker/AssociationPickerWindow.jsx +47 -28
  140. data/app/javascript/components/admin/curriculum/CurriculumEditor.jsx +54 -33
  141. data/app/javascript/components/admin/curriculum/DirectoryPicker.jsx +80 -53
  142. data/app/javascript/components/admin/picker/PickerButton.jsx +16 -11
  143. data/app/javascript/components/admin/picker/pickerModal.jsx +6 -6
  144. data/app/javascript/components/admin/picker/pickerWindowWrapper.jsx +61 -40
  145. data/app/javascript/components/admin/resource-picker/ResourcePicker.jsx +54 -40
  146. data/app/javascript/components/admin/resource-picker/ResourcePickerResource.jsx +14 -3
  147. data/app/javascript/components/admin/resource-picker/ResourcePickerWindow.jsx +50 -21
  148. data/app/javascript/components/paginate/PageView.jsx +20 -8
  149. data/app/javascript/components/paginate/PaginationBoxView.jsx +78 -66
  150. data/app/javascript/components/paginate/PaginationListView.jsx +59 -45
  151. data/app/javascript/packs/lcms_engine_admin.js +15 -0
  152. data/app/javascript/packs/{application.js → lcms_engine_application.js} +5 -4
  153. data/app/javascript/packs/server_rendering.js +1 -0
  154. data/app/javascript/vendor/jstree/jstree.min.js +6 -0
  155. data/app/javascript/vendor/jstree/themes/default/32px.png +0 -0
  156. data/app/javascript/vendor/jstree/themes/default/40px.png +0 -0
  157. data/app/javascript/vendor/jstree/themes/default/style.css +1106 -0
  158. data/app/javascript/vendor/jstree/themes/default/style.min.css +1 -0
  159. data/app/javascript/vendor/jstree/themes/default/throbber.gif +0 -0
  160. data/app/javascript/vendor/jstree/themes/default-dark/32px.png +0 -0
  161. data/app/javascript/vendor/jstree/themes/default-dark/40px.png +0 -0
  162. data/app/javascript/vendor/jstree/themes/default-dark/style.css +1150 -0
  163. data/app/javascript/vendor/jstree/themes/default-dark/style.min.css +1 -0
  164. data/app/javascript/vendor/jstree/themes/default-dark/throbber.gif +0 -0
  165. data/app/jobs/lcms/engine/document_generate_job.rb +1 -1
  166. data/app/jobs/lcms/engine/document_generate_pdf_job.rb +5 -5
  167. data/app/jobs/lcms/engine/material_generate_pdf_job.rb +4 -4
  168. data/app/models/concerns/lcms/engine/navigable.rb +6 -10
  169. data/app/models/concerns/lcms/engine/searchable.rb +7 -0
  170. data/app/models/lcms/engine/document.rb +1 -1
  171. data/app/models/lcms/engine/resource.rb +1 -1
  172. data/app/models/lcms/engine/search/repository.rb +1 -1
  173. data/app/presenters/lcms/engine/content_presenter.rb +1 -1
  174. data/app/presenters/lcms/engine/curriculum_presenter.rb +21 -18
  175. data/app/presenters/lcms/engine/document_presenter.rb +3 -1
  176. data/app/presenters/lcms/engine/resource_presenter.rb +6 -3
  177. data/app/queries/lcms/engine/admin_documents_query.rb +1 -1
  178. data/app/queries/lcms/engine/admin_materials_query.rb +11 -2
  179. data/app/queries/lcms/engine/base_query.rb +1 -1
  180. data/app/services/lcms/engine/document_build_service.rb +2 -0
  181. data/app/services/lcms/engine/document_generator.rb +2 -2
  182. data/app/services/lcms/engine/google/drive_service.rb +7 -15
  183. data/app/services/lcms/engine/google/script_service.rb +7 -3
  184. data/app/services/lcms/engine/html_sanitizer.rb +1 -1
  185. data/app/services/lcms/engine/lti_exporter.rb +1 -1
  186. data/app/services/lcms/engine/material_preview_generator.rb +1 -1
  187. data/app/services/lcms/engine/s3_service.rb +14 -2
  188. data/app/tasks/resource_tasks.rb +2 -2
  189. data/app/views/layouts/lcms/engine/admin.html.erb +3 -3
  190. data/app/views/layouts/lcms/engine/application.html.erb +2 -2
  191. data/app/views/layouts/lcms/engine/lti.html.erb +1 -1
  192. data/app/views/lcms/engine/admin/access_codes/_form.html.erb +1 -1
  193. data/app/views/lcms/engine/admin/access_codes/index.html.erb +3 -3
  194. data/app/views/lcms/engine/admin/batch_reimports/_search_form.html.erb +1 -1
  195. data/app/views/lcms/engine/admin/curriculums/edit.html.erb +4 -2
  196. data/app/views/lcms/engine/admin/documents/_reimport.html.erb +1 -1
  197. data/app/views/lcms/engine/admin/documents/_search_form.html.erb +1 -1
  198. data/app/views/lcms/engine/admin/documents/import.html.erb +1 -1
  199. data/app/views/lcms/engine/admin/documents/index.html.erb +5 -3
  200. data/app/views/lcms/engine/admin/documents/new.html.erb +6 -2
  201. data/app/views/lcms/engine/admin/materials/_reimport.html.erb +1 -1
  202. data/app/views/lcms/engine/admin/materials/_search_form.html.erb +1 -1
  203. data/app/views/lcms/engine/admin/materials/import.html.erb +1 -1
  204. data/app/views/lcms/engine/admin/materials/index.html.erb +22 -18
  205. data/app/views/lcms/engine/admin/materials/new.html.erb +5 -1
  206. data/app/views/lcms/engine/admin/resource_bulk_edits/new.html.erb +1 -1
  207. data/app/views/lcms/engine/admin/resources/_fields.html.erb +4 -3
  208. data/app/views/lcms/engine/admin/resources/_form.html.erb +1 -1
  209. data/app/views/lcms/engine/admin/resources/_search_form.html.erb +1 -1
  210. data/app/views/lcms/engine/admin/resources/index.html.erb +7 -5
  211. data/app/views/lcms/engine/admin/shared/_header.html.erb +12 -12
  212. data/app/views/lcms/engine/admin/standards/_form.html.erb +3 -1
  213. data/app/views/lcms/engine/admin/standards/_search_form.html.erb +1 -1
  214. data/app/views/lcms/engine/admin/users/_form.html.erb +1 -1
  215. data/app/views/lcms/engine/admin/users/_search_form.html.erb +1 -1
  216. data/app/views/lcms/engine/admin/users/index.html.erb +6 -6
  217. data/app/views/lcms/engine/pages/not_found.html.erb +5 -0
  218. data/app/views/lcms/engine/resources/generic.html.erb +0 -4
  219. data/app/views/lcms/engine/resources/media.html.erb +0 -4
  220. data/app/views/lcms/engine/resources/show.html.erb +0 -2
  221. data/config/initializers/airbrake.rb +62 -10
  222. data/config/initializers/bitly.rb +1 -1
  223. data/config/initializers/carrier_wave.rb +6 -4
  224. data/config/initializers/ckeditor.rb +6 -0
  225. data/config/initializers/elasticsearch.rb +1 -1
  226. data/config/initializers/resque.rb +2 -2
  227. data/config/locales/admin/en.yml +0 -1
  228. data/config/locales/ui/en.yml +1 -0
  229. data/config/routes.rb +5 -2
  230. data/db/migrate/.keep +0 -0
  231. data/db/schema.rb +279 -311
  232. data/db/seeds.rb +0 -1
  233. data/docker-compose.ror4.yml +32 -0
  234. data/docker-compose.yml +6 -3
  235. data/docs/env-variables.md +40 -40
  236. data/docs/google-cloud-platform-setup.md +45 -17
  237. data/docs/how-to-build-and-publish.md +14 -0
  238. data/docs/pdf-generation.md +31 -0
  239. data/lcms-engine.gemspec +27 -15
  240. data/lib/doc_template/document.rb +3 -4
  241. data/lib/doc_template/document_toc.rb +2 -2
  242. data/lib/doc_template/objects/activity_metadata.rb +1 -1
  243. data/lib/doc_template/objects/toc_helpers.rb +4 -4
  244. data/lib/doc_template/objects/toc_metadata.rb +4 -6
  245. data/lib/doc_template/tags/answer_space_tag.rb +1 -1
  246. data/lib/doc_template/tags/base_tag.rb +2 -2
  247. data/lib/doc_template/tags/block_tag.rb +1 -1
  248. data/lib/doc_template/tags/table_tag.rb +1 -1
  249. data/lib/doc_template/template.rb +1 -1
  250. data/lib/doc_template.rb +9 -9
  251. data/lib/document_exporter/gdoc/base.rb +5 -2
  252. data/lib/document_exporter/pdf/base.rb +1 -1
  253. data/lib/document_exporter/pdf/document.rb +2 -2
  254. data/lib/document_exporter/pdf/material.rb +2 -2
  255. data/lib/document_exporter/pdf/student_material.rb +2 -2
  256. data/lib/document_exporter/pdf/teacher_material.rb +2 -2
  257. data/lib/document_renderer/part.rb +1 -3
  258. data/lib/lcms/engine/engine.rb +10 -9
  259. data/lib/lcms/engine/version.rb +1 -1
  260. data/lib/lcms/engine.rb +0 -1
  261. data/lib/lt/lcms/metadata/context.rb +56 -52
  262. data/lib/lt/lcms/metadata/service.rb +3 -2
  263. data/lib/tasks/cloud66.rake +2 -2
  264. data/lib/tasks/document.rake +4 -4
  265. data/lib/tasks/google.rake +29 -14
  266. data/lib/tasks/lcms/engine_tasks.rake +1 -1
  267. data/package.json +31 -10
  268. data/postcss.config.js +12 -0
  269. data/spec/controllers/admin/curriculums_controller_spec.rb +23 -0
  270. data/spec/controllers/admin/documents_controller_spec.rb +22 -2
  271. data/spec/controllers/admin/materials_controller_spec.rb +16 -3
  272. data/spec/controllers/admin/resource_bulk_edit_controller_spec.rb +1 -1
  273. data/spec/controllers/admin/resources_controller_spec.rb +1 -1
  274. data/spec/controllers/admin/settings_controller_spec.rb +1 -1
  275. data/spec/controllers/admin/standards_controller_spec.rb +1 -1
  276. data/spec/controllers/admin/welcome_controller_spec.rb +12 -10
  277. data/spec/controllers/resources_controller_spec.rb +3 -3
  278. data/spec/controllers/welcome_controller_spec.rb +38 -0
  279. data/spec/dummy/.traceroute.yaml +0 -2
  280. data/spec/dummy/bin/webpack +18 -0
  281. data/spec/dummy/bin/webpack-dev-server +18 -0
  282. data/spec/dummy/config/application.rb +1 -1
  283. data/spec/dummy/config/environments/test.rb +1 -1
  284. data/spec/dummy/config/initializers/assets.rb +6 -0
  285. data/spec/dummy/config/lcms-admin.yml +3 -7
  286. data/spec/dummy/config/routes.rb +6 -0
  287. data/spec/dummy/db/schema.rb +5 -5
  288. data/spec/factories/documents.rb +1 -0
  289. data/spec/factories/downloads.rb +1 -1
  290. data/spec/factories/resources.rb +2 -2
  291. data/spec/features/admin/materials/add_material_spec.rb +2 -0
  292. data/spec/features/admin/users_spec.rb +2 -2
  293. data/spec/{controllers/admin/admin_controller_spec.rb → helpers/path_helper_spec.rb} +6 -6
  294. data/spec/lib/doc_template/objects/activity_metadata_spec.rb +1 -1
  295. data/spec/lib/doc_template/objects/agenda_metadata_spec.rb +2 -0
  296. data/spec/lib/doc_template/objects/toc_metadata_spec.rb +1 -1
  297. data/spec/lib/doc_template/tags/page_break_tag_spec.rb +1 -1
  298. data/spec/lib/doc_template/tags/pd_tag_spec.rb +1 -1
  299. data/spec/models/document_spec.rb +1 -1
  300. data/spec/models/standard_spec.rb +2 -0
  301. data/spec/queries/lcms/engine/admin_materials_query_spec.rb +41 -0
  302. data/spec/rails_helper.rb +6 -17
  303. data/spec/services/document_build_service_spec.rb +4 -11
  304. data/spec/services/s3_service_spec.rb +31 -0
  305. data/spec/support/concerns/navigable.rb +2 -0
  306. data/spec/support/routes.rb +4 -0
  307. data/spec/support/shared_examples/content_tag.rb +4 -4
  308. data/templates/routes.rb +0 -1
  309. data/yarn.lock +3412 -2933
  310. metadata +152 -289
  311. data/app/assets/stylesheets/lcms/engine/application.scss +0 -36
  312. data/app/assets/stylesheets/lcms/engine/vendors/jquery.tagsinput.css +0 -1
  313. data/app/exceptions/components_api_error.rb +0 -4
  314. data/app/exceptions/document_error.rb +0 -4
  315. data/app/exceptions/material_error.rb +0 -4
  316. data/app/javascript/packs/admin.js +0 -14
  317. data/app/models/lcms/engine/component.rb +0 -88
  318. data/app/presenters/lcms/engine/social_media_presenter.rb +0 -83
  319. data/app/views/lcms/engine/shared/_social_sharing.html.erb +0 -22
  320. data/db/migrate/20200217160930_change_document_parts_to_polymorphic.rb +0 -36
  321. data/db/migrate/20200218144849_drop_material_parts_table.rb +0 -7
  322. data/db/migrate/20200422130652_add_reimported_at_to_documents.rb +0 -7
  323. data/db/migrate/20200429130353_drop_pages.rb +0 -13
  324. data/db/seeds/pages.seeds.rb +0 -26
  325. data/lib/document_exporter.rb +0 -6
  326. data/lib/lcms/engine/migration.rb +0 -16
  327. data/spec/models/component_spec.rb +0 -60
  328. data/vendor/assets/javascripts/jquery.tagsinput.js +0 -1
@@ -22,7 +22,7 @@ describe Lcms::Engine::Admin::ResourceBulkEditsController do
22
22
  grades = resources.flat_map { |r| r.grades.list }
23
23
  expect(grades).to_not include('grade 11')
24
24
  post :create, params: { ids: ids, resource: { grades: ['grade 11'] } }
25
- expect(response).to redirect_to(:admin_resources)
25
+ expect(response).to redirect_to(lcms_engine(admin_resources_path))
26
26
  resources.each do |r|
27
27
  expect(r.reload.grades.list).to include('grade 11')
28
28
  end
@@ -27,7 +27,7 @@ describe Lcms::Engine::Admin::ResourcesController do
27
27
  subject { post :update, params: { id: resource.to_param, resource: params } }
28
28
 
29
29
  context 'with valid params' do
30
- it { is_expected.to redirect_to admin_resources_path }
30
+ it { is_expected.to redirect_to lcms_engine(admin_resources_path) }
31
31
 
32
32
  it 'passes notice' do
33
33
  subject
@@ -11,6 +11,6 @@ describe Lcms::Engine::Admin::SettingsController do
11
11
  expect(Lcms::Engine::Settings[:editing_enabled]).to be true
12
12
  patch :toggle_editing_enabled
13
13
  expect(Lcms::Engine::Settings[:editing_enabled]).to be false
14
- expect(response).to redirect_to(:admin_resources)
14
+ expect(response).to redirect_to(lcms_engine(admin_resources_path))
15
15
  end
16
16
  end
@@ -60,7 +60,7 @@ describe Lcms::Engine::Admin::StandardsController do
60
60
  subject { post :update, params: { id: standard.to_param, standard: params } }
61
61
 
62
62
  context 'with valid params' do
63
- it { is_expected.to redirect_to admin_standards_path }
63
+ it { is_expected.to redirect_to lcms_engine(admin_standards_path) }
64
64
 
65
65
  it 'passes notice' do
66
66
  subject
@@ -5,17 +5,19 @@ require 'rails_helper'
5
5
  describe Lcms::Engine::Admin::WelcomeController do
6
6
  let(:user) { create :admin }
7
7
 
8
- describe 'requires admin user' do
9
- before { get :index }
10
- it { expect(response).to redirect_to new_user_session_path }
11
- end
12
-
13
- describe 'allow admin' do
14
- before do
15
- sign_in user
16
- get :index
8
+ describe 'GET index' do
9
+ context 'requires admin user' do
10
+ before { get :index }
11
+ it { expect(response).to redirect_to lcms_engine(new_user_session_path) }
17
12
  end
18
13
 
19
- it { expect(response).to be_successful }
14
+ context 'allow admin' do
15
+ before do
16
+ sign_in user
17
+ get :index
18
+ end
19
+
20
+ it { expect(response).to be_successful }
21
+ end
20
22
  end
21
23
  end
@@ -49,19 +49,19 @@ xdescribe Lcms::Engine::ResourcesController do
49
49
  context 'with id' do
50
50
  before { get :show, id: resource.id }
51
51
 
52
- it { expect(response).to redirect_to("/#{resource.slug}") }
52
+ it { expect(response).to redirect_to("/lcms-engine#{resource.slug}") }
53
53
  end
54
54
 
55
55
  context 'grade' do
56
56
  let(:resource) { create(:resource, :grade) }
57
57
  before { get :show, slug: resource.slug }
58
- it { expect(response).to redirect_to explore_curriculum_index_path(p: resource.slug, e: 1) }
58
+ it { expect(response).to redirect_to lcms_engine(explore_curriculum_index_path(p: resource.slug, e: 1)) }
59
59
  end
60
60
 
61
61
  context 'module' do
62
62
  let(:resource) { create(:resource, :module) }
63
63
  before { get :show, slug: resource.slug }
64
- it { expect(response).to redirect_to explore_curriculum_index_path(p: resource.slug, e: 1) }
64
+ it { expect(response).to redirect_to lcms_engine(explore_curriculum_index_path(p: resource.slug, e: 1)) }
65
65
  end
66
66
  end
67
67
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe Lcms::Engine::WelcomeController do
6
+ #
7
+ # In the Host application should be a proxy which will redirect
8
+ # request inside mounted engine
9
+ #
10
+ describe 'GET oauth2callback' do
11
+ let(:code) { Faker::Lorem.words.join }
12
+
13
+ before { request.env['HTTP_REFERER'] = Lcms::Engine::WelcomeController::OAUTH_REFERER }
14
+
15
+ subject { get :oauth2callback, params: { code: code } }
16
+
17
+ it 'skips authorization' do
18
+ subject
19
+ expect(response).to be_successful
20
+ end
21
+
22
+ it 'renders passed in params as JSON' do
23
+ subject
24
+ result = JSON.parse(response.body)
25
+ expect(result['text']).to eq Lcms::Engine::WelcomeController::OAUTH_MESSAGE
26
+ expect(result['code']).to eq code
27
+ end
28
+
29
+ context 'when referer is not a Google service' do
30
+ before { request.env['HTTP_REFERER'] = 'test.com' }
31
+
32
+ it 'returns 404' do
33
+ subject
34
+ expect(response).to have_http_status(404)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -6,11 +6,9 @@ ignore_unreachable_actions:
6
6
  - lcms_engine
7
7
  - rails_info
8
8
  - rails_mailers
9
- - whoami$
10
9
  ignore_unused_routes:
11
10
  - ^lcms/engine/admin/access_codes#edit # accessed via `edit_admin_access_code_path`
12
11
  - ^lcms/engine/admin\/reading_assignment_texts # accessed via `association_picker_field` helper
13
12
  - ^devise
14
13
  - ^lcms/engine/pages#forthcoming # Used by `LinkTag`
15
14
  - ^pdfjs_viewer
16
- - whoami$
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
4
+ ENV["NODE_ENV"] ||= "development"
5
+
6
+ require "pathname"
7
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
8
+ Pathname.new(__FILE__).realpath)
9
+
10
+ require "bundler/setup"
11
+
12
+ require "webpacker"
13
+ require "webpacker/webpack_runner"
14
+
15
+ APP_ROOT = File.expand_path("..", __dir__)
16
+ Dir.chdir(APP_ROOT) do
17
+ Webpacker::WebpackRunner.run(ARGV)
18
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
4
+ ENV["NODE_ENV"] ||= "development"
5
+
6
+ require "pathname"
7
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
8
+ Pathname.new(__FILE__).realpath)
9
+
10
+ require "bundler/setup"
11
+
12
+ require "webpacker"
13
+ require "webpacker/dev_server_runner"
14
+
15
+ APP_ROOT = File.expand_path("..", __dir__)
16
+ Dir.chdir(APP_ROOT) do
17
+ Webpacker::DevServerRunner.run(ARGV)
18
+ end
@@ -17,7 +17,7 @@ require 'lcms/engine'
17
17
  module Dummy
18
18
  class Application < Rails::Application
19
19
  # Initialize configuration defaults for originally generated Rails version.
20
- config.load_defaults 5.2
20
+ config.load_defaults 6.1
21
21
 
22
22
  # Settings in config/environments/* take precedence over those specified here.
23
23
  # Application configuration can go into files in config/initializers
@@ -7,7 +7,7 @@ Rails.application.configure do
7
7
  # test suite. You never need to work with it otherwise. Remember that
8
8
  # your test database is "scratch space" for the test suite and is wiped
9
9
  # and recreated between test runs. Don't rely on the data there!
10
- config.cache_classes = true
10
+ config.cache_classes = false
11
11
 
12
12
  # Do not eager load code on boot. This avoids loading your whole application
13
13
  # just for the purpose of running a single test. If you are using a tool that
@@ -14,3 +14,9 @@ Rails.application.config.assets.version = '1.0'
14
14
  # application.js, application.css, and all non-JS/CSS in the app/assets
15
15
  # folder are already added.
16
16
  # Rails.application.config.assets.precompile += %w( admin.js admin.css )
17
+
18
+ # To prevent Sass errors
19
+ # See https://github.com/rails/sprockets/issues/581
20
+ Rails.application.config.assets.configure do |env|
21
+ env.export_concurrent = false
22
+ end
@@ -2,17 +2,13 @@
2
2
  # Admin layout
3
3
  layout: 'lcms/engine/admin'
4
4
 
5
- # TODO: Check the default values handling
6
- # Engine
7
- engine: 'Lcms::Engine::Engine'
8
-
9
5
  # TODO: Check the default values handling
10
6
  # Redirects
11
7
  redirect:
12
8
  host:
13
- # root_path: 'admin_path'
14
- # document_path: 'document_path'
15
- # material_path: 'material_path'
9
+ root_path: 'admin_path'
10
+ document_path: 'document_path'
11
+ material_path: 'material_path'
16
12
  engine:
17
13
  root_path: 'admin_path'
18
14
  document_path: 'document_path'
@@ -4,5 +4,11 @@ Rails.application.routes.draw do
4
4
  mount Lcms::Engine::Engine => '/lcms-engine'
5
5
  root to: redirect('/lcms-engine/')
6
6
 
7
+ get '/oauth2callback', to: redirect(path: '/lcms-engine/oauth2callback')
8
+
9
+ # Used for testing only
10
+ direct(:document) { '/' }
11
+ direct(:material) { '/' }
12
+
7
13
  get '/admin', to: 'welcome#index', as: :admin
8
14
  end
@@ -2,11 +2,11 @@
2
2
  # of editing this file, please use the migrations feature of Active Record to
3
3
  # incrementally modify your database, and then regenerate this schema definition.
4
4
  #
5
- # Note that this schema.rb definition is the authoritative source for your
6
- # database schema. If you need to create the application database on another
7
- # system, you should be using db:schema:load, not running all the migrations
8
- # from scratch. The latter is a flawed and unsustainable approach (the more migrations
9
- # you'll amass, the slower it'll run and the greater likelihood for issues).
5
+ # This file is the source Rails uses to define your schema when running `bin/rails
6
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
7
+ # be faster and is potentially less error prone than running all of your
8
+ # migrations from scratch. Old migrations may fail to apply correctly if those
9
+ # migrations use external dependencies or application code.
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
@@ -2,5 +2,6 @@
2
2
 
3
3
  FactoryBot.define do
4
4
  factory :document, class: Lcms::Engine::Document do
5
+ file_id { "file_#{SecureRandom.hex(6)}" }
5
6
  end
6
7
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  FactoryBot.define do
4
4
  factory :download, class: Lcms::Engine::Download do
5
- title { Faker::Lorem.words.join '' }
5
+ title { Faker::Lorem.words.join }
6
6
  url { Faker::Internet.url }
7
7
  end
8
8
  end
@@ -5,7 +5,7 @@ FactoryBot.define do
5
5
  curriculum { ::Lcms::Engine::Curriculum.default || create(:curriculum) }
6
6
  curriculum_type { 'lesson' }
7
7
  metadata do
8
- { subject: 'ela', grade: 'grade 2', 'module': 'module 1',
8
+ { subject: 'ela', grade: 'grade 2', module: 'module 1',
9
9
  unit: 'unit 1', lesson: 'lesson 1' }
10
10
  end
11
11
  resource_type { ::Lcms::Engine::Resource.resource_types[:resource] }
@@ -20,7 +20,7 @@ FactoryBot.define do
20
20
 
21
21
  trait :module do
22
22
  curriculum_type { 'module' }
23
- metadata { { subject: 'ela', grade: 'grade 2', 'module': 'module 1' } }
23
+ metadata { { subject: 'ela', grade: 'grade 2', module: 'module 1' } }
24
24
  end
25
25
  end
26
26
  end
@@ -44,6 +44,7 @@ feature 'Admin adds a material' do
44
44
  expect(page).to have_field :material_form_link
45
45
 
46
46
  fill_in :material_form_link, with: data[:url]
47
+ find('#material_form_async').uncheck
47
48
  click_button 'Parse'
48
49
 
49
50
  expect(Lcms::Engine::Material.last.name).to eql(data[:file_name])
@@ -66,6 +67,7 @@ feature 'Admin adds a material' do
66
67
  allow(Lcms::Engine::S3Service).to receive(:upload)
67
68
 
68
69
  fill_in :material_form_link, with: data[:url]
70
+ find('#material_form_async').uncheck
69
71
  click_button 'Parse'
70
72
 
71
73
  expect(Lcms::Engine::Material.last.name).to eql(data[:file_name])
@@ -7,7 +7,7 @@ feature 'Admin users' do
7
7
 
8
8
  given(:access_code) { create(:access_code).code }
9
9
  given(:admin) { create :admin }
10
- given(:domain) { ENV['APPLICATION_DOMAIN'] }
10
+ given(:domain) { ENV.fetch('APPLICATION_DOMAIN', nil) }
11
11
  given!(:user) { create :user, email: "unbounded@#{domain}" }
12
12
  given(:name) { Faker::Lorem.name }
13
13
  given(:email) { Faker::Internet.email }
@@ -57,7 +57,7 @@ feature 'Admin users' do
57
57
  click_button 'Save'
58
58
 
59
59
  user.reload
60
- expect(current_path).to eq lcms_engine.edit_admin_user_path(user.id)
60
+ expect(current_path).to eq lcms_engine.admin_users_path
61
61
  expect(page.find('.callout.success').text).to include('saved successfully')
62
62
  expect(user.email).to eq "unbounded@#{domain}"
63
63
  expect(user.unconfirmed_email).to eq "joe@#{domain}"
@@ -2,26 +2,26 @@
2
2
 
3
3
  require 'rails_helper'
4
4
 
5
- describe Lcms::Engine::Admin::AdminController do
6
- describe '.host_engine_path' do
5
+ describe Lcms::Engine::PathHelper do
6
+ describe '#dynamic_path' do
7
7
  let(:args) { { query: 'test', filter: '1' } }
8
8
 
9
- subject { described_class.host_engine_path(:root_path, args) }
9
+ subject { helper.dynamic_path(:root_path, args) }
10
10
 
11
11
  context 'with host redirect' do
12
12
  it 'builds correct path' do
13
- expect(subject).to eq "/lcms-engine/admin?#{args.to_param}"
13
+ expect(subject).to eq "/admin?#{args.to_param}"
14
14
  end
15
15
  end
16
16
 
17
17
  context 'with engine redirect' do
18
18
  let(:settings) do
19
- settings = described_class.settings
19
+ settings = Lcms::Engine::Admin::AdminController.settings
20
20
  settings[:redirect].delete(:host)
21
21
  settings
22
22
  end
23
23
 
24
- before { allow(described_class).to receive(:settings).and_return(settings) }
24
+ before { allow(Lcms::Engine::Admin::AdminController).to receive(:settings).and_return(settings) }
25
25
 
26
26
  it 'builds correct path' do
27
27
  expect(subject).to eq "/lcms-engine/admin?#{args.to_param}"
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rails_helper'
4
- require 'doc_template/objects/activity_metadata'
4
+ # require 'doc_template/objects/activity_metadata'
5
5
 
6
6
  describe DocTemplate::Objects::ActivityMetadata do
7
7
  describe '.build_from' do
@@ -15,6 +15,7 @@ describe DocTemplate::Objects::AgendaMetadata do
15
15
  end
16
16
  end
17
17
 
18
+ # rubocop:disable Naming/VariableNumber
18
19
  describe 'correct data' do
19
20
  describe 'calculates time hierarchily' do
20
21
  let(:agenda_table) do
@@ -116,5 +117,6 @@ describe DocTemplate::Objects::AgendaMetadata do
116
117
  end
117
118
  end
118
119
  end
120
+ # rubocop:enable Naming/VariableNumber
119
121
  end
120
122
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'rails_helper'
4
4
 
5
- describe DocTemplate::Objects::TOCMetadata do
5
+ describe DocTemplate::Objects::TocMetadata do
6
6
  let(:empty_toc) { {} }
7
7
  let(:l2_toc) do
8
8
  {
@@ -28,6 +28,6 @@ describe DocTemplate::Tags::PageBreakTag do
28
28
  context 'with soft returns on tag' do
29
29
  let(:original_content) { '<p><span>[page-break]</span>some content</p>' }
30
30
 
31
- it { expect { subject }.to raise_error(DocumentError) }
31
+ it { expect { subject }.to raise_error(Lcms::Engine::DocumentError) }
32
32
  end
33
33
  end
@@ -9,7 +9,7 @@ describe DocTemplate::Tags::PdTag do
9
9
  let(:original_content) { "<p><span>[PD: #{url}; #{title}; </span><span>#{description}]</span></p><p><span>" }
10
10
  let(:params) do
11
11
  {
12
- metadata: OpenStruct.new(resource_subject: 'ela'),
12
+ metadata: double('metadata', resource_subject: 'ela'),
13
13
  value: [url, title, description].join('; ')
14
14
  }
15
15
  end
@@ -111,7 +111,7 @@ describe Lcms::Engine::Document do
111
111
  subject { document.ordered_material_ids }
112
112
 
113
113
  it 'proxies the call to the TOC' do
114
- expect_any_instance_of(DocTemplate::Objects::TOCMetadata).to receive(:ordered_material_ids)
114
+ expect_any_instance_of(DocTemplate::Objects::TocMetadata).to receive(:ordered_material_ids)
115
115
  subject
116
116
  end
117
117
  end
@@ -8,6 +8,7 @@ describe Lcms::Engine::Standard do
8
8
  expect(obj).to be_valid
9
9
  end
10
10
 
11
+ # rubocop:disable Naming/VariableNumber
11
12
  describe '.search_by_name' do
12
13
  let(:alt_name) { 'a-synonym' }
13
14
  let(:name) { 'test-std' }
@@ -26,4 +27,5 @@ describe Lcms::Engine::Standard do
26
27
  expect(described_class.search_by_name(name).first).to eq standard_2
27
28
  end
28
29
  end
30
+ # rubocop:enable Naming/VariableNumber
29
31
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe Lcms::Engine::AdminMaterialsQuery do
6
+ describe 'filter by metadata' do
7
+ let(:query) { { lesson: 1, name_date: true } }
8
+ let(:scope) { double ActiveRecord::Relation }
9
+
10
+ before do
11
+ allow(Lcms::Engine::Material).to receive(:all).and_return(scope)
12
+ allow(scope).to receive_message_chain(:reorder, :distinct).and_return(scope)
13
+ end
14
+
15
+ subject { described_class.call query }
16
+
17
+ it 'filters by metadata using ILIKE' do
18
+ expect(scope).to receive(:where_metadata_like).with(:lesson, 1).and_return(scope)
19
+ expect(scope).to receive(:where_metadata_like).with(:name_date, true).and_return(scope)
20
+ subject
21
+ end
22
+
23
+ context 'strict metadata fields' do
24
+ let(:query) { { lesson: 1, grade: 'Grade 1', subject: Faker::Lorem.word } }
25
+
26
+ it 'filters by metadata using explicit comparison' do
27
+ expect(scope).to receive(:where_metadata_like).with(:lesson, 1).and_return(scope)
28
+ expect(scope).to receive(:where_metadata).with(hash_including(grade: query[:grade].downcase)).and_return(scope)
29
+ expect(scope).to receive(:where_metadata).with(query.slice(:subject)).and_return(scope)
30
+ subject
31
+ end
32
+
33
+ it 'filters case-insensitive' do
34
+ allow(scope).to receive(:where_metadata).with(query.slice(:subject)).and_return(scope)
35
+ allow(scope).to receive(:where_metadata_like).with(:lesson, 1).and_return(scope)
36
+ expect(scope).to receive(:where_metadata).with(hash_including(grade: query[:grade].downcase)).and_return(scope)
37
+ subject
38
+ end
39
+ end
40
+ end
41
+ end
data/spec/rails_helper.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is copied to spec/ when you run 'rails generate rspec:install'
4
+ require 'simplecov'
5
+ SimpleCov.start 'rails'
6
+
4
7
  require 'spec_helper'
5
8
 
6
9
  ENV['RAILS_ENV'] ||= 'test'
@@ -16,6 +19,9 @@ require 'email_spec'
16
19
  require 'email_spec/rspec'
17
20
  require 'faker'
18
21
 
22
+ Warning[:deprecated] = true
23
+ Warning[:experimental] = true
24
+
19
25
  Dir[File.expand_path('support/**/*.rb', __dir__)].sort.each(&method(:require))
20
26
  Dir[File.expand_path('**/shared_examples/*.rb')].sort.each(&method(:require))
21
27
 
@@ -32,21 +38,4 @@ RSpec.configure do |config|
32
38
  config.infer_spec_type_from_file_location!
33
39
 
34
40
  config.filter_rails_from_backtrace!
35
-
36
- config.before(:suite) do
37
- # Rails 4.2 call `initialize` inside `recycle!`. However Ruby 2.6 doesn't allow calling `initialize` twice.
38
- # See for detail: https://github.com/rails/rails/issues/34790
39
- if RUBY_VERSION.to_f >= 2.6 && Rails::VERSION::MAJOR == 4
40
- class ActionController::TestResponse # rubocop:disable Style/ClassAndModuleChildren
41
- prepend Module.new {
42
- def recycle!
43
- # Patch to avoid MonitorMixin double-initialize error:
44
- @mon_mutex_owner_object_id = nil
45
- @mon_mutex = nil
46
- super
47
- end
48
- }
49
- end
50
- end
51
- end
52
41
  end
@@ -10,29 +10,22 @@ describe Lcms::Engine::DocumentBuildService do
10
10
  let(:downloader) { double }
11
11
  let(:downloaded_document) { 'html-here' }
12
12
  let(:file) do
13
- OpenStruct.new(
14
- name: 'file name',
15
- modified_time: Time.current - 1.day
16
- )
13
+ double('file', name: 'file name', modified_time: Time.current - 1.day, last_modifying_user: 'User', version: '42')
17
14
  end
18
15
  let(:file_id) { 'Google Document file id' }
19
16
  let(:parsed_document) do
20
- OpenStruct.new(
21
- activity_metadata: [{ 'material_ids' => [] }],
22
- agenda: [],
23
- parts: []
24
- )
17
+ double('parsed_document', activity_metadata: [{ 'material_ids' => [] }], agenda: [], parts: [])
25
18
  end
26
19
  let(:template) do
27
20
  stubs = {
28
21
  css_styles: '',
29
22
  metadata: {},
30
- metadata_service: OpenStruct.new(errors: []),
23
+ metadata_service: double('service', errors: []),
31
24
  parse: parsed_document,
32
25
  parts: [],
33
26
  'prereq?' => false,
34
27
  render: '',
35
- toc: OpenStruct.new(collect_material_ids: [])
28
+ toc: double('toc', collect_material_ids: [])
36
29
  }
37
30
  instance_double DocTemplate::Template, stubs
38
31
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe Lcms::Engine::S3Service do
6
+ describe '.upload' do
7
+ let(:data) { StringIO.new('data to be uploaded') }
8
+ let(:full_options) { options.merge(body: data) }
9
+ let(:key) { 'path/to/file' }
10
+ let(:object) do
11
+ params = {
12
+ put: 'true',
13
+ public_url: url
14
+ }
15
+ double(::Aws::S3::Resource, **params)
16
+ end
17
+ let(:options) { { content_type: 'image/png' } }
18
+ let(:url) { Faker::Internet.url }
19
+
20
+ before { allow(described_class).to receive(:create_object).with(key).and_return(object) }
21
+
22
+ subject { described_class.upload(key, data, options) }
23
+
24
+ it 'uploads data with passed params' do
25
+ expect(object).to receive(:put).with(full_options)
26
+ subject
27
+ end
28
+
29
+ it 'returns URL of the uploaded object'
30
+ end
31
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'rails_helper'
4
4
 
5
+ # rubocop:disable Naming/VariableNumber
5
6
  shared_examples_for 'navigable' do # rubocop:disable Metrics/BlockLength
6
7
  let(:another_grandchild) { create factory }
7
8
  let(:child) { create factory }
@@ -71,3 +72,4 @@ shared_examples_for 'navigable' do # rubocop:disable Metrics/BlockLength
71
72
  end
72
73
  end
73
74
  end
75
+ # rubocop:enable Naming/VariableNumber
@@ -9,6 +9,10 @@ module Lcms
9
9
  included do
10
10
  routes { ::Lcms::Engine::Engine.routes }
11
11
  end
12
+
13
+ def lcms_engine(path)
14
+ "/lcms-engine#{path}"
15
+ end
12
16
  end
13
17
  end
14
18
  end