workarea-blog 3.4.7

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 (213) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +20 -0
  3. data/.eslintignore +2 -0
  4. data/.eslintrc +24 -0
  5. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  6. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  7. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  8. data/.gitignore +16 -0
  9. data/.rspec +2 -0
  10. data/.scss-lint.yml +188 -0
  11. data/.tailor +180 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +1123 -0
  14. data/CODE_OF_CONDUCT.md +3 -0
  15. data/CONTRIBUTING.md +3 -0
  16. data/Gemfile +7 -0
  17. data/LICENSE +52 -0
  18. data/README.md +140 -0
  19. data/Rakefile +42 -0
  20. data/app/assets/images/workarea/admin/blog/content_block_types/blog_entry.svg +1 -0
  21. data/app/assets/images/workarea/admin/blog/icons/blog.svg +1 -0
  22. data/app/assets/images/workarea/admin/blog/icons/blog_entry.svg +1 -0
  23. data/app/assets/images/workarea/admin/blog/icons/blog_post_comment.svg +1 -0
  24. data/app/assets/javascripts/workarea/storefront/blog/modules/blog_comment_placeholder.js +33 -0
  25. data/app/assets/stylesheets/workarea/admin/blog/components/_blog_entry_card.scss +14 -0
  26. data/app/assets/stylesheets/workarea/storefront/blog/components/_blog_entry.scss +91 -0
  27. data/app/assets/stylesheets/workarea/storefront/blog/components/_blog_entry_summary.scss +74 -0
  28. data/app/assets/stylesheets/workarea/storefront/blog/components/_featured_entry_content_block.scss +22 -0
  29. data/app/controllers/workarea/admin/application_controller.decorator +5 -0
  30. data/app/controllers/workarea/admin/content_blog_comments_controller.rb +54 -0
  31. data/app/controllers/workarea/admin/content_blog_entries_controller.rb +70 -0
  32. data/app/controllers/workarea/admin/content_blogs_controller.rb +56 -0
  33. data/app/controllers/workarea/admin/create_content_blog_entries_controller.rb +69 -0
  34. data/app/controllers/workarea/storefront/blog_comments_controller.rb +14 -0
  35. data/app/controllers/workarea/storefront/blog_entries_controller.rb +48 -0
  36. data/app/controllers/workarea/storefront/blogs_controller.rb +19 -0
  37. data/app/helpers/workarea/admin/blogs_helper.rb +61 -0
  38. data/app/models/workarea/content/blog.rb +26 -0
  39. data/app/models/workarea/content/blog_comment.rb +67 -0
  40. data/app/models/workarea/content/blog_entry.rb +35 -0
  41. data/app/models/workarea/content/fields/blog_entry_id.rb +11 -0
  42. data/app/models/workarea/content/fields/blog_id.rb +8 -0
  43. data/app/models/workarea/search/admin/content_blog.rb +27 -0
  44. data/app/models/workarea/search/admin/content_blog_entry.rb +37 -0
  45. data/app/queries/workarea/metadata/content_blog.rb +6 -0
  46. data/app/queries/workarea/metadata/content_blog_entry.rb +6 -0
  47. data/app/queries/workarea/search/admin_blog_entries.rb +24 -0
  48. data/app/queries/workarea/search/admin_blogs.rb +20 -0
  49. data/app/seeds/workarea/blog_comments_seeds.rb +26 -0
  50. data/app/seeds/workarea/blog_entry_seeds.rb +73 -0
  51. data/app/seeds/workarea/blog_seeds.rb +53 -0
  52. data/app/services/workarea/search/queries/blog_admin.rb +20 -0
  53. data/app/services/workarea/search/queries/blog_entry_admin.rb +13 -0
  54. data/app/services/workarea/set_navigable.decorator +10 -0
  55. data/app/view_models/workarea/admin/blog_comments_view_model.rb +45 -0
  56. data/app/view_models/workarea/admin/blog_entries_view_model.rb +31 -0
  57. data/app/view_models/workarea/admin/blog_entry_view_model.rb +29 -0
  58. data/app/view_models/workarea/admin/blog_search_view_model.rb +6 -0
  59. data/app/view_models/workarea/admin/blog_view_model.rb +13 -0
  60. data/app/view_models/workarea/storefront/blog_entry_view_model.rb +43 -0
  61. data/app/view_models/workarea/storefront/blog_index_view_model.rb +17 -0
  62. data/app/view_models/workarea/storefront/blog_view_model.rb +83 -0
  63. data/app/view_models/workarea/storefront/content_blocks/blog_entry_content_block_view_model.rb +63 -0
  64. data/app/views/workarea/admin/activities/_content_blog_comment_create.html.haml +12 -0
  65. data/app/views/workarea/admin/activities/_content_blog_comment_destroy.html.haml +9 -0
  66. data/app/views/workarea/admin/activities/_content_blog_comment_update.html.haml +10 -0
  67. data/app/views/workarea/admin/activities/_content_blog_create.html.haml +12 -0
  68. data/app/views/workarea/admin/activities/_content_blog_destroy.html.haml +10 -0
  69. data/app/views/workarea/admin/activities/_content_blog_entry_create.html.haml +12 -0
  70. data/app/views/workarea/admin/activities/_content_blog_entry_destroy.html.haml +10 -0
  71. data/app/views/workarea/admin/activities/_content_blog_entry_update.html.haml +10 -0
  72. data/app/views/workarea/admin/activities/_content_blog_update.html.haml +10 -0
  73. data/app/views/workarea/admin/blog/_dashboard_navigation.html.haml +1 -0
  74. data/app/views/workarea/admin/blog/_menu.html.haml +13 -0
  75. data/app/views/workarea/admin/content_blocks/_blog_entry_id.html.haml +4 -0
  76. data/app/views/workarea/admin/content_blocks/_blog_id.html.haml +3 -0
  77. data/app/views/workarea/admin/content_blog_comments/_summary.html.haml +24 -0
  78. data/app/views/workarea/admin/content_blog_comments/edit.html.haml +60 -0
  79. data/app/views/workarea/admin/content_blog_comments/index.html.haml +49 -0
  80. data/app/views/workarea/admin/content_blog_entries/_aux_navigation.html.haml +4 -0
  81. data/app/views/workarea/admin/content_blog_entries/_cards.html.haml +113 -0
  82. data/app/views/workarea/admin/content_blog_entries/_summary.html.haml +10 -0
  83. data/app/views/workarea/admin/content_blog_entries/edit.html.haml +75 -0
  84. data/app/views/workarea/admin/content_blog_entries/index.html.haml +80 -0
  85. data/app/views/workarea/admin/content_blog_entries/index.json.jbuilder +5 -0
  86. data/app/views/workarea/admin/content_blog_entries/show.html.haml +20 -0
  87. data/app/views/workarea/admin/content_blog_entries/thumbnail_image.html.haml +55 -0
  88. data/app/views/workarea/admin/content_blogs/_aux_navigation.html.haml +2 -0
  89. data/app/views/workarea/admin/content_blogs/_cards.html.haml +58 -0
  90. data/app/views/workarea/admin/content_blogs/_summary.html.haml +6 -0
  91. data/app/views/workarea/admin/content_blogs/edit.html.haml +51 -0
  92. data/app/views/workarea/admin/content_blogs/index.html.haml +76 -0
  93. data/app/views/workarea/admin/content_blogs/index.json.jbuilder +4 -0
  94. data/app/views/workarea/admin/content_blogs/new.html.haml +33 -0
  95. data/app/views/workarea/admin/content_blogs/show.html.haml +19 -0
  96. data/app/views/workarea/admin/create_content_blog_entries/content.html.haml +28 -0
  97. data/app/views/workarea/admin/create_content_blog_entries/featured_products.html.haml +71 -0
  98. data/app/views/workarea/admin/create_content_blog_entries/publish.html.haml +51 -0
  99. data/app/views/workarea/admin/create_content_blog_entries/setup.html.haml +61 -0
  100. data/app/views/workarea/admin/create_content_blog_entries/thumbnail_image.html.haml +48 -0
  101. data/app/views/workarea/storefront/blog_comments/index.html.haml +31 -0
  102. data/app/views/workarea/storefront/blog_entries/_summary.html.haml +25 -0
  103. data/app/views/workarea/storefront/blog_entries/show.html.haml +85 -0
  104. data/app/views/workarea/storefront/blog_metadata/_publisher.html.haml +7 -0
  105. data/app/views/workarea/storefront/blogs/_blog_navigation.html.haml +7 -0
  106. data/app/views/workarea/storefront/blogs/index.html.haml +25 -0
  107. data/app/views/workarea/storefront/blogs/show.atom.builder +26 -0
  108. data/app/views/workarea/storefront/blogs/show.html.haml +31 -0
  109. data/app/views/workarea/storefront/content_blocks/_blog_entry.html.haml +20 -0
  110. data/app/workers/workarea/generate_content_metadata.decorator +15 -0
  111. data/bin/rails +18 -0
  112. data/config/initializers/appends.rb +26 -0
  113. data/config/initializers/content_block_types.rb +13 -0
  114. data/config/initializers/jump_to_navigation.rb +3 -0
  115. data/config/initializers/seeds.rb +5 -0
  116. data/config/initializers/workarea.rb +15 -0
  117. data/config/locales/en.yml +244 -0
  118. data/config/routes.rb +49 -0
  119. data/data/blog_thumbnails/thumbnail_1.png +0 -0
  120. data/data/blog_thumbnails/thumbnail_2.png +0 -0
  121. data/data/blog_thumbnails/thumbnail_3.png +0 -0
  122. data/lib/tasks/import_wordpress.rake +13 -0
  123. data/lib/tasks/import_wordpress_attachments.rake +18 -0
  124. data/lib/tasks/import_wordpress_pages.rake +21 -0
  125. data/lib/tasks/import_wordpress_posts.rake +25 -0
  126. data/lib/workarea/blog/engine.rb +8 -0
  127. data/lib/workarea/blog/import/wordpress/attachment.rb +40 -0
  128. data/lib/workarea/blog/import/wordpress/content_cleaner.rb +64 -0
  129. data/lib/workarea/blog/import/wordpress/entry.rb +76 -0
  130. data/lib/workarea/blog/import/wordpress/entry_parser.rb +64 -0
  131. data/lib/workarea/blog/import/wordpress/page.rb +69 -0
  132. data/lib/workarea/blog/import/wordpress/page_parser.rb +50 -0
  133. data/lib/workarea/blog/version.rb +5 -0
  134. data/lib/workarea/blog.rb +11 -0
  135. data/test/dummy/Rakefile +6 -0
  136. data/test/dummy/app/assets/config/manifest.js +4 -0
  137. data/test/dummy/app/assets/images/.keep +0 -0
  138. data/test/dummy/app/assets/javascripts/application.js +13 -0
  139. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  140. data/test/dummy/app/controllers/application_controller.rb +3 -0
  141. data/test/dummy/app/controllers/concerns/.keep +0 -0
  142. data/test/dummy/app/helpers/application_helper.rb +2 -0
  143. data/test/dummy/app/jobs/application_job.rb +2 -0
  144. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  145. data/test/dummy/app/models/concerns/.keep +0 -0
  146. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  147. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  148. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  149. data/test/dummy/bin/bundle +3 -0
  150. data/test/dummy/bin/rails +4 -0
  151. data/test/dummy/bin/rake +4 -0
  152. data/test/dummy/bin/setup +34 -0
  153. data/test/dummy/bin/update +29 -0
  154. data/test/dummy/config/application.rb +26 -0
  155. data/test/dummy/config/boot.rb +5 -0
  156. data/test/dummy/config/cable.yml +9 -0
  157. data/test/dummy/config/environment.rb +5 -0
  158. data/test/dummy/config/environments/development.rb +59 -0
  159. data/test/dummy/config/environments/production.rb +86 -0
  160. data/test/dummy/config/environments/test.rb +43 -0
  161. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  162. data/test/dummy/config/initializers/assets.rb +11 -0
  163. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  164. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  165. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  166. data/test/dummy/config/initializers/inflections.rb +16 -0
  167. data/test/dummy/config/initializers/mime_types.rb +4 -0
  168. data/test/dummy/config/initializers/new_framework_defaults.rb +18 -0
  169. data/test/dummy/config/initializers/session_store.rb +3 -0
  170. data/test/dummy/config/initializers/workarea.rb +3 -0
  171. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  172. data/test/dummy/config/locales/en.yml +23 -0
  173. data/test/dummy/config/puma.rb +47 -0
  174. data/test/dummy/config/routes.rb +5 -0
  175. data/test/dummy/config/secrets.yml +22 -0
  176. data/test/dummy/config/spring.rb +6 -0
  177. data/test/dummy/config.ru +5 -0
  178. data/test/dummy/db/seeds.rb +2 -0
  179. data/test/dummy/lib/assets/.keep +0 -0
  180. data/test/dummy/log/.keep +0 -0
  181. data/test/factories/blog.rb +33 -0
  182. data/test/factories/wordpress_import.rb +17 -0
  183. data/test/fixtures/test_wordpress.xml +493 -0
  184. data/test/integration/workarea/blog/admin_integration_test.rb +55 -0
  185. data/test/integration/workarea/blog/create_blog_entries_integration_test.rb +106 -0
  186. data/test/integration/workarea/blog/storefront_integration_test.rb +112 -0
  187. data/test/integration/workarea/blog/wordpress_import_integration_test.rb +26 -0
  188. data/test/lib/workarea/blog/import/wordpress/attachment_test.rb +20 -0
  189. data/test/lib/workarea/blog/import/wordpress/content_cleaner_test.rb +65 -0
  190. data/test/lib/workarea/blog/import/wordpress/entry_parser_test.rb +42 -0
  191. data/test/lib/workarea/blog/import/wordpress/entry_test.rb +61 -0
  192. data/test/lib/workarea/blog/import/wordpress/page_parser_test.rb +35 -0
  193. data/test/lib/workarea/blog/import/wordpress/page_test.rb +52 -0
  194. data/test/models/workarea/content/blog_comment_test.rb +57 -0
  195. data/test/models/workarea/content/blog_entry_test.rb +17 -0
  196. data/test/queries/workarea/metadata/content_blog_entry_test.rb +36 -0
  197. data/test/queries/workarea/metadata/content_blog_test.rb +36 -0
  198. data/test/support/workarea/blog/stub_wordpress_assets.rb +19 -0
  199. data/test/system/workarea/admin/blog_entries_system_test.rb +103 -0
  200. data/test/system/workarea/admin/blog_system_test.rb +93 -0
  201. data/test/system/workarea/admin/blog_taxonomy_system_test.rb +21 -0
  202. data/test/system/workarea/admin/blog_user_comments_system_test.rb +138 -0
  203. data/test/system/workarea/storefront/blog_content_block_system_test.rb +36 -0
  204. data/test/system/workarea/storefront/blog_system_test.rb +256 -0
  205. data/test/test_helper.rb +9 -0
  206. data/test/view_models/workarea/admin/blog_comments_view_model_test.rb +77 -0
  207. data/test/view_models/workarea/admin/blog_entries_view_model_test.rb +36 -0
  208. data/test/view_models/workarea/storefront/blog_entry_content_block_view_model_test.rb +100 -0
  209. data/test/view_models/workarea/storefront/blog_entry_view_model_test.rb +47 -0
  210. data/test/view_models/workarea/storefront/blog_view_model_test.rb +149 -0
  211. data/test/workers/workarea/generate_content_blog_metadata_test.rb +18 -0
  212. data/workarea-blog.gemspec +19 -0
  213. metadata +274 -0
@@ -0,0 +1,77 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Admin
5
+ class BlogCommentsViewModelTest < TestCase
6
+ setup :blog
7
+
8
+ def blog
9
+ @blog ||= create_blog(name: 'Test Blog',
10
+ entries: [
11
+ {
12
+ name: 'Entry 1',
13
+ author: 'BC',
14
+ slug: 'entry1',
15
+ summary: 'A short summary about the entry'
16
+ },
17
+ {
18
+ name: 'Entry 2',
19
+ author: 'BC',
20
+ slug: 'entry2',
21
+ summary: 'A different summary for this entry'
22
+ }
23
+ ])
24
+ end
25
+
26
+ def test_comments_filters_by_entry_if_passed
27
+ view_model = Workarea::Admin::BlogCommentsViewModel.new(
28
+ nil,
29
+ content_blog_entry_id: @blog.entries.second.slug
30
+ )
31
+
32
+ assert_equal(0, view_model.comments.length)
33
+ end
34
+
35
+ def test_comments_returns_all_comments_if_not_filter_by_entry
36
+ blog_comment = @blog.entries.first.comments.create!(
37
+ user_id: 'userid',
38
+ user_info: 'UC',
39
+ body: 'Great writer! A+++++++. Will read again.'
40
+ )
41
+
42
+ view_model = Workarea::Admin::BlogCommentsViewModel.new(nil)
43
+
44
+ assert_equal(1, view_model.comments.length)
45
+ assert_equal(blog_comment, view_model.comments.first)
46
+ end
47
+
48
+ def test_entry_returns_the_entry_when_we_are_filtering_by_entry
49
+ view_model = Workarea::Admin::BlogCommentsViewModel.new(
50
+ nil,
51
+ content_blog_entry_id: @blog.entries.first.slug
52
+ )
53
+
54
+ assert_equal(@blog.entries.first, view_model.blog_entry)
55
+ end
56
+
57
+ def test_entry_does_not_return_the_entry_if_we_are_not_filtering_by_entry
58
+ view_model = Workarea::Admin::BlogCommentsViewModel.new(nil)
59
+ assert_nil(view_model.blog_entry)
60
+ end
61
+
62
+ def test_blog_returns_the_blog_when_we_are_filtering_by_entry
63
+ view_model = Workarea::Admin::BlogCommentsViewModel.new(
64
+ nil,
65
+ content_blog_entry_id: @blog.entries.first.slug
66
+ )
67
+
68
+ assert_equal(@blog, view_model.blog)
69
+ end
70
+
71
+ def test_blog_does_not_return_the_blog_if_we_are_not_filtering_by_entry
72
+ view_model = Workarea::Admin::BlogCommentsViewModel.new(nil)
73
+ assert_nil(view_model.blog)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Blog
5
+ module Admin
6
+ class BlogEntriesViewModelTest < TestCase
7
+ setup :create_blog_1
8
+ setup :create_blog_2
9
+
10
+ def create_blog_1
11
+ @blog ||= create_blog(name: 'Test',
12
+ slug: 'test',
13
+ entries: [{ name: 'Entry', author: 'BC' }])
14
+ end
15
+
16
+ def create_blog_2
17
+ create_blog(name: 'Test2',
18
+ slug: 'test2',
19
+ entries: [{ name: 'Entry2', author: 'BC' }])
20
+ end
21
+
22
+ def test_entries_only_shows_entries_for_this_blog
23
+ view_model = Workarea::Admin::BlogEntriesViewModel.new(nil, content_blog_id: @blog.slug)
24
+
25
+ assert_equal(1, view_model.entries.length)
26
+ assert_equal(Workarea::Storefront::BlogEntryViewModel.new(@blog.entries.first), view_model.entries.first)
27
+ end
28
+
29
+ def test_blog_should_return_the_blog
30
+ view_model = Workarea::Admin::BlogEntriesViewModel.new(nil, content_blog_id: @blog.slug)
31
+ assert_equal(@blog, view_model.blog)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,100 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Storefront
5
+ class BlogEntryContentBlockViewModelTest < TestCase
6
+ setup :blog
7
+ setup :create_blog_entries
8
+
9
+ def blog
10
+ @blog ||= create_blog(name: 'Test')
11
+ end
12
+
13
+ def create_blog_entries
14
+ 4.times { @blog.entries.create!(name: 'Test', author: 'BC') }
15
+ end
16
+
17
+ def test_returns_a_blog_and_entry_object
18
+ content = create_content
19
+ block = content.blocks.create!(
20
+ area: 'body',
21
+ type_id: 'blog_entry',
22
+ data: {
23
+ use_manual_entries: 'true',
24
+ blog_entry: [@blog.entries.first.id]
25
+ }
26
+ )
27
+
28
+ view_model = ContentBlocks::BlogEntryContentBlockViewModel.new(block)
29
+
30
+ assert_instance_of(Workarea::Storefront::BlogEntryViewModel, view_model.locals[:entries].first)
31
+ assert_instance_of(Workarea::Storefront::BlogViewModel, view_model.locals[:entries].first.blog)
32
+ end
33
+
34
+ def test_returns_most_recent_blog_entry_by_default
35
+ content = create_content
36
+ block = content.blocks.create!(
37
+ area: 'body',
38
+ type_id: 'blog_entry',
39
+ data: {
40
+ number_of_entries: '1',
41
+ use_manual_entries: 'false'
42
+ }
43
+ )
44
+ view_model = ContentBlocks::BlogEntryContentBlockViewModel.new(block)
45
+
46
+ assert_equal(@blog.entries.last.id, view_model.locals[:entries].first.id)
47
+ end
48
+
49
+ def test_can_return_multiple_recent_blog_entries
50
+ content = create_content
51
+ block = content.blocks.create!(
52
+ area: 'body',
53
+ type_id: 'blog_entry',
54
+ data: {
55
+ number_of_entries: '3',
56
+ use_manual_entries: 'false'
57
+ }
58
+ )
59
+ view_model = ContentBlocks::BlogEntryContentBlockViewModel.new(block)
60
+
61
+ assert_equal(3, view_model.locals[:entries].count)
62
+ end
63
+
64
+ def test_can_return_recent_blog_entries_for_a_specific_blog
65
+ new_blog = create_blog(name: 'New Blog')
66
+ new_blog.entries.create!(name: 'New Post', author: 'BC')
67
+
68
+ content = create_content
69
+ block = content.blocks.create!(
70
+ area: 'body',
71
+ type_id: 'blog_entry',
72
+ data: {
73
+ blog: new_blog.id,
74
+ number_of_entries: '1',
75
+ use_manual_entries: 'false'
76
+ }
77
+ )
78
+ view_model = ContentBlocks::BlogEntryContentBlockViewModel.new(block)
79
+
80
+ assert_equal(1, view_model.locals[:entries].count)
81
+ assert_equal(new_blog.id, view_model.locals[:entries].first.blog.id)
82
+ end
83
+
84
+ def test_can_return_multiple_manually_selected_entries
85
+ content = create_content
86
+ block = content.blocks.create!(
87
+ area: 'body',
88
+ type_id: 'blog_entry',
89
+ data: {
90
+ use_manual_entries: 'true',
91
+ blog_entry: [@blog.entries.first.id, @blog.entries.second.id]
92
+ }
93
+ )
94
+
95
+ view_model = ContentBlocks::BlogEntryContentBlockViewModel.new(block)
96
+ assert_equal(2, view_model.locals[:entries].count)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Storefront
5
+ module Blog
6
+ class BlogEntryViewModelTest < TestCase
7
+ def test_comments_only_shows_approved_comments
8
+ blog = create_blog(
9
+ entries: [{
10
+ name: 'Test Entry',
11
+ comments: [
12
+ { user_id: user.id },
13
+ { user_id: user.id, approved: true }
14
+ ]
15
+ }]
16
+ )
17
+
18
+ view_model = Workarea::Storefront::BlogEntryViewModel.new(blog.entries.first)
19
+
20
+ assert_equal(1, view_model.comments.length)
21
+ end
22
+
23
+ def test_products
24
+ 3.times.map { |id| create_product(id: id) }
25
+
26
+ product_ids = [1, 2, 0].map(&:to_s)
27
+ blog = create_blog(
28
+ entries: [{
29
+ name: 'Test Entry',
30
+ product_ids: product_ids
31
+ }]
32
+ )
33
+ entry = blog.entries.first
34
+ view_model = Workarea::Storefront::BlogEntryViewModel.new(entry)
35
+
36
+ assert_equal(product_ids, view_model.products.map(&:id))
37
+ end
38
+
39
+ private
40
+
41
+ def user
42
+ @user ||= create_user
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,149 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Blog
5
+ module Storefront
6
+ class BlogViewModelTest < TestCase
7
+ setup :blog
8
+ setup :set_blog_entries_on_index
9
+ teardown :reset_blog_entries_on_index
10
+
11
+ def blog
12
+ @blog ||= create_blog(name: 'Test', slug: 'test')
13
+ end
14
+
15
+ def set_blog_entries_on_index
16
+ @blog_entries_on_index = Workarea.config.blog_entries_on_index
17
+ Workarea.config.blog_entries_on_index = 4
18
+ end
19
+
20
+ def reset_blog_entries_on_index
21
+ Workarea.config.blog_entries_on_index = @blog_entries_on_index
22
+ end
23
+
24
+ def test_entries_paginates
25
+ view_model = Workarea::Storefront::BlogViewModel.new(@blog)
26
+
27
+ tmp = Workarea::Storefront::BlogViewModel.per_page
28
+ Workarea::Storefront::BlogViewModel.per_page = 1
29
+
30
+ 3.times { @blog.entries.create!(name: 'Test', author: 'BC') }
31
+
32
+ assert_equal(1, view_model.entries.size)
33
+ assert_equal(1, view_model.entries.current_page)
34
+ assert_instance_of(Workarea::Storefront::BlogEntryViewModel, view_model.entries.first)
35
+
36
+ Workarea::Storefront::BlogViewModel.per_page = tmp
37
+ end
38
+
39
+ def test_entries_filters_on_tag
40
+ view_model = Workarea::Storefront::BlogViewModel.new(@blog)
41
+
42
+ @blog.entries.create!(name: 'Test', author: 'BC', tag_list: 'foo')
43
+ @blog.entries.create!(name: 'Test', author: 'BC', tag_list: 'bar')
44
+
45
+ view_model.options[:tag] = 'foo'
46
+ assert_equal(1, view_model.entries.size)
47
+ end
48
+
49
+ def test_entries_only_returns_active_entries
50
+ view_model = Workarea::Storefront::BlogViewModel.new(@blog)
51
+
52
+ @blog.entries.create!(name: 'Active Entry', author: 'BC', tag_list: 'baz', active: true)
53
+ @blog.entries.create!(name: 'Inactive Entry', author: 'BC', tag_list: 'baz', active: false)
54
+
55
+ assert_equal(['Active Entry'], view_model.entries.map(&:name))
56
+ end
57
+
58
+ def test_entries_sort_by_written_date
59
+ view_model = Workarea::Storefront::BlogViewModel.new(@blog)
60
+
61
+ @blog.entries.create!(name: '3', author: 'BC', tag_list: 'baz', written_at: Time.now - 3.days)
62
+ @blog.entries.create!(name: '4', author: 'BC', tag_list: 'qux', written_at: Time.now - 4.days)
63
+ @blog.entries.create!(name: '1', author: 'BC', tag_list: 'foo', written_at: Time.now - 1.day)
64
+ @blog.entries.create!(name: '2', author: 'BC', tag_list: 'bar', written_at: Time.now - 2.days)
65
+
66
+ assert_equal(%w[1 2 3 4], view_model.entries.map(&:name))
67
+ end
68
+
69
+ def test_entries_on_index_returns_the_first_4_entries_in_a_blog
70
+ view_model = Workarea::Storefront::BlogViewModel.new(@blog)
71
+ @blog.entries.create!(name: '1', author: 'BC', tag_list: 'foo', written_at: Time.now - 1.day)
72
+ @blog.entries.create!(name: '2', author: 'BC', tag_list: 'bar', written_at: Time.now - 2.days)
73
+ @blog.entries.create!(name: '3', author: 'BC', tag_list: 'baz', written_at: Time.now - 3.days)
74
+ @blog.entries.create!(name: '4', author: 'BC', tag_list: 'qux', written_at: Time.now - 4.days)
75
+ @blog.entries.create!(name: '5', author: 'BC', tag_list: 'qux', written_at: Time.now - 5.days)
76
+ @blog.entries.create!(name: '6', author: 'BC', tag_list: 'qux', written_at: Time.now - 6.days, featured: true)
77
+
78
+ assert_equal(4, view_model.entries_on_index.count)
79
+ assert_equal(%w[6 1 2 3], view_model.entries_on_index.map(&:name))
80
+ assert_instance_of(Workarea::Storefront::BlogEntryViewModel, view_model.entries_on_index.first)
81
+ end
82
+
83
+ def test_tags_includes_all_tags_for_active_entries_in_a_blog_as_facets
84
+ view_model = Workarea::Storefront::BlogViewModel.new(@blog)
85
+ @blog.entries.create!(
86
+ name: 'Test', author: 'BC', tag_list: 'foo', active: true
87
+ )
88
+ @blog.entries.create!(
89
+ name: 'Test', author: 'BC', tag_list: 'bar', active: true
90
+ )
91
+ @blog.entries.create!(
92
+ name: 'Test', author: 'BC', tag_list: 'baz', active: false
93
+ )
94
+
95
+ view_model.options[:tag] = 'foo'
96
+ assert_equal(2, view_model.tags.count)
97
+ end
98
+
99
+ def test_tags_empty_without_blog_entries_collection
100
+ Workarea::Content::BlogEntry.collection.drop
101
+
102
+ model = Workarea::Content::Blog.first
103
+ view_model = Workarea::Storefront::BlogViewModel.new(model)
104
+
105
+ assert_empty(view_model.tags)
106
+ ensure
107
+ Workarea::Content::BlogEntry.create_indexes
108
+ end
109
+
110
+ def test_updated_at_is_the_updated_at_date_of_the_newest_active_entry
111
+ view_model = Workarea::Storefront::BlogViewModel.new(@blog)
112
+ 3.times do
113
+ @blog.entries.create!(name: 'Test', author: 'BC', active: true)
114
+ end
115
+
116
+ assert_equal(@blog.entries.first.updated_at.to_s, view_model.updated_at.to_s)
117
+ end
118
+
119
+ def test_filters_entries_by_current_release
120
+ release = create_release(publish_at: 1.hour.from_now, published_at: nil)
121
+ view_model = Workarea::Storefront::BlogViewModel.new(@blog)
122
+ 3.times do
123
+ @blog.entries.create!(name: 'Test', author: 'BC', active: true)
124
+ end
125
+ 2.times do
126
+ @blog.entries.create!(name: 'Unpublished', author: 'BC', active: false)
127
+ end
128
+ release.as_current do
129
+ entry = @blog.entries.where(name: 'Unpublished').first
130
+ entry.active = true
131
+ entry.save!
132
+ end
133
+ unpublished = view_model.entries.select { |entry| entry.name == 'Unpublished' }
134
+
135
+ assert_equal(3, view_model.entries.count)
136
+ assert unpublished.empty?
137
+
138
+ release.as_current do
139
+ view_model = Workarea::Storefront::BlogViewModel.new(@blog.reload)
140
+ newly_published = view_model.entries.select { |entry| entry.name == 'Unpublished' }
141
+
142
+ assert_equal(4, view_model.entries.count)
143
+ refute newly_published.empty?
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class GenerateContentBlogMetadataTest < TestCase
5
+ def test_generate_metadata_for_blog
6
+ blog = create_blog(name: 'foo')
7
+ content = Content.for(blog)
8
+
9
+ content.update!(automate_metadata: true)
10
+ content.blocks.create!(type: 'html', data: { html: '<p>Lorem ipsum dolor</p>' })
11
+
12
+ GenerateContentMetadata.new.perform
13
+
14
+ assert_equal('foo', content.reload.browser_title)
15
+ assert_equal('Lorem ipsum dolor', content.reload.meta_description)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
2
+
3
+ require 'workarea/blog/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'workarea-blog'
7
+ s.version = Workarea::Blog::VERSION
8
+ s.authors = ['bcrouse']
9
+ s.email = ['bcrouse@workarea.com']
10
+ s.homepage = 'https://github.com/workarea-commerce/workarea-blog'
11
+ s.summary = 'Blog plugin for Workarea.'
12
+ s.description = 'This plugin adds blogs capability to Workarea.'
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+
16
+ s.license = 'Business Software License'
17
+
18
+ s.add_dependency 'workarea', '~> 3.x', '>= 3.3.x'
19
+ end