fix issue locomotivecms/engine#1155 (Unpublished Pages still visible)

did committed Jul 12, 2016
commit c17802c3deb1a58093fc6396ee594cbac28a6aed
Showing 8 changed files with 86 additions and 11 deletions
locomotive/steam/middlewares/page.rb b/lib/locomotive/steam/middlewares/page.rb +12 -2
@@ @@ -26,11 +26,21 @@ module Locomotive::Steam
protected
def fetch_page
- services.page_finder.match(path).tap do |pages|
+ page = page_finder.match(path).tap do |pages|
if pages.size > 1
self.log "Found multiple pages: #{pages.map(&:title).join(', ')}"
end
- end.first || services.page_finder.find('404')
+ end.first
+
+ if page && (page.published? || page.not_found? || live_editing?)
+ page
+ else
+ page_finder.find('404')
+ end
+ end
+
+ def page_finder
+ services.page_finder
end
end
locomotive/steam/middlewares/renderer.rb b/lib/locomotive/steam/middlewares/renderer.rb +1 -1
@@ @@ -73,7 +73,7 @@ module Locomotive::Steam
'today' => Date.today,
'mode' => Locomotive::Steam.configuration.mode,
'wagon' => Locomotive::Steam.configuration.mode == :test,
- 'live_editing' => !!env['steam.live_editing']
+ 'live_editing' => live_editing?
}
end
locomotive/steam/middlewares/thread_safe.rb b/lib/locomotive/steam/middlewares/thread_safe.rb +4 -0
@@ @@ -61,6 +61,10 @@ module Locomotive::Steam::Middlewares
@params ||= self.request.params.with_indifferent_access
end
+ def live_editing?
+ !!env['steam.live_editing']
+ end
+
end
end
spec/fixtures/default/app/views/pages/all.liquid.haml +1 -1
@@ @@ -1,7 +1,7 @@
---
title: All the pages
listed: false
- published: false
+ published: true
---
{% extends parent %}
{% block content %}
spec/fixtures/default/app/views/pages/tags/nav_in_deep.liquid.haml +2 -2
@@ @@ -1,6 +1,6 @@
---
title: Page to test the nav tag with a high depth
listed: false
- published: false
+ published: true
---
- {% nav 'site', depth: 2 %}
\ No newline at end of file
+ {% nav 'site', depth: 2 %}
spec/integration/server/sitemap_spec.rb +1 -1
@@ @@ -21,7 +21,7 @@ describe Locomotive::Steam::Server do
it 'checks if it looks valid' do
expect(Nokogiri::XML(subject).errors.empty?).to eq true
- expect(subject.scan(/<url>/).size).to eq 46
+ expect(subject.scan(/<url>/).size).to eq 48
expect(subject).to match("<loc>http://example.org/songs/song-number-2/band</loc>")
expect(subject).to match((<<-EOF
<url>
spec/unit/middlewares/page_spec.rb +63 -0
@@ @@ -0,0 +1,63 @@
+ require 'spec_helper'
+
+ require_relative '../../../lib/locomotive/steam/middlewares/thread_safe'
+ require_relative '../../../lib/locomotive/steam/middlewares/helpers'
+ require_relative '../../../lib/locomotive/steam/middlewares/page'
+
+ describe Locomotive::Steam::Middlewares::Page do
+
+ let(:live_editing) { nil }
+ let(:published) { true }
+ let(:page_not_found) { instance_double('PageNotFound', not_found?: true) }
+ let(:page) { instance_double('Page', title: 'Hello world', fullpath: 'hello-world', not_found?: false, published?: published) }
+ let(:pages) { [page] }
+ let(:site) { instance_double('Site', default_locale: 'en') }
+ let(:service) { instance_double('PageFinder', match: pages) }
+ let(:url) { 'http://models.example.com' }
+ let(:app) { ->(env) { [200, env, 'app'] } }
+ let(:middleware) { described_class.new(app) }
+
+ subject do
+ env = env_for(url, 'steam.site' => site)
+ env['steam.path'] = 'hello-world'
+ env['steam.locale'] = 'en'
+ env['steam.request'] = Rack::Request.new(env)
+ env['steam.live_editing'] = live_editing
+ code, env = middleware.call(env)
+ env['steam.page']
+ end
+
+ before do
+ allow_any_instance_of(described_class).to receive(:page_finder).and_return(service)
+ allow(service).to receive(:find).with('404').and_return(page_not_found)
+ end
+
+ it { is_expected.to eq page }
+
+ context "page doesn't exist" do
+
+ let(:pages) { [] }
+
+ it { is_expected.to eq page_not_found }
+
+ end
+
+ context 'page is unpublished' do
+
+ let(:published) { false }
+
+ it { is_expected.to eq page_not_found }
+
+ context 'the live editing mode is on' do
+
+ let(:live_editing) { true }
+
+ it 'has to display it' do
+ is_expected.to eq page
+ end
+
+ end
+
+ end
+
+ end
spec/unit/middlewares/renderer_spec.rb +2 -4
@@ @@ -8,9 +8,7 @@ describe Locomotive::Steam::Middlewares::Renderer do
let(:app) { ->(env) { [200, env, 'app'] }}
- let :middleware do
- Locomotive::Steam::Middlewares::Renderer.new(app)
- end
+ let(:middleware) { described_class.new(app) }
describe 'missing 404 page' do
@@ @@ -21,7 +19,7 @@ describe Locomotive::Steam::Middlewares::Renderer do
middleware.call env_for('http://www.example.com', { 'steam.page' => nil, 'steam.locale' => locale, 'steam.site' => site })
end
- specify 'return 200' do
+ specify 'return 404' do
code, headers, response = subject
expect(code).to eq(404)
expect(response).to eq(["Your 404 page is missing. Please create it."])