comfypress 0.1.3

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 (289) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +22 -0
  4. data/Gemfile +22 -0
  5. data/Gemfile.lock +175 -0
  6. data/LICENSE +20 -0
  7. data/README.md +79 -0
  8. data/Rakefile +5 -0
  9. data/app/assets/images/comfypress/arrow_bottom.gif +0 -0
  10. data/app/assets/images/comfypress/arrow_right.gif +0 -0
  11. data/app/assets/images/comfypress/bootstrap/glyphicons-halflings-white.png +0 -0
  12. data/app/assets/images/comfypress/bootstrap/glyphicons-halflings.png +0 -0
  13. data/app/assets/images/comfypress/checkerboard.gif +0 -0
  14. data/app/assets/images/comfypress/icon_draft.gif +0 -0
  15. data/app/assets/images/comfypress/icon_file.gif +0 -0
  16. data/app/assets/images/comfypress/icon_layout.gif +0 -0
  17. data/app/assets/images/comfypress/icon_move.gif +0 -0
  18. data/app/assets/images/comfypress/icon_page.gif +0 -0
  19. data/app/assets/images/comfypress/icon_site.gif +0 -0
  20. data/app/assets/images/comfypress/icon_snippet.gif +0 -0
  21. data/app/assets/images/comfypress/nav_arrow.png +0 -0
  22. data/app/assets/javascripts/comfypress/admin/application.js +1 -0
  23. data/app/assets/javascripts/comfypress/application.js.coffee +175 -0
  24. data/app/assets/javascripts/comfypress/lib/bootstrap-datetimepicker.js +21 -0
  25. data/app/assets/javascripts/comfypress/lib/bootstrap-wysihtml5.js +492 -0
  26. data/app/assets/javascripts/comfypress/lib/bootstrap.js +6 -0
  27. data/app/assets/javascripts/comfypress/lib/codemirror.js +10 -0
  28. data/app/assets/javascripts/comfypress/lib/wysihtml5.js +261 -0
  29. data/app/assets/stylesheets/comfypress/admin/application.css +1 -0
  30. data/app/assets/stylesheets/comfypress/application.css.sass +8 -0
  31. data/app/assets/stylesheets/comfypress/base.css.sass +333 -0
  32. data/app/assets/stylesheets/comfypress/bootstrap_overrides.css.sass +45 -0
  33. data/app/assets/stylesheets/comfypress/codemirror_overrides.css.sass +27 -0
  34. data/app/assets/stylesheets/comfypress/lib/bootstrap-datetimepicker.css +9 -0
  35. data/app/assets/stylesheets/comfypress/lib/bootstrap-wysihtml5.css +102 -0
  36. data/app/assets/stylesheets/comfypress/lib/bootstrap.css +9 -0
  37. data/app/assets/stylesheets/comfypress/lib/codemirror.css +240 -0
  38. data/app/assets/stylesheets/comfypress/wysihtml5_overrides.css.sass +5 -0
  39. data/app/controllers/application_controller.rb +5 -0
  40. data/app/controllers/cms_admin/base_controller.rb +51 -0
  41. data/app/controllers/cms_admin/categories_controller.rb +35 -0
  42. data/app/controllers/cms_admin/files_controller.rb +108 -0
  43. data/app/controllers/cms_admin/layouts_controller.rb +67 -0
  44. data/app/controllers/cms_admin/menu_items_controller.rb +65 -0
  45. data/app/controllers/cms_admin/menus_controller.rb +60 -0
  46. data/app/controllers/cms_admin/pages_controller.rb +112 -0
  47. data/app/controllers/cms_admin/revisions_controller.rb +57 -0
  48. data/app/controllers/cms_admin/sites_controller.rb +64 -0
  49. data/app/controllers/cms_admin/snippets_controller.rb +64 -0
  50. data/app/controllers/cms_content_controller.rb +79 -0
  51. data/app/helpers/application_helper.rb +16 -0
  52. data/app/models/cms/block.rb +48 -0
  53. data/app/models/cms/categorization.rb +21 -0
  54. data/app/models/cms/category.rb +30 -0
  55. data/app/models/cms/file.rb +75 -0
  56. data/app/models/cms/layout.rb +99 -0
  57. data/app/models/cms/menu.rb +26 -0
  58. data/app/models/cms/menu_item.rb +14 -0
  59. data/app/models/cms/page.rb +202 -0
  60. data/app/models/cms/revision.rb +17 -0
  61. data/app/models/cms/site.rb +113 -0
  62. data/app/models/cms/snippet.rb +58 -0
  63. data/app/models/cms.rb +5 -0
  64. data/app/views/cms_admin/categories/_categories.html.haml +3 -0
  65. data/app/views/cms_admin/categories/_edit.html.haml +6 -0
  66. data/app/views/cms_admin/categories/_form.html.haml +8 -0
  67. data/app/views/cms_admin/categories/_index.html.haml +24 -0
  68. data/app/views/cms_admin/categories/_show.html.haml +13 -0
  69. data/app/views/cms_admin/categories/create.js.erb +7 -0
  70. data/app/views/cms_admin/categories/destroy.js.erb +3 -0
  71. data/app/views/cms_admin/categories/edit.js.erb +3 -0
  72. data/app/views/cms_admin/categories/update.js.erb +6 -0
  73. data/app/views/cms_admin/files/_file.html.haml +13 -0
  74. data/app/views/cms_admin/files/_form.html.haml +14 -0
  75. data/app/views/cms_admin/files/_index.html.haml +14 -0
  76. data/app/views/cms_admin/files/_page_form.html.haml +9 -0
  77. data/app/views/cms_admin/files/destroy.js.coffee +2 -0
  78. data/app/views/cms_admin/files/edit.html.haml +5 -0
  79. data/app/views/cms_admin/files/index.html.haml +28 -0
  80. data/app/views/cms_admin/files/new.html.haml +5 -0
  81. data/app/views/cms_admin/layouts/_form.html.haml +17 -0
  82. data/app/views/cms_admin/layouts/_index_branch.html.haml +23 -0
  83. data/app/views/cms_admin/layouts/edit.html.haml +9 -0
  84. data/app/views/cms_admin/layouts/index.html.haml +9 -0
  85. data/app/views/cms_admin/layouts/new.html.haml +5 -0
  86. data/app/views/cms_admin/menu_items/_form.html.haml +22 -0
  87. data/app/views/cms_admin/menu_items/edit.html.haml +8 -0
  88. data/app/views/cms_admin/menu_items/index.html.haml +24 -0
  89. data/app/views/cms_admin/menu_items/new.html.haml +5 -0
  90. data/app/views/cms_admin/menus/_form.html.haml +8 -0
  91. data/app/views/cms_admin/menus/edit.html.haml +8 -0
  92. data/app/views/cms_admin/menus/index.html.haml +24 -0
  93. data/app/views/cms_admin/menus/new.html.haml +5 -0
  94. data/app/views/cms_admin/pages/_form.html.haml +38 -0
  95. data/app/views/cms_admin/pages/_form_blocks.html.haml +28 -0
  96. data/app/views/cms_admin/pages/_index_branch.html.haml +35 -0
  97. data/app/views/cms_admin/pages/edit.html.haml +9 -0
  98. data/app/views/cms_admin/pages/form_blocks.js.erb +2 -0
  99. data/app/views/cms_admin/pages/index.html.haml +11 -0
  100. data/app/views/cms_admin/pages/new.html.haml +5 -0
  101. data/app/views/cms_admin/pages/toggle_branch.js.erb +11 -0
  102. data/app/views/cms_admin/revisions/show.html.haml +28 -0
  103. data/app/views/cms_admin/sites/_form.html.haml +14 -0
  104. data/app/views/cms_admin/sites/_mirrors.html.haml +17 -0
  105. data/app/views/cms_admin/sites/edit.html.haml +5 -0
  106. data/app/views/cms_admin/sites/index.html.haml +24 -0
  107. data/app/views/cms_admin/sites/new.html.haml +5 -0
  108. data/app/views/cms_admin/snippets/_form.html.haml +11 -0
  109. data/app/views/cms_admin/snippets/edit.html.haml +9 -0
  110. data/app/views/cms_admin/snippets/index.html.haml +28 -0
  111. data/app/views/cms_admin/snippets/new.html.haml +5 -0
  112. data/app/views/cms_content/_menu.html.haml +5 -0
  113. data/app/views/cms_content/render_sitemap.xml.builder +15 -0
  114. data/app/views/layouts/cms_admin/_body.html.haml +16 -0
  115. data/app/views/layouts/cms_admin/_center.html.haml +7 -0
  116. data/app/views/layouts/cms_admin/_footer.html.haml +3 -0
  117. data/app/views/layouts/cms_admin/_footer_js.html.haml +7 -0
  118. data/app/views/layouts/cms_admin/_head.html.haml +12 -0
  119. data/app/views/layouts/cms_admin/_left.html.haml +11 -0
  120. data/app/views/layouts/cms_admin/_right.html.haml +1 -0
  121. data/app/views/layouts/cms_admin.html.haml +4 -0
  122. data/comfypress.gemspec +28 -0
  123. data/config/application.rb +69 -0
  124. data/config/boot.rb +6 -0
  125. data/config/database.sqlite.yml +47 -0
  126. data/config/database.yml +47 -0
  127. data/config/environment.rb +5 -0
  128. data/config/environments/development.rb +39 -0
  129. data/config/environments/production.rb +67 -0
  130. data/config/environments/test.rb +39 -0
  131. data/config/initializers/comfypress.rb +100 -0
  132. data/config/initializers/paperclip.rb +3 -0
  133. data/config/locales/de.yml +236 -0
  134. data/config/locales/en.yml +285 -0
  135. data/config/locales/es.yml +236 -0
  136. data/config/locales/fr.yml +236 -0
  137. data/config/locales/ja.yml +237 -0
  138. data/config/locales/pl.yml +236 -0
  139. data/config/locales/pt-BR.yml +236 -0
  140. data/config/locales/ru.yml +236 -0
  141. data/config/locales/sv.yml +236 -0
  142. data/config/locales/zh-CN.yml +236 -0
  143. data/config/routes.rb +10 -0
  144. data/config.ru +4 -0
  145. data/db/cms_fixtures/sample-site/layouts/default/_default.yml +1 -0
  146. data/db/cms_fixtures/sample-site/layouts/default/content.html +5 -0
  147. data/db/cms_fixtures/sample-site/layouts/default/css.css +1 -0
  148. data/db/cms_fixtures/sample-site/layouts/default/js.js +1 -0
  149. data/db/cms_fixtures/sample-site/layouts/default/nested/_nested.yml +2 -0
  150. data/db/cms_fixtures/sample-site/layouts/default/nested/content.html +2 -0
  151. data/db/cms_fixtures/sample-site/layouts/default/nested/css.css +1 -0
  152. data/db/cms_fixtures/sample-site/layouts/default/nested/js.js +1 -0
  153. data/db/cms_fixtures/sample-site/pages/index/_index.yml +2 -0
  154. data/db/cms_fixtures/sample-site/pages/index/child/_child.yml +3 -0
  155. data/db/cms_fixtures/sample-site/pages/index/child/left.html +1 -0
  156. data/db/cms_fixtures/sample-site/pages/index/child/right.html +1 -0
  157. data/db/cms_fixtures/sample-site/pages/index/content.html +2 -0
  158. data/db/cms_fixtures/sample-site/snippets/default/_default.yml +1 -0
  159. data/db/cms_fixtures/sample-site/snippets/default/content.html +1 -0
  160. data/db/migrate/01_create_cms.rb +163 -0
  161. data/db/seeds.rb +9 -0
  162. data/db/upgrade_migrations/02_upgrade_to_1_1_0.rb +19 -0
  163. data/db/upgrade_migrations/03_upgrade_to_1_2_0.rb +15 -0
  164. data/db/upgrade_migrations/04_upgrade_to_1_3_0.rb +23 -0
  165. data/db/upgrade_migrations/05_upgrade_to_1_4_0.rb +33 -0
  166. data/db/upgrade_migrations/06_upgrade_to_1_5_0.rb +21 -0
  167. data/db/upgrade_migrations/07_upgrade_to_1_6_0.rb +25 -0
  168. data/doc/preview.png +0 -0
  169. data/doc/sofa.png +0 -0
  170. data/lib/comfypress/authentication/dummy_auth.rb +8 -0
  171. data/lib/comfypress/authentication/http_auth.rb +18 -0
  172. data/lib/comfypress/configuration.rb +99 -0
  173. data/lib/comfypress/engine.rb +18 -0
  174. data/lib/comfypress/error.rb +24 -0
  175. data/lib/comfypress/extensions/acts_as_tree.rb +102 -0
  176. data/lib/comfypress/extensions/has_revisions.rb +64 -0
  177. data/lib/comfypress/extensions/is_categorized.rb +49 -0
  178. data/lib/comfypress/extensions/is_mirrored.rb +85 -0
  179. data/lib/comfypress/extensions/rails.rb +24 -0
  180. data/lib/comfypress/fixtures.rb +289 -0
  181. data/lib/comfypress/form_builder.rb +97 -0
  182. data/lib/comfypress/render_methods.rb +85 -0
  183. data/lib/comfypress/routing.rb +62 -0
  184. data/lib/comfypress/sitemap.rb +27 -0
  185. data/lib/comfypress/tag.rb +154 -0
  186. data/lib/comfypress/tags/asset.rb +25 -0
  187. data/lib/comfypress/tags/collection.rb +64 -0
  188. data/lib/comfypress/tags/field_datetime.rb +17 -0
  189. data/lib/comfypress/tags/field_integer.rb +17 -0
  190. data/lib/comfypress/tags/field_rich_text.rb +17 -0
  191. data/lib/comfypress/tags/field_string.rb +17 -0
  192. data/lib/comfypress/tags/field_text.rb +17 -0
  193. data/lib/comfypress/tags/file.rb +29 -0
  194. data/lib/comfypress/tags/helper.rb +24 -0
  195. data/lib/comfypress/tags/menu.rb +27 -0
  196. data/lib/comfypress/tags/page_datetime.rb +13 -0
  197. data/lib/comfypress/tags/page_file.rb +51 -0
  198. data/lib/comfypress/tags/page_files.rb +52 -0
  199. data/lib/comfypress/tags/page_integer.rb +13 -0
  200. data/lib/comfypress/tags/page_markdown.rb +22 -0
  201. data/lib/comfypress/tags/page_rich_text.rb +13 -0
  202. data/lib/comfypress/tags/page_string.rb +13 -0
  203. data/lib/comfypress/tags/page_text.rb +13 -0
  204. data/lib/comfypress/tags/partial.rb +23 -0
  205. data/lib/comfypress/tags/snippet.rb +19 -0
  206. data/lib/comfypress/version.rb +3 -0
  207. data/lib/comfypress/view_hooks.rb +32 -0
  208. data/lib/comfypress/view_methods.rb +52 -0
  209. data/lib/comfypress.rb +66 -0
  210. data/lib/generators/comfy/cms/README +10 -0
  211. data/lib/generators/comfy/cms/cms_generator.rb +57 -0
  212. data/lib/tasks/comfypress.rake +45 -0
  213. data/script/rails +6 -0
  214. data/test/fixtures/cms/blocks.yml +12 -0
  215. data/test/fixtures/cms/categories.yml +4 -0
  216. data/test/fixtures/cms/categorizations.yml +3 -0
  217. data/test/fixtures/cms/files.yml +9 -0
  218. data/test/fixtures/cms/layouts.yml +40 -0
  219. data/test/fixtures/cms/menu_items.yml +15 -0
  220. data/test/fixtures/cms/menus.yml +9 -0
  221. data/test/fixtures/cms/pages.yml +39 -0
  222. data/test/fixtures/cms/revisions.yml +21 -0
  223. data/test/fixtures/cms/sites.yml +6 -0
  224. data/test/fixtures/cms/snippets.yml +6 -0
  225. data/test/fixtures/files/data.zip +0 -0
  226. data/test/fixtures/files/document.pdf +0 -0
  227. data/test/fixtures/files/image.gif +0 -0
  228. data/test/fixtures/files/image.jpg +0 -0
  229. data/test/fixtures/views/_nav_hook.html.erb +1 -0
  230. data/test/fixtures/views/_nav_hook_2.html.erb +1 -0
  231. data/test/fixtures/views/render_test/_test.html.erb +1 -0
  232. data/test/fixtures/views/render_test/new.html.erb +1 -0
  233. data/test/fixtures/views/render_test/render_layout.html.erb +1 -0
  234. data/test/functional/cms_admin/base_controller_test.rb +18 -0
  235. data/test/functional/cms_admin/categories_controller_test.rb +70 -0
  236. data/test/functional/cms_admin/files_controller_test.rb +216 -0
  237. data/test/functional/cms_admin/layouts_controller_test.rb +123 -0
  238. data/test/functional/cms_admin/pages_controller_test.rb +450 -0
  239. data/test/functional/cms_admin/revisions_controller_test.rb +138 -0
  240. data/test/functional/cms_admin/sites_controller_test.rb +105 -0
  241. data/test/functional/cms_admin/snippets_controller_test.rb +140 -0
  242. data/test/functional/cms_content_controller_test.rb +205 -0
  243. data/test/gemfiles/Gemfile.rails.3.1 +16 -0
  244. data/test/gemfiles/Gemfile.rails.3.2 +16 -0
  245. data/test/gemfiles/Gemfile.rails.4.0 +16 -0
  246. data/test/integration/authentication_test.rb +48 -0
  247. data/test/integration/fixtures_test.rb +61 -0
  248. data/test/integration/mirrors_test.rb +72 -0
  249. data/test/integration/render_cms_test.rb +233 -0
  250. data/test/integration/sites_test.rb +120 -0
  251. data/test/integration/view_hooks_test.rb +43 -0
  252. data/test/test_helper.rb +124 -0
  253. data/test/unit/cms/menu_item_test.rb +7 -0
  254. data/test/unit/cms/menu_test.rb +7 -0
  255. data/test/unit/configuration_test.rb +42 -0
  256. data/test/unit/fixtures_test.rb +357 -0
  257. data/test/unit/mirrors_test.rb +242 -0
  258. data/test/unit/models/block_test.rb +199 -0
  259. data/test/unit/models/categorization_test.rb +76 -0
  260. data/test/unit/models/category_test.rb +39 -0
  261. data/test/unit/models/file_test.rb +89 -0
  262. data/test/unit/models/layout_test.rb +125 -0
  263. data/test/unit/models/page_test.rb +255 -0
  264. data/test/unit/models/site_test.rb +152 -0
  265. data/test/unit/models/snippet_test.rb +49 -0
  266. data/test/unit/revisions_test.rb +185 -0
  267. data/test/unit/sitemap_test.rb +20 -0
  268. data/test/unit/tag_test.rb +308 -0
  269. data/test/unit/tags/asset_test.rb +56 -0
  270. data/test/unit/tags/collection_test.rb +116 -0
  271. data/test/unit/tags/field_datetime_test.rb +50 -0
  272. data/test/unit/tags/field_integer_test.rb +49 -0
  273. data/test/unit/tags/field_rich_text_test.rb +49 -0
  274. data/test/unit/tags/field_string_test.rb +52 -0
  275. data/test/unit/tags/field_text_test.rb +48 -0
  276. data/test/unit/tags/file_test.rb +67 -0
  277. data/test/unit/tags/helper_test.rb +86 -0
  278. data/test/unit/tags/page_datetime_test.rb +50 -0
  279. data/test/unit/tags/page_file_test.rb +119 -0
  280. data/test/unit/tags/page_files_test.rb +113 -0
  281. data/test/unit/tags/page_integer_test.rb +49 -0
  282. data/test/unit/tags/page_markdown_test.rb +48 -0
  283. data/test/unit/tags/page_rich_text_test.rb +49 -0
  284. data/test/unit/tags/page_string_test.rb +49 -0
  285. data/test/unit/tags/page_text_test.rb +52 -0
  286. data/test/unit/tags/partial_test.rb +76 -0
  287. data/test/unit/tags/snippet_test.rb +45 -0
  288. data/test/unit/view_methods_test.rb +80 -0
  289. metadata +457 -0
@@ -0,0 +1,255 @@
1
+ # encoding: utf-8
2
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
3
+
4
+ class CmsPageTest < ActiveSupport::TestCase
5
+
6
+ def test_fixtures_validity
7
+ Cms::Page.all.each do |page|
8
+ assert page.valid?, page.errors.full_messages.to_s
9
+ assert_equal page.read_attribute(:content), page.content(true)
10
+ end
11
+ end
12
+
13
+ def test_validations
14
+ page = Cms::Page.new
15
+ page.save
16
+ assert page.invalid?
17
+ assert_has_errors_on page, :site_id, :layout, :slug, :label
18
+ end
19
+
20
+ def test_validation_of_parent_presence
21
+ page = cms_sites(:default).pages.new(new_params)
22
+ assert !page.parent
23
+ assert page.valid?, page.errors.full_messages.to_s
24
+ assert_equal cms_pages(:default), page.parent
25
+ end
26
+
27
+ def test_validation_of_parent_relationship
28
+ page = cms_pages(:default)
29
+ assert !page.parent
30
+ page.parent = page
31
+ assert page.invalid?
32
+ assert_has_errors_on page, :parent_id
33
+ page.parent = cms_pages(:child)
34
+ assert page.invalid?
35
+ assert_has_errors_on page, :parent_id
36
+ end
37
+
38
+ def test_validation_of_target_page
39
+ page = cms_pages(:child)
40
+ page.target_page = cms_pages(:default)
41
+ page.save!
42
+ assert_equal cms_pages(:default), page.target_page
43
+ page.target_page = page
44
+ assert page.invalid?
45
+ assert_has_errors_on page, :target_page_id
46
+ end
47
+
48
+ def test_validation_of_slug
49
+ page = cms_pages(:child)
50
+ page.slug = 'slug.with.d0ts-and_things'
51
+ assert page.valid?
52
+
53
+ page.slug = 'inva lid'
54
+ assert page.invalid?
55
+
56
+ page.slug = 'acción'
57
+ assert page.valid?
58
+ end
59
+
60
+ def test_validation_of_slug_allows_unicode_accent_characters
61
+ page = cms_pages(:child)
62
+ thai_character_ko_kai = "\u0e01"
63
+ thai_character_mai_tho = "\u0E49"
64
+ page.slug = thai_character_ko_kai + thai_character_mai_tho
65
+ assert page.valid?
66
+ end
67
+
68
+ def test_label_assignment
69
+ page = cms_sites(:default).pages.new(
70
+ :slug => 'test',
71
+ :parent => cms_pages(:default),
72
+ :layout => cms_layouts(:default)
73
+ )
74
+ assert page.valid?
75
+ assert_equal 'Test', page.label
76
+ end
77
+
78
+ def test_creation
79
+ assert_difference ['Cms::Page.count', 'Cms::Block.count'] do
80
+ page = cms_sites(:default).pages.create!(
81
+ :label => 'test',
82
+ :slug => 'test',
83
+ :parent => cms_pages(:default),
84
+ :layout => cms_layouts(:default),
85
+ :blocks_attributes => [
86
+ { :identifier => 'default_page_text',
87
+ :content => 'test' }
88
+ ]
89
+ )
90
+ assert page.is_published?
91
+ assert_equal 1, page.position
92
+ end
93
+ end
94
+
95
+ def test_initialization_of_full_path
96
+ page = Cms::Page.new
97
+ assert_equal '/', page.full_path
98
+
99
+ page = Cms::Page.new(new_params)
100
+ assert page.invalid?
101
+ assert_has_errors_on page, :site_id
102
+
103
+ page = cms_sites(:default).pages.new(new_params(:parent => cms_pages(:default)))
104
+ assert page.valid?
105
+ assert_equal '/test-page', page.full_path
106
+
107
+ page = cms_sites(:default).pages.new(new_params(:parent => cms_pages(:child)))
108
+ assert page.valid?
109
+ assert_equal '/child-page/test-page', page.full_path
110
+
111
+ Cms::Page.destroy_all
112
+ page = cms_sites(:default).pages.new(new_params)
113
+ assert page.valid?
114
+ assert_equal '/', page.full_path
115
+ end
116
+
117
+ def test_sync_child_pages
118
+ page = cms_pages(:child)
119
+ page_1 = cms_sites(:default).pages.create!(new_params(:parent => page, :slug => 'test-page-1'))
120
+ page_2 = cms_sites(:default).pages.create!(new_params(:parent => page, :slug => 'test-page-2'))
121
+ page_3 = cms_sites(:default).pages.create!(new_params(:parent => page_2, :slug => 'test-page-3'))
122
+ page_4 = cms_sites(:default).pages.create!(new_params(:parent => page_1, :slug => 'test-page-4'))
123
+ assert_equal '/child-page/test-page-1', page_1.full_path
124
+ assert_equal '/child-page/test-page-2', page_2.full_path
125
+ assert_equal '/child-page/test-page-2/test-page-3', page_3.full_path
126
+ assert_equal '/child-page/test-page-1/test-page-4', page_4.full_path
127
+
128
+ page.update_attributes!(:slug => 'updated-page')
129
+ assert_equal '/updated-page', page.full_path
130
+ page_1.reload; page_2.reload; page_3.reload; page_4.reload
131
+ assert_equal '/updated-page/test-page-1', page_1.full_path
132
+ assert_equal '/updated-page/test-page-2', page_2.full_path
133
+ assert_equal '/updated-page/test-page-2/test-page-3', page_3.full_path
134
+ assert_equal '/updated-page/test-page-1/test-page-4', page_4.full_path
135
+
136
+ page_2.update_attributes!(:parent => page_1)
137
+ page_1.reload; page_2.reload; page_3.reload; page_4.reload
138
+ assert_equal '/updated-page/test-page-1', page_1.full_path
139
+ assert_equal '/updated-page/test-page-1/test-page-2', page_2.full_path
140
+ assert_equal '/updated-page/test-page-1/test-page-2/test-page-3', page_3.full_path
141
+ assert_equal '/updated-page/test-page-1/test-page-4', page_4.full_path
142
+ end
143
+
144
+ def test_children_count_updating
145
+ page_1 = cms_pages(:default)
146
+ page_2 = cms_pages(:child)
147
+ assert_equal 1, page_1.children_count
148
+ assert_equal 0, page_2.children_count
149
+
150
+ page_3 = cms_sites(:default).pages.create!(new_params(:parent => page_2))
151
+ page_1.reload; page_2.reload
152
+ assert_equal 1, page_1.children_count
153
+ assert_equal 1, page_2.children_count
154
+ assert_equal 0, page_3.children_count
155
+
156
+ page_3.update_attributes!(:parent => page_1)
157
+ page_1.reload; page_2.reload
158
+ assert_equal 2, page_1.children_count
159
+ assert_equal 0, page_2.children_count
160
+
161
+ page_3.destroy
162
+ page_1.reload; page_2.reload
163
+ assert_equal 1, page_1.children_count
164
+ assert_equal 0, page_2.children_count
165
+ end
166
+
167
+ def test_cascading_destroy
168
+ assert_difference 'Cms::Page.count', -2 do
169
+ assert_difference 'Cms::Block.count', -2 do
170
+ cms_pages(:default).destroy
171
+ end
172
+ end
173
+ end
174
+
175
+ def test_options_for_select
176
+ assert_equal ['Default Page', '. . Child Page'],
177
+ Cms::Page.options_for_select(cms_sites(:default)).collect{|t| t.first }
178
+ assert_equal ['Default Page'],
179
+ Cms::Page.options_for_select(cms_sites(:default), cms_pages(:child)).collect{|t| t.first }
180
+ assert_equal [],
181
+ Cms::Page.options_for_select(cms_sites(:default), cms_pages(:default))
182
+
183
+ page = Cms::Page.new(new_params(:parent => cms_pages(:default)))
184
+ assert_equal ['Default Page', '. . Child Page'],
185
+ Cms::Page.options_for_select(cms_sites(:default), page).collect{|t| t.first }
186
+ end
187
+
188
+ def test_cms_blocks_attributes_accessor
189
+ page = cms_pages(:default)
190
+ assert_equal page.blocks.count, page.blocks_attributes.size
191
+ assert_equal 'default_field_text', page.blocks_attributes.first[:identifier]
192
+ assert_equal 'default_field_text_content', page.blocks_attributes.first[:content]
193
+ end
194
+
195
+ def test_content_caching
196
+ page = cms_pages(:default)
197
+ assert_equal page.read_attribute(:content), page.content
198
+ assert_equal page.read_attribute(:content), page.content(true)
199
+
200
+ page.update_attributes({:content => 'changed'}, :without_protection => true)
201
+ assert_equal page.read_attribute(:content), page.content
202
+ assert_equal page.read_attribute(:content), page.content(true)
203
+ assert_not_equal 'changed', page.read_attribute(:content)
204
+ end
205
+
206
+ def test_scope_published
207
+ assert_equal 2, Cms::Page.published.count
208
+ cms_pages(:child).update_column(:is_published, false)
209
+ assert_equal 1, Cms::Page.published.count
210
+ end
211
+
212
+ def test_root?
213
+ assert cms_pages(:default).root?
214
+ assert !cms_pages(:child).root?
215
+ end
216
+
217
+ def test_url
218
+ site = cms_sites(:default)
219
+
220
+ assert_equal 'http://test.host/', cms_pages(:default).url
221
+ assert_equal 'http://test.host/child-page', cms_pages(:child).url
222
+
223
+ site.update_column(:path, '/en/site')
224
+ cms_pages(:default).reload
225
+ cms_pages(:child).reload
226
+
227
+ assert_equal 'http://test.host/en/site/', cms_pages(:default).url
228
+ assert_equal 'http://test.host/en/site/child-page', cms_pages(:child).url
229
+ end
230
+
231
+ def test_unicode_slug_escaping
232
+ page = cms_pages(:child)
233
+ page_1 = cms_sites(:default).pages.create!(new_params(:parent => page, :slug => 'tést-ünicode-slug'))
234
+ assert_equal CGI::escape('tést-ünicode-slug'), page_1.slug
235
+ assert_equal CGI::escape('/child-page/tést-ünicode-slug').gsub('%2F', '/'), page_1.full_path
236
+ end
237
+
238
+ def test_unicode_slug_unescaping
239
+ page = cms_pages(:child)
240
+ page_1 = cms_sites(:default).pages.create!(new_params(:parent => page, :slug => 'tést-ünicode-slug'))
241
+ found_page = cms_sites(:default).pages.where(:slug => CGI::escape('tést-ünicode-slug')).first
242
+ assert_equal 'tést-ünicode-slug', found_page.slug
243
+ assert_equal '/child-page/tést-ünicode-slug', found_page.full_path
244
+ end
245
+
246
+ protected
247
+
248
+ def new_params(options = {})
249
+ {
250
+ :label => 'Test Page',
251
+ :slug => 'test-page',
252
+ :layout => cms_layouts(:default)
253
+ }.merge(options)
254
+ end
255
+ end
@@ -0,0 +1,152 @@
1
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
2
+
3
+ class CmsSiteTest < ActiveSupport::TestCase
4
+
5
+ def test_fixtures_validity
6
+ Cms::Site.all.each do |site|
7
+ assert site.valid?, site.errors.inspect
8
+ end
9
+ end
10
+
11
+ def test_validation
12
+ site = Cms::Site.new
13
+ assert site.invalid?
14
+ assert_has_errors_on site, [:identifier, :label, :hostname]
15
+
16
+ site = Cms::Site.new(:identifier => 'test', :hostname => 'http://site.host')
17
+ assert site.invalid?
18
+ assert_has_errors_on site, :hostname
19
+
20
+ site = Cms::Site.new(:identifier => cms_sites(:default).identifier, :hostname => 'site.host')
21
+ assert site.invalid?
22
+ assert_has_errors_on site, :identifier
23
+
24
+ site = Cms::Site.new(:identifier => 'test', :hostname => 'site.host')
25
+ assert site.valid?, site.errors.inspect
26
+
27
+ site = Cms::Site.new(:identifier => 'test', :hostname => 'localhost:3000')
28
+ assert site.valid?, site.errors.inspect
29
+ end
30
+
31
+ def test_validation_path_uniqueness
32
+ s1 = cms_sites(:default)
33
+ s2 = Cms::Site.new(
34
+ :identifier => 'test',
35
+ :hostname => s1.hostname,
36
+ :path => s1.path
37
+ )
38
+ assert s2.invalid?
39
+ assert_has_errors_on s2, :hostname
40
+
41
+ s2 = Cms::Site.new(
42
+ :identifier => 'test',
43
+ :hostname => s1.hostname,
44
+ :path => '/en'
45
+ )
46
+ assert s2.valid?
47
+ end
48
+
49
+ def test_identifier_assignment
50
+ site = Cms::Site.new(:hostname => 'my-site.host')
51
+ assert site.valid?
52
+ assert_equal 'my-site-host', site.identifier
53
+ end
54
+
55
+ def test_hostname_assignment
56
+ site = Cms::Site.new(:identifier => 'test-site')
57
+ assert site.valid?
58
+ assert_equal 'test-site', site.hostname
59
+ end
60
+
61
+ def test_label_assignment
62
+ site = Cms::Site.new(:identifier => 'test', :hostname => 'my-site.host')
63
+ assert site.valid?
64
+ assert_equal 'Test', site.label
65
+ end
66
+
67
+ def test_clean_path
68
+ site = Cms::Site.create!(:identifier => 'test_a', :hostname => 'test.host', :path => '/en///test//')
69
+ assert_equal '/en/test', site.path
70
+
71
+ site = Cms::Site.create!(:identifier => 'test_b', :hostname => 'my-site.host', :path => '/')
72
+ assert_equal '', site.path
73
+ end
74
+
75
+ def test_creation
76
+ assert_difference 'Cms::Site.count' do
77
+ Cms::Site.create!(
78
+ :identifier => 'test',
79
+ :label => 'Test Site',
80
+ :hostname => 'test.test'
81
+ )
82
+ end
83
+ end
84
+
85
+ def test_cascading_destroy
86
+ assert_difference 'Cms::Site.count', -1 do
87
+ assert_difference 'Cms::Layout.count', -3 do
88
+ assert_difference 'Cms::Page.count', -2 do
89
+ assert_difference 'Cms::Snippet.count', -1 do
90
+ assert_difference 'Cms::Category.count', -1 do
91
+ cms_sites(:default).destroy
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ def test_scope_mirrored
100
+ site = cms_sites(:default)
101
+ assert !site.is_mirrored
102
+ assert_equal 0, Cms::Site.mirrored.count
103
+ site.update_column(:is_mirrored, true)
104
+ assert_equal 1, Cms::Site.mirrored.count
105
+ end
106
+
107
+ def test_find_site
108
+ site_a = cms_sites(:default)
109
+ assert_equal 'test.host', site_a.hostname
110
+ assert_equal nil, site_a.path
111
+
112
+ assert_equal site_a, Cms::Site.find_site('test.host')
113
+ assert_equal site_a, Cms::Site.find_site('test.host', '/some/path')
114
+ assert_equal site_a, Cms::Site.find_site('test99.host', '/some/path')
115
+
116
+ site_b = Cms::Site.create!(:identifier => 'test_a', :hostname => 'test2.host', :path => 'en')
117
+ site_c = Cms::Site.create!(:identifier => 'test_b', :hostname => 'test2.host', :path => 'fr')
118
+
119
+ assert_equal site_a, Cms::Site.find_site('test.host')
120
+ assert_equal site_a, Cms::Site.find_site('test.host', '/some/path')
121
+ assert_equal site_a, Cms::Site.find_site('test.host', '/some/path')
122
+ assert_equal nil, Cms::Site.find_site('test99.host', '/some/path')
123
+
124
+ assert_equal nil, Cms::Site.find_site('test2.host')
125
+ assert_equal nil, Cms::Site.find_site('test2.host', '/some/path')
126
+ assert_equal site_b, Cms::Site.find_site('test2.host', '/en')
127
+ assert_equal site_b, Cms::Site.find_site('test2.host', '/en?a=b')
128
+ assert_equal site_b, Cms::Site.find_site('test2.host', '/en/some/path?a=b')
129
+
130
+ assert_equal nil, Cms::Site.find_site('test2.host', '/english/some/path')
131
+
132
+ assert_equal site_c, Cms::Site.find_site('test2.host', '/fr')
133
+ assert_equal site_c, Cms::Site.find_site('test2.host', '/fr?a=b')
134
+ assert_equal site_c, Cms::Site.find_site('test2.host', '/fr/some/path')
135
+ assert_equal site_c, Cms::Site.find_site('test2.host', '/fr/some/path?a=b')
136
+ end
137
+
138
+ def test_find_site_with_site_alias
139
+ site_a = cms_sites(:default)
140
+ site_b = Cms::Site.create!(:identifier => 'site_b', :hostname => 'test2.host')
141
+
142
+ ComfyPress.config.hostname_aliases = {
143
+ 'test.host' => 'alias_a.host',
144
+ 'test2.host' => %w(alias_b.host alias_c.host)
145
+ }
146
+
147
+ assert_equal site_a, Cms::Site.find_site('alias_a.host')
148
+ assert_equal site_b, Cms::Site.find_site('alias_b.host')
149
+ assert_equal site_b, Cms::Site.find_site('alias_c.host')
150
+ end
151
+
152
+ end
@@ -0,0 +1,49 @@
1
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
2
+
3
+ class CmsSnippetTest < ActiveSupport::TestCase
4
+
5
+ def test_fixtures_validity
6
+ Cms::Snippet.all.each do |snippet|
7
+ assert snippet.valid?, snippet.errors.full_messages.to_s
8
+ end
9
+ end
10
+
11
+ def test_validations
12
+ snippet = Cms::Snippet.new
13
+ snippet.save
14
+ assert snippet.invalid?
15
+ assert_has_errors_on snippet, :site_id, :label, :identifier
16
+ end
17
+
18
+ def test_label_assignment
19
+ snippet = cms_sites(:default).snippets.new(
20
+ :identifier => 'test'
21
+ )
22
+ assert snippet.valid?
23
+ assert_equal 'Test', snippet.label
24
+ end
25
+
26
+ def test_create
27
+ assert_difference 'Cms::Snippet.count' do
28
+ snippet = cms_sites(:default).snippets.create(
29
+ :label => 'Test Snippet',
30
+ :identifier => 'test',
31
+ :content => 'Test Content'
32
+ )
33
+ assert_equal 'Test Snippet', snippet.label
34
+ assert_equal 'test', snippet.identifier
35
+ assert_equal 'Test Content', snippet.content
36
+ assert_equal 1, snippet.position
37
+ end
38
+ end
39
+
40
+ def test_update_forces_page_content_reload
41
+ snippet = cms_snippets(:default)
42
+ page = cms_pages(:default)
43
+ assert_match snippet.content, page.content
44
+ snippet.update_attributes(:content => 'new_snippet_content')
45
+ page.reload
46
+ assert_match /new_snippet_content/, page.content
47
+ end
48
+
49
+ end
@@ -0,0 +1,185 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class RevisionsTest < ActiveSupport::TestCase
4
+
5
+ def test_fixtures_validity
6
+ assert_equal ({
7
+ 'content' => 'revision {{cms:page:default_page_text}}',
8
+ 'css' => 'revision css',
9
+ 'js' => 'revision js' }), cms_revisions(:layout).data
10
+
11
+ assert_equal ({'blocks_attributes' => [
12
+ { 'identifier' => 'default_page_text', 'content' => 'revision page content' },
13
+ { 'identifier' => 'default_field_text', 'content' => 'revision field content' }
14
+ ]}), cms_revisions(:page).data
15
+
16
+ assert_equal ({
17
+ 'content' => 'revision content'
18
+ }), cms_revisions(:snippet).data
19
+ end
20
+
21
+ def test_init_for_layouts
22
+ assert_equal ['content', 'css', 'js'], cms_layouts(:default).revision_fields
23
+ end
24
+
25
+ def test_init_for_pages
26
+ assert_equal ['blocks_attributes'], cms_pages(:default).revision_fields
27
+ end
28
+
29
+ def test_init_for_snippets
30
+ assert_equal ['content'], cms_snippets(:default).revision_fields
31
+ end
32
+
33
+ def test_creation_for_layout
34
+ layout = cms_layouts(:default)
35
+ old_attributes = layout.attributes.slice('content', 'css', 'js')
36
+
37
+ assert_difference 'layout.revisions.count' do
38
+ layout.update_attributes!(
39
+ :content => 'new {{cms:page:content}}',
40
+ :js => 'new js'
41
+ )
42
+ layout.reload
43
+ assert_equal 2, layout.revisions.count
44
+ revision = layout.revisions.first
45
+ assert_equal old_attributes, revision.data
46
+ end
47
+ end
48
+
49
+ def test_creation_for_layout_ignore
50
+ layout = cms_layouts(:default)
51
+ assert_no_difference 'layout.revisions.count' do
52
+ layout.update_attributes(:label => 'new label')
53
+ end
54
+ end
55
+
56
+ def test_creation_for_page
57
+ page = cms_pages(:default)
58
+
59
+ assert_difference 'page.revisions.count' do
60
+ page.update_attributes!(
61
+ :blocks_attributes => [
62
+ { :identifier => 'default_page_text',
63
+ :content => 'new content' }
64
+ ]
65
+ )
66
+ page.reload
67
+ assert_equal 2, page.revisions.count
68
+ revision = page.revisions.first
69
+ assert_equal ({
70
+ 'blocks_attributes' => [
71
+ { :identifier => 'default_field_text',
72
+ :content => 'default_field_text_content' },
73
+ { :identifier => 'default_page_text',
74
+ :content => "default_page_text_content_a\n{{cms:snippet:default}}\ndefault_page_text_content_b" }]
75
+ }), revision.data
76
+ end
77
+ end
78
+
79
+ def test_creation_for_page_ignore
80
+ page = cms_pages(:default)
81
+ assert_no_difference 'page.revisions.count' do
82
+ page.update_attributes(:label => 'new label')
83
+ end
84
+ end
85
+
86
+ def test_creation_for_snippet
87
+ snippet = cms_snippets(:default)
88
+ old_attributes = snippet.attributes.slice('content')
89
+
90
+ assert_difference 'snippet.revisions.count' do
91
+ snippet.update_attributes(:content => 'new content')
92
+ snippet.reload
93
+ assert_equal 2, snippet.revisions.count
94
+ revision = snippet.revisions.first
95
+ assert_equal old_attributes, revision.data
96
+ end
97
+ end
98
+
99
+ def test_creation_for_snippet_ignore
100
+ snippet = cms_snippets(:default)
101
+ assert_no_difference 'snippet.revisions.count' do
102
+ snippet.update_attributes(:label => 'new label')
103
+ end
104
+ end
105
+
106
+ def test_creation_for_new_record
107
+ assert_difference 'Cms::Snippet.count' do
108
+ assert_no_difference 'Cms::Revision.count' do
109
+ snippet = cms_sites(:default).snippets.create!(
110
+ :label => 'test snippet',
111
+ :identifier => 'test_snippet',
112
+ :content => 'test content'
113
+ )
114
+ assert_equal 0, snippet.revisions.count
115
+ end
116
+ end
117
+ end
118
+
119
+ def test_restore_from_revision_for_layout
120
+ layout = cms_layouts(:default)
121
+ revision = cms_revisions(:layout)
122
+
123
+ assert_difference 'layout.revisions.count' do
124
+ layout.restore_from_revision(revision)
125
+ layout.reload
126
+ assert_equal 'revision {{cms:page:default_page_text}}', layout.content
127
+ assert_equal 'revision css', layout.css
128
+ assert_equal 'revision js', layout.js
129
+ end
130
+ end
131
+
132
+ def test_restore_from_revision_for_page
133
+ page = cms_pages(:default)
134
+ revision = cms_revisions(:page)
135
+
136
+ assert_difference 'page.revisions.count' do
137
+ page.restore_from_revision(revision)
138
+ page.reload
139
+ assert_equal [
140
+ { :identifier => 'default_field_text', :content => 'revision field content' },
141
+ { :identifier => 'default_page_text', :content => 'revision page content' }
142
+ ], page.blocks_attributes
143
+ end
144
+ end
145
+
146
+ def test_restore_from_revision_for_snippet
147
+ snippet = cms_snippets(:default)
148
+ revision = cms_revisions(:snippet)
149
+
150
+ assert_difference 'snippet.revisions.count' do
151
+ snippet.restore_from_revision(revision)
152
+ snippet.reload
153
+ assert_equal 'revision content', snippet.content
154
+ end
155
+ end
156
+
157
+ def test_restore_from_revision_with_wrong_revision_type
158
+ snippet = cms_snippets(:default)
159
+ revision = cms_revisions(:layout)
160
+
161
+ assert_no_difference 'snippet.revisions.count' do
162
+ snippet.restore_from_revision(revision)
163
+ snippet.reload
164
+ assert_equal 'default_snippet_content', snippet.content
165
+ end
166
+ end
167
+
168
+ def test_creation_with_limit
169
+ ComfyPress.config.revisions_limit = 1
170
+ snippet = cms_snippets(:default)
171
+ revision = cms_revisions(:snippet)
172
+
173
+ assert_equal 1, snippet.revisions.count
174
+
175
+ assert_no_difference 'snippet.revisions.count' do
176
+ snippet.update_attributes(:content => 'new content')
177
+ assert_nil Cms::Revision.find_by_id(revision.id)
178
+
179
+ snippet.reload
180
+ revision = snippet.revisions.first
181
+ assert_equal ({ 'content' => 'default_snippet_content' }), revision.data
182
+ end
183
+ end
184
+
185
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class SitemapTest < ActiveSupport::TestCase
4
+ class DummySitemapExtension
5
+ @@calls = 0
6
+ def self.calls
7
+ @@calls
8
+ end
9
+ def self.callback(cms_site, view, xml)
10
+ @@calls = @@calls + 1
11
+ end
12
+ end
13
+
14
+ def test_should_get_registered_extensions
15
+ ComfyPress::Sitemap.register_extension(DummySitemapExtension.method(:callback))
16
+ ComfyPress::Sitemap.process(cms_sites(:default), nil, "xml")
17
+ assert_equal 1, DummySitemapExtension.calls
18
+ end
19
+
20
+ end