brightcontent-pages 2.0.33 → 2.1.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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/brightcontent/pages.js +1 -2
- data/app/assets/stylesheets/brightcontent/pages.css.scss +1 -1
- data/app/helpers/render_sortable_tree_helper.rb +3 -58
- data/app/models/brightcontent/page_core.rb +27 -14
- data/app/views/brightcontent/pages/_form_field_body.html.erb +1 -1
- data/app/views/brightcontent/pages/_list_field_name.html.erb +1 -1
- data/app/views/brightcontent/pages/_page.html.erb +15 -0
- data/app/views/brightcontent/pages/index.html.erb +9 -7
- data/brightcontent-pages.gemspec +2 -1
- data/config/locales/brightcontent_pages.nl.yml +10 -0
- data/config/routes.rb +0 -7
- data/lib/brightcontent/pages/methods.rb +1 -1
- data/lib/brightcontent/pages/path_constraint.rb +26 -0
- data/lib/brightcontent/pages/routes.rb +13 -0
- data/lib/brightcontent/pages.rb +4 -0
- data/lib/generators/brightcontent/pages/install_generator.rb +4 -0
- data/script/rails +2 -2
- data/spec/dummy/config/application.rb +2 -6
- data/spec/dummy/config/environments/development.rb +1 -10
- data/spec/dummy/config/environments/production.rb +0 -4
- data/spec/dummy/config/environments/test.rb +1 -6
- data/spec/dummy/config/initializers/secret_token.rb +1 -1
- data/spec/dummy/config/routes.rb +2 -1
- data/spec/dummy/db/migrate/20121206121725_create_brightcontent_admin_users.rb +1 -1
- data/spec/dummy/db/migrate/20140227110824_add_position_to_attachments.brightcontent_attachments_engine.rb +6 -0
- data/spec/dummy/db/schema.rb +16 -15
- data/spec/features/menu_spec.rb +1 -3
- data/spec/features/pages_index_spec.rb +3 -5
- data/spec/lib/brightcontent/pages/path_constraint_spec.rb +30 -0
- data/spec/models/brightcontent/page_spec.rb +21 -24
- metadata +48 -27
- data/app/assets/javascripts/brightcontent/wysithtml5-parser-rules.js +0 -553
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fce00f1da51773d10d82d547a0cac73e00965af5
|
4
|
+
data.tar.gz: e3819eb119baf8a62004b701c1c96ece8d7994d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebb8e5d9427bd83d768da06cc5a628360dbc5390b1bbea2309d026ac17ed847c39214425ce5ad609aa14fc2739486c81ff4483452bd0f9558d53aff66ba24445
|
7
|
+
data.tar.gz: 70784aa91cd3d3f763ea95664f082b4353abaa49c555caa710c60d312656e1ebdf0eb2023570f49c2e6a218c8b8140c8f27c0acbd1b26a26fd4b107396c66979
|
@@ -1,62 +1,7 @@
|
|
1
|
-
# DOC:
|
2
|
-
# We use Helper Methods for tree building,
|
3
|
-
# because it's faster than View Templates and Partials
|
4
|
-
|
5
|
-
# SECURITY note
|
6
|
-
# Prepare your data on server side for rendering
|
7
|
-
# or use h.html_escape(node.content)
|
8
|
-
# for escape potentially dangerous content
|
9
1
|
module RenderSortableTreeHelper
|
10
|
-
module Render
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def render_node(h, options)
|
15
|
-
@h, @options = h, options
|
16
|
-
|
17
|
-
node = options[:node]
|
18
|
-
|
19
|
-
"
|
20
|
-
<li id='#{ node.id }_#{ options[:klass] }'>
|
21
|
-
<div class='item #{"page-hidden" if node.hidden? }'>
|
22
|
-
<i class='handle'></i>
|
23
|
-
#{show_link}
|
24
|
-
#{controls}
|
25
|
-
</div>
|
26
|
-
#{children}
|
27
|
-
</li>
|
28
|
-
"
|
29
|
-
end
|
30
|
-
|
31
|
-
def show_link
|
32
|
-
node = options[:node]
|
33
|
-
ns = options[:namespace]
|
34
|
-
url = h.url_for(ns + [node])
|
35
|
-
title_field = options[:title]
|
36
|
-
|
37
|
-
h.link_to(node.send(title_field), url, class: 'link')
|
38
|
-
end
|
39
|
-
|
40
|
-
def controls
|
41
|
-
node = options[:node]
|
42
|
-
|
43
|
-
edit_path = h.url_for(:controller => options[:klass].pluralize, :action => :edit, :id => node)
|
44
|
-
show_path = h.url_for(:controller => options[:klass].pluralize, :action => :show, :id => node)
|
45
|
-
|
46
|
-
"
|
47
|
-
<div class='controls'>
|
48
|
-
#{ h.link_to 'Edit', edit_path, :class => 'btn btn-mini btn-primary btn-edit' }
|
49
|
-
#{ h.link_to 'Delete', show_path, :class => 'btn btn-mini btn-delete', :method => :delete, :data => { :confirm => 'Are you sure?' } }
|
50
|
-
</div>
|
51
|
-
"
|
52
|
-
end
|
53
|
-
|
54
|
-
def children
|
55
|
-
unless options[:children].blank?
|
56
|
-
"<ol class='nested_set'>#{ options[:children] }</ol>"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
2
|
+
module Render
|
3
|
+
def self.render_node(h, options)
|
4
|
+
h.render("page", item: options[:node], children: options[:children], klass: options[:klass])
|
60
5
|
end
|
61
6
|
end
|
62
7
|
end
|
@@ -3,18 +3,30 @@ module Brightcontent
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
-
acts_as_nested_set
|
7
|
-
has_attached_files Brightcontent.page_attachment_styles
|
8
|
-
include Brightcontent::Attachable
|
9
6
|
include TheSortableTree::Scopes
|
7
|
+
|
8
|
+
has_attached_files Brightcontent.page_attachment_styles
|
9
|
+
acts_as_nested_set
|
10
|
+
|
10
11
|
validates_presence_of :name
|
11
|
-
|
12
|
-
|
12
|
+
|
13
|
+
after_save :update_slug, :expire_path_cache
|
14
|
+
after_move :update_slug, :expire_path_cache
|
15
|
+
|
16
|
+
default_scope { order(:lft) }
|
13
17
|
end
|
14
18
|
|
15
19
|
module ClassMethods
|
16
|
-
def
|
17
|
-
|
20
|
+
def find_by_path(path)
|
21
|
+
find_by(slug: sanitize_path(path))
|
22
|
+
end
|
23
|
+
|
24
|
+
def find_by_path!(path)
|
25
|
+
find_by!(slug: sanitize_path(path))
|
26
|
+
end
|
27
|
+
|
28
|
+
def sanitize_path(path)
|
29
|
+
path[1..-1]
|
18
30
|
end
|
19
31
|
end
|
20
32
|
|
@@ -26,19 +38,20 @@ module Brightcontent
|
|
26
38
|
"/" + slug
|
27
39
|
end
|
28
40
|
|
29
|
-
def root_parent_children
|
30
|
-
root? ? children : ancestors.first.children
|
31
|
-
end
|
32
|
-
|
33
41
|
private
|
34
42
|
|
35
43
|
def update_slug
|
36
|
-
|
44
|
+
update_column(:slug, slug_name.to_s)
|
37
45
|
end
|
38
46
|
|
39
47
|
def slug_name
|
40
|
-
homepage?
|
48
|
+
unless homepage?
|
49
|
+
self_and_ancestors.map { |p| p.name.parameterize }.join("/")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def expire_path_cache
|
54
|
+
Pages::PathConstraint.expire
|
41
55
|
end
|
42
56
|
end
|
43
57
|
end
|
44
|
-
|
@@ -1 +1 @@
|
|
1
|
-
<%= form.input :body, input_html: { id: 'insertable' } %>
|
1
|
+
<%= form.input :body, input_html: { id: 'insertable', rows: 20, data: {wysihtml5: true} } %>
|
@@ -1 +1 @@
|
|
1
|
-
<%=
|
1
|
+
<%= item.name %> <% if item.hidden? %><span class="badge"><%= t('brightcontent.hidden') %></span><% end %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<li id="<%= item.id %>_brightcontent/page">
|
2
|
+
<div class='item'>
|
3
|
+
<i class='handle'></i>
|
4
|
+
<%= link_to item, class: 'link' do %>
|
5
|
+
<%= render_list_field(item, :name) %>
|
6
|
+
<% end %>
|
7
|
+
<div class='controls'>
|
8
|
+
<%= link_to t('brightcontent.edit'), [:edit, item], class: "btn btn-xs btn-primary" %>
|
9
|
+
<%= link_to t('brightcontent.delete'), item, class: "btn btn-xs btn-danger", data: {confirm: 'Are you sure?'}, method: :delete %>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
<% unless children.blank? %>
|
13
|
+
<ol class='nested_set'><%= raw children %></ol>
|
14
|
+
<% end %>
|
15
|
+
</li>
|
@@ -1,10 +1,12 @@
|
|
1
|
-
<div
|
1
|
+
<div class="page-header">
|
2
|
+
<%= link_to "#{I18n.t('brightcontent.create_new', model: resource_class.model_name.human).humanize}", polymorphic_url([parent, resource_class], action: :new), class: "btn btn-primary pull-right" %>
|
3
|
+
<h1><%= nominative_plural(resource_class).capitalize %></h1>
|
4
|
+
</div>
|
2
5
|
|
3
|
-
|
4
|
-
<h1><%= resource_collection_name.to_s.humanize %></h1>
|
5
|
-
<%= render "index_top" %>
|
6
|
+
<%= render_if_exists "index_top" %>
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
<div class="panel-body">
|
9
|
+
<ol class="sortable_tree" data-rebuild_url="<%=rebuild_pages_url%>" data-max_levels="5">
|
10
|
+
<%= sortable_tree collection %>
|
11
|
+
</ol>
|
10
12
|
</div>
|
data/brightcontent-pages.gemspec
CHANGED
@@ -17,7 +17,8 @@ Gem::Specification.new do |s|
|
|
17
17
|
|
18
18
|
s.add_dependency "brightcontent-core", version
|
19
19
|
s.add_dependency "brightcontent-attachments", version
|
20
|
-
s.add_dependency "awesome_nested_set"
|
20
|
+
s.add_dependency "awesome_nested_set", ">= 3.0.0.rc.3"
|
21
|
+
s.add_dependency "jquery-ui-rails", ">= 2.3.0"
|
21
22
|
s.add_dependency "the_sortable_tree", "~> 2.3.0"
|
22
23
|
|
23
24
|
s.add_development_dependency "sqlite3"
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Brightcontent
|
2
|
+
module Pages
|
3
|
+
class PathConstraint
|
4
|
+
CACHE_KEY = :brightcontent_page_slugs
|
5
|
+
|
6
|
+
def self.expire
|
7
|
+
Rails.cache.delete(CACHE_KEY)
|
8
|
+
end
|
9
|
+
|
10
|
+
def matches?(request)
|
11
|
+
slug = Page.sanitize_path(request.path)
|
12
|
+
cached_page_slugs.include?(slug)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def cached_page_slugs
|
18
|
+
Rails.cache.fetch(CACHE_KEY) { page_slugs }
|
19
|
+
end
|
20
|
+
|
21
|
+
def page_slugs
|
22
|
+
Page.pluck(:slug)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/brightcontent/pages.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
require "brightcontent-core"
|
2
2
|
require "brightcontent-attachments"
|
3
3
|
require "awesome_nested_set"
|
4
|
+
require "jquery-ui-rails"
|
4
5
|
require "the_sortable_tree"
|
5
6
|
|
7
|
+
require "brightcontent/pages/routes"
|
6
8
|
require "brightcontent/pages/engine"
|
7
9
|
|
8
10
|
module Brightcontent
|
11
|
+
register_extension 'pages'
|
9
12
|
|
10
13
|
mattr_accessor :page_attachment_styles
|
11
14
|
@@page_attachment_styles = {}
|
12
15
|
|
13
16
|
module Pages
|
14
17
|
autoload :Methods, 'brightcontent/pages/methods'
|
18
|
+
autoload :PathConstraint, 'brightcontent/pages/path_constraint'
|
15
19
|
end
|
16
20
|
end
|
data/script/rails
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
3
|
|
4
|
-
ENGINE_ROOT = File.expand_path('
|
5
|
-
ENGINE_PATH = File.expand_path('
|
4
|
+
ENGINE_ROOT = File.expand_path('../../../core', __FILE__)
|
5
|
+
ENGINE_PATH = File.expand_path('../../../core/lib/brightcontent/engine', __FILE__)
|
6
6
|
|
7
7
|
require 'rails/all'
|
8
8
|
require 'rails/engine/commands'
|
@@ -43,15 +43,11 @@ module Dummy
|
|
43
43
|
# like if you have constraints or database-specific column types
|
44
44
|
# config.active_record.schema_format = :sql
|
45
45
|
|
46
|
-
# Enforce whitelist mode for mass assignment.
|
47
|
-
# This will create an empty whitelist of attributes available for mass-assignment for all models
|
48
|
-
# in your app. As such, your models will need to explicitly whitelist or blacklist accessible
|
49
|
-
# parameters by using an attr_accessible or attr_protected declaration.
|
50
|
-
config.active_record.whitelist_attributes = false
|
51
|
-
|
52
46
|
# Enable the asset pipeline
|
53
47
|
config.assets.enabled = true
|
54
48
|
|
49
|
+
# config.i18n.enforce_available_locales = true
|
50
|
+
|
55
51
|
# Version of your assets, change this if you want to expire all your assets
|
56
52
|
config.assets.version = '1.0'
|
57
53
|
end
|
@@ -1,14 +1,12 @@
|
|
1
1
|
Dummy::Application.configure do
|
2
2
|
# Settings specified here will take precedence over those in config/application.rb
|
3
|
+
config.eager_load = false
|
3
4
|
|
4
5
|
# In the development environment your application's code is reloaded on
|
5
6
|
# every request. This slows down response time but is perfect for development
|
6
7
|
# since you don't have to restart the web server when you make code changes.
|
7
8
|
config.cache_classes = false
|
8
9
|
|
9
|
-
# Log error messages when you accidentally call methods on nil.
|
10
|
-
config.whiny_nils = true
|
11
|
-
|
12
10
|
# Show full error reports and disable caching
|
13
11
|
config.consider_all_requests_local = true
|
14
12
|
config.action_controller.perform_caching = false
|
@@ -22,13 +20,6 @@ Dummy::Application.configure do
|
|
22
20
|
# Only use best-standards-support built into browsers
|
23
21
|
config.action_dispatch.best_standards_support = :builtin
|
24
22
|
|
25
|
-
# Raise exception on mass assignment protection for Active Record models
|
26
|
-
config.active_record.mass_assignment_sanitizer = :strict
|
27
|
-
|
28
|
-
# Log the query plan for queries taking more than this (works
|
29
|
-
# with SQLite, MySQL, and PostgreSQL)
|
30
|
-
config.active_record.auto_explain_threshold_in_seconds = 0.5
|
31
|
-
|
32
23
|
# Do not compress assets
|
33
24
|
config.assets.compress = false
|
34
25
|
|
@@ -60,8 +60,4 @@ Dummy::Application.configure do
|
|
60
60
|
|
61
61
|
# Send deprecation notices to registered listeners
|
62
62
|
config.active_support.deprecation = :notify
|
63
|
-
|
64
|
-
# Log the query plan for queries taking more than this (works
|
65
|
-
# with SQLite, MySQL, and PostgreSQL)
|
66
|
-
# config.active_record.auto_explain_threshold_in_seconds = 0.5
|
67
63
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
Dummy::Application.configure do
|
2
2
|
# Settings specified here will take precedence over those in config/application.rb
|
3
|
+
config.eager_load = false
|
3
4
|
|
4
5
|
# The test environment is used exclusively to run your application's
|
5
6
|
# test suite. You never need to work with it otherwise. Remember that
|
@@ -11,9 +12,6 @@ Dummy::Application.configure do
|
|
11
12
|
config.serve_static_assets = true
|
12
13
|
config.static_cache_control = "public, max-age=3600"
|
13
14
|
|
14
|
-
# Log error messages when you accidentally call methods on nil
|
15
|
-
config.whiny_nils = true
|
16
|
-
|
17
15
|
# Show full error reports and disable caching
|
18
16
|
config.consider_all_requests_local = true
|
19
17
|
config.action_controller.perform_caching = false
|
@@ -29,9 +27,6 @@ Dummy::Application.configure do
|
|
29
27
|
# ActionMailer::Base.deliveries array.
|
30
28
|
config.action_mailer.delivery_method = :test
|
31
29
|
|
32
|
-
# Raise exception on mass assignment protection for Active Record models
|
33
|
-
config.active_record.mass_assignment_sanitizer = :strict
|
34
|
-
|
35
30
|
# Print deprecation notices to the stderr
|
36
31
|
config.active_support.deprecation = :stderr
|
37
32
|
end
|
@@ -4,4 +4,4 @@
|
|
4
4
|
# If you change this key, all old signed cookies will become invalid!
|
5
5
|
# Make sure the secret is at least 30 characters and all random,
|
6
6
|
# no regular words or you'll be exposed to dictionary attacks.
|
7
|
-
Dummy::Application.config.
|
7
|
+
Dummy::Application.config.secret_key_base = '1582af16879d84e4319aa02ea51964c7c27576e6468838ea1bcadf1286623d44e9117613a747386fde1bc2253a9a49c291a2c100fec64ae5c2cc5c75efa553ef'
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -7,6 +7,6 @@ class CreateBrightcontentAdminUsers < ActiveRecord::Migration
|
|
7
7
|
t.timestamps
|
8
8
|
end
|
9
9
|
|
10
|
-
Brightcontent::AdminUser.create!(:email => 'admin@example.com', :password => 'password')
|
10
|
+
Brightcontent::AdminUser.create!(:email => 'admin@example.com', :password => 'password', :password_confirmation => 'password')
|
11
11
|
end
|
12
12
|
end
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -9,32 +9,33 @@
|
|
9
9
|
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
10
10
|
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
11
11
|
#
|
12
|
-
# It's strongly recommended
|
12
|
+
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(:
|
14
|
+
ActiveRecord::Schema.define(version: 20140227110824) do
|
15
15
|
|
16
|
-
create_table "brightcontent_admin_users", :
|
16
|
+
create_table "brightcontent_admin_users", force: true do |t|
|
17
17
|
t.string "email"
|
18
18
|
t.string "password_digest"
|
19
|
-
t.datetime "created_at", :
|
20
|
-
t.datetime "updated_at", :
|
19
|
+
t.datetime "created_at", null: false
|
20
|
+
t.datetime "updated_at", null: false
|
21
21
|
end
|
22
22
|
|
23
|
-
create_table "brightcontent_attachments", :
|
23
|
+
create_table "brightcontent_attachments", force: true do |t|
|
24
24
|
t.integer "attachable_id"
|
25
25
|
t.string "attachable_type"
|
26
26
|
t.string "asset_file_name"
|
27
27
|
t.string "asset_content_type"
|
28
28
|
t.integer "asset_file_size"
|
29
29
|
t.datetime "asset_updated_at"
|
30
|
-
t.datetime "created_at", :
|
31
|
-
t.datetime "updated_at", :
|
30
|
+
t.datetime "created_at", null: false
|
31
|
+
t.datetime "updated_at", null: false
|
32
|
+
t.integer "position"
|
32
33
|
end
|
33
34
|
|
34
|
-
add_index "brightcontent_attachments", ["attachable_id"], :
|
35
|
-
add_index "brightcontent_attachments", ["attachable_type"], :
|
35
|
+
add_index "brightcontent_attachments", ["attachable_id"], name: "index_brightcontent_attachments_on_attachable_id"
|
36
|
+
add_index "brightcontent_attachments", ["attachable_type"], name: "index_brightcontent_attachments_on_attachable_type"
|
36
37
|
|
37
|
-
create_table "brightcontent_pages", :
|
38
|
+
create_table "brightcontent_pages", force: true do |t|
|
38
39
|
t.string "name"
|
39
40
|
t.text "body"
|
40
41
|
t.string "slug"
|
@@ -42,11 +43,11 @@ ActiveRecord::Schema.define(:version => 20130105142936) do
|
|
42
43
|
t.integer "lft"
|
43
44
|
t.integer "rgt"
|
44
45
|
t.integer "parent_id"
|
45
|
-
t.datetime "created_at",
|
46
|
-
t.datetime "updated_at",
|
47
|
-
t.boolean "hidden", :
|
46
|
+
t.datetime "created_at", null: false
|
47
|
+
t.datetime "updated_at", null: false
|
48
|
+
t.boolean "hidden", default: false, null: false
|
48
49
|
end
|
49
50
|
|
50
|
-
add_index "brightcontent_pages", ["slug"], :
|
51
|
+
add_index "brightcontent_pages", ["slug"], name: "index_brightcontent_pages_on_slug"
|
51
52
|
|
52
53
|
end
|
data/spec/features/menu_spec.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
feature "Menu" do
|
4
|
-
|
5
4
|
scenario "Shows menu for extra resources" do
|
6
5
|
sign_in
|
7
6
|
menu_should_have_link "Pages"
|
8
7
|
end
|
9
8
|
|
10
9
|
def menu_should_have_link(link_name)
|
11
|
-
within "
|
10
|
+
within ".js-menu" do
|
12
11
|
page.should have_link link_name
|
13
12
|
end
|
14
13
|
end
|
15
|
-
|
16
14
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
feature "Pages index" do
|
4
|
-
|
5
4
|
background do
|
6
5
|
sign_in
|
7
6
|
create(:page, name: "Test page")
|
@@ -9,13 +8,13 @@ feature "Pages index" do
|
|
9
8
|
|
10
9
|
scenario "click on edit page" do
|
11
10
|
click_link "Pages"
|
12
|
-
page.find(:css, '.controls .btn-
|
13
|
-
page.should have_content "Edit
|
11
|
+
page.find(:css, '.controls .btn-primary').click
|
12
|
+
page.should have_content "Edit page"
|
14
13
|
end
|
15
14
|
|
16
15
|
scenario "click on delete page" do
|
17
16
|
click_link "Pages"
|
18
|
-
page.find(:css, '.controls .btn-
|
17
|
+
page.find(:css, '.controls .btn-danger').click
|
19
18
|
page.should_not have_content "Test page"
|
20
19
|
page.should have_content "successfully"
|
21
20
|
end
|
@@ -25,5 +24,4 @@ feature "Pages index" do
|
|
25
24
|
click_link "Pages"
|
26
25
|
page.should have_css(".sortable_tree li", :count => 41)
|
27
26
|
end
|
28
|
-
|
29
27
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Brightcontent
|
4
|
+
module Pages
|
5
|
+
describe PathConstraint do
|
6
|
+
describe "#expire" do
|
7
|
+
it 'clear the cache' do
|
8
|
+
expect(Rails.cache).to receive(:delete)
|
9
|
+
PathConstraint.expire
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".matches?" do
|
14
|
+
before do
|
15
|
+
PathConstraint.expire
|
16
|
+
allow(Page).to receive(:pluck) { ['existing'] }
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'returns true if path is existing' do
|
20
|
+
request = double(:request, path: '/existing')
|
21
|
+
expect(subject.matches?(request)).to be_true
|
22
|
+
end
|
23
|
+
it 'returns false if path is non-existing' do
|
24
|
+
request = double(:request, path: '/nonexisting')
|
25
|
+
expect(subject.matches?(request)).to be_false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -8,6 +8,27 @@ module Brightcontent
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
describe "callbacks" do
|
12
|
+
it 'expires path cache after commit' do
|
13
|
+
expect(Pages::PathConstraint).to receive(:expire)
|
14
|
+
create(:page)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#find_by_path" do
|
19
|
+
it 'finds the page by path' do
|
20
|
+
create(:page)
|
21
|
+
page = create(:page, name: "About us")
|
22
|
+
expect(Page.find_by_path('/about-us')).to eq page
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#sanitize_path' do
|
27
|
+
it 'removes the leading slash' do
|
28
|
+
expect(Page.sanitize_path('/path')).to eq 'path'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
11
32
|
describe "slugs" do
|
12
33
|
context "first page" do
|
13
34
|
subject { create(:page, name: "Homepage") }
|
@@ -55,29 +76,5 @@ module Brightcontent
|
|
55
76
|
it { should_not be_homepage }
|
56
77
|
end
|
57
78
|
end
|
58
|
-
|
59
|
-
describe "root_parent_children" do
|
60
|
-
it "returns the children if page is root element" do
|
61
|
-
root, child = build(:page), build(:page)
|
62
|
-
root.children << child
|
63
|
-
root.root_parent_children.should == [child]
|
64
|
-
end
|
65
|
-
|
66
|
-
it "returns the children of parent if page has parent" do
|
67
|
-
root, page, child = create(:page), create(:page), create(:page)
|
68
|
-
root.children << page
|
69
|
-
page.children << child
|
70
|
-
page.root_parent_children.should == [page]
|
71
|
-
end
|
72
|
-
|
73
|
-
it "returns the children of root parent if page has multiple parent" do
|
74
|
-
root1, root2, page = create(:page), create(:page), create(:page)
|
75
|
-
root1.children << root2
|
76
|
-
root2.children << page
|
77
|
-
page.root_parent_children.should == [root2]
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
79
|
end
|
83
80
|
end
|