solidus_static_content 1.0.0 → 2.0.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 (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