brightcontent-pages 2.0.33 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|