lcms-engine 0.3.0 → 0.4.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 (374) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -1
  3. data/.dockerignore +25 -0
  4. data/.env.docker +1 -1
  5. data/.eslintignore +2 -1
  6. data/.eslintrc +23 -73
  7. data/.nvmrc +1 -1
  8. data/.overcommit.yml +8 -2
  9. data/.prettierrc +7 -0
  10. data/.rubocop.yml +12 -8
  11. data/.ruby-version +1 -1
  12. data/.stylelintignore +9 -0
  13. data/.stylelintrc +8 -0
  14. data/CHANGELOG.md +50 -1
  15. data/Dockerfile +3 -3
  16. data/Gemfile.lock +408 -322
  17. data/README.md +20 -17
  18. data/app/assets/config/lcms_engine_manifest.js +4 -2
  19. data/app/assets/javascripts/lcms/engine/admin/{application.js → lcms_engine_application.js} +1 -3
  20. data/app/assets/javascripts/lcms/engine/initializers/foundation.js +1 -1
  21. data/app/assets/javascripts/lcms/engine/{application.js → lcms_engine_application.js} +0 -0
  22. data/app/assets/stylesheets/lcms/engine/admin/collections.scss +2 -1
  23. data/app/assets/stylesheets/lcms/engine/admin/components.scss +60 -19
  24. data/app/assets/stylesheets/lcms/engine/admin/curriculums.scss +12 -10
  25. data/app/assets/stylesheets/lcms/engine/admin/lessons.scss +21 -15
  26. data/app/assets/stylesheets/lcms/engine/admin/materials.scss +25 -17
  27. data/app/assets/stylesheets/lcms/engine/admin/resources.scss +8 -7
  28. data/app/assets/stylesheets/lcms/engine/admin/standards.scss +4 -1
  29. data/app/assets/stylesheets/lcms/engine/admin/users.scss +1 -1
  30. data/app/assets/stylesheets/lcms/engine/base/_colors.scss +8 -10
  31. data/app/assets/stylesheets/lcms/engine/base/_ld-colors.scss +10 -10
  32. data/app/assets/stylesheets/lcms/engine/components/_assoc-picker.scss +4 -5
  33. data/app/assets/stylesheets/lcms/engine/components/lesson/_activity.scss +6 -2
  34. data/app/assets/stylesheets/lcms/engine/components/lesson/_callout.scss +19 -5
  35. data/app/assets/stylesheets/lcms/engine/components/lesson/_columns.scss +4 -3
  36. data/app/assets/stylesheets/lcms/engine/components/lesson/_curriculum-map.scss +16 -7
  37. data/app/assets/stylesheets/lcms/engine/components/lesson/_def.scss +2 -2
  38. data/app/assets/stylesheets/lcms/engine/components/lesson/_expand.scss +9 -9
  39. data/app/assets/stylesheets/lcms/engine/components/lesson/_foundational-divider.scss +0 -1
  40. data/app/assets/stylesheets/lcms/engine/components/lesson/_group.scss +3 -1
  41. data/app/assets/stylesheets/lcms/engine/components/lesson/_icons.scss +1 -1
  42. data/app/assets/stylesheets/lcms/engine/components/lesson/_image-wrap.scss +2 -2
  43. data/app/assets/stylesheets/lcms/engine/components/lesson/_inset.scss +7 -2
  44. data/app/assets/stylesheets/lcms/engine/components/lesson/_materials.scss +1 -1
  45. data/app/assets/stylesheets/lcms/engine/components/lesson/_multiple-choice.scss +4 -1
  46. data/app/assets/stylesheets/lcms/engine/components/lesson/_override.scss +28 -9
  47. data/app/assets/stylesheets/lcms/engine/components/lesson/_pd.scss +7 -7
  48. data/app/assets/stylesheets/lcms/engine/components/lesson/_pv.scss +5 -4
  49. data/app/assets/stylesheets/lcms/engine/components/lesson/_section.scss +10 -3
  50. data/app/assets/stylesheets/lcms/engine/components/lesson/_selection-control.scss +14 -8
  51. data/app/assets/stylesheets/lcms/engine/components/lesson/_sidebar.scss +25 -10
  52. data/app/assets/stylesheets/lcms/engine/components/lesson/_title.scss +3 -1
  53. data/app/assets/stylesheets/lcms/engine/components/lesson/_unit-map.scss +1 -1
  54. data/app/assets/stylesheets/lcms/engine/components/material/_material.scss +3 -3
  55. data/app/assets/stylesheets/lcms/engine/components/material/_overlay.scss +12 -4
  56. data/app/assets/stylesheets/lcms/engine/components/material/_preview.scss +1 -1
  57. data/app/assets/stylesheets/lcms/engine/components/support/_survey.scss +3 -1
  58. data/app/assets/stylesheets/lcms/engine/layout/_footer.scss +29 -11
  59. data/app/assets/stylesheets/lcms/engine/layout/_header.scss +5 -5
  60. data/app/assets/stylesheets/lcms/engine/layout/_navigation.scss +4 -6
  61. data/app/assets/stylesheets/lcms/engine/layout/_page.scss +2 -2
  62. data/app/assets/stylesheets/lcms/engine/{admin.scss → lcms_engine_admin.scss} +26 -15
  63. data/app/assets/stylesheets/lcms/engine/lcms_engine_application.scss +9 -0
  64. data/app/assets/stylesheets/lcms/engine/pdf.scss +5 -26
  65. data/app/assets/stylesheets/lcms/engine/pdf_plain.scss +5 -23
  66. data/app/assets/stylesheets/lcms/engine/print/_base.scss +41 -12
  67. data/app/assets/stylesheets/lcms/engine/print/_cover.scss +12 -12
  68. data/app/assets/stylesheets/lcms/engine/print/_footer.scss +8 -3
  69. data/app/assets/stylesheets/lcms/engine/print/_gdoc-base.scss +10 -37
  70. data/app/assets/stylesheets/lcms/engine/print/_helpers.scss +5 -2
  71. data/app/assets/stylesheets/lcms/engine/print/_lesson-base.scss +2 -14
  72. data/app/assets/stylesheets/lcms/engine/print/_material-base.scss +1 -3
  73. data/app/assets/stylesheets/lcms/engine/print/_print.scss +15 -8
  74. data/app/assets/stylesheets/lcms/engine/print/_toc.scss +24 -9
  75. data/app/assets/stylesheets/lcms/engine/print/gdoc/_base-typography.scss +24 -6
  76. data/app/assets/stylesheets/lcms/engine/print/gdoc/_base.scss +10 -3
  77. data/app/assets/stylesheets/lcms/engine/print/gdoc/_colors.scss +3 -3
  78. data/app/assets/stylesheets/lcms/engine/print/gdoc/_header.scss +2 -2
  79. data/app/assets/stylesheets/lcms/engine/print/gdoc/_helpers.scss +1 -0
  80. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_activity.scss +1 -1
  81. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_agenda.scss +8 -2
  82. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_callout.scss +16 -6
  83. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_def.scss +1 -1
  84. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_dialogue.scss +3 -1
  85. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_expand.scss +5 -2
  86. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_image-wrap.scss +5 -3
  87. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_image.scss +1 -1
  88. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_optbreak.scss +1 -0
  89. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_section.scss +4 -1
  90. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_smp.scss +1 -0
  91. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_tables.scss +11 -3
  92. data/app/assets/stylesheets/lcms/engine/print/gdoc/material/_header.scss +5 -2
  93. data/app/assets/stylesheets/lcms/engine/print/lesson/_base-typography.scss +33 -9
  94. data/app/assets/stylesheets/lcms/engine/print/lesson/_group.scss +3 -1
  95. data/app/assets/stylesheets/lcms/engine/print/lesson/_image.scss +3 -1
  96. data/app/assets/stylesheets/lcms/engine/print/lesson/_materials.scss +1 -1
  97. data/app/assets/stylesheets/lcms/engine/print/lesson/_pd.scss +8 -4
  98. data/app/assets/stylesheets/lcms/engine/print/lesson/_section.scss +1 -1
  99. data/app/assets/stylesheets/lcms/engine/print/material/_header.scss +4 -1
  100. data/app/assets/stylesheets/lcms/engine/themes/_material.scss +11 -11
  101. data/app/assets/stylesheets/lcms/engine/utils/_colorcodes.scss +15 -5
  102. data/app/assets/stylesheets/lcms/engine/utils/_functions.scss +1 -1
  103. data/app/assets/stylesheets/lcms/engine/utils/_helpers.scss +23 -11
  104. data/app/assets/stylesheets/lcms/engine/utils/_placeholders.scss +1 -1
  105. data/app/assets/stylesheets/lcms/engine/utils/_variables.scss +11 -11
  106. data/app/assets/stylesheets/lcms/engine/vendors/{mathjax.css → mathjax.scss} +0 -0
  107. data/app/assets/stylesheets/lcms/engine/vendors/react-tagsinput.css +48 -0
  108. data/app/controllers/concerns/lcms/engine/reimportable.rb +12 -2
  109. data/app/controllers/lcms/engine/admin/access_codes_controller.rb +8 -3
  110. data/app/controllers/lcms/engine/admin/admin_controller.rb +6 -40
  111. data/app/controllers/lcms/engine/admin/association_picker_controller.rb +4 -1
  112. data/app/controllers/lcms/engine/admin/batch_reimports_controller.rb +2 -2
  113. data/app/controllers/lcms/engine/admin/curriculums_controller.rb +21 -2
  114. data/app/controllers/lcms/engine/admin/documents_controller.rb +41 -14
  115. data/app/controllers/lcms/engine/admin/materials_controller.rb +32 -13
  116. data/app/controllers/lcms/engine/admin/resource_bulk_edits_controller.rb +2 -2
  117. data/app/controllers/lcms/engine/admin/resources_controller.rb +9 -7
  118. data/app/controllers/lcms/engine/admin/settings_controller.rb +1 -1
  119. data/app/controllers/lcms/engine/admin/standards_controller.rb +7 -2
  120. data/app/controllers/lcms/engine/admin/users_controller.rb +15 -7
  121. data/app/controllers/lcms/engine/application_controller.rb +1 -1
  122. data/app/controllers/lcms/engine/resources_controller.rb +5 -5
  123. data/app/controllers/lcms/engine/welcome_controller.rb +11 -0
  124. data/app/entities/lcms/engine/grades.rb +17 -6
  125. data/app/entities/lcms/engine/hierarchical_position.rb +1 -2
  126. data/app/entities/lcms/engine/media_embed.rb +2 -2
  127. data/app/entities/lcms/engine/pagination.rb +14 -10
  128. data/app/entities/lcms/engine/roman_numerals.rb +2 -2
  129. data/app/exceptions/lcms/engine/document_error.rb +8 -0
  130. data/app/exceptions/lcms/engine/material_error.rb +8 -0
  131. data/app/forms/lcms/engine/document_form.rb +19 -14
  132. data/app/forms/lcms/engine/material_form.rb +3 -2
  133. data/app/helpers/admin/components_helper.rb +3 -3
  134. data/app/helpers/lcms/engine/path_helper.rb +32 -0
  135. data/app/helpers/lcms/engine/resource_helper.rb +1 -1
  136. data/app/helpers/lcms/engine/view_helper.rb +1 -9
  137. data/app/interactors/lcms/engine/explore_curriculum_interactor.rb +2 -2
  138. data/app/javascript/components/admin/ImportStatus.jsx +90 -56
  139. data/app/javascript/components/admin/Initializer.jsx +33 -35
  140. data/app/javascript/components/admin/MultiSelectedOperation.jsx +43 -18
  141. data/app/javascript/components/admin/association-picker/AssociationPicker.jsx +68 -47
  142. data/app/javascript/components/admin/association-picker/AssociationPickerItem.jsx +18 -7
  143. data/app/javascript/components/admin/association-picker/AssociationPickerResults.jsx +42 -17
  144. data/app/javascript/components/admin/association-picker/AssociationPickerWindow.jsx +47 -27
  145. data/app/javascript/components/admin/curriculum/CurriculumEditor.jsx +54 -32
  146. data/app/javascript/components/admin/curriculum/DirectoryPicker.jsx +80 -53
  147. data/app/javascript/components/admin/picker/PickerButton.jsx +16 -11
  148. data/app/javascript/components/admin/picker/pickerModal.jsx +6 -6
  149. data/app/javascript/components/admin/picker/pickerWindowWrapper.jsx +61 -40
  150. data/app/javascript/components/admin/resource-picker/ResourcePicker.jsx +54 -39
  151. data/app/javascript/components/admin/resource-picker/ResourcePickerResource.jsx +14 -3
  152. data/app/javascript/components/admin/resource-picker/ResourcePickerWindow.jsx +50 -21
  153. data/app/javascript/components/paginate/PageView.jsx +20 -8
  154. data/app/javascript/components/paginate/PaginationBoxView.jsx +78 -66
  155. data/app/javascript/components/paginate/PaginationListView.jsx +59 -45
  156. data/app/javascript/packs/lcms_engine_admin.js +15 -0
  157. data/app/javascript/packs/{application.js → lcms_engine_application.js} +5 -4
  158. data/app/javascript/packs/server_rendering.js +1 -0
  159. data/app/javascript/vendor/jstree/jstree.min.js +6 -0
  160. data/app/javascript/vendor/jstree/themes/default/32px.png +0 -0
  161. data/app/javascript/vendor/jstree/themes/default/40px.png +0 -0
  162. data/app/javascript/vendor/jstree/themes/default/style.css +1106 -0
  163. data/app/javascript/vendor/jstree/themes/default/style.min.css +1 -0
  164. data/app/javascript/vendor/jstree/themes/default/throbber.gif +0 -0
  165. data/app/javascript/vendor/jstree/themes/default-dark/32px.png +0 -0
  166. data/app/javascript/vendor/jstree/themes/default-dark/40px.png +0 -0
  167. data/app/javascript/vendor/jstree/themes/default-dark/style.css +1150 -0
  168. data/app/javascript/vendor/jstree/themes/default-dark/style.min.css +1 -0
  169. data/app/javascript/vendor/jstree/themes/default-dark/throbber.gif +0 -0
  170. data/app/jobs/concerns/lcms/engine/nested_resque_job.rb +1 -4
  171. data/app/jobs/lcms/engine/document_generate_gdoc_job.rb +2 -2
  172. data/app/jobs/lcms/engine/document_generate_job.rb +2 -2
  173. data/app/jobs/lcms/engine/document_generate_pdf_job.rb +5 -5
  174. data/app/jobs/lcms/engine/document_parse_job.rb +1 -1
  175. data/app/jobs/lcms/engine/material_generate_pdf_job.rb +4 -4
  176. data/app/models/concerns/lcms/engine/navigable.rb +6 -10
  177. data/app/models/concerns/lcms/engine/searchable.rb +7 -0
  178. data/app/models/lcms/engine/document.rb +1 -1
  179. data/app/models/lcms/engine/download.rb +1 -1
  180. data/app/models/lcms/engine/resource.rb +1 -1
  181. data/app/models/lcms/engine/search/document.rb +4 -3
  182. data/app/models/lcms/engine/search/repository.rb +1 -1
  183. data/app/presenters/lcms/engine/content_presenter.rb +1 -1
  184. data/app/presenters/lcms/engine/curriculum_presenter.rb +21 -18
  185. data/app/presenters/lcms/engine/document_presenter.rb +5 -3
  186. data/app/presenters/lcms/engine/resource_presenter.rb +6 -3
  187. data/app/queries/lcms/engine/admin_documents_query.rb +2 -2
  188. data/app/queries/lcms/engine/admin_materials_query.rb +11 -2
  189. data/app/queries/lcms/engine/base_query.rb +1 -1
  190. data/app/serializers/lcms/engine/previews_material_serializer.rb +1 -0
  191. data/app/services/lcms/engine/document_build_service.rb +6 -0
  192. data/app/services/lcms/engine/document_generator.rb +2 -2
  193. data/app/services/lcms/engine/google/drive_service.rb +7 -15
  194. data/app/services/lcms/engine/google/script_service.rb +7 -3
  195. data/app/services/lcms/engine/html_sanitizer.rb +6 -6
  196. data/app/services/lcms/engine/lessons_gdoc_bundler.rb +1 -1
  197. data/app/services/lcms/engine/lti_exporter.rb +1 -1
  198. data/app/services/lcms/engine/material_build_service.rb +6 -2
  199. data/app/services/lcms/engine/material_preview_generator.rb +3 -3
  200. data/app/services/lcms/engine/react_materials_resolver.rb +3 -2
  201. data/app/services/lcms/engine/s3_service.rb +14 -2
  202. data/app/tasks/resource_tasks.rb +2 -2
  203. data/app/views/layouts/lcms/engine/admin.html.erb +3 -3
  204. data/app/views/layouts/lcms/engine/application.html.erb +2 -2
  205. data/app/views/layouts/lcms/engine/lti.html.erb +1 -1
  206. data/app/views/lcms/engine/admin/access_codes/_form.html.erb +1 -1
  207. data/app/views/lcms/engine/admin/access_codes/index.html.erb +3 -3
  208. data/app/views/lcms/engine/admin/batch_reimports/_search_form.html.erb +2 -2
  209. data/app/views/lcms/engine/admin/curriculums/edit.html.erb +5 -5
  210. data/app/views/lcms/engine/admin/documents/_materials_links.html.erb +2 -2
  211. data/app/views/lcms/engine/admin/documents/_reimport.html.erb +1 -1
  212. data/app/views/lcms/engine/admin/documents/_search_form.html.erb +2 -2
  213. data/app/views/lcms/engine/admin/documents/import.html.erb +1 -1
  214. data/app/views/lcms/engine/admin/documents/index.html.erb +7 -5
  215. data/app/views/lcms/engine/admin/documents/new.html.erb +6 -2
  216. data/app/views/lcms/engine/admin/materials/_reimport.html.erb +1 -1
  217. data/app/views/lcms/engine/admin/materials/_search_form.html.erb +2 -2
  218. data/app/views/lcms/engine/admin/materials/import.html.erb +1 -1
  219. data/app/views/lcms/engine/admin/materials/index.html.erb +26 -22
  220. data/app/views/lcms/engine/admin/materials/new.html.erb +5 -1
  221. data/app/views/lcms/engine/admin/resource_bulk_edits/new.html.erb +2 -2
  222. data/app/views/lcms/engine/admin/resources/_fields.html.erb +4 -0
  223. data/app/views/lcms/engine/admin/resources/_form.html.erb +1 -1
  224. data/app/views/lcms/engine/admin/resources/_search_form.html.erb +2 -2
  225. data/app/views/lcms/engine/admin/resources/index.html.erb +7 -5
  226. data/app/views/lcms/engine/admin/shared/_header.html.erb +12 -12
  227. data/app/views/lcms/engine/admin/standards/_form.html.erb +3 -1
  228. data/app/views/lcms/engine/admin/standards/_search_form.html.erb +1 -1
  229. data/app/views/lcms/engine/admin/users/_form.html.erb +1 -1
  230. data/app/views/lcms/engine/admin/users/_search_form.html.erb +1 -1
  231. data/app/views/lcms/engine/admin/users/index.html.erb +6 -6
  232. data/app/views/lcms/engine/documents/gdoc/_agenda.html.erb +1 -1
  233. data/app/views/lcms/engine/documents/show.html.erb +1 -1
  234. data/app/views/lcms/engine/materials/show.html.erb +1 -1
  235. data/app/views/lcms/engine/pages/not_found.html.erb +5 -0
  236. data/app/views/lcms/engine/resources/_download.html.erb +2 -2
  237. data/app/views/lcms/engine/resources/_unit_bundles.html.erb +2 -2
  238. data/app/views/lcms/engine/resources/generic.html.erb +0 -4
  239. data/app/views/lcms/engine/resources/media.html.erb +0 -4
  240. data/app/views/lcms/engine/resources/show.html.erb +0 -2
  241. data/config/initializers/airbrake.rb +62 -10
  242. data/config/initializers/bitly.rb +1 -1
  243. data/config/initializers/carrier_wave.rb +6 -4
  244. data/config/initializers/ckeditor.rb +6 -0
  245. data/config/initializers/elasticsearch.rb +1 -1
  246. data/config/initializers/resque.rb +2 -2
  247. data/config/locales/admin/en.yml +1 -2
  248. data/config/locales/ui/en.yml +1 -0
  249. data/config/routes.rb +5 -2
  250. data/db/migrate/.keep +0 -0
  251. data/db/schema.rb +280 -312
  252. data/db/seeds.rb +0 -1
  253. data/docker-compose.ror4.yml +32 -0
  254. data/docker-compose.yml +6 -3
  255. data/docs/env-variables.md +40 -40
  256. data/docs/google-cloud-platform-setup.md +45 -17
  257. data/docs/how-to-build-and-publish.md +1 -0
  258. data/lcms-engine.gemspec +28 -20
  259. data/lib/doc_template/document.rb +3 -4
  260. data/lib/doc_template/document_toc.rb +2 -2
  261. data/lib/doc_template/objects/activity_metadata.rb +1 -1
  262. data/lib/doc_template/objects/agenda_metadata.rb +1 -1
  263. data/lib/doc_template/objects/metadata_helpers.rb +1 -1
  264. data/lib/doc_template/objects/toc_helpers.rb +4 -4
  265. data/lib/doc_template/objects/toc_metadata.rb +4 -6
  266. data/lib/doc_template/tables/base.rb +3 -2
  267. data/lib/doc_template/tags/activity_metadata_type_tag.rb +1 -1
  268. data/lib/doc_template/tags/answer_space_tag.rb +2 -2
  269. data/lib/doc_template/tags/base_tag.rb +5 -5
  270. data/lib/doc_template/tags/block_tag.rb +1 -1
  271. data/lib/doc_template/tags/columns_tag.rb +1 -1
  272. data/lib/doc_template/tags/def_tag.rb +1 -1
  273. data/lib/doc_template/tags/expand_tag.rb +1 -0
  274. data/lib/doc_template/tags/heading_tag.rb +1 -1
  275. data/lib/doc_template/tags/inset_tag.rb +2 -2
  276. data/lib/doc_template/tags/latex_tag.rb +1 -1
  277. data/lib/doc_template/tags/page_break_tag.rb +1 -1
  278. data/lib/doc_template/tags/pd_tag.rb +4 -4
  279. data/lib/doc_template/tags/section_tag.rb +2 -2
  280. data/lib/doc_template/tags/standard_tag.rb +3 -3
  281. data/lib/doc_template/tags/table_preserve_alignment_tag.rb +1 -1
  282. data/lib/doc_template/tags/table_tag.rb +1 -1
  283. data/lib/doc_template/template.rb +1 -1
  284. data/lib/doc_template.rb +9 -9
  285. data/lib/document_exporter/gdoc/base.rb +6 -3
  286. data/lib/document_exporter/pdf/base.rb +1 -1
  287. data/lib/document_exporter/pdf/document.rb +2 -2
  288. data/lib/document_exporter/pdf/material.rb +2 -2
  289. data/lib/document_exporter/pdf/student_material.rb +2 -2
  290. data/lib/document_exporter/pdf/teacher_material.rb +2 -2
  291. data/lib/document_renderer/part.rb +4 -6
  292. data/lib/elasticsearch/persistence/repository/response/results.rb +1 -1
  293. data/lib/lcms/engine/engine.rb +10 -9
  294. data/lib/lcms/engine/version.rb +1 -1
  295. data/lib/lcms/engine.rb +0 -1
  296. data/lib/lt/lcms/metadata/base_service.rb +2 -1
  297. data/lib/lt/lcms/metadata/context.rb +58 -54
  298. data/lib/lt/lcms/metadata/service.rb +6 -3
  299. data/lib/resque_job.rb +3 -6
  300. data/lib/standard_importer.rb +4 -4
  301. data/lib/tasks/cloud66.rake +8 -6
  302. data/lib/tasks/document.rake +7 -7
  303. data/lib/tasks/google.rake +29 -14
  304. data/lib/tasks/lcms/engine_tasks.rake +1 -1
  305. data/package.json +31 -9
  306. data/postcss.config.js +12 -0
  307. data/spec/controllers/admin/association_picker_controller_spec.rb +6 -8
  308. data/spec/controllers/admin/curriculums_controller_spec.rb +23 -0
  309. data/spec/controllers/admin/documents_controller_spec.rb +25 -3
  310. data/spec/controllers/admin/materials_controller_spec.rb +17 -4
  311. data/spec/controllers/admin/resource_bulk_edit_controller_spec.rb +1 -1
  312. data/spec/controllers/admin/resources_controller_spec.rb +3 -3
  313. data/spec/controllers/admin/settings_controller_spec.rb +1 -1
  314. data/spec/controllers/admin/standards_controller_spec.rb +1 -1
  315. data/spec/controllers/admin/welcome_controller_spec.rb +12 -10
  316. data/spec/controllers/resources_controller_spec.rb +3 -3
  317. data/spec/controllers/welcome_controller_spec.rb +38 -0
  318. data/spec/dummy/.env.docker +5 -0
  319. data/spec/dummy/.traceroute.yaml +0 -2
  320. data/spec/dummy/bin/webpack +18 -0
  321. data/spec/dummy/bin/webpack-dev-server +18 -0
  322. data/spec/dummy/config/application.rb +1 -1
  323. data/spec/dummy/config/environments/production.rb +1 -1
  324. data/spec/dummy/config/environments/test.rb +1 -1
  325. data/spec/dummy/config/initializers/assets.rb +6 -0
  326. data/spec/dummy/config/lcms-admin.yml +3 -7
  327. data/spec/dummy/config/puma.rb +3 -3
  328. data/spec/dummy/config/routes.rb +6 -0
  329. data/spec/dummy/db/schema.rb +5 -5
  330. data/spec/entities/grades_spec.rb +12 -0
  331. data/spec/factories/documents.rb +1 -0
  332. data/spec/factories/downloads.rb +1 -1
  333. data/spec/factories/resources.rb +2 -2
  334. data/spec/features/admin/lessons/add_lesson_spec.rb +3 -3
  335. data/spec/features/admin/materials/add_material_spec.rb +5 -3
  336. data/spec/features/admin/users_spec.rb +2 -2
  337. data/spec/forms/document_form_spec.rb +11 -1
  338. data/spec/{controllers/admin/admin_controller_spec.rb → helpers/path_helper_spec.rb} +6 -6
  339. data/spec/lib/doc_template/objects/activity_metadata_spec.rb +1 -1
  340. data/spec/lib/doc_template/objects/agenda_metadata_spec.rb +2 -0
  341. data/spec/lib/doc_template/objects/toc_metadata_spec.rb +1 -1
  342. data/spec/lib/doc_template/tables/shared_examples/remove_table.rb +1 -1
  343. data/spec/lib/doc_template/tags/page_break_tag_spec.rb +1 -1
  344. data/spec/lib/doc_template/tags/pd_tag_spec.rb +1 -1
  345. data/spec/models/document_spec.rb +1 -1
  346. data/spec/models/standard_spec.rb +2 -0
  347. data/spec/queries/lcms/engine/admin_materials_query_spec.rb +34 -0
  348. data/spec/rails_helper.rb +8 -2
  349. data/spec/services/document_build_service_spec.rb +4 -11
  350. data/spec/services/s3_service_spec.rb +31 -0
  351. data/spec/support/concerns/navigable.rb +2 -0
  352. data/spec/support/routes.rb +4 -0
  353. data/spec/support/shared_examples/content_tag.rb +4 -4
  354. data/templates/routes.rb +0 -1
  355. data/yarn.lock +3447 -2993
  356. metadata +208 -303
  357. data/app/assets/stylesheets/lcms/engine/application.scss +0 -36
  358. data/app/assets/stylesheets/lcms/engine/vendors/jquery.tagsinput.css +0 -1
  359. data/app/exceptions/components_api_error.rb +0 -4
  360. data/app/exceptions/document_error.rb +0 -4
  361. data/app/exceptions/material_error.rb +0 -4
  362. data/app/javascript/packs/admin.js +0 -14
  363. data/app/models/lcms/engine/component.rb +0 -88
  364. data/app/presenters/lcms/engine/social_media_presenter.rb +0 -83
  365. data/app/views/lcms/engine/shared/_social_sharing.html.erb +0 -22
  366. data/db/migrate/20200217160930_change_document_parts_to_polymorphic.rb +0 -36
  367. data/db/migrate/20200218144849_drop_material_parts_table.rb +0 -7
  368. data/db/migrate/20200422130652_add_reimported_at_to_documents.rb +0 -7
  369. data/db/migrate/20200429130353_drop_pages.rb +0 -13
  370. data/db/seeds/pages.seeds.rb +0 -26
  371. data/lib/document_exporter.rb +0 -6
  372. data/lib/lcms/engine/migration.rb +0 -16
  373. data/spec/models/component_spec.rb +0 -60
  374. data/vendor/assets/javascripts/jquery.tagsinput.js +0 -1
@@ -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'
@@ -6,16 +6,16 @@
6
6
  # the maximum value specified for Puma. Default is set to 5 threads for minimum
7
7
  # and maximum; this matches the default thread size of Active Record.
8
8
  #
9
- threads_count = ENV.fetch('RAILS_MAX_THREADS') { 5 }
9
+ threads_count = ENV.fetch('RAILS_MAX_THREADS', 5)
10
10
  threads threads_count, threads_count
11
11
 
12
12
  # Specifies the `port` that Puma will listen on to receive requests; default is 3000.
13
13
  #
14
- port ENV.fetch('PORT') { 3000 }
14
+ port ENV.fetch('PORT', 3000)
15
15
 
16
16
  # Specifies the `environment` that Puma will run in.
17
17
  #
18
- environment ENV.fetch('RAILS_ENV') { 'development' }
18
+ environment ENV.fetch('RAILS_ENV', 'development')
19
19
 
20
20
  # Specifies the number of `workers` to boot in clustered mode.
21
21
  # Workers are forked webserver processes. If using threads and workers together
@@ -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
 
@@ -8,6 +8,18 @@ describe Lcms::Engine::Grades do
8
8
  let(:dir) { [] }
9
9
  let(:resource) { create :resource, metadata: { grade: dir.uniq } }
10
10
 
11
+ describe 'grades' do
12
+ it 'returns GRADES constant' do
13
+ expect(described_class.grades).to eq Lcms::Engine::Grades::GRADES
14
+ end
15
+ end
16
+
17
+ describe 'gardes_abbrevs' do
18
+ it 'returns GRADES_ABBR constant' do
19
+ expect(described_class.grades_abbrevs).to eq Lcms::Engine::Grades::GRADES_ABBR
20
+ end
21
+ end
22
+
11
23
  describe 'list' do
12
24
  let(:dir) { ['grade 2'] }
13
25
  let(:search_doc) { Lcms::Engine::Search::Document.new(grade: ['kindergarten']) }
@@ -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
@@ -3,9 +3,9 @@
3
3
  require 'rails_helper'
4
4
 
5
5
  feature 'Admin adds a lesson' do
6
- SAMPLE_LESSON_PATH = 'spec/features/admin/lessons/sample-lessons'
6
+ given(:sample_lesson_path) { 'spec/features/admin/lessons/sample-lessons' }
7
7
 
8
- DownloadedFile = Struct.new :last_modifying_user, :modified_time, :name, :version
8
+ given(:downloaded_file) { Struct.new :last_modifying_user, :modified_time, :name, :version }
9
9
 
10
10
  given(:sample_lessons) do
11
11
  [
@@ -43,7 +43,7 @@ feature 'Admin adds a lesson' do
43
43
 
44
44
  # stub GDoc download
45
45
  file_content = File.read File.join(SAMPLE_LESSON_PATH, data[:file_name])
46
- allow_any_instance_of(DocumentDownloader::Gdoc).to receive(:file).and_return(DownloadedFile.new(nil, nil, idx))
46
+ allow_any_instance_of(DocumentDownloader::Gdoc).to receive(:file).and_return(downloaded_file.new(nil, nil, idx))
47
47
  allow_any_instance_of(DocumentDownloader::Gdoc).to receive(:content).and_return(file_content)
48
48
 
49
49
  fill_in :document_form_link, with: data[:url]
@@ -6,7 +6,7 @@ require 'lt/lcms/lesson/downloader/gdoc'
6
6
  require 'lt/lcms/lesson/downloader/pdf'
7
7
 
8
8
  feature 'Admin adds a material' do
9
- SAMPLE_PATH = 'spec/features/admin/materials/sample-materials'
9
+ given(:sample_path) { 'spec/features/admin/materials/sample-materials' }
10
10
 
11
11
  given(:downloaded_file) { Struct.new :last_modifying_user, :modified_time, :name, :version }
12
12
 
@@ -34,7 +34,7 @@ feature 'Admin adds a material' do
34
34
  data = samples[:gdoc]
35
35
 
36
36
  # stub GDoc download
37
- file_content = File.read File.join(SAMPLE_PATH, data[:file_name])
37
+ file_content = File.read File.join(sample_path, data[:file_name])
38
38
  base_klass = ::Lt::Lcms::Lesson::Downloader::Base
39
39
  gdoc_klass = ::Lt::Lcms::Lesson::Downloader::Gdoc
40
40
  allow_any_instance_of(base_klass).to receive(:file).and_return(downloaded_file.new(nil, nil, data[:file_name]))
@@ -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])
@@ -59,13 +60,14 @@ feature 'Admin adds a material' do
59
60
  base_klass = ::Lt::Lcms::Lesson::Downloader::Base
60
61
  allow_any_instance_of(base_klass).to receive(:file).and_return(downloaded_file.new(nil, nil, data[:file_name]))
61
62
 
62
- file_content = File.read File.join(SAMPLE_PATH, data[:file_name])
63
+ file_content = File.read File.join(sample_path, data[:file_name])
63
64
  allow_any_instance_of(Lt::Lcms::Lesson::Downloader::PDF).to receive(:pdf_content).and_return(file_content)
64
65
  allow_any_instance_of(DocumentExporter::Thumbnail).to receive(:export)
65
66
  allow_any_instance_of(DocumentExporter::Thumbnail).to receive(:orientation)
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}"
@@ -10,7 +10,7 @@ describe Lcms::Engine::DocumentForm do
10
10
 
11
11
  describe '#save' do
12
12
  let(:document) { create :document }
13
- let(:service) { instance_double('DocumentBuildService', build_for: document) }
13
+ let(:service) { instance_double('DocumentBuildService', build_for: document, errors: []) }
14
14
 
15
15
  subject { form.save }
16
16
 
@@ -64,6 +64,16 @@ describe Lcms::Engine::DocumentForm do
64
64
  subject
65
65
  end
66
66
  end
67
+
68
+ context 'when there are non-critical errors' do
69
+ let(:errors) { %w(error-1 error-2 error-3) }
70
+ let(:service) { instance_double('DocumentBuildService', build_for: document, errors: errors) }
71
+
72
+ it 'store service errors' do
73
+ subject
74
+ expect(form.service_errors).to eq errors
75
+ end
76
+ end
67
77
  end
68
78
 
69
79
  context 'when is invalid' do
@@ -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
  {
@@ -4,7 +4,7 @@ require 'rails_helper'
4
4
 
5
5
  shared_examples 'removes metadata table' do
6
6
  it 'removes original table' do
7
- table_html = %r{<span\s+[^.]*>\[?#{described_class::HEADER_LABEL}\]?<\/span>}im
7
+ table_html = %r{<span\s+[^.]*>\[?#{described_class::HEADER_LABEL}\]?</span>}im
8
8
  subject
9
9
  expect(fragment.to_html).to_not match(table_html)
10
10
  end
@@ -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,34 @@
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(query.slice(:grade)).and_return(scope)
29
+ expect(scope).to receive(:where_metadata).with(query.slice(:subject)).and_return(scope)
30
+ subject
31
+ end
32
+ end
33
+ end
34
+ 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,8 +19,11 @@ require 'email_spec'
16
19
  require 'email_spec/rspec'
17
20
  require 'faker'
18
21
 
19
- Dir[File.expand_path('support/**/*.rb', __dir__)].each(&method(:require))
20
- Dir[File.expand_path('**/shared_examples/*.rb')].each(&method(:require))
22
+ Warning[:deprecated] = true
23
+ Warning[:experimental] = true
24
+
25
+ Dir[File.expand_path('support/**/*.rb', __dir__)].sort.each(&method(:require))
26
+ Dir[File.expand_path('**/shared_examples/*.rb')].sort.each(&method(:require))
21
27
 
22
28
  # Checks for pending migrations and applies them before tests are run.
23
29
  # If you are not using ActiveRecord, you can remove these lines.
@@ -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: nil,
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
@@ -11,7 +11,7 @@ shared_examples 'content_tag' do # rubocop:disable Metrics/BlockLength
11
11
  HTML
12
12
  end
13
13
 
14
- it { expect { subject }.to raise_error(DocumentError) }
14
+ it { expect { subject }.to raise_error(Lcms::Engine::DocumentError) }
15
15
  end
16
16
 
17
17
  context 'with soft return before start tag' do
@@ -22,7 +22,7 @@ shared_examples 'content_tag' do # rubocop:disable Metrics/BlockLength
22
22
  HTML
23
23
  end
24
24
 
25
- it { expect { subject }.to raise_error(DocumentError) }
25
+ it { expect { subject }.to raise_error(Lcms::Engine::DocumentError) }
26
26
  end
27
27
 
28
28
  context 'with soft return before stop tag' do
@@ -34,7 +34,7 @@ shared_examples 'content_tag' do # rubocop:disable Metrics/BlockLength
34
34
  HTML
35
35
  end
36
36
 
37
- it { expect { subject }.to raise_error(DocumentError) }
37
+ it { expect { subject }.to raise_error(Lcms::Engine::DocumentError) }
38
38
  end
39
39
 
40
40
  context 'with soft return after stop tag' do
@@ -46,6 +46,6 @@ shared_examples 'content_tag' do # rubocop:disable Metrics/BlockLength
46
46
  HTML
47
47
  end
48
48
 
49
- it { expect { subject }.to raise_error(DocumentError) }
49
+ it { expect { subject }.to raise_error(Lcms::Engine::DocumentError) }
50
50
  end
51
51
  end
data/templates/routes.rb CHANGED
@@ -54,7 +54,6 @@ Rails.application.routes.draw do
54
54
 
55
55
  namespace :admin do
56
56
  get '/' => 'welcome#index'
57
- get '/whoami' => 'admin#whoami'
58
57
  get 'google_oauth2_callback' => 'google_oauth2#callback'
59
58
  get '/association_picker' => 'association_picker#index'
60
59
  resources :reading_assignment_texts