spree_essential_cms 0.3.0.rc1 → 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 (69) hide show
  1. data/.gitignore +8 -0
  2. data/.travis.yml +15 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE +1 -1
  5. data/README.md +64 -5
  6. data/Versionfile +8 -0
  7. data/app/controllers/spree/admin/contents_controller.rb +4 -4
  8. data/app/controllers/spree/admin/pages_controller.rb +6 -12
  9. data/app/controllers/spree/base_controller_decorator.rb +15 -0
  10. data/app/controllers/spree/home_controller_decorator.rb +23 -0
  11. data/app/controllers/spree/pages_controller.rb +2 -11
  12. data/app/models/spree/content.rb +40 -39
  13. data/app/models/spree/page.rb +21 -10
  14. data/app/models/spree/page_image.rb +10 -15
  15. data/app/views/spree/admin/contents/_form.html.erb +9 -4
  16. data/app/views/spree/admin/contents/edit.html.erb +0 -2
  17. data/app/views/spree/admin/contents/index.html.erb +22 -23
  18. data/app/views/spree/admin/contents/new.html.erb +0 -2
  19. data/app/views/spree/admin/contents/show.html.erb +0 -1
  20. data/app/views/spree/admin/page_images/edit.html.erb +1 -3
  21. data/app/views/spree/admin/page_images/index.html.erb +25 -25
  22. data/app/views/spree/admin/page_images/new.html.erb +3 -1
  23. data/app/views/spree/admin/pages/edit.html.erb +0 -2
  24. data/app/views/spree/admin/pages/index.html.erb +26 -26
  25. data/app/views/spree/admin/pages/new.html.erb +1 -1
  26. data/app/views/spree/admin/pages/show.html.erb +0 -2
  27. data/app/views/spree/pages/home.html.erb +10 -0
  28. data/app/views/spree/shared/_main_menu.html.erb +3 -7
  29. data/app/views/spree/shared/_main_menu_items.html.erb +6 -0
  30. data/config/locales/en.yml +1 -0
  31. data/config/locales/it.yml +63 -0
  32. data/config/routes.rb +10 -12
  33. data/{lib/generators/templates/db/migrate/create_pages.rb → db/migrate/20120306185628_create_pages.rb} +0 -0
  34. data/{lib/generators/templates/db/migrate/create_contents.rb → db/migrate/20120306185638_create_contents.rb} +0 -0
  35. data/{lib/generators/templates/db/migrate/add_spree_namespace.rb → db/migrate/20120306185648_add_spree_namespace.rb} +0 -0
  36. data/lib/generators/spree_essentials/cms_generator.rb +3 -8
  37. data/lib/spree_essential_cms.rb +5 -19
  38. data/lib/spree_essential_cms/engine.rb +16 -0
  39. data/lib/spree_essential_cms/version.rb +1 -1
  40. data/lib/tasks/sample.rake +9 -13
  41. data/spree_essential_cms.gemspec +34 -0
  42. data/test/dummy_hooks/after_app_generator.rb +17 -0
  43. data/test/dummy_hooks/after_migrate.rb.sample +1 -0
  44. data/test/dummy_hooks/before_migrate.rb +11 -0
  45. data/test/dummy_hooks/templates/assets/javascripts/admin/all.js +1 -0
  46. data/test/dummy_hooks/templates/assets/javascripts/store/all.js +1 -0
  47. data/test/dummy_hooks/templates/assets/stylesheets/admin/all.css +3 -0
  48. data/test/dummy_hooks/templates/assets/stylesheets/store/all.css +3 -0
  49. data/test/dummy_hooks/templates/assets/stylesheets/store/screen.css +749 -0
  50. data/test/dummy_hooks/templates/initializers/spree_user_error_fix.rb +3 -0
  51. data/test/dummy_hooks/templates/overrides/main_menu.rb +6 -0
  52. data/test/integration/spree/admin/contents_integration_test.rb +116 -0
  53. data/test/integration/spree/admin/page_images_integration_test.rb +94 -0
  54. data/test/integration/spree/admin/pages_integration_test.rb +131 -0
  55. data/test/integration/spree/home_integration_test.rb +54 -0
  56. data/test/integration/spree/pages_integration_test.rb +122 -0
  57. data/test/support/factories.rb +21 -0
  58. data/test/support/files/1.jpg +0 -0
  59. data/test/support/files/2.jpg +0 -0
  60. data/test/support/helpers.rb +13 -0
  61. data/test/test_helper.rb +19 -0
  62. data/test/unit/spree/content_test.rb +39 -0
  63. data/test/unit/spree/essential_test.rb +9 -0
  64. data/test/unit/spree/page_image_test.rb +47 -0
  65. data/test/unit/spree/page_test.rb +53 -0
  66. metadata +117 -48
  67. data/app/assets/stylesheets/essentials/cms.css +0 -39
  68. data/app/controllers/spree/page_controller.rb +0 -20
  69. data/app/controllers/spree/spree_base_controller_decorator.rb +0 -12
@@ -0,0 +1,3 @@
1
+ unless Spree::User.const_defined?(:DestroyWithOrdersError)
2
+ class Spree::User::DestroyWithOrdersError < StandardError; end
3
+ end
@@ -0,0 +1,6 @@
1
+ # app/overrides/main_menu.rb
2
+ Deface::Override.new(:virtual_path => "spree/shared/_store_menu",
3
+ :name => "spree_essential_cms_main_menu_items",
4
+ :insert_after => "#home-link[data-hook]",
5
+ :partial => "spree/shared/main_menu_items",
6
+ :disabled => false)
@@ -0,0 +1,116 @@
1
+ require 'test_helper'
2
+
3
+ class Spree::Admin::ContentsIntegrationTest < SpreeEssentials::IntegrationCase
4
+
5
+ setup do
6
+ Spree::Content.destroy_all
7
+ @page = Spree::Page.first || Factory.create(:spree_page)
8
+ end
9
+
10
+ should "have a link to new content" do
11
+ visit spree.admin_page_contents_path(@page)
12
+ btn = find(".actions a.button").native
13
+ assert_match /#{spree.new_admin_page_content_path(@page)}$/, btn.attribute('href')
14
+ assert_equal "New Content", btn.text
15
+ end
16
+
17
+ should "get new content" do
18
+ visit spree.new_admin_page_content_path(@page)
19
+ assert has_content?("New Content")
20
+ within "#new_content" do
21
+ assert has_field?("Title")
22
+ assert has_field?("Page")
23
+ assert has_field?("Body")
24
+ assert has_field?("Context")
25
+ assert has_field?("Attachment")
26
+ assert has_field?("Link URL")
27
+ assert has_field?("Link Text")
28
+ assert has_field?("Hide Title")
29
+ end
30
+ end
31
+
32
+ should "validate content" do
33
+ visit spree.new_admin_page_content_path(@page)
34
+ click_button "Create"
35
+ within "#errorExplanation" do
36
+ assert_seen "1 error prohibited this record from being saved:"
37
+ assert_seen "Title can't be blank"
38
+ end
39
+ end
40
+
41
+ should "create some content" do
42
+ visit spree.new_admin_page_content_path(@page)
43
+ within "#new_content" do
44
+ fill_in "Title", :with => "Just some content"
45
+ select @page.title, :from => "Page"
46
+ fill_in "Body", :with => "Just some words in the content..."
47
+ end
48
+ click_button "Create"
49
+ assert_equal spree.admin_page_contents_path(@page), current_path
50
+ assert_flash :notice, "Content has been successfully created!"
51
+ end
52
+
53
+ context "existing content" do
54
+ setup do
55
+ @content = Factory.create(:spree_content, :page => @page)
56
+ end
57
+
58
+ should "edit and update" do
59
+ visit spree.edit_admin_page_content_path(@page, @content)
60
+ within "#edit_content_#{@content.id}" do
61
+ fill_in "Title", :with => "Just some content"
62
+ select @page.title, :from => "Page"
63
+ fill_in "Body", :with => "Just some words in the content..."
64
+ end
65
+ click_button "Update"
66
+ assert_equal spree.admin_page_contents_path(@page.reload), current_path
67
+ assert_flash :notice, "Content has been successfully updated!"
68
+ end
69
+
70
+ should "not delete current attachment unless checkbox is checked" do
71
+ @content.update_attribute(:attachment, sample_image)
72
+ visit spree.edit_admin_page_content_path(@page, @content)
73
+ click_button "Update"
74
+ assert !@content.reload.attachment_file_name.blank?
75
+ end
76
+
77
+ should "delete current attachment" do
78
+ @content.update_attribute(:attachment, sample_image)
79
+ visit spree.edit_admin_page_content_path(@page, @content)
80
+ click_link "Optional Fields"
81
+ check "Delete current attachment"
82
+ click_button "Update"
83
+ assert @content.reload.attachment_file_name.blank?
84
+ end
85
+
86
+ should "get destroyed" do
87
+ visit spree.admin_page_contents_path(@page)
88
+ within "table.index" do
89
+ find("a[href='#']").click
90
+ end
91
+ assert find_by_id("popup_ok").click
92
+ end
93
+
94
+ end
95
+
96
+ context "several contents" do
97
+
98
+ setup do
99
+ setup_action_controller_behaviour(Spree::Admin::ContentsController)
100
+ @contents = Array.new(2) {|i| Factory(:spree_content, :title => "Content ##{i + 1}", :page => @page, :position => i) }
101
+ end
102
+
103
+ should "update positions" do
104
+ positions = Hash[@contents.map{|i| [i.id, 2 - i.position ]}]
105
+ visit spree.admin_page_contents_path(@page)
106
+ assert_seen "Content #1", :within => "tbody tr:first"
107
+ assert_seen "Content #2", :within => "tbody tr:last"
108
+ xhr :post, :update_positions, { :page_id => @page.to_param, :positions => positions }
109
+ visit spree.admin_page_contents_path(@page)
110
+ assert_seen "Content #2", :within => "tbody tr:first"
111
+ assert_seen "Content #1", :within => "tbody tr:last"
112
+ end
113
+
114
+ end
115
+
116
+ end
@@ -0,0 +1,94 @@
1
+ require 'test_helper'
2
+
3
+ class Spree::Admin::PageImagesIntegrationTest < SpreeEssentials::IntegrationCase
4
+
5
+ setup do
6
+ Spree::PageImage.destroy_all
7
+ @page = Spree::Page.first || Factory.create(:spree_page)
8
+ end
9
+
10
+ should "have a link to new page image" do
11
+ visit spree.admin_page_images_path(@page)
12
+ btn = find("#new_image_link").native
13
+ assert_match /#{spree.new_admin_page_image_path(@page)}$/, btn.attribute('href')
14
+ assert_equal "New Image", btn.text
15
+ end
16
+
17
+ should "get new page image" do
18
+ visit spree.new_admin_page_image_path(@page)
19
+ assert_seen "New Image"
20
+ within "#new_page_image" do
21
+ assert has_field?("Attachment")
22
+ assert has_field?("Alt")
23
+ end
24
+ end
25
+
26
+ should "validate page image" do
27
+ visit spree.new_admin_page_image_path(@page)
28
+ click_button "Create"
29
+ within "#errorExplanation" do
30
+ assert_seen "2 errors prohibited this record from being saved:"
31
+ assert_seen "Attachment can't be empty"
32
+ assert_seen "Attachment file name can't be empty"
33
+ end
34
+ end
35
+
36
+ should "create page image" do
37
+ visit spree.admin_page_images_path(@page)
38
+ click_link "New Image"
39
+ within "#new_page_image" do
40
+ attach_file "Attachment", sample_image_path
41
+ fill_in "Alt", :with => "alt text!"
42
+ end
43
+ click_button "Create"
44
+ assert_equal spree.admin_page_images_path(@page), current_path
45
+ assert_flash :notice, "Page image has been successfully created!"
46
+ end
47
+
48
+ context "existing page image" do
49
+ setup do
50
+ @page_image = Factory.create(:spree_page_image, :viewable => @page)
51
+ end
52
+
53
+ should "edit and update" do
54
+ visit spree.edit_admin_page_image_path(@page, @page_image)
55
+ within "#edit_page_image_#{@page_image.id}" do
56
+ attach_file "Attachment", sample_image_path("2.jpg")
57
+ fill_in "Alt", :with => "omg!"
58
+ end
59
+ click_button "Update"
60
+ assert_equal spree.admin_page_images_path(@page), current_path
61
+ assert_flash :notice, "Page image has been successfully updated!"
62
+ end
63
+
64
+ should "get destroyed" do
65
+ visit spree.admin_page_images_path(@page)
66
+ within "table.index" do
67
+ find("a[href='#']").click
68
+ end
69
+ assert find_by_id("popup_ok").click
70
+ end
71
+
72
+ end
73
+
74
+ context "several page images" do
75
+
76
+ setup do
77
+ setup_action_controller_behaviour(Spree::Admin::PageImagesController)
78
+ @page_images = Array.new(2) {|i| Factory(:spree_page_image, :alt => "Image ##{i + 1}", :viewable => @page, :position => i) }
79
+ end
80
+
81
+ should "update positions" do
82
+ positions = Hash[@page_images.map{|i| [i.id, 2 - i.position ]}]
83
+ visit spree.admin_page_images_path(@page)
84
+ assert_seen "Image #1", :within => "tbody tr:first"
85
+ assert_seen "Image #2", :within => "tbody tr:last"
86
+ xhr :post, :update_positions, { :page_id => @page.to_param, :positions => positions }
87
+ visit spree.admin_page_images_path(@page)
88
+ assert_seen "Image #2", :within => "tbody tr:first"
89
+ assert_seen "Image #1", :within => "tbody tr:last"
90
+ end
91
+
92
+ end
93
+
94
+ end
@@ -0,0 +1,131 @@
1
+ require 'test_helper'
2
+
3
+ class Spree::Admin::PagesIntegrationTest < SpreeEssentials::IntegrationCase
4
+
5
+ setup do
6
+ Spree::Page.destroy_all
7
+ @labels = %(Title, Meta Title, Meta Description, Meta Keywords, Path, Navigation Title).split(', ')
8
+ @values = %(Just a page, Super Sweet Page Title, #{Faker::Lorem.paragraph}, one keyword, /some-page, Visit Page).split(', ')
9
+ end
10
+
11
+ should "get index and have a link to new page" do
12
+ visit spree.admin_pages_path
13
+ btn = find(".actions a.button").native
14
+ assert_match /#{spree.new_admin_page_path}$/, btn.attribute('href')
15
+ assert_equal "New Page", btn.text
16
+ end
17
+
18
+ should "get new page" do
19
+ visit spree.new_admin_page_path
20
+ assert has_content?("New Page")
21
+ within "#new_page" do
22
+ @labels.each do |f|
23
+ assert has_field?(f)
24
+ end
25
+ end
26
+ end
27
+
28
+ should "validate page" do
29
+ visit spree.new_admin_page_path
30
+ click_button "Create"
31
+ within "#errorExplanation" do
32
+ assert_seen "2 errors prohibited this record from being saved:"
33
+ assert_seen "Title can't be blank"
34
+ assert_seen "Path can't be blank"
35
+ end
36
+ end
37
+
38
+ should "create a page" do
39
+ visit spree.new_admin_page_path
40
+ within "#new_page" do
41
+ @labels.each_with_index do |label, index|
42
+ fill_in label, :with => @values[index]
43
+ end
44
+ end
45
+ click_button "Create"
46
+ @page = Spree::Page.last
47
+ assert_equal spree.edit_admin_page_content_path(@page, @page.contents.first), current_path
48
+ assert_flash :notice, %(Page "Just a page" has been successfully created!)
49
+ end
50
+
51
+ context "an existing page" do
52
+ setup do
53
+ @page = Factory.create(:spree_page)
54
+ end
55
+
56
+ should "get show" do
57
+ visit spree.admin_page_path(@page)
58
+ assert_seen @page.meta_title
59
+ assert_seen @page.meta_description
60
+ assert_seen @page.meta_keywords
61
+ assert has_link?("Edit")
62
+ within "#sidebar" do
63
+ assert has_link?("Contents")
64
+ assert has_link?("Images")
65
+ end
66
+ end
67
+
68
+ should "edit and update" do
69
+ visit spree.edit_admin_page_path(@page)
70
+
71
+ within "#edit_page_#{@page.id}" do
72
+ @labels.each_with_index do |label, index|
73
+ fill_in label, :with => @values[index].reverse
74
+ end
75
+ end
76
+ click_button "Update"
77
+ assert_equal spree.admin_page_path(@page.reload), current_path
78
+ assert_flash :notice, %(Page "egap a tsuJ" has been successfully updated!)
79
+ end
80
+
81
+ should "get destroyed" do
82
+ visit spree.admin_pages_path
83
+ find("a[href='#']").click
84
+ assert find_by_id("popup_ok").click
85
+ end
86
+
87
+ end
88
+
89
+ context "The homepage" do
90
+
91
+ setup do
92
+ @page = Spree::Page.create(:title => "Home", :meta_title => "Welcome to our homepage!", :path => "/")
93
+ end
94
+
95
+ should "edit and update" do
96
+ visit spree.edit_admin_page_path(@page)
97
+
98
+ within "#edit_page_#{@page.id}" do
99
+ @labels.each_with_index do |label, index|
100
+ next if label == "Path"
101
+ fill_in label, :with => @values[index]
102
+ end
103
+ end
104
+ click_button "Update"
105
+ assert_equal spree.admin_page_path(@page.reload), current_path
106
+ assert_flash :notice, %(Page "Just a page" has been successfully updated!)
107
+ end
108
+
109
+ end
110
+
111
+ context "several pages" do
112
+
113
+ setup do
114
+ setup_action_controller_behaviour(Spree::Admin::PagesController)
115
+ @pages = Array.new(2) {|i| Factory(:spree_page, :title => "Page ##{i + 1}", :position => i) }
116
+ end
117
+
118
+ should "update positions" do
119
+ positions = Hash[@pages.map{|i| [i.id, 2 - i.position ]}]
120
+ visit spree.admin_pages_path
121
+ assert_seen "Page #1", :within => "tbody tr:first"
122
+ assert_seen "Page #2", :within => "tbody tr:last"
123
+ xhr :post, :update_positions, { :page_id => @page.to_param, :positions => positions }
124
+ visit spree.admin_pages_path
125
+ assert_seen "Page #2", :within => "tbody tr:first"
126
+ assert_seen "Page #1", :within => "tbody tr:last"
127
+ end
128
+
129
+ end
130
+
131
+ end
@@ -0,0 +1,54 @@
1
+ require 'test_helper'
2
+
3
+ class Spree::HomeIntegrationTest < SpreeEssentials::IntegrationCase
4
+
5
+ setup do
6
+ Spree::Page.destroy_all
7
+ @images = Dir[File.expand_path("../../../../lib/tasks/sample", __FILE__) + "/*.jpg"]
8
+ end
9
+
10
+ should "redirect to products when no homepage is present" do
11
+ visit "/"
12
+ assert_equal spree.products_path, current_path
13
+ end
14
+
15
+ context "an existing homepage" do
16
+
17
+ setup do
18
+ @home = Spree::Page.create(:title => "Home", :meta_title => "Welcome to our homepage!", :path => "/")
19
+ @home.contents.first.update_attributes(:body => "This is a test", :context => "main")
20
+ @home.contents.create(:title => "Some might say...", :body => "This is another test", :context => "intro")
21
+ @images.each { |image|
22
+ image = File.open(image)
23
+ @home.images.create(:attachment => image, :alt => "Sailing", :viewable => @home)
24
+ image.close
25
+ }
26
+ visit "/"
27
+ end
28
+
29
+ should "have proper page title" do
30
+ assert_title "Spree Demo Site - Welcome to our homepage!"
31
+ end
32
+
33
+ should "have proper contents" do
34
+ within ".left .content-main" do
35
+ assert_seen "Home", :within => "h1.title"
36
+ assert_seen "This is a test", :within => "p"
37
+ end
38
+ within ".intro .content-main" do
39
+ assert_seen "Some might say...", :within => "h1.title"
40
+ assert_seen "This is another test", :within => "p"
41
+ end
42
+ end
43
+
44
+ should "have a images in slideshow" do
45
+ within "#content .slideshow" do
46
+ @home.images.each do |img|
47
+ assert has_xpath?("//img[@src='#{img.attachment.url(:slide)}']")
48
+ end
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,122 @@
1
+ require 'test_helper'
2
+
3
+ class Spree::PagesIntegrationTest < SpreeEssentials::IntegrationCase
4
+
5
+ setup do
6
+ Spree::Page.destroy_all
7
+ @images = Dir[File.expand_path("../../../../lib/tasks/sample", __FILE__) + "/*.jpg"]
8
+ end
9
+
10
+ context "any other page" do
11
+
12
+ setup do
13
+ @page = Spree::Page.create(:title => "Some Page", :meta_description => "This is the description", :meta_keywords => "just, a, keyword", :path => "/some-page")
14
+ end
15
+
16
+ should "have proper meta tags" do
17
+ visit @page.path
18
+ assert_title "Spree Demo Site - Some Page"
19
+ assert_meta :description, "This is the description"
20
+ assert_meta :keywords, "just, a, keyword"
21
+ end
22
+
23
+ context "with content that doesn't have an image" do
24
+
25
+ setup do
26
+ @page.contents.first.update_attributes(:body => "OMG it really is a page")
27
+ end
28
+
29
+ should "have proper content" do
30
+ visit @page.path
31
+ within ".content-main" do
32
+ assert_seen "Some Page", :within => "h1.title"
33
+ assert_seen "OMG it really is a page", :within => "p"
34
+ end
35
+ end
36
+
37
+ should "hide title is specified" do
38
+ @page.contents.first.update_attributes(:hide_title => true)
39
+ visit @page.path
40
+ within ".content-main" do
41
+ assert !has_selector?("h1.title")
42
+ assert_seen "OMG it really is a page", :within => "p"
43
+ end
44
+ end
45
+
46
+ end
47
+
48
+
49
+ context "with content that has an image" do
50
+
51
+ setup do
52
+ @content = @page.contents.first
53
+ @content.update_attributes(:body => "OMG it really is a page", :attachment => File.open(@images.first))
54
+ end
55
+
56
+ should "have proper content" do
57
+ visit @page.path
58
+ within ".content-left" do
59
+ assert has_xpath?("//img[@src='#{@content.attachment.url(:medium)}']")
60
+ end
61
+ within ".content-right" do
62
+ assert_seen "Some Page", :within => "h1.title"
63
+ assert_seen "OMG it really is a page", :within => "p"
64
+ end
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+
71
+
72
+ context "with several existing pages" do
73
+
74
+ setup do
75
+ @home_page = Factory.create(:spree_page, :title => "Home", :path => "/", :position => 1)
76
+ @another_home = Factory.create(:spree_page, :title => "Another Home", :path => "/home", :position => 2)
77
+ @about_page = Factory.create(:spree_page, :title => "About", :path => "/about-us", :position => 3)
78
+ @nested_page = Factory.create(:spree_page, :title => "Our Services", :path => "/about-us/services", :position => 4)
79
+ end
80
+
81
+ should "get the homepage" do
82
+ visit "/"
83
+ assert_title @home_page.title
84
+ end
85
+
86
+ should "get the page called home" do
87
+ visit "/home"
88
+ assert_title @another_home.title
89
+ end
90
+
91
+ should "get the about page" do
92
+ visit "/about-us"
93
+ assert_title @about_page.title
94
+ end
95
+
96
+ should "get a nested page" do
97
+ visit "/about-us/services"
98
+ assert_title @nested_page.title
99
+ end
100
+
101
+ should "render 404" do
102
+ visit "/a/page/that/doesnt/exist"
103
+ assert_seen "Error"
104
+ end
105
+
106
+ should "have a proper main menu" do
107
+ visit "/"
108
+ Spree::Page.order(:position).all.each do |page|
109
+ assert_seen page.nav_title, :within => "#main-nav-bar li:nth-child(#{page.position}) a"
110
+ end
111
+ end
112
+
113
+ should "only have pages marked visible in main menu" do
114
+ @about_page.update_attribute(:visible, false)
115
+ visit "/"
116
+ within "#main-nav-bar" do
117
+ assert !has_content?(@about_page.nav_title)
118
+ end
119
+ end
120
+
121
+ end
122
+ end