adva_blog 0.0.1
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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/adva_blog.gemspec +17 -0
- data/app/controllers/admin/blog/articles_controller.rb +5 -0
- data/app/controllers/admin/blog/categories_controller.rb +1 -0
- data/app/controllers/admin/blog/contents_controller.rb +5 -0
- data/app/controllers/admin/blogs_controller.rb +1 -0
- data/app/controllers/blog_articles_controller.rb +23 -0
- data/app/helpers/blog_helper.rb +49 -0
- data/app/models/blog.rb +34 -0
- data/app/views/admin/blog/articles/index.html.erb +40 -0
- data/app/views/admin/sections/settings/_blog.html.erb +11 -0
- data/app/views/blogs/articles/_article.html.erb +28 -0
- data/app/views/blogs/articles/_footer.html.erb +40 -0
- data/app/views/blogs/articles/index.atom.builder +21 -0
- data/app/views/blogs/articles/index.html.erb +4 -0
- data/app/views/blogs/articles/show.html.erb +14 -0
- data/config/initializers/base_controller.rb +3 -0
- data/config/routes.rb +49 -0
- data/lib/adva_blog.rb +10 -0
- data/lib/adva_blog/version.rb +3 -0
- data/test/contexts.rb +9 -0
- data/test/fixtures.rb +50 -0
- data/test/functional/blog_articles_controller_test.rb +139 -0
- data/test/functional/blog_articles_routes_test.rb +159 -0
- data/test/integration/admin/blog_article_test.rb +54 -0
- data/test/integration/admin/blog_ping_test.rb +68 -0
- data/test/integration/admin/blog_test.rb +43 -0
- data/test/integration/blog_article_test.rb +40 -0
- data/test/integration/blog_categories_test.rb +55 -0
- data/test/integration/blog_comment_test.rb +51 -0
- data/test/integration/blog_index_test.rb +104 -0
- data/test/test_helper.rb +2 -0
- data/test/unit/cells/blog_cell_test.rb +29 -0
- data/test/unit/helpers/blog_helper_test.rb +50 -0
- data/test/unit/helpers/content_helper_test.rb +19 -0
- data/test/unit/models/blog_test.rb +37 -0
- data/test/unit/models/counter_test.rb +44 -0
- metadata +101 -0
data/lib/adva_blog.rb
ADDED
data/test/contexts.rb
ADDED
data/test/fixtures.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
user = User.find_by_first_name('a user')
|
2
|
+
admin = User.find_by_first_name('an admin')
|
3
|
+
moderator = User.find_by_first_name('a moderator')
|
4
|
+
|
5
|
+
site = Site.create! :name => 'site with blog',
|
6
|
+
:title => 'site with blog title',
|
7
|
+
:host => 'site-with-blog.com'
|
8
|
+
|
9
|
+
blog = Blog.create! :site => site,
|
10
|
+
:title => 'a blog',
|
11
|
+
:permalink => 'a-blog',
|
12
|
+
:comment_age => 0,
|
13
|
+
:published_at => Time.parse('2008-01-01 12:00:00')
|
14
|
+
|
15
|
+
category = Category.create! :section => blog,
|
16
|
+
:title => 'a category'
|
17
|
+
|
18
|
+
Category.create! :section => blog,
|
19
|
+
:title => 'another category'
|
20
|
+
|
21
|
+
Category.create! :section => blog,
|
22
|
+
:title => 'öäü'
|
23
|
+
|
24
|
+
Category.create! :section => blog,
|
25
|
+
:title => '$%&'
|
26
|
+
|
27
|
+
article = Article.create! :site => site,
|
28
|
+
:section => blog,
|
29
|
+
:title => 'a blog article',
|
30
|
+
:body => 'a blog article body',
|
31
|
+
:categories => [category],
|
32
|
+
:tag_list => 'foo bar',
|
33
|
+
:author => user,
|
34
|
+
:published_at => Time.parse('2008-01-01 12:00:00')
|
35
|
+
|
36
|
+
Article.create! :site => site,
|
37
|
+
:section => blog,
|
38
|
+
:title => 'an unpublished blog article',
|
39
|
+
:body => 'an unpublished blog article body',
|
40
|
+
:categories => [category],
|
41
|
+
:tag_list => 'foo bar',
|
42
|
+
:author => user
|
43
|
+
|
44
|
+
attributes = { :site => site, :section => blog, :commentable => article, :author => user }
|
45
|
+
Comment.create! attributes.merge(:body => 'the approved comment body', :approved => 1)
|
46
|
+
Comment.create! attributes.merge(:body => 'the unapproved comment body', :approved => 0)
|
47
|
+
|
48
|
+
admin.roles.create!(:name => 'admin', :context => site)
|
49
|
+
moderator.roles.create!(:name => 'moderator', :context => blog)
|
50
|
+
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
|
2
|
+
|
3
|
+
class BlogArticlesControllerTest < ActionController::TestCase
|
4
|
+
tests BlogArticlesController
|
5
|
+
with_common :a_blog, :a_category, :an_article
|
6
|
+
|
7
|
+
test "is an BaseController" do
|
8
|
+
@controller.should be_kind_of(BaseController)
|
9
|
+
end
|
10
|
+
|
11
|
+
{ :blog_paths => %w( /a-blog
|
12
|
+
/a-blog/2008
|
13
|
+
/a-blog/2008/1 ),
|
14
|
+
:blog_category_paths => %w( /a-blog/categories/a-category
|
15
|
+
/a-blog/categories/a-category/2008
|
16
|
+
/a-blog/categories/a-category/2008/1 ),
|
17
|
+
:blog_tag_paths => %w( /a-blog/tags/foo+bar ),
|
18
|
+
:blog_feed_paths => %w( /a-blog.atom
|
19
|
+
/a-blog/categories/a-category.atom
|
20
|
+
/a-blog/tags/foo+bar.atom ),
|
21
|
+
:blog_comment_feed_paths => %w( /a-blog/comments.atom
|
22
|
+
/a-blog/2008/1/1/a-blog-article.atom ) }.each do |type, paths|
|
23
|
+
|
24
|
+
paths.each { |path| With.share(type) { before { @params = params_from path } } }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "GET to :index" do
|
28
|
+
action { get :index, @params }
|
29
|
+
|
30
|
+
with [:blog_paths, :blog_category_paths, :blog_tag_paths] do
|
31
|
+
it_assigns :section, :articles
|
32
|
+
it_caches_the_page :track => ['@article', '@articles', '@category', {'@site' => :tag_counts, '@section' => :tag_counts}]
|
33
|
+
|
34
|
+
it_assigns :category, :in => :blog_category_paths
|
35
|
+
it_assigns :tags, %(foo bar), :in => :blog_tag_paths
|
36
|
+
|
37
|
+
it_renders :template, :index
|
38
|
+
end
|
39
|
+
|
40
|
+
with "a blog path" do
|
41
|
+
# splitting this off so we do not test all these combinations on any of the paths above
|
42
|
+
before { @params = params_from('/a-blog') }
|
43
|
+
|
44
|
+
it "displays the article" do
|
45
|
+
has_tag('div[class~=entry]') { has_permalink @article }
|
46
|
+
end
|
47
|
+
|
48
|
+
it "shows the excerpt", :with => :article_has_an_excerpt do
|
49
|
+
does_not_have_text 'article body'
|
50
|
+
has_text 'article excerpt'
|
51
|
+
has_tag 'a', /read the rest of this entry/i
|
52
|
+
end
|
53
|
+
|
54
|
+
it "shows the body", :with => :article_has_no_excerpt do
|
55
|
+
has_text 'article body'
|
56
|
+
does_not_have_text 'article excerpt'
|
57
|
+
has_tag 'a', :text => /read the rest of this entry/i, :count => 0
|
58
|
+
end
|
59
|
+
|
60
|
+
it "displays the number of comments and links to them", :with => :comments_or_commenting_allowed do
|
61
|
+
has_tag 'div.meta a', /\d comment[s]?/i
|
62
|
+
end
|
63
|
+
|
64
|
+
it "does not display the number of comments", :with => :no_comments_and_commenting_not_allowed do
|
65
|
+
has_tag 'div.meta a', :text => /\d comment[s]?/, :count => 0
|
66
|
+
end
|
67
|
+
|
68
|
+
has_tag 'div[id=footer]', :if => :default_theme do
|
69
|
+
has_tag 'ul[id=categories_list]'
|
70
|
+
has_tag 'ul[id=archives]'
|
71
|
+
# has_tag 'ul[id=tags-list]' # FIXME currently tags are not displayed
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
with :blog_feed_paths do
|
76
|
+
it_assigns :section, :articles
|
77
|
+
it_renders :template, :index, :format => :atom
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "GET to :show" do
|
82
|
+
action { get :show, {:section_id => @section.id}.merge(@article.full_permalink) }
|
83
|
+
|
84
|
+
with :the_article_is_published do
|
85
|
+
it_assigns :section, :article
|
86
|
+
it_caches_the_page :track => ['@article', '@articles', '@category', {'@site' => :tag_counts, '@section' => :tag_counts}]
|
87
|
+
|
88
|
+
it_renders :template, :show do
|
89
|
+
has_tag 'div[class~=entry]' do
|
90
|
+
# displays the title and links it to the article
|
91
|
+
has_permalink @article
|
92
|
+
|
93
|
+
# displays excerpt and body
|
94
|
+
has_text @article.excerpt
|
95
|
+
has_text @article.body
|
96
|
+
|
97
|
+
# displays an edit link for authorized users
|
98
|
+
has_authorized_tag 'a[href=?]', edit_admin_article_path(@site, @section, @article), /edit/i
|
99
|
+
|
100
|
+
# does not display a 'read more' link
|
101
|
+
assert @response.body !~ /read the rest of this entry/i
|
102
|
+
|
103
|
+
# FIXME
|
104
|
+
# lists the article's categories
|
105
|
+
# lists the article's tags
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# FIXME
|
110
|
+
# when article has an approved comment: shows the comment
|
111
|
+
# when article has an unapproved comment: does not show any comments
|
112
|
+
# when article does not have any comments: does not show any comments
|
113
|
+
#
|
114
|
+
# when article allows commenting: shows comment form
|
115
|
+
# when article does not allow commenting: does not show comment form
|
116
|
+
end
|
117
|
+
|
118
|
+
# FIXME
|
119
|
+
# with "the article is not published" do
|
120
|
+
# when the user does not have edit permissions: 404, raises ActiveRecord::RecordNotFound
|
121
|
+
# when the user has edit permissions: renders show template, does not cache the page
|
122
|
+
# end
|
123
|
+
|
124
|
+
# FIXME
|
125
|
+
# with a permalink that does not point to an article: raises ActiveRecord::RecordNotFound
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "GET to :comments" do
|
129
|
+
action { get :comments, @params }
|
130
|
+
|
131
|
+
with :the_article_is_published do
|
132
|
+
with :blog_comment_feed_paths do
|
133
|
+
# FIXME it_caches_the_page ...
|
134
|
+
it_assigns :section, :comments
|
135
|
+
it_renders :template, 'comments/comments', :format => :atom
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
|
2
|
+
|
3
|
+
class BlogArticlesRoutesTest < ActionController::TestCase
|
4
|
+
tests BlogArticlesController
|
5
|
+
with_common :default_routing_filters, :a_blog, :a_category, :an_article
|
6
|
+
|
7
|
+
# FIXME /blogs/1 is regenerated as /sections/1
|
8
|
+
paths = %W( /blogs/1/2007
|
9
|
+
/blogs/1/2007/1
|
10
|
+
/blogs/1/categories/a-category
|
11
|
+
/blogs/1/categories/a-category/2007
|
12
|
+
/blogs/1/categories/a-category/2007/1
|
13
|
+
/blogs/1/categories/a-category.atom
|
14
|
+
/blogs/1/tags/foo+bar
|
15
|
+
/blogs/1/tags/foo+bar/2007
|
16
|
+
/blogs/1/tags/foo+bar/2007/1
|
17
|
+
/blogs/1/tags/foo+bar.atom )
|
18
|
+
|
19
|
+
paths.each do |path|
|
20
|
+
test "regenerates the original path from the recognized params for #{path}" do
|
21
|
+
without_routing_filters do
|
22
|
+
params = ActionController::Routing::Routes.recognize_path(path, :method => :get)
|
23
|
+
assert_equal path, @controller.url_for(params.merge(:only_path => true))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "routing" do
|
29
|
+
['', '/a-blog', '/de', '/de/a-blog'].each do |path_prefix|
|
30
|
+
['', '/pages/2'].each do |path_suffix|
|
31
|
+
|
32
|
+
common = { :section_id => Blog.first.id.to_s, :path_prefix => path_prefix, :path_suffix => path_suffix }
|
33
|
+
common.merge! :locale => 'de' if path_prefix =~ /de/
|
34
|
+
common.merge! :page => 2 if path_suffix =~ /pages/
|
35
|
+
|
36
|
+
with_options common do |r|
|
37
|
+
r.it_maps :get, '/', :action => 'index'
|
38
|
+
r.it_maps :get, '/2000', :action => 'index', :year => '2000'
|
39
|
+
r.it_maps :get, '/2000/1', :action => 'index', :year => '2000', :month => '1'
|
40
|
+
|
41
|
+
r.it_maps :get, '/categories/foo', :action => 'index', :category_id => 'foo'
|
42
|
+
r.it_maps :get, '/categories/foo/2000', :action => 'index', :category_id => 'foo', :year => '2000'
|
43
|
+
r.it_maps :get, '/categories/foo/2000/1', :action => 'index', :category_id => 'foo', :year => '2000', :month => '1'
|
44
|
+
|
45
|
+
r.it_maps :get, '/tags/foo+bar', :action => 'index', :tags => 'foo+bar'
|
46
|
+
r.it_maps :get, '/tags/foo+bar/2000', :action => 'index', :tags => 'foo+bar', :year => '2000'
|
47
|
+
r.it_maps :get, '/tags/foo+bar/2000/1', :action => 'index', :tags => 'foo+bar', :year => '2000', :month => '1'
|
48
|
+
|
49
|
+
unless path_suffix =~ /pages/
|
50
|
+
r.it_maps :get, '/2000/1/1/an-article', :action => 'show', :year => '2000', :month => '1', :day => '1',
|
51
|
+
:permalink => 'an-article'
|
52
|
+
|
53
|
+
# article feeds
|
54
|
+
r.it_maps :get, '.atom', :action => 'index', :format => 'atom'
|
55
|
+
r.it_maps :get, '/categories/foo.atom', :action => 'index', :category_id => 'foo', :format => 'atom'
|
56
|
+
r.it_maps :get, '/tags/foo+bar.atom', :action => 'index', :tags => 'foo+bar', :format => 'atom'
|
57
|
+
|
58
|
+
# comment feeds
|
59
|
+
r.it_maps :get, '/2000/1/1/an-article.atom', :action => 'comments', :year => '2000', :month => '1', :day => '1',
|
60
|
+
:permalink => 'an-article', :format => 'atom'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# these do not work with a root section path because there's a reguar Comments resource
|
67
|
+
with_options :action => 'comments', :format => 'atom', :section_id => Blog.first.id.to_s do |r|
|
68
|
+
r.it_maps :get, '/a-blog/comments.atom'
|
69
|
+
r.it_maps :get, '/de/a-blog/comments.atom', :locale => 'de'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "the url_helper blog_path" do
|
74
|
+
before do
|
75
|
+
other = @section.site.sections.create! :title => 'another section' # FIXME move to db/populate
|
76
|
+
other.move_to_left_of @section
|
77
|
+
|
78
|
+
url_rewriter = ActionController::UrlRewriter.new @request, :controller => 'blog', :section => @section.id
|
79
|
+
@controller.instance_variable_set :@url, url_rewriter
|
80
|
+
@controller.instance_variable_set :@site, @site
|
81
|
+
|
82
|
+
I18n.default_locale = :en
|
83
|
+
I18n.locale = :de
|
84
|
+
end
|
85
|
+
|
86
|
+
blog_path = lambda { blog_path(@section) }
|
87
|
+
archive_path = lambda { blog_path(@section, :year => '2008', :month => '1') }
|
88
|
+
tag_path = lambda { blog_tag_path(@section, 'foo+bar') }
|
89
|
+
category_path = lambda { blog_category_path(@section, @category) }
|
90
|
+
|
91
|
+
paged_blog_path = lambda { blog_path(@section, :page => 2) }
|
92
|
+
paged_archive_path = lambda { blog_path(@section, :year => '2008', :month => '1', :page => 2) }
|
93
|
+
paged_tag_path = lambda { blog_tag_path(@section, 'foo+bar', :page => 2) }
|
94
|
+
paged_category_path = lambda { blog_category_path(@section, @category, :page => 2) }
|
95
|
+
|
96
|
+
blog_feed_path = lambda { blog_feed_path(@section.id, :format => :rss) }
|
97
|
+
tag_feed_path = lambda { tag_feed_path(@section, 'foo+bar', :rss) }
|
98
|
+
category_feed_path = lambda { category_feed_path(@section, @category, :rss) }
|
99
|
+
|
100
|
+
article_path = lambda { blog_article_path(@section, @article.full_permalink) }
|
101
|
+
comments_feed_path = lambda { blog_comments_path(@section, :format => :rss) }
|
102
|
+
article_comments_feed_path = lambda { blog_article_comments_path(@section, @article.full_permalink.merge(:format => :rss)) }
|
103
|
+
|
104
|
+
it_rewrites blog_path, :to => '/', :with => [:is_default_locale, :is_root_section]
|
105
|
+
it_rewrites blog_path, :to => '/de', :with => [:is_root_section]
|
106
|
+
it_rewrites blog_path, :to => '/a-blog', :with => [:is_default_locale]
|
107
|
+
it_rewrites blog_path, :to => '/de/a-blog'
|
108
|
+
|
109
|
+
it_rewrites archive_path, :to => '/2008/1', :with => [:is_default_locale, :is_root_section]
|
110
|
+
it_rewrites archive_path, :to => '/de/2008/1', :with => [:is_root_section]
|
111
|
+
it_rewrites archive_path, :to => '/a-blog/2008/1', :with => [:is_default_locale]
|
112
|
+
it_rewrites archive_path, :to => '/de/a-blog/2008/1'
|
113
|
+
|
114
|
+
it_rewrites tag_path, :to => '/tags/foo+bar', :with => [:is_default_locale, :is_root_section]
|
115
|
+
it_rewrites tag_path, :to => '/de/tags/foo+bar', :with => [:is_root_section]
|
116
|
+
it_rewrites tag_path, :to => '/a-blog/tags/foo+bar', :with => [:is_default_locale]
|
117
|
+
it_rewrites tag_path, :to => '/de/a-blog/tags/foo+bar'
|
118
|
+
|
119
|
+
it_rewrites category_path, :to => '/categories/a-category', :with => [:is_default_locale, :is_root_section]
|
120
|
+
it_rewrites category_path, :to => '/de/categories/a-category', :with => [:is_root_section]
|
121
|
+
it_rewrites category_path, :to => '/a-blog/categories/a-category', :with => [:is_default_locale]
|
122
|
+
it_rewrites category_path, :to => '/de/a-blog/categories/a-category'
|
123
|
+
|
124
|
+
it_rewrites paged_blog_path, :to => '/de/a-blog/pages/2'
|
125
|
+
it_rewrites paged_archive_path, :to => '/de/a-blog/2008/1/pages/2'
|
126
|
+
it_rewrites paged_tag_path, :to => '/de/a-blog/tags/foo+bar/pages/2'
|
127
|
+
it_rewrites paged_category_path, :to => '/de/a-blog/categories/a-category/pages/2'
|
128
|
+
|
129
|
+
it_rewrites blog_feed_path, :to => '/a-blog.rss', :with => [:is_default_locale, :is_root_section]
|
130
|
+
it_rewrites blog_feed_path, :to => '/de/a-blog.rss', :with => [:is_root_section]
|
131
|
+
it_rewrites blog_feed_path, :to => '/a-blog.rss', :with => [:is_default_locale]
|
132
|
+
it_rewrites blog_feed_path, :to => '/de/a-blog.rss'
|
133
|
+
|
134
|
+
it_rewrites tag_feed_path, :to => '/tags/foo+bar.rss', :with => [:is_default_locale, :is_root_section]
|
135
|
+
it_rewrites tag_feed_path, :to => '/de/tags/foo+bar.rss', :with => [:is_root_section]
|
136
|
+
it_rewrites tag_feed_path, :to => '/a-blog/tags/foo+bar.rss', :with => [:is_default_locale]
|
137
|
+
it_rewrites tag_feed_path, :to => '/de/a-blog/tags/foo+bar.rss'
|
138
|
+
|
139
|
+
it_rewrites category_feed_path, :to => '/categories/a-category.rss', :with => [:is_default_locale, :is_root_section]
|
140
|
+
it_rewrites category_feed_path, :to => '/de/categories/a-category.rss', :with => [:is_root_section]
|
141
|
+
it_rewrites category_feed_path, :to => '/a-blog/categories/a-category.rss', :with => [:is_default_locale]
|
142
|
+
it_rewrites category_feed_path, :to => '/de/a-blog/categories/a-category.rss'
|
143
|
+
|
144
|
+
it_rewrites article_path, :to => '/2008/1/1/a-blog-article', :with => [:is_default_locale, :is_root_section]
|
145
|
+
it_rewrites article_path, :to => '/de/2008/1/1/a-blog-article', :with => [:is_root_section]
|
146
|
+
it_rewrites article_path, :to => '/a-blog/2008/1/1/a-blog-article', :with => [:is_default_locale]
|
147
|
+
it_rewrites article_path, :to => '/de/a-blog/2008/1/1/a-blog-article'
|
148
|
+
|
149
|
+
it_rewrites comments_feed_path, :to => '/comments.rss', :with => [:is_default_locale, :is_root_section]
|
150
|
+
it_rewrites comments_feed_path, :to => '/de/comments.rss', :with => [:is_root_section]
|
151
|
+
it_rewrites comments_feed_path, :to => '/a-blog/comments.rss', :with => [:is_default_locale]
|
152
|
+
it_rewrites comments_feed_path, :to => '/de/a-blog/comments.rss'
|
153
|
+
|
154
|
+
it_rewrites article_comments_feed_path, :to => '/2008/1/1/a-blog-article.rss', :with => [:is_default_locale, :is_root_section]
|
155
|
+
it_rewrites article_comments_feed_path, :to => '/de/2008/1/1/a-blog-article.rss', :with => [:is_root_section]
|
156
|
+
it_rewrites article_comments_feed_path, :to => '/a-blog/2008/1/1/a-blog-article.rss', :with => [:is_default_locale]
|
157
|
+
it_rewrites article_comments_feed_path, :to => '/de/a-blog/2008/1/1/a-blog-article.rss'
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_helper' )
|
2
|
+
|
3
|
+
module IntegrationTests
|
4
|
+
class AdminBlogArticleTest < ActionController::IntegrationTest
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@section = Blog.first
|
8
|
+
@site = @section.site
|
9
|
+
use_site! @site
|
10
|
+
stub(Time).now.returns Time.utc(2008, 1, 1)
|
11
|
+
end
|
12
|
+
|
13
|
+
test "Admin creates an article, previews, edits and deletes it" do
|
14
|
+
login_as_admin
|
15
|
+
visit_admin_articles_index_page
|
16
|
+
create_a_new_article
|
17
|
+
revise_the_article
|
18
|
+
preview_article
|
19
|
+
delete_article
|
20
|
+
end
|
21
|
+
|
22
|
+
def visit_admin_articles_index_page
|
23
|
+
visit "/admin/sites/#{@site.id}/sections/#{@section.id}/articles"
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_a_new_article
|
27
|
+
click_link "New"
|
28
|
+
fill_in 'article[title]', :with => 'the article title'
|
29
|
+
fill_in 'article[body]', :with => 'the article body'
|
30
|
+
click_button 'Save'
|
31
|
+
request.url.should =~ %r(/admin/sites/\d+/sections/\d+/articles/\d+/edit)
|
32
|
+
end
|
33
|
+
|
34
|
+
def revise_the_article
|
35
|
+
fill_in 'article[title]', :with => 'the revised article title'
|
36
|
+
fill_in 'article[body]', :with => 'the revised article body'
|
37
|
+
click_button 'Save'
|
38
|
+
request.url.should =~ %r(/admin/sites/\d+/sections/\d+/articles/\d+/edit)
|
39
|
+
@back_url = request.url
|
40
|
+
end
|
41
|
+
|
42
|
+
def preview_article
|
43
|
+
click_link 'Show'
|
44
|
+
request.url.should == controller.show_url(Article.find_by_permalink('the-article-title'))
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete_article
|
48
|
+
visit @back_url
|
49
|
+
click_link 'Delete'
|
50
|
+
request.url.should =~ %r(/admin/sites/\d+/sections/\d+/articles)
|
51
|
+
response.body.should_not =~ %r(the revised article title)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_helper' )
|
2
|
+
|
3
|
+
if Rails.plugin?(:adva_post_ping)
|
4
|
+
module IntegrationTests
|
5
|
+
class AdminBlogPingTest < ActionController::IntegrationTest
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
@section = Blog.first
|
9
|
+
@site = @section.site
|
10
|
+
use_site! @site
|
11
|
+
stub(Time).now.returns Time.utc(2008, 1, 2)
|
12
|
+
|
13
|
+
Article.old_add_observer(@observer = ArticlePingObserver.instance)
|
14
|
+
|
15
|
+
@ping_service = { :url => "http://rpc.pingomatic.com/", :type => :xmlrpc }
|
16
|
+
ArticlePingObserver::SERVICES.replace [@ping_service]
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
super
|
21
|
+
Article.delete_observer(@observer)
|
22
|
+
end
|
23
|
+
|
24
|
+
test "The system pings FOO when a blog article is published" do
|
25
|
+
login_as_admin
|
26
|
+
|
27
|
+
visit "/admin/sites/#{@site.id}/sections/#{@section.id}/articles"
|
28
|
+
click_link "New"
|
29
|
+
|
30
|
+
expect_no_pings do
|
31
|
+
create_a_new_article
|
32
|
+
end
|
33
|
+
|
34
|
+
expect_ping_to(@ping_service) do
|
35
|
+
publish_article
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def create_a_new_article
|
40
|
+
fill_in 'article[title]', :with => 'the article title'
|
41
|
+
fill_in 'article[body]', :with => 'the article body'
|
42
|
+
click_button 'Save'
|
43
|
+
request.url.should =~ %r(/admin/sites/\d+/sections/\d+/articles/\d+/edit)
|
44
|
+
end
|
45
|
+
|
46
|
+
def publish_article
|
47
|
+
uncheck 'article[draft]'
|
48
|
+
select_date "2008-1-1", :from => 'Publish on this date'
|
49
|
+
click_button 'Save'
|
50
|
+
request.url.should =~ %r(/admin/sites/\d+/sections/\d+/articles/\d+/edit)
|
51
|
+
end
|
52
|
+
|
53
|
+
def expect_no_pings
|
54
|
+
RR.dont_allow(ArticlePingObserver.instance).ping_service(anything, anything)
|
55
|
+
yield
|
56
|
+
RR.verify
|
57
|
+
RR.reset
|
58
|
+
end
|
59
|
+
|
60
|
+
def expect_ping_to(service)
|
61
|
+
RR.mock(ArticlePingObserver.instance).ping_service(service, anything)
|
62
|
+
yield
|
63
|
+
RR.verify
|
64
|
+
RR.reset
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|