solidus_static_content 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +35 -0
  3. data/.gem_release.yml +5 -0
  4. data/.gitignore +17 -6
  5. data/.rspec +2 -3
  6. data/.rubocop.yml +2 -0
  7. data/CHANGELOG.md +80 -0
  8. data/Gemfile +26 -6
  9. data/{LICENSE.md → LICENSE} +0 -0
  10. data/README.md +81 -68
  11. data/Rakefile +4 -13
  12. data/app/assets/stylesheets/spree/frontend/solidus_static_content.css +7 -0
  13. data/app/assets/stylesheets/spree/frontend/spree_static_content.css +2 -7
  14. data/app/models/solidus_static_content/permission_sets/page_display.rb +11 -0
  15. data/app/models/solidus_static_content/permission_sets/page_management.rb +11 -0
  16. data/app/models/spree/page.rb +16 -21
  17. data/bin/console +17 -0
  18. data/bin/r +8 -0
  19. data/bin/rails +6 -6
  20. data/bin/rails-engine +13 -0
  21. data/bin/rails-sandbox +16 -0
  22. data/bin/rake +7 -0
  23. data/bin/sandbox +84 -0
  24. data/bin/sandbox_rails +8 -0
  25. data/bin/setup +8 -0
  26. data/config/locales/de.yml +7 -5
  27. data/config/locales/en.yml +9 -7
  28. data/config/locales/es-MX.yml +38 -0
  29. data/config/locales/es.yml +6 -5
  30. data/config/locales/et.yml +6 -5
  31. data/config/locales/fr.yml +7 -5
  32. data/config/locales/it.yml +6 -5
  33. data/config/locales/nl.yml +7 -5
  34. data/config/locales/pl.yml +6 -5
  35. data/config/locales/pt-BR.yml +6 -5
  36. data/config/locales/pt.yml +7 -5
  37. data/config/locales/ro.yml +11 -9
  38. data/config/locales/ru.yml +7 -5
  39. data/config/locales/sv.yml +7 -5
  40. data/config/routes.rb +9 -2
  41. data/db/migrate/20081216193152_create_pages.rb +1 -1
  42. data/db/migrate/20090625125735_extend_pages.rb +1 -1
  43. data/db/migrate/20090814113100_add_visible_to_pages.rb +1 -1
  44. data/db/migrate/20090814142845_add_default_true_to_visible_for_page.rb +1 -1
  45. data/db/migrate/20090829000527_add_index_for_page.rb +1 -1
  46. data/db/migrate/20091219021134_add_meta_fields_to_pages.rb +1 -1
  47. data/db/migrate/20100204105222_add_layout_to_pages.rb +1 -1
  48. data/db/migrate/20100323085528_add_show_in_sidebar_option_to_pages.rb +1 -1
  49. data/db/migrate/20110717103112_add_meta_title_to_page.rb +1 -1
  50. data/db/migrate/20120723144115_add_render_as_partial_for_layout_for_spree_pages.rb +1 -1
  51. data/db/migrate/20140926121757_add_pages_stores.rb +1 -1
  52. data/db/migrate/20180305193240_update_spree_page_position.rb +13 -0
  53. data/lib/controllers/backend/spree/admin/pages_controller.rb +16 -0
  54. data/{app/controllers → lib/controllers/frontend}/spree/static_content_controller.rb +7 -3
  55. data/lib/generators/solidus_static_content/install/install_generator.rb +7 -5
  56. data/lib/solidus_static_content.rb +6 -18
  57. data/lib/solidus_static_content/engine.rb +35 -0
  58. data/lib/solidus_static_content/factories.rb +18 -0
  59. data/lib/solidus_static_content/route_matcher.rb +11 -0
  60. data/lib/solidus_static_content/version.rb +5 -0
  61. data/lib/views/backend/spree/admin/pages/_form.html.erb +119 -0
  62. data/lib/views/backend/spree/admin/pages/edit.html.erb +32 -0
  63. data/lib/views/backend/spree/admin/pages/index.html.erb +68 -0
  64. data/lib/views/backend/spree/admin/pages/new.html.erb +31 -0
  65. data/lib/views/backend/spree/admin/shared/_pages_tabs.html.erb +9 -0
  66. data/{app/views → lib/views/frontend}/spree/static_content/_static_content_footer.html.erb +0 -0
  67. data/{app/views → lib/views/frontend}/spree/static_content/_static_content_header.html.erb +0 -0
  68. data/{app/views → lib/views/frontend}/spree/static_content/_static_content_list.html.erb +0 -0
  69. data/{app/views → lib/views/frontend}/spree/static_content/_static_content_sidebar.html.erb +1 -1
  70. data/lib/views/frontend/spree/static_content/show.html.erb +18 -0
  71. data/solidus_static_content.gemspec +36 -31
  72. data/spec/controllers/spree/admin/pages_controller_spec.rb +11 -0
  73. data/spec/controllers/{static_content_controller_spec.rb → spree/static_content_controller_spec.rb} +9 -12
  74. data/spec/features/{admin → spree/admin}/pages_spec.rb +8 -5
  75. data/spec/features/{static_content_spec.rb → spree/static_content_spec.rb} +6 -4
  76. data/spec/helpers/{page_helper_spec.rb → spree/page_helper_spec.rb} +0 -0
  77. data/spec/lib/solidus_static_content/engine_spec.rb +14 -0
  78. data/spec/lib/{spree_static.content_spec.rb → solidus_static_content/route_matcher_spec.rb} +4 -13
  79. data/spec/models/{page_spec.rb → spree/page_spec.rb} +22 -7
  80. data/spec/spec_helper.rb +17 -40
  81. metadata +85 -177
  82. data/.travis.yml +0 -21
  83. data/app/assets/javascripts/spree/backend/spree_static_content.js +0 -1
  84. data/app/assets/javascripts/spree/frontend/spree_static_content.js +0 -1
  85. data/app/assets/stylesheets/spree/backend/spree_static_content.css +0 -3
  86. data/app/controllers/spree/admin/pages_controller.rb +0 -3
  87. data/app/overrides/pages_in_menu.rb +0 -5
  88. data/app/views/spree/admin/pages/_form.html.erb +0 -98
  89. data/app/views/spree/admin/pages/edit.html.erb +0 -18
  90. data/app/views/spree/admin/pages/index.html.erb +0 -51
  91. data/app/views/spree/admin/pages/new.html.erb +0 -18
  92. data/app/views/spree/static_content/show.html.erb +0 -26
  93. data/lib/spree_static_content/engine.rb +0 -17
  94. data/spec/factories/page_factory.rb +0 -18
@@ -0,0 +1,32 @@
1
+ <%= render 'spree/admin/shared/pages_tabs' %>
2
+
3
+ <% admin_breadcrumb(link_to plural_resource_name(Spree::Page), spree.admin_pages_path) %>
4
+ <% admin_breadcrumb(@page.title) %>
5
+
6
+ <% content_for :page_title do %>
7
+ <%= t("spree.editing_page") %>
8
+ <% end %>
9
+
10
+ <% content_for :page_actions do %>
11
+ <li>
12
+ <%= button_to t("spree.back_to_static_pages_list"), spree.admin_pages_path %>
13
+ </li>
14
+ <% end %>
15
+
16
+ <div data-hook='admin_page_edit_form_header'>
17
+ <%= render "spree/shared/error_messages", :target => @page %>
18
+ </div>
19
+
20
+ <%= form_for [:admin, @page], as: :page, url: admin_page_path(@page) do |f| %>
21
+ <fieldset class="no-border-top">
22
+ <%= render :partial => 'form', :locals => { :f => f } %>
23
+
24
+ <div class='clear'></div>
25
+
26
+ <div data-hook='admin_page_edit_form_buttons'>
27
+ <% if can?(:update, @page) %>
28
+ <%= render partial: 'spree/admin/shared/edit_resource_links' %>
29
+ <% end %>
30
+ </div>
31
+ </fieldset>
32
+ <% end %>
@@ -0,0 +1,68 @@
1
+ <%= render 'spree/admin/shared/pages_tabs' %>
2
+
3
+ <% content_for :page_actions do %>
4
+ <% if can?(:create, Spree::Page) %>
5
+ <li>
6
+ <%= link_to t("spree.new_page"), new_object_url, icon: 'plus' %>
7
+ </li>
8
+ <% end %>
9
+ <% end %>
10
+
11
+ <% content_for :page_title do %>
12
+ <%= t("spree.static_pages") %>
13
+ <% end %>
14
+
15
+ <% if @pages.any? %>
16
+ <table class="index responsive sortable" id="listing_pages" data-hook data-sortable-link="<%= update_positions_admin_pages_url %>">
17
+ <colgroup>
18
+ <col style="width: 10%">
19
+ <col style="width: 40%">
20
+ <col style="width: 35%">
21
+ <col style="width: 10%">
22
+ <col style="width: 15%">
23
+ </colgroup>
24
+
25
+ <thead>
26
+ <tr data-hook="admin_pages_index_headers">
27
+ <th></th>
28
+ <th><%= Spree::Page.human_attribute_name(:title) %></th>
29
+ <th><%= t("spree.link") %></th>
30
+ <th><%= Spree::Page.human_attribute_name(:visible) %></th>
31
+ <th data-hook="admin_pages_index_header_actions" class="actions"></th>
32
+ </tr>
33
+ </thead>
34
+
35
+ <tbody class="ui-sortable">
36
+ <% @pages.each do |page| %>
37
+ <tr data-hook="admin_pages_index_rows" class="<%= cycle('odd', 'even') %>" id="<%= dom_id page %>">
38
+ <td>
39
+ <% if can?(:update_positions, Spree::StockLocation) %>
40
+ <span class='handle ui-sortable-handle'></span>
41
+ <% end %>
42
+ </td>
43
+ <td><%= page.title %></td>
44
+ <td><%= link_to page.link, page.link, :target => '_blank' %></td>
45
+ <td>
46
+ <span class='pill pill-<%= page.visible ? 'active' : 'inactive' %>'>
47
+ <%= t("spree.#{page.visible? ? :active : :inactive}") %>
48
+ </span>
49
+ </td>
50
+ <td data-hook="admin_pages_index_row_actions" class="actions" >
51
+ <% if can?(:update, page) %>
52
+ <%= link_to_edit page, no_text: true %>
53
+ <% end %>
54
+ <% if can?(:destroy, page) %>
55
+ <%= link_to_delete page, no_text: true %>
56
+ <% end %>
57
+ </td>
58
+ </tr>
59
+ <% end %>
60
+ </tbody>
61
+ </table>
62
+ <% else %>
63
+ <div class="no-objects-found">
64
+ <%= render 'spree/admin/shared/no_objects_found',
65
+ resource: Spree::Page,
66
+ new_resource_url: new_object_url %>
67
+ </div>
68
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <%= render 'spree/admin/shared/pages_tabs' %>
2
+
3
+ <% admin_breadcrumb(link_to plural_resource_name(Spree::Page), spree.admin_pages_path) %>
4
+
5
+ <% content_for :page_title do %>
6
+ <%= t("spree.new_page") %>
7
+ <% end %>
8
+
9
+ <% content_for :page_actions do %>
10
+ <li>
11
+ <%= button_to t("spree.back_to_static_pages_list"), spree.admin_pages_path %>
12
+ </li>
13
+ <% end %>
14
+
15
+ <%= render "spree/shared/error_messages", :target => @page %>
16
+
17
+ <div data-hook='admin_page_new_form'>
18
+ <%= form_for [:admin, @page] do |f| %>
19
+ <fieldset class='no-border-top'>
20
+ <%= render partial: 'form', locals: { f: f } %>
21
+
22
+ <div class='clear'></div>
23
+
24
+ <% if can?(:create, Spree::Page) %>
25
+ <div data-hook='admin_page_new_form_buttons'>
26
+ <%= render partial: 'spree/admin/shared/new_resource_links' %>
27
+ </div>
28
+ <% end %>
29
+ </fieldset>
30
+ <% end %>
31
+ </div>
@@ -0,0 +1,9 @@
1
+ <% content_for :tabs do %>
2
+ <nav>
3
+ <ul class='tabs' data-hook='admin_settings_pages_tabs'>
4
+ <% if can?(:display, Spree::Page) %>
5
+ <%= settings_tab_item plural_resource_name(Spree::Page), spree.admin_pages_path %>
6
+ <% end %>
7
+ </ul>
8
+ </nav>
9
+ <% end %>
@@ -1,6 +1,6 @@
1
1
  <% if Spree::Page.by_store(current_store).visible.sidebar_links.any? %>
2
2
  <nav id="pages" class="sidebar-item">
3
- <h6 class="pages-root"><%= Spree.t(:pages) %></h6>
3
+ <h6 class="pages-root"><%= t("spree.pages") %></h6>
4
4
  <ul class="pages-list"><%= render :partial => "spree/static_content/static_content_list", :collection => Spree::Page.visible.sidebar_links, :as => :page %></ul>
5
5
  </nav>
6
6
  <% end %>
@@ -0,0 +1,18 @@
1
+ <% if @page.layout.present? and @page.render_layout_as_partial? %>
2
+ <%= render :partial => @page.layout %>
3
+ <% else %>
4
+ <% content_for :sidebar do %>
5
+ <div data-hook="homepage_sidebar_navigation">
6
+ <% if "spree/products" == params[:controller] && @taxon %>
7
+ <%= render partial: 'spree/shared/filters' %>
8
+ <% else %>
9
+ <%= render partial: 'spree/shared/taxonomies' %>
10
+ <% end %>
11
+ </div>
12
+ <% end %>
13
+
14
+ <h1><%= @page.title %></h1>
15
+ <div id="page_content">
16
+ <%= raw @page.body %>
17
+ </div>
18
+ <% end %>
@@ -1,32 +1,37 @@
1
- Gem::Specification.new do |s|
2
- s.platform = Gem::Platform::RUBY
3
- s.name = 'solidus_static_content'
4
- s.version = '1.0.0'
5
- s.summary = 'Extention to manage the static pages for your Spree shop.'
6
- s.description = s.summary
7
- s.required_ruby_version = '>= 1.9.3'
8
-
9
- s.authors = [%q{Peter Berkenbosch}, %q{Roman Smirnov}]
10
- s.email = 'peter@pero-ict.nl'
11
- s.homepage = 'http://spreecommerce.com/extensions/139-static-content'
12
- s.license = %q{BSD-3}
13
-
14
- s.files = `git ls-files`.split("\n")
15
- s.test_files = `git ls-files -- spec/*`.split("\n")
16
- s.require_path = 'lib'
17
- s.requirements << 'none'
18
-
19
- s.add_dependency 'solidus', ['>= 1.1', '< 3']
20
- s.add_dependency 'deface', '~> 1.0.2'
21
-
22
- s.add_development_dependency 'capybara', '~> 2.7'
23
- s.add_development_dependency 'factory_girl', '~> 4.7'
24
- s.add_development_dependency 'ffaker'
25
- s.add_development_dependency 'database_cleaner', '~> 1.5'
26
- s.add_development_dependency 'rspec-rails', '~> 3.5'
27
- s.add_development_dependency 'sqlite3', '~> 1.3'
28
- s.add_development_dependency 'poltergeist', '~> 1.10'
29
- s.add_development_dependency 'simplecov', '~> 0.12'
30
- s.add_development_dependency 'pry-rails'
31
- s.add_development_dependency 'test-unit'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/solidus_static_content/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'solidus_static_content'
7
+ spec.version = SolidusStaticContent::VERSION
8
+ spec.authors = ['Peter Berkenbosch', 'Roman Smirnov']
9
+ spec.email = 'peter@pero-ict.nl'
10
+
11
+ spec.summary = 'Extension to manage the static pages for your Solidus store.'
12
+ spec.description = 'Manage the static pages of your Solidus store or replace existing pages with a static version'
13
+ spec.homepage = 'https://github.com/solidusio-contrib/solidus_static_content#readme'
14
+ spec.license = 'BSD-3-Clause'
15
+
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = 'https://github.com/solidusio-contrib/solidus_static_content#readme'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/solidusio-contrib/solidus_static_content/releases'
19
+
20
+ spec.required_ruby_version = Gem::Requirement.new('~> 2.5')
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ files = Dir.chdir(__dir__) { `git ls-files -z`.split("\x0") }
25
+
26
+ spec.files = files.grep_v(%r{^(test|spec|features)/})
27
+ spec.test_files = files.grep(%r{^(test|spec|features)/})
28
+ spec.bindir = "exe"
29
+ spec.executables = files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_dependency 'deface', '~> 1.0'
33
+ spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 3']
34
+ spec.add_dependency 'solidus_support', '~> 0.5'
35
+
36
+ spec.add_development_dependency 'solidus_dev_support'
32
37
  end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Spree::Admin::PagesController do
4
+ describe '.build_resource' do
5
+ it 'pre-assigns the default store' do
6
+ default_store = create(:store, default: true)
7
+
8
+ expect(subject.send(:build_resource).stores).to eq([default_store])
9
+ end
10
+ end
11
+ end
@@ -1,37 +1,34 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Spree::StaticContentController, type: :controller do
4
- before do
5
- controller.stub spree_current_user: nil
6
- end
7
-
8
4
  let!(:store) { create(:store, default: true) }
9
5
 
10
6
  context '#show' do
11
7
  it 'accepts path as root' do
12
8
  page = create(:page, slug: '/', stores: [store])
13
9
  request.path = page.slug
14
- spree_get :show, path: page.slug
15
- expect(response).to be_success
10
+ get :show, params: { path: page.slug }
11
+ expect(response).to be_successful
16
12
  end
17
13
 
18
14
  it 'accepts path as string' do
19
15
  page = create(:page, slug: 'hello', stores: [store])
20
16
  request.path = page.slug
21
- spree_get :show, path: page.slug
22
- expect(response).to be_success
17
+ get :show, params: { path: page.slug }
18
+ expect(response).to be_successful
23
19
  end
24
20
 
25
21
  it 'accepts path as nested' do
26
22
  page = create(:page, slug: 'aa/bb/cc', stores: [store])
27
23
  request.path = page.slug
28
- spree_get :show, path: page.slug
29
- expect(response).to be_success
24
+ get :show, params: { path: page.slug }
25
+ expect(response).to be_successful
30
26
  end
31
27
 
32
28
  it 'respond with a 404 when no page exists' do
33
- spree_get :show
34
- expect(response.response_code).to eq(404)
29
+ expect {
30
+ get :show
31
+ }.to raise_error(ActiveRecord::RecordNotFound)
35
32
  end
36
33
  end
37
34
  end
@@ -3,6 +3,10 @@ require 'spec_helper'
3
3
  RSpec.feature 'Admin Static Content', js: true do
4
4
  stub_authorization!
5
5
 
6
+ background do
7
+ create :store, default: true
8
+ end
9
+
6
10
  context 'when no page exists' do
7
11
  background do
8
12
  visit spree.admin_path
@@ -10,10 +14,11 @@ RSpec.feature 'Admin Static Content', js: true do
10
14
  end
11
15
 
12
16
  scenario 'can create new page' do
13
- expect(page).to have_text /No Pages found, Add One!/i
17
+ expect(page).to have_text /No Pages found/i
14
18
 
15
19
  click_link 'New page'
16
- expect(page).to have_text 'Static pages'
20
+
21
+ expect(page).to have_text 'New page'
17
22
 
18
23
  fill_in 'page_title', with: 'Contact us'
19
24
  fill_in 'page_slug', with: 'contact-us'
@@ -56,11 +61,9 @@ RSpec.feature 'Admin Static Content', js: true do
56
61
 
57
62
  scenario 'can be deleted' do
58
63
  within_row(1) do
59
- click_icon :trash
64
+ accept_confirm { click_icon :trash }
60
65
  end
61
66
 
62
- page.driver.browser.switch_to.alert.accept unless Capybara.javascript_driver == :poltergeist
63
-
64
67
  expect(page).not_to have_text static_page.title
65
68
  end
66
69
  end
@@ -29,10 +29,12 @@ feature 'Static Content Page', js: true do
29
29
  expect(page).to have_text 'Root Page Test'
30
30
  end
31
31
 
32
- scenario 'is limited within its own constraints' do
33
- create(:page, slug: '/t/categories/page3', title: 'Constraint Test', stores: [store])
34
- visit '/t/categories/page3'
35
- expect(page).not_to have_text 'Constraint Test'
32
+ scenario 'is limited within its own constraints', js: false do
33
+ create(:taxon, permalink: 'test', name: 'The Taxon')
34
+ create(:page, slug: '/t/test', title: 'The Page', stores: [store])
35
+ visit '/t/test'
36
+ expect(page).to have_content('The Taxon')
37
+ expect(page).not_to have_content('The Page')
36
38
  end
37
39
 
38
40
  scenario 'fetch correct page' do
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SolidusStaticContent::Engine do
4
+ describe '.activate_menu_item' do
5
+ it 'adds the menu item only once' do
6
+ described_class.activate_menu_items
7
+
8
+ expect {
9
+ described_class.activate_menu_items
10
+ described_class.activate_menu_items
11
+ }.not_to change(Spree::Backend::Config.menu_items, :size)
12
+ end
13
+ end
14
+ end
@@ -1,33 +1,24 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe StaticPage do
4
- context '.remove_spree_mount_point' do
5
- specify do
6
- path = '/hello'
7
- expect(subject.remove_spree_mount_point(path)).to eq 'hello'
8
- end
9
- end
10
- end
11
-
12
- describe Spree::StaticPage do
3
+ describe SolidusStaticContent::RouteMatcher do
13
4
  subject { described_class }
14
5
 
15
6
  context '.matches?' do
16
7
  it 'is true when valid page' do
17
8
  page = create(:page, slug: 'hello', visible: true)
18
- request = double('request', path: page.slug)
9
+ request = instance_double(Rack::Request, path_info: page.slug)
19
10
  expect(subject.matches?(request)).to be true
20
11
  end
21
12
 
22
13
  it 'is false when using reserved slug name' do
23
14
  page = create(:page, slug: 'login', visible: true)
24
- request = double('request', path: page.slug)
15
+ request = instance_double(Rack::Request, path_info: page.slug)
25
16
  expect(subject.matches?(request)).to be false
26
17
  end
27
18
 
28
19
  it 'is false when page is not accessible' do
29
20
  page = create(:page, slug: 'hello', visible: false)
30
- request = double('request', path: page.slug)
21
+ request = instance_double(Rack::Request, path_info: page.slug)
31
22
  expect(subject.matches?(request)).to be false
32
23
  end
33
24
  end
@@ -9,11 +9,6 @@ describe Spree::Page do
9
9
  end
10
10
  end
11
11
 
12
- it 'always add / prefix to slug' do
13
- page = create(:page, slug: 'hello')
14
- expect(page.slug).to eq '/hello'
15
- end
16
-
17
12
  context '.link' do
18
13
  it 'return slug if foreign_link blank' do
19
14
  page = create(:page, slug: 'hello')
@@ -26,9 +21,7 @@ describe Spree::Page do
26
21
  end
27
22
  end
28
23
 
29
-
30
24
  context "pages in stores" do
31
-
32
25
  before(:each) do
33
26
  @store = create(:store)
34
27
  @page = create(:page, :stores => [@store])
@@ -40,7 +33,29 @@ describe Spree::Page do
40
33
  expect(pages_by_store).to include(@page)
41
34
  expect(pages_by_store).to_not include(@page2)
42
35
  end
36
+ end
43
37
 
38
+ describe '#slug' do
39
+ it 'always adds a "/" (slash) prefix to the slug' do
40
+ page = create(:page, slug: 'hello')
41
+ expect(page.slug).to eq '/hello'
42
+ end
43
+
44
+ context 'when a title is present' do
45
+ it 'is generated from the title' do
46
+ page = create(:page, slug: nil, title: 'Hello World!')
47
+
48
+ expect(page).to be_valid
49
+ expect(page.slug).to eq('/hello-world')
50
+ end
51
+ end
44
52
  end
45
53
 
54
+ describe '.meta_title' do
55
+ it 'falls back to title' do
56
+ page = build(:page, title: "Foo Bar", meta_title: nil)
57
+
58
+ expect(page.meta_title).to eq("Foo Bar")
59
+ end
60
+ end
46
61
  end