tylerrick-bcms_blog 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +63 -0
- data/app/controllers/application_controller.rb +10 -0
- data/app/controllers/cms/blog_comments_controller.rb +3 -0
- data/app/controllers/cms/blog_posts_controller.rb +35 -0
- data/app/controllers/cms/blogs_controller.rb +11 -0
- data/app/helpers/application_helper.rb +3 -0
- data/app/helpers/cms/blog_helper.rb +11 -0
- data/app/models/blog.rb +143 -0
- data/app/models/blog_comment.rb +28 -0
- data/app/models/blog_group_membership.rb +4 -0
- data/app/models/blog_post.rb +101 -0
- data/app/portlets/blog_post_portlet.rb +38 -0
- data/app/views/cms/blog_comments/_form.html.erb +5 -0
- data/app/views/cms/blog_comments/render.html.erb +2 -0
- data/app/views/cms/blog_posts/_form.html.erb +11 -0
- data/app/views/cms/blog_posts/no_access.html.erb +9 -0
- data/app/views/cms/blog_posts/render.html.erb +1 -0
- data/app/views/cms/blogs/_form.html.erb +23 -0
- data/app/views/cms/blogs/admin_only.html.erb +9 -0
- data/app/views/cms/blogs/render.html.erb +2 -0
- data/app/views/partials/_blog_post.html.erb +106 -0
- data/app/views/partials/_blog_post.html.haml +91 -0
- data/app/views/portlets/blog_post/_form.html.erb +3 -0
- data/app/views/portlets/blog_post/render.html.erb +33 -0
- data/db/migrate/20090415000000_create_blogs.rb +45 -0
- data/db/migrate/20090415000001_create_blog_posts.rb +25 -0
- data/db/migrate/20090415000002_create_blog_comments.rb +19 -0
- data/db/migrate/20090415000003_add_attachment_to_blog_posts.rb +23 -0
- data/doc/README_FOR_APP +2 -0
- data/doc/migrate_to_20100427.rb +68 -0
- data/lib/bcms_blog/routes.rb +9 -0
- data/lib/bcms_blog.rb +1 -0
- data/rails/init.rb +4 -0
- data/test/factories.rb +31 -0
- data/test/functional/blog_post_test.rb +41 -0
- data/test/functional/blog_test.rb +69 -0
- data/test/functional/cms/blog_posts_controller_test.rb +43 -0
- data/test/functional/cms/blogs_controller_test.rb +12 -0
- data/test/performance/browsing_test.rb +9 -0
- data/test/test_helper.rb +104 -0
- data/test/test_logging.rb +64 -0
- data/test/unit/blog_post_test.rb +16 -0
- data/test/unit/blog_test.rb +23 -0
- metadata +96 -0
@@ -0,0 +1,91 @@
|
|
1
|
+
%style
|
2
|
+
:sass
|
3
|
+
.blog_post.first
|
4
|
+
h2, h2 a
|
5
|
+
font: normal 30px/28px 'arial black', arial, sans-serif !important
|
6
|
+
border-bottom: 1px solid #ccc
|
7
|
+
|
8
|
+
.blog_post
|
9
|
+
border: 0px solid gray
|
10
|
+
margin-bottom: 20px
|
11
|
+
|
12
|
+
h2
|
13
|
+
margin-bottom: 0
|
14
|
+
h2, h2 a
|
15
|
+
font: normal 20px/23px 'arial black', arial, sans-serif !important
|
16
|
+
text-decoration: none !important
|
17
|
+
h2 a:hover
|
18
|
+
text-decoration: underline !important
|
19
|
+
|
20
|
+
.image
|
21
|
+
float: left
|
22
|
+
border: 1px solid #ccc
|
23
|
+
margin: 10px
|
24
|
+
margin-top: 0
|
25
|
+
|
26
|
+
.date
|
27
|
+
color: #666
|
28
|
+
.read_more
|
29
|
+
font-weight: bold
|
30
|
+
|
31
|
+
.comment + .comment
|
32
|
+
border-top: 1px dashed #ccc
|
33
|
+
|
34
|
+
.clear
|
35
|
+
clear: both
|
36
|
+
|
37
|
+
:ruby
|
38
|
+
# _counter is defined only if we pass :collection to the partial
|
39
|
+
if defined?(blog_post_counter)
|
40
|
+
showing_individual_post = false
|
41
|
+
else
|
42
|
+
showing_individual_post = true
|
43
|
+
blog_post_counter = 0
|
44
|
+
end
|
45
|
+
|
46
|
+
if blog_post_counter == 0
|
47
|
+
max_width = 250
|
48
|
+
css_class = 'first'
|
49
|
+
else
|
50
|
+
max_width = 75
|
51
|
+
css_class = ''
|
52
|
+
end
|
53
|
+
|
54
|
+
.blog_post.clear{:id => "blog_post_#{blog_post.id}", :class => css_class}
|
55
|
+
- if blog_post.attachment
|
56
|
+
-# .image= image_tag_with_max_size blog_post.attachment.file_path, blog_post.attachment.full_file_location, :width => max_width
|
57
|
+
.image= image_tag blog_post.attachment.file_path
|
58
|
+
|
59
|
+
%h2= link_to h(blog_post.name), href = _blog_post_path(blog_post)
|
60
|
+
|
61
|
+
.date= blog_post.published_at.to_s(:long)
|
62
|
+
|
63
|
+
.body
|
64
|
+
- if showing_individual_post or blog_post.summary.blank?
|
65
|
+
= blog_post.body
|
66
|
+
- else
|
67
|
+
= blog_post.summary
|
68
|
+
%p.read_more= link_to 'Read More »', href
|
69
|
+
|
70
|
+
- if showing_individual_post || blog_post_counter == 0
|
71
|
+
.meta
|
72
|
+
- unless blog_post.category_id.blank?
|
73
|
+
Posted in #{link_to h(blog_post.category_name), _blog_path(blog_post.blog, 'posts_in_category', :category => blog_post.category_name)}
|
74
|
+
%strong |
|
75
|
+
- if blog_post.tags.any?
|
76
|
+
Tags:
|
77
|
+
%span.tags
|
78
|
+
= blog_post.tags.map{|t| link_to(h(t.name), _blog_path(blog_post.blog, 'posts_with_tag', :tag => t.name)) }.join(", ")
|
79
|
+
%strong |
|
80
|
+
= link_to h(pluralize(blog_post.comments_count, "Comment")), "#{_blog_post_path(blog_post)}#comments"
|
81
|
+
%br.clear/
|
82
|
+
|
83
|
+
- comments = blog_post.comments.reject(&:new_record?)
|
84
|
+
- if showing_individual_post and comments.any?
|
85
|
+
%h2 Comments
|
86
|
+
- comments.each_with_index do |comment, i|
|
87
|
+
%div{:class => "comment #{'first' if i == 0}"}
|
88
|
+
= h comment.body
|
89
|
+
%p
|
90
|
+
\—#{comment.url.present? ? link_to(h(comment.author), comment.url) : h(comment.author)}
|
91
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<% page_title @blog_post.name %>
|
2
|
+
<%= render :partial => "partials/blog_post", :object => @blog_post %>
|
3
|
+
|
4
|
+
<style>
|
5
|
+
@import url('/stylesheets/cms/form_layout.css');
|
6
|
+
</style>
|
7
|
+
|
8
|
+
<div class="blog_comment_form">
|
9
|
+
<% form_for @blog_comment, :url => cms_handler_path(@portlet, "create_comment") do |f| %>
|
10
|
+
<%= f.hidden_field :post_id %>
|
11
|
+
<%= f.error_messages %>
|
12
|
+
<div class="fields text_fields">
|
13
|
+
<%= f.label :author, 'Name *' %>
|
14
|
+
<%= f.text_field :author %>
|
15
|
+
</div>
|
16
|
+
<div class="fields text_fields clear">
|
17
|
+
<%= f.label :email, 'E-mail address' %>
|
18
|
+
<%= f.text_field :email %>
|
19
|
+
</div>
|
20
|
+
<div class="fields text_fields clear">
|
21
|
+
<%= f.label :url, 'Web site' %>
|
22
|
+
<%= f.text_field :url %>
|
23
|
+
</div>
|
24
|
+
<div class="fields text_editor_fields clear">
|
25
|
+
<%= f.label :body, 'Body *' %>
|
26
|
+
<br/>
|
27
|
+
<%= f.text_area :body, :size => "50x5", :style => 'height: auto' %>
|
28
|
+
</div>
|
29
|
+
<div class="buttons clear">
|
30
|
+
<%= submit_tag "Submit comment" %>
|
31
|
+
</div>
|
32
|
+
<% end %>
|
33
|
+
</div>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'pp'
|
2
|
+
|
3
|
+
Page # trigger auto-loading
|
4
|
+
# At the time of this writing, these associations are missing :dependent => :destroy
|
5
|
+
class Page
|
6
|
+
has_many :page_routes, :dependent => :destroy
|
7
|
+
end
|
8
|
+
class PageRoute
|
9
|
+
has_many :requirements, :class_name => "PageRouteRequirement", :dependent => :destroy
|
10
|
+
has_many :conditions, :class_name => "PageRouteCondition", :dependent => :destroy
|
11
|
+
end
|
12
|
+
|
13
|
+
class CreateBlogs < ActiveRecord::Migration
|
14
|
+
def self.up
|
15
|
+
create_versioned_table :blogs do |t|
|
16
|
+
t.string :name
|
17
|
+
t.string :format
|
18
|
+
t.text :template
|
19
|
+
end
|
20
|
+
|
21
|
+
create_table :blog_group_memberships do |t|
|
22
|
+
t.integer :blog_id
|
23
|
+
t.integer :group_id
|
24
|
+
end
|
25
|
+
|
26
|
+
ContentType.create!(:name => "Blog", :group_name => "Blog")
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.down
|
30
|
+
puts "Destroying portlets, pages, page_routes..."
|
31
|
+
pp (portlets = BlogPostPortlet.all).map(&:connected_pages).flatten.each(&:destroy)
|
32
|
+
pp portlets.each(&:destroy)
|
33
|
+
|
34
|
+
#Blog.all.map(&:connected_pages).flatten.map(&:page_routes).flatten.each(&:destroy)
|
35
|
+
pp Blog.all.map(&:connected_pages).flatten.each(&:destroy)
|
36
|
+
|
37
|
+
ContentType.destroy_all(:name => "Blog")
|
38
|
+
Connector.destroy_all(:connectable_type => "Blog")
|
39
|
+
|
40
|
+
drop_table :blog_versions
|
41
|
+
drop_table :blogs
|
42
|
+
|
43
|
+
drop_table :blog_group_memberships
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class CreateBlogPosts < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_versioned_table :blog_posts do |t|
|
4
|
+
t.integer :blog_id
|
5
|
+
t.integer :author_id
|
6
|
+
t.integer :category_id
|
7
|
+
t.string :name
|
8
|
+
t.string :slug
|
9
|
+
t.text :summary
|
10
|
+
t.text :body, :size => (64.kilobytes + 1)
|
11
|
+
t.integer :comments_count
|
12
|
+
t.datetime :published_at
|
13
|
+
end
|
14
|
+
CategoryType.create!(:name => "Blog Post")
|
15
|
+
ContentType.create!(:name => "BlogPost", :group_name => "Blog")
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.down
|
19
|
+
ContentType.destroy_all(:name => 'BlogPost')
|
20
|
+
CategoryType.destroy_all(:name => "Blog Post")
|
21
|
+
|
22
|
+
drop_table :blog_post_versions
|
23
|
+
drop_table :blog_posts
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class CreateBlogComments < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_versioned_table :blog_comments do |t|
|
4
|
+
t.integer :post_id
|
5
|
+
t.string :author
|
6
|
+
t.string :email
|
7
|
+
t.string :url
|
8
|
+
t.string :ip
|
9
|
+
t.text :body
|
10
|
+
end
|
11
|
+
ContentType.create!(:name => "BlogComment", :group_name => "Blog")
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.down
|
15
|
+
ContentType.destroy_all(:name => 'BlogComment')
|
16
|
+
drop_table :blog_comment_versions
|
17
|
+
drop_table :blog_comments
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class AddAttachmentToBlogPosts < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
change_table :blog_posts do |t|
|
4
|
+
t.belongs_to :attachment
|
5
|
+
t.integer :attachment_version
|
6
|
+
end
|
7
|
+
change_table :blog_post_versions do |t|
|
8
|
+
t.belongs_to :attachment
|
9
|
+
t.integer :attachment_version
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
change_table :blog_posts do |t|
|
15
|
+
t.remove :attachment
|
16
|
+
t.remove :attachment_version
|
17
|
+
end
|
18
|
+
change_table :blog_post_versions do |t|
|
19
|
+
t.remove :attachment
|
20
|
+
t.remove :attachment_version
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/doc/README_FOR_APP
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# Ideally, we would create a new migration whenever we wanted to make changes to an existing
|
2
|
+
# migration that is already in circulation, instead of simply editing the existing migrations
|
3
|
+
# and publishing the new version, because doing rake db:migrate:redo VERSION=20090415000000,
|
4
|
+
# etc. on each updated migration is not only a pain but will probably result in more data being
|
5
|
+
# lost than is strictly necessary -- assuming the migrations work correctly at all.
|
6
|
+
#
|
7
|
+
# On the other hand, there's something pretty compelling about "fixing" the migration so that
|
8
|
+
# it doesn't have any useless steps that are just going to get reverted by the next migration.
|
9
|
+
#
|
10
|
+
# There is also the problem of model dependencies: you can't safely remove a model in the same
|
11
|
+
# commit that you use that model in a migration (f.e., Model.destroy_all). Even if you remove it
|
12
|
+
# in the following commit, it's only safe if people check out every intermediate version and run
|
13
|
+
# db:migrate at each version, instead of simply checking out the tip version and then running
|
14
|
+
# db:migrate. And people don't do that.
|
15
|
+
#
|
16
|
+
# Anyway, I guess we assume that there are only a few brave souls out there who are already
|
17
|
+
# using bcms_blog and hope for the best. Here is the "missing migration"; hopefully it will be
|
18
|
+
# helpful to you.
|
19
|
+
#
|
20
|
+
# Run this script instead of re-running the changed migrations with rake db:migrate:redo so that
|
21
|
+
# your blog data is not destroyed.
|
22
|
+
#
|
23
|
+
# Usage: ./script/runner 'require "/path/to/bcms_blog/doc/migrate_to_20100427.rb"'
|
24
|
+
|
25
|
+
require 'pp'
|
26
|
+
|
27
|
+
Page # trigger auto-loading
|
28
|
+
# At the time of this writing, these associations are missing :dependent => :destroy
|
29
|
+
class Page
|
30
|
+
has_many :page_routes, :dependent => :destroy
|
31
|
+
end
|
32
|
+
class PageRoute
|
33
|
+
has_many :requirements, :class_name => "PageRouteRequirement", :dependent => :destroy
|
34
|
+
has_many :conditions, :class_name => "PageRouteCondition", :dependent => :destroy
|
35
|
+
end
|
36
|
+
|
37
|
+
class MigrateTo20100427 < ActiveRecord::Migration
|
38
|
+
def self.up
|
39
|
+
drop_table :blog_group_membership_versions
|
40
|
+
|
41
|
+
PageRouteOption.all.each {|a| a.destroy unless a.page_route }
|
42
|
+
|
43
|
+
puts "Destroying portlets, pages, page_routes left over from old version of bcms_blog..."
|
44
|
+
puts "(*Not* destroying any existing Blogs, pages on which Blogs are connected, or BlogPosts)"
|
45
|
+
portlets = [BlogPostPortlet, BlogPostsInCategoryPortlet, BlogPostsWithTagPortlet, BlogPostsInDayPortlet, BlogPostsInMonthPortlet, BlogPostsInYearPortlet]
|
46
|
+
#pp portlets.map(&:all).flatten.map(&:connected_pages).flatten.map(&:page_routes).flatten.each(&:destroy)
|
47
|
+
pp portlets.map(&:all).flatten.map(&:connected_pages).flatten.each(&:destroy)
|
48
|
+
|
49
|
+
# Something like this might not work if they have moved their Blog page to a different section or to no section, so we better let users resolve this manually...
|
50
|
+
#Blog.all.map(&:connected_pages).flatten.each do |page|
|
51
|
+
# page.hidden = true
|
52
|
+
# page.save!
|
53
|
+
# page.section.hidden = false
|
54
|
+
# page.section.save!
|
55
|
+
#end
|
56
|
+
|
57
|
+
puts "Calling after_create on each Blog in the system..."
|
58
|
+
Blog.all.each do |blog|
|
59
|
+
puts "#{blog}..."
|
60
|
+
blog.send :after_create
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.down
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
MigrateTo20100427.up
|
data/lib/bcms_blog.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bcms_blog/routes'
|
data/rails/init.rb
ADDED
data/test/factories.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
if ActiveRecord::Base.connection.table_exists?("blogs")
|
2
|
+
|
3
|
+
Factory.define :group do |m|
|
4
|
+
m.sequence(:name) {|n| "TestGroup#{n}" }
|
5
|
+
end
|
6
|
+
|
7
|
+
Factory.define :group_type do |m|
|
8
|
+
m.sequence(:name) {|n| "TestGroupType#{n}" }
|
9
|
+
end
|
10
|
+
|
11
|
+
Factory.define :user do |m|
|
12
|
+
m.first_name "Test"
|
13
|
+
m.last_name "User"
|
14
|
+
m.sequence(:login) {|n| "test_#{n}" }
|
15
|
+
m.email {|a| "#{a.login}@example.com" }
|
16
|
+
m.password "password"
|
17
|
+
m.password_confirmation {|a| a.password }
|
18
|
+
end
|
19
|
+
|
20
|
+
Factory.define :blog do |m|
|
21
|
+
m.sequence(:name) {|n| "TestBlog#{n}"}
|
22
|
+
end
|
23
|
+
|
24
|
+
Factory.define :blog_post do |b|
|
25
|
+
b.sequence(:name) { |n| "BlogPost#{n}" }
|
26
|
+
b.blog { Factory.create(:blog) }
|
27
|
+
b.sequence(:body) { |n| "Lorem ipsum #{n}" }
|
28
|
+
b.author { User.find(:first) }
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class BlogPostTest < ActionController::TestCase
|
4
|
+
tests Cms::ContentController
|
5
|
+
|
6
|
+
def setup
|
7
|
+
create_baseline_data
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
destroy_baseline_data
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_show_post
|
15
|
+
get :show, :path => ["blog", "post"],
|
16
|
+
:year => @first_post.year,
|
17
|
+
:month => @first_post.month,
|
18
|
+
:day => @first_post.day,
|
19
|
+
:slug => @first_post.slug
|
20
|
+
#log @response.body
|
21
|
+
assert_response :success
|
22
|
+
assert_select "title", @first_post.name
|
23
|
+
assert_select ".blog_post", 1
|
24
|
+
|
25
|
+
assert_select "#blog_post_#{@first_post.id}" do
|
26
|
+
assert_select "h2 a", @first_post.name
|
27
|
+
assert_select "p.body", @first_post.body
|
28
|
+
assert_select "p.meta a", "General"
|
29
|
+
assert_select "p.meta a", "0 Comments"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_non_existent_slug_should_return_404
|
35
|
+
get :show, :path => ["blog", "post"],
|
36
|
+
:year => 2005, :month => 6, :day => 14,
|
37
|
+
:slug => "not-here"
|
38
|
+
assert_response :not_found
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class BlogTest < ActionController::TestCase
|
4
|
+
tests Cms::ContentController
|
5
|
+
|
6
|
+
def setup
|
7
|
+
create_baseline_data
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
destroy_baseline_data
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_list_of_blog_posts
|
15
|
+
get :show
|
16
|
+
#log @response.body
|
17
|
+
assert_response :success
|
18
|
+
assert_select ".blog_post", 5
|
19
|
+
|
20
|
+
assert_select "#blog_post_#{@first_post.id}" do
|
21
|
+
assert_select "h2 a", @first_post.name
|
22
|
+
assert_select "p.body", @first_post.body
|
23
|
+
assert_select "p.meta a", "General"
|
24
|
+
assert_select "p.meta a", "0 Comments"
|
25
|
+
end
|
26
|
+
|
27
|
+
assert_select "#blog_post_#{@foo_post_1.id}" do
|
28
|
+
assert_select "h2 a", @foo_post_1.name
|
29
|
+
assert_select "p.body", @foo_post_1.body
|
30
|
+
assert_select "p.meta .tags a", "foo"
|
31
|
+
assert_select "p.meta .tags a", "stuff"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_list_of_tagged_blog_posts
|
36
|
+
get :show, :category => "General"
|
37
|
+
#log @response.body
|
38
|
+
assert_response :success
|
39
|
+
assert_select ".blog_post", 3
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_list_of_categorized_blog_posts
|
43
|
+
get :show, :tag => "foo"
|
44
|
+
#log @response.body
|
45
|
+
assert_response :success
|
46
|
+
assert_select ".blog_post", 2
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_list_of_blog_posts_in_day
|
50
|
+
get :show, :path => ["blog", "posts_in_day"],
|
51
|
+
:year => 2008, :month => 7, :day => 5
|
52
|
+
assert_response :success
|
53
|
+
assert_select ".blog_post", 2
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_list_of_blog_posts_in_month
|
57
|
+
get :show, :path => ["blog", "posts_in_month"],
|
58
|
+
:year => 2008, :month => 7
|
59
|
+
assert_response :success
|
60
|
+
assert_select ".blog_post", 3
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_list_of_blog_posts_in_year
|
64
|
+
get :show, :path => ["blog", "posts_in_year"],
|
65
|
+
:year => 2008
|
66
|
+
assert_response :success
|
67
|
+
assert_select ".blog_post", 4
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
class Cms::BlogPostsControllerTest < ActionController::TestCase
|
4
|
+
def setup
|
5
|
+
create_non_admin_user
|
6
|
+
login_as(@user)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_access_denied_on_create_if_blog_not_user_editable
|
10
|
+
@editable = Factory.create(:blog, :groups => [@group])
|
11
|
+
@non_editable = Factory.create(:blog)
|
12
|
+
post :create, :blog_post => { :blog_id => @non_editable.id }
|
13
|
+
assert @response.body.include?("AccessDenied")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_access_denied_on_update_if_blog_not_user_editable
|
17
|
+
@editable = Factory.create(:blog, :groups => [@group])
|
18
|
+
@non_editable = Factory.create(:blog)
|
19
|
+
@blog_post = Factory.create(:blog_post, :blog => @non_editable)
|
20
|
+
put :update, :id => @blog_post, :blog_post => { :name => "Foo" }
|
21
|
+
assert @response.body.include?("AccessDenied")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_no_access_if_no_editable_blogs
|
25
|
+
@blog = Factory.create(:blog)
|
26
|
+
get :index
|
27
|
+
assert_template "no_access"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_index_shouldnt_show_non_editable_posts
|
31
|
+
@editable = Factory.create(:blog, :groups => [@group])
|
32
|
+
@non_editable = Factory.create(:blog)
|
33
|
+
@blog_post = Factory.create(:blog_post, :name => "Non-editable", :blog => @non_editable)
|
34
|
+
get :index
|
35
|
+
assert !@response.body.include?("Non-editable")
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_create_sets_author
|
39
|
+
@blog = Factory.create(:blog, :groups => [@group])
|
40
|
+
post :create, :blog_post => { :blog_id => @blog.id }
|
41
|
+
assert_equal @user, assigns(:block).author
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
class Cms::BlogsControllerTest < ActionController::TestCase
|
4
|
+
def test_list_blog_posts_as_non_admin
|
5
|
+
create_non_admin_user
|
6
|
+
login_as(@user)
|
7
|
+
|
8
|
+
get :index
|
9
|
+
assert_response :success
|
10
|
+
assert @response.body.include? "Sorry, this section is restricted to administrators."
|
11
|
+
end
|
12
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
ENV["RAILS_ENV"] = "test"
|
2
|
+
ENV['BACKTRACE'] = "YES PLEASE"
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
|
4
|
+
require 'test_help'
|
5
|
+
|
6
|
+
unless $database_initialized
|
7
|
+
$database_initialized = true
|
8
|
+
|
9
|
+
# Empty the database and load in the default seed data for browsercms
|
10
|
+
# and the blog module
|
11
|
+
`rake db:test:purge`
|
12
|
+
`rake db:migrate`
|
13
|
+
|
14
|
+
# Publish all pages, as they are drafts after migrating
|
15
|
+
Page.find(:all).each(&:publish!)
|
16
|
+
end
|
17
|
+
|
18
|
+
class ActiveSupport::TestCase
|
19
|
+
require File.dirname(__FILE__) + '/test_logging'
|
20
|
+
include TestLogging
|
21
|
+
# Transactional fixtures accelerate your tests by wrapping each test method
|
22
|
+
# in a transaction that's rolled back on completion. This ensures that the
|
23
|
+
# test database remains unchanged so your fixtures don't have to be reloaded
|
24
|
+
# between every test method. Fewer database queries means faster tests.
|
25
|
+
#
|
26
|
+
# Read Mike Clark's excellent walkthrough at
|
27
|
+
# http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
|
28
|
+
#
|
29
|
+
# Every Active Record database supports transactions except MyISAM tables
|
30
|
+
# in MySQL. Turn off transactional fixtures in this case; however, if you
|
31
|
+
# don't care one way or the other, switching from MyISAM to InnoDB tables
|
32
|
+
# is recommended.
|
33
|
+
#
|
34
|
+
# The only drawback to using transactional fixtures is when you actually
|
35
|
+
# need to test transactions. Since your test is bracketed by a transaction,
|
36
|
+
# any transactions started in your code will be automatically rolled back.
|
37
|
+
self.use_transactional_fixtures = true
|
38
|
+
|
39
|
+
# Instantiated fixtures are slow, but give you @david where otherwise you
|
40
|
+
# would need people(:david). If you don't want to migrate your existing
|
41
|
+
# test cases which use the @david style and don't mind the speed hit (each
|
42
|
+
# instantiated fixtures translates to a database query per test method),
|
43
|
+
# then set this back to true.
|
44
|
+
self.use_instantiated_fixtures = false
|
45
|
+
|
46
|
+
# Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
|
47
|
+
#
|
48
|
+
# Note: You'll currently still have to declare fixtures explicitly in integration tests
|
49
|
+
# -- they do not yet inherit this setting
|
50
|
+
fixtures :all
|
51
|
+
|
52
|
+
# Add more helper methods to be used by all tests here...
|
53
|
+
def create_baseline_data
|
54
|
+
# Find the seed data items
|
55
|
+
@blog = Blog.find_by_name("My Blog")
|
56
|
+
@blog_page = Page.find_by_path("/")
|
57
|
+
@blog_post_page = Page.find_by_path("/blog/post")
|
58
|
+
@category_type = CategoryType.find_by_name("Blog Post")
|
59
|
+
|
60
|
+
# For some reason this is necessary otherwise the relevant page routes aren't loaded when
|
61
|
+
# the tests are run via "rake" (as opposed to running them directly). I don't know exactly
|
62
|
+
# why this is the case.
|
63
|
+
ActionController::Routing::Routes.load!
|
64
|
+
|
65
|
+
@stuff = Category.create!(:name => "Stuff", :category_type => @category_type)
|
66
|
+
@general = Category.create!(:name => "General", :category_type => @category_type)
|
67
|
+
|
68
|
+
@first_post = Factory(:blog_post, :blog => @blog, :category => @general,
|
69
|
+
:published_at => Time.utc(2008, 7, 5, 6), :publish_on_save => true)
|
70
|
+
|
71
|
+
@foo_post_1 = Factory(:blog_post, :blog => @blog, :category => @stuff,
|
72
|
+
:published_at => Time.utc(2008, 7, 5, 12), :tag_list => "foo stuff", :publish_on_save => true)
|
73
|
+
|
74
|
+
@foo_post_2 = Factory(:blog_post, :blog => @blog, :category => @general,
|
75
|
+
:published_at => Time.utc(2008, 7, 21), :publish_on_save => true)
|
76
|
+
|
77
|
+
@bar_post_1 = Factory(:blog_post, :blog => @blog, :category => @stuff,
|
78
|
+
:published_at => Time.utc(2008, 9, 2), :tag_list => "foo stuff", :publish_on_save => true)
|
79
|
+
|
80
|
+
@bar_post_2 = Factory(:blog_post, :blog => @blog, :category => @general,
|
81
|
+
:published_at => Time.utc(2009, 3, 18), :publish_on_save => true)
|
82
|
+
end
|
83
|
+
|
84
|
+
def destroy_baseline_data
|
85
|
+
Category.destroy_all
|
86
|
+
BlogPost.destroy_all
|
87
|
+
end
|
88
|
+
|
89
|
+
def create_non_admin_user
|
90
|
+
@group = Factory(:group, :name => "Test", :group_type => Factory(:group_type, :name => "CMS User", :cms_access => true))
|
91
|
+
@group.permissions << Permission.find_by_name("edit_content")
|
92
|
+
@group.permissions << Permission.find_by_name("publish_content")
|
93
|
+
@group.save!
|
94
|
+
|
95
|
+
@user = Factory(:user)
|
96
|
+
@user.groups << @group
|
97
|
+
@user.save!
|
98
|
+
end
|
99
|
+
|
100
|
+
def login_as(user)
|
101
|
+
@request.session[:user_id] = user ? user.id : nil
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|