articles_controller_spec.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:12k
源码类别:

Ajax

开发平台:

Others

  1. require File.dirname(__FILE__) + '/../spec_helper'
  2. describe ArticlesController do
  3.   integrate_views
  4.   it "should redirect category to /categories" do
  5.     get 'category'
  6.     response.should redirect_to(categories_path)
  7.   end
  8.   it "should redirect tag to /tags" do
  9.     get 'tag'
  10.     response.should redirect_to(tags_path)
  11.   end
  12.   describe 'index action' do
  13.     before :each do
  14.       get 'index'
  15.     end
  16.     it 'should be render template index' do
  17.       response.should render_template(:index)
  18.     end
  19.     it 'should assigns articles' do
  20.       assigns[:articles].should_not be_nil
  21.     end
  22.     it 'should have good link feed rss' do
  23.       response.should have_tag('head>link[href=?]','http://test.host/articles.rss')
  24.     end
  25.     it 'should have good link feed atom' do
  26.       response.should have_tag('head>link[href=?]','http://test.host/articles.atom')
  27.     end
  28.   end
  29.   describe '#search action' do
  30.     describe 'a valid search' do
  31.       before :each do
  32.         get 'search', :q => 'a'
  33.       end
  34.       it 'should render template search' do
  35.         response.should render_template(:search)
  36.       end
  37.       it 'should assigns articles' do
  38.         assigns[:articles].should_not be_nil
  39.       end
  40.       it 'should have good feed rss link' do
  41.         response.should have_tag('head>link[href=?]','http://test.host/search/a.rss')
  42.       end
  43.       it 'should have good feed atom link' do
  44.         response.should have_tag('head>link[href=?]','http://test.host/search/a.atom')
  45.       end
  46.       it 'should have content markdown interpret and without html tag' do
  47.         response.should have_tag('div', /in markdown formatnnnwenusenok to define a linknn...n/)
  48.       end
  49.     end
  50.     it 'should render feed rss by search' do
  51.       get 'search', :q => 'a', :format => 'rss'
  52.       response.should be_success
  53.       response.should render_template('articles/_rss20_feed')
  54.       assert_feedvalidator response.body
  55.     end
  56.     it 'should render feed atom by search' do
  57.       get 'search', :q => 'a', :format => 'atom'
  58.       response.should be_success
  59.       response.should render_template('articles/_atom_feed')
  60.       assert_feedvalidator response.body
  61.     end
  62.     it 'search with empty result' do
  63.       get 'search', :q => 'abcdefghijklmnopqrstuvwxyz'
  64.       response.should render_template('articles/error.html.erb')
  65.       assigns[:articles].should be_empty
  66.     end
  67.   end
  68.   describe '#livesearch action' do
  69.     describe 'with a query with several words' do
  70.       before :each do
  71.         Factory.create(:article, :body => "hello world and im herer")
  72.         Factory.create(:article, :title => "hello", :body => "worldwide")
  73.         Factory.create(:article)
  74.         get :live_search, :q => 'hello world'
  75.       end
  76.       it 'should be valid' do 
  77.         assigns[:articles].should_not be_empty
  78.         assigns[:articles].should have(2).records
  79.       end
  80.       it 'should render without layout' do
  81.         controller.should_receive(:render).with(:layout =>false, :action => :live_search)
  82.         get :live_search, :q => 'hello world'
  83.       end
  84.       it 'should render template live_search' do
  85.         response.should render_template(:live_search)
  86.       end
  87.       it 'should not have h3 tag' do
  88.         response.should have_tag("h3")
  89.       end
  90.       it "should assign @search the search string" do
  91.         assigns[:search].should be_equal(params[:q])
  92.       end
  93.     end
  94.   end
  95.   
  96.   it 'archives' do
  97.     get 'archives'
  98.     response.should render_template(:archives)
  99.     assigns[:articles].should_not be_nil
  100.   end
  101.   describe 'index for a month' do
  102.     before :each do
  103.       get 'index', :year => 2004, :month => 4
  104.     end
  105.     it 'should render template index' do
  106.       response.should render_template(:index)
  107.     end
  108.     it 'should contain some articles' do
  109.       assigns[:articles].should_not be_nil
  110.     end
  111.   end
  112. end
  113. describe ArticlesController, "nosettings" do
  114.   before(:each) do
  115.     Blog.delete_all
  116.     @blog = Blog.new.save
  117.   end
  118.   it 'redirects to setup' do
  119.     get 'index'
  120.     response.should redirect_to(:controller => 'setup', :action => 'index')
  121.   end
  122.   
  123. end
  124. describe ArticlesController, "nousers" do
  125.   before(:each) do
  126.     User.stub!(:count).and_return(0)
  127.     @user = mock("user")
  128.     @user.stub!(:reload).and_return(@user)
  129.     User.stub!(:new).and_return(@user)
  130.   end
  131.   it 'redirects to signup' do
  132.     get 'index'
  133.     response.should redirect_to(:controller => 'accounts', :action => 'signup')
  134.   end
  135. end
  136. describe ArticlesController, "feeds" do
  137.   
  138.   integrate_views
  139.   specify "/articles.atom => an atom feed" do
  140.     get 'index', :format => 'atom'
  141.     response.should be_success
  142.     response.should render_template("_atom_feed")
  143.     assert_feedvalidator response.body
  144.   end
  145.   specify "/articles.rss => an RSS 2.0 feed" do
  146.     get 'index', :format => 'rss'
  147.     response.should be_success
  148.     response.should render_template("_rss20_feed")
  149.     response.should have_tag('link', 'http://myblog.net')
  150.     assert_feedvalidator response.body
  151.   end
  152.   specify "atom feed for archive should be valid" do
  153.     get 'index', :year => 2004, :month => 4, :format => 'atom'
  154.     response.should render_template("_atom_feed")
  155.     assert_feedvalidator response.body
  156.   end
  157.   specify "RSS feed for archive should be valid" do
  158.     get 'index', :year => 2004, :month => 4, :format => 'rss'
  159.     response.should render_template("_rss20_feed")
  160.     assert_feedvalidator response.body
  161.   end
  162.   it 'should create valid atom feed when article contains é' do
  163.     article = contents(:article2)
  164.     article.body = 'écoute!'
  165.     article.save!
  166.     get 'index', :format => 'atom'
  167.     #response.body.should =~ /écoute!/
  168.     assert_feedvalidator response.body
  169.   end
  170.   it 'should create valid atom feed when article contains loose <' do
  171.     article = contents(:article2)
  172.     article.body = 'is 4 < 2? no!'
  173.     article.save!
  174.     get 'index', :format => 'atom'
  175.     assert_feedvalidator response.body
  176.   end
  177. end
  178. describe ArticlesController, "the index" do
  179.   it "should ignore the HTTP Accept: header" do
  180.     request.env["HTTP_ACCEPT"] = "application/atom+xml"
  181.     get "index"
  182.     response.should_not render_template("_atom_feed")
  183.   end
  184. end
  185. describe ArticlesController, "previewing" do
  186.   integrate_views
  187.   describe 'with non logged user' do
  188.     before :each do
  189.       @request.session = {}
  190.       get :preview, :id => Factory(:article).id
  191.     end
  192.     it 'should be redirect to login' do
  193.       response.should redirect_to(:controller => "accounts/login", :action => :index)
  194.     end
  195.   end
  196.   describe 'with logged user' do
  197.     before :each do
  198.       @request.session = {:user => users(:tobi).id}
  199.       @article = Factory(:article)
  200.     end
  201.     with_each_theme do |theme, view_path|
  202.       it "should render template #{view_path}/articles/read" do
  203.         this_blog.theme = theme if theme
  204.         get :preview, :id => @article.id
  205.         response.should render_template('articles/read.html.erb')
  206.       end
  207.     end
  208.     it 'should assigns article define with id' do
  209.       get :preview, :id => @article.id
  210.       assigns[:article].should == @article
  211.     end
  212.     it 'should assigns last article with id like parent_id' do
  213.       draft = Factory(:article, :parent_id => @article.id)
  214.       get :preview, :id => @article.id
  215.       assigns[:article].should == draft
  216.     end
  217.   end
  218. end
  219. describe ArticlesController, "redirecting" do
  220.   before do
  221.     ActionController::Base.relative_url_root = nil # avoid failures if environment.rb defines a relative URL root
  222.   end
  223.   it 'should split routing path' do
  224.     assert_routing "foo/bar/baz", {
  225.       :from => ["foo", "bar", "baz"],
  226.       :controller => 'articles', :action => 'redirect'}
  227.   end
  228.   it 'should redirect from articles_routing' do
  229.     assert_routing "articles", {
  230.       :from => ["articles"],
  231.       :controller => 'articles', :action => 'redirect'}
  232.     assert_routing "articles/foo", {
  233.       :from => ["articles", "foo"],
  234.       :controller => 'articles', :action => 'redirect'}
  235.     assert_routing "articles/foo/bar", {
  236.       :from => ["articles", "foo", "bar"],
  237.       :controller => 'articles', :action => 'redirect'}
  238.     assert_routing "articles/foo/bar/baz", {
  239.       :from => ["articles", "foo", "bar", "baz"],
  240.       :controller => 'articles', :action => 'redirect'}
  241.   end
  242.   it 'should redirect' do
  243.     get :redirect, :from => ["foo", "bar"]
  244.     assert_response 301
  245.     assert_redirected_to "http://test.host/someplace/else"
  246.   end
  247.   it 'should redirect with url_root' do
  248.     ActionController::Base.relative_url_root = "/blog"
  249.     get :redirect, :from => ["foo", "bar"]
  250.     assert_response 301
  251.     assert_redirected_to "http://test.host/blog/someplace/else"
  252.     get :redirect, :from => ["bar", "foo"]
  253.     assert_response 301
  254.     assert_redirected_to "http://test.host/blog/someplace/else"
  255.   end
  256.   it 'should no redirect' do
  257.     get :redirect, :from => ["something/that/isnt/there"]
  258.     assert_response 404
  259.   end
  260.   it 'should redirect to article' do
  261.     get :redirect, :from => ["articles", "2004", "04", "01", "second-blog-article"]
  262.     assert_response 301
  263.     assert_redirected_to "http://myblog.net/2004/04/01/second-blog-article"
  264.   end
  265.   it 'should redirect to article with url_root' do
  266.     b = blogs(:default)
  267.     b.base_url = "http://test.host/blog"
  268.     b.save
  269.     get :redirect, :from => ["articles", "2004", "04", "01", "second-blog-article"]
  270.     assert_response 301
  271.     assert_redirected_to "http://test.host/blog/2004/04/01/second-blog-article"
  272.   end
  273.   it 'should redirect to article when url_root is articles' do
  274.     b = blogs(:default)
  275.     b.base_url = "http://test.host/articles"
  276.     b.save
  277.     get :redirect, :from => ["articles", "2004", "04", "01", "second-blog-article"]
  278.     assert_response 301
  279.     assert_redirected_to "http://test.host/articles/2004/04/01/second-blog-article"
  280.   end
  281.   it 'should redirect to article with articles in url_root' do
  282.     b = blogs(:default)
  283.     b.base_url = "http://test.host/aaa/articles/bbb"
  284.     b.save
  285.     get :redirect, :from => ["articles", "2004", "04", "01", "second-blog-article"]
  286.     assert_response 301
  287.     assert_redirected_to "http://test.host/aaa/articles/bbb/2004/04/01/second-blog-article"
  288.   end
  289.   describe 'with permalink_format like %title%.html' do
  290.     integrate_views
  291.     before(:each) do
  292.       b = blogs(:default)
  293.       b.permalink_format = '/%title%.html'
  294.       b.save
  295.     end
  296.     describe 'render article' do
  297.       integrate_views
  298.       before(:each) do
  299.         get :redirect, :from => ["#{contents(:article1).permalink}.html"]
  300.       end
  301.       it 'should render template read to article' do
  302.         response.should render_template('articles/read.html.erb')
  303.       end
  304.       it 'should assign article1 to @article' do
  305. assigns(:article).should == contents(:article1)
  306.       end
  307.       it 'should have good rss feed link' do
  308.         response.should have_tag('head>link[href=?]', "http://myblog.net/#{contents(:article1).permalink}.html.rss")
  309.       end
  310.       it 'should have good atom feed link' do
  311.         response.should have_tag('head>link[href=?]', "http://myblog.net/#{contents(:article1).permalink}.html.atom")
  312.       end
  313.     end
  314.     it 'should get good article with utf8 slug' do
  315.       get :redirect, :from => ['2004', '06', '02', 'ルビー']
  316.       assigns(:article).should == contents(:utf8_article)
  317.     end
  318.     describe 'rendering as atom feed' do
  319.       before(:each) do
  320.         get :redirect, :from => ["#{contents(:article1).permalink}.html.atom"]
  321.       end
  322.       it 'should render atom partial' do
  323.         response.should render_template('articles/_atom_feed.atom.builder')
  324.       end
  325.       it 'should render a valid feed' do
  326.         assert_feedvalidator response.body
  327.       end
  328.     end
  329.     describe 'rendering as rss feed' do
  330.       before(:each) do
  331.         get :redirect, :from => ["#{contents(:article1).permalink}.html.rss"]
  332.       end
  333.       it 'should render rss20 partial' do
  334.         response.should render_template('articles/_rss20_feed.rss.builder')
  335.       end
  336.       it 'should render a valid feed' do
  337.         assert_feedvalidator response.body
  338.       end
  339.     end
  340.     describe 'rendering comment feed with problematic characters' do
  341.       before(:each) do
  342.         @comment = contents(:article1).comments.first
  343.         @comment.body = "&eacute;coute! 4 < 2, non?"
  344.         @comment.save!
  345.         get :redirect, :from => ["#{contents(:article1).permalink}.html.atom"]
  346.       end
  347.       it 'should result in a valid atom feed' do
  348.         assigns(:article).should == contents(:article1)
  349.         assert_feedvalidator response.body
  350.       end
  351.     end
  352.   end
  353. end