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

Ajax

开发平台:

Others

  1. require File.dirname(__FILE__) + '/../spec_helper'
  2. describe Article do
  3.   before do
  4.     @articles = []
  5.   end
  6.   describe 'Factory Girl' do
  7.     it 'should article factory valid' do
  8.       Factory(:article).should be_valid
  9.       Factory.build(:article).should be_valid
  10.     end
  11.     it 'should second_article factory valid' do
  12.       Factory(:second_article).should be_valid
  13.       Factory.build(:second_article).should be_valid
  14.     end
  15.     it 'should article_with_accent_in_html' do
  16.       Factory(:article_with_accent_in_html).should be_valid
  17.       Factory.build(:article_with_accent_in_html).should be_valid
  18.     end
  19.     it 'should store user too' do
  20.       a = Factory(:article)
  21.       a.user.should be_valid
  22.       Article.find(a.id).user.should_not be_nil
  23.     end
  24.     it 'should create multiple valid articles' do
  25.       Factory(:article).should be_valid
  26.       Factory(:article).should be_valid
  27.     end
  28.   end
  29.   def assert_results_are(*expected)
  30.     assert_equal expected.size, @articles.size
  31.     expected.each do |i|
  32.       assert @articles.include?(i.is_a?(Symbol) ? contents(i) : i)
  33.     end
  34.   end
  35.   it "test_content_fields" do
  36.     a = Article.new
  37.     assert_equal [:body, :extended], a.content_fields
  38.   end
  39.   it "test_permalink_url with hostname" do
  40.     assert_equal 'http://myblog.net/2004/06/01/article-3', contents(:article3).permalink_url(anchor=nil, only_path=false)
  41.   end
  42.   it "test_permalink_url only path" do
  43.     assert_equal '/2004/06/01/article-3', contents(:article3).permalink_url(anchor=nil, only_path=true)
  44.   end
  45.   it "test_edit_url" do
  46.     a = contents(:article3)
  47.     assert_equal "http://myblog.net/admin/content/edit/#{a.id}", a.edit_url
  48.   end
  49.   it "test_delete_url" do
  50.     a = contents(:article3)
  51.     assert_equal "http://myblog.net/admin/content/destroy/#{a.id}", a.delete_url
  52.   end
  53.   it "test_feed_url" do
  54.     a = contents(:article3)
  55.     assert_equal "http://myblog.net/2004/06/01/article-3.atom", a.feed_url(:atom10)
  56.     assert_equal "http://myblog.net/2004/06/01/article-3.rss", a.feed_url(:rss20)
  57.   end
  58.   it "test_create" do
  59.     a = Article.new
  60.     a.user_id = 1
  61.     a.body = "Foo"
  62.     a.title = "Zzz"
  63.     assert a.save
  64.     a.categories << Category.find(categories(:software).id)
  65.     assert_equal 1, a.categories.size
  66.     b = Article.find(a.id)
  67.     assert_equal 1, b.categories.size
  68.   end
  69.   it "test_permalink_with_title" do
  70.     assert_equal( contents(:article3),
  71.                   Article.find_by_permalink({:year => 2004, :month => 06, :day => 01, :title => "article-3"}) )
  72.     assert_raises(ActiveRecord::RecordNotFound) do
  73.       Article.find_by_permalink :year => 2005, :month => "06", :day => "01", :title => "article-5"
  74.     end
  75.   end
  76.   it "test_strip_title" do
  77.     assert_equal "article-3", "Article-3".to_url
  78.     assert_equal "article-3", "Article 3!?#".to_url
  79.     assert_equal "there-is-sex-in-my-violence", "There is Sex in my Violence!".to_url
  80.     assert_equal "article", "-article-".to_url
  81.     assert_equal "lorem-ipsum-dolor-sit-amet-consectetaur-adipisicing-elit", "Lorem ipsum dolor sit amet, consectetaur adipisicing elit".to_url
  82.     assert_equal "my-cats-best-friend", "My Cat's Best Friend".to_url
  83.   end
  84.   it "test_perma_title" do
  85.     assert_equal "article-1", contents(:article1).stripped_title
  86.     assert_equal "article-2", contents(:article2).stripped_title
  87.     assert_equal "article-3", contents(:article3).stripped_title
  88.   end
  89.   it "test_html_title" do
  90.     a = Article.new
  91.     a.title = "This <i>is</i> a <b>test</b>"
  92.     assert a.save
  93.     assert_equal 'this-is-a-test', a.permalink
  94.   end
  95.   it "test_multibyte_title" do
  96.     a = Article.new
  97.     a.title = "ルビー"
  98.     assert a.save
  99.     assert_equal '%E3%83%AB%E3%83%93%E3%83%BC', a.permalink
  100.   end
  101.   describe "the html_urls method" do
  102.     it "test_urls" do
  103.       urls = contents(:article4).html_urls
  104.       assert_equal ["http://www.example.com/public"], urls
  105.     end
  106.     it "should only match the href attribute" do
  107.       a = Factory.create :article
  108.       a.body = '<a href="http://a/b">a</a> <a fhref="wrong">wrong</a>'
  109.       urls = a.html_urls
  110.       assert_equal ["http://a/b"], urls
  111.     end
  112.     it "should match across newlines" do
  113.       a = Factory.create :article
  114.       a.body = "<anhref="http://foo/bar">foo</a>"
  115.       urls = a.html_urls
  116.       assert_equal ["http://foo/bar"], urls
  117.     end
  118.     it "should match with single quotes" do
  119.       a = Factory.create :article
  120.       a.body = "<a href='http://foo/bar'>foo</a>"
  121.       urls = a.html_urls
  122.       assert_equal ["http://foo/bar"], urls
  123.     end
  124.     it "should match with no quotes" do
  125.       a = Factory.create :article
  126.       a.body = "<a href=http://foo/bar>foo</a>"
  127.       urls = a.html_urls
  128.       assert_equal ["http://foo/bar"], urls
  129.     end
  130.   end
  131.   ### XXX: Should we have a test here?
  132.   it "test_send_pings" do
  133.   end
  134.   ### XXX: Should we have a test here?
  135.   it "test_send_multiple_pings" do
  136.   end
  137.   it "test_tags" do
  138.     a = Article.new(:title => 'Test tag article',
  139.                     :keywords => 'test tag tag stuff');
  140.     assert_kind_of Article, a
  141.     assert_equal 0, a.tags.size
  142.     a.keywords_to_tags
  143.     assert_equal 3, a.tags.size
  144.     assert_equal ["test", "tag", "stuff"].sort , a.tags.collect {|t| t.name}.sort
  145.     assert a.save
  146.     a.keywords = 'tag bar stuff foo'
  147.     a.keywords_to_tags
  148.     assert_equal 4, a.tags.size
  149.     assert_equal ["foo", "bar", "tag", "stuff"].sort , a.tags.collect {|t| t.name}.sort
  150.     a.keywords='tag bar'
  151.     a.keywords_to_tags
  152.     assert_equal 2, a.tags.size
  153.     a.keywords=''
  154.     a.keywords_to_tags
  155.     assert_equal 0, a.tags.size
  156.     b = Article.new(:title => 'Tag Test 2',
  157.                     :keywords => 'tag test article one two three')
  158.     assert_kind_of Article,b
  159.     assert_equal 0, b.tags.size
  160.     c = Article.new(:title => 'Foo', :keywords => 'test "tag test" web2.0')
  161.     c.keywords_to_tags
  162.     assert_equal 3, c.tags.size
  163.     assert_equal ['test', 'tagtest', 'web2-0'].sort, c.tags.collect(&:name).sort
  164.   end
  165.   it "test_find_published_by_tag_name" do
  166.     @articles = Tag.find_by_name(tags(:foo).name).published_articles
  167.     assert_results_are(:article1, :article2, :publisher_article)
  168.   end
  169.   it "test_find_published" do
  170.     @articles = Article.find_published
  171.     assert_results_are(:search_target, :article1, :article2,
  172.                        :article3, :inactive_article,:xmltest,
  173.                        :spammed_article, :publisher_article, :markdown_article, :utf8_article)
  174.     @articles = Article.find_published(:all,
  175.                                                   :conditions => "title = 'Article 1!'")
  176.     assert_results_are :article1
  177.   end
  178.   it "test_just_published_flag" do
  179.     art = Article.new(:title => 'title',
  180.                                    :body => 'body',
  181.                                    :published => true)
  182.     assert art.just_changed_published_status?
  183.     assert art.save
  184.     art = Article.find(art.id)
  185.     assert !art.just_changed_published_status?
  186.     art = Article.create!(:title => 'title2',
  187.                           :body => 'body',
  188.                           :published => false)
  189.     assert ! art.just_changed_published_status?
  190.   end
  191.   it "test_future_publishing" do
  192.     assert_sets_trigger(Article.create!(:title => 'title', :body => 'body',
  193.                                         :published => true,
  194.                                         :published_at => Time.now + 4.seconds))
  195.   end
  196.   it "test_future_publishing_without_published_flag" do
  197.     assert_sets_trigger Article.create!(:title => 'title', :body => 'body',
  198.                                         :published_at => Time.now + 4.seconds)
  199.   end
  200.   it "test_triggers_are_dependent" do
  201.     art = Article.create!(:title => 'title', :body => 'body',
  202.                           :published_at => Time.now + 1.hour)
  203.     assert_equal 1, Trigger.count
  204.     art.destroy
  205.     assert_equal 0, Trigger.count
  206.   end
  207.   def assert_sets_trigger(art)
  208.     assert_equal 1, Trigger.count
  209.     assert Trigger.find(:first, :conditions => ['pending_item_id = ?', art.id])
  210.     assert !art.published
  211.     t = Time.now
  212.     # We stub the Time.now answer to emulate a sleep of 4. Avoid the sleep. So
  213.     # speed up in test
  214.     Time.stub!(:now).and_return(t + 5.seconds)
  215.     Trigger.fire
  216.     art.reload
  217.     assert art.published
  218.   end
  219.   it "test_find_published_by_category" do
  220.     Article.create!(:title      => "News from the future!",
  221.                     :body       => "The future is cool!",
  222.                     :keywords   => "future",
  223.                     :published_at => Time.now + 12.minutes)
  224.     @articles = Category.find_by_permalink('personal').published_articles
  225.     assert_results_are :article1, :article2, :article3
  226.     @articles = Category.find_by_permalink('software').published_articles
  227.     assert_results_are :article1
  228.   end
  229.   it "test_find_published_by_nonexistent_category_raises_exception" do
  230.     assert_raises ActiveRecord::RecordNotFound do
  231.       Category.find_by_permalink('does-not-exist').published_articles
  232.     end
  233.   end
  234.   it "test_destroy_file_upload_associations" do
  235.     a = contents(:article1)
  236.     assert_equal 2, a.resources.size
  237.     a.resources << resources(:resource3)
  238.     assert_equal 3, a.resources.size
  239.     a.destroy
  240.     assert_equal 0, Resource.find(:all, :conditions => "article_id = #{a.id}").size
  241.   end
  242.   it 'should notify' do
  243.     [:randomuser, :bob].each do |tag|
  244.       u = users(tag); u.notify_on_new_articles = true; u.save!
  245.     end
  246.     a = Article.new(:title => 'New Article', :body => 'Foo', :author => 'Tobi', :user => users(:tobi))
  247.     assert a.save
  248.     assert_equal 2, a.notify_users.size
  249.     assert_equal ['bob', 'randomuser'], a.notify_users.collect {|u| u.login }.sort
  250.   end
  251.   it "test_tags_on_update" do
  252.     contents(:article3).update_attribute :keywords, "my new tags"
  253.     assert_equal 3, contents(:article3).reload.tags.size
  254.     assert contents(:article3).tags.include?(Tag.find_by_name("new"))
  255.   end
  256.   it "test_withdrawal" do
  257.     art = Article.find(contents(:article1).id)
  258.     assert   art.published?
  259.     assert ! art.withdrawn?
  260.     art.withdraw!
  261.     assert ! art.published?
  262.     assert   art.withdrawn?
  263.     art.reload
  264.     assert ! art.published?
  265.     assert   art.withdrawn?
  266.   end
  267.   it "test_default_filter" do
  268.     a = Article.find(contents(:article1).id)
  269.     assert_equal 'textile', a.default_text_filter.name
  270.   end
  271.   it 'should get only ham not spam comment' do
  272.     contents(:article2).comments.ham.should == [feedback(:spam_comment)]
  273.     contents(:article2).comments.count.should == 2
  274.   end
  275.   describe '#access_by?' do
  276.     it 'admin should be access to an article write by another' do
  277.       contents(:article2).should be_access_by(users(:tobi))
  278.     end
  279.     it 'admin should be access to an article write by himself' do
  280.       contents(:article1).should be_access_by(users(:tobi))
  281.     end
  282.   end
  283.   describe 'body_and_extended' do
  284.     before :each do
  285.       @article = contents(:article1)
  286.     end
  287.     it 'should combine body and extended content' do
  288.       @article.body_and_extended.should ==
  289.         "#{@article.body}n<!--more-->n#{@article.extended}"
  290.     end
  291.     it 'should not insert <!--more--> tags if extended is empty' do
  292.       @article.extended = ''
  293.       @article.body_and_extended.should == @article.body
  294.     end
  295.   end
  296.   describe '#search' do
  297.     describe 'is an array', :shared => true do
  298.       it 'should get an array' do
  299.         @articles.should be_a(Array)
  300.       end
  301.     end
  302.     describe 'with several words and no result' do
  303.       before :each do
  304.         @articles = Article.search('hello world')
  305.       end
  306.       it_should_behave_like 'is an array'
  307.       it 'should be empty' do
  308.         @articles.should be_empty
  309.       end
  310.     end
  311.     describe 'with one word and result' do
  312.       before :each do
  313.         @articles = Article.search('extended')
  314.       end
  315.       it_should_behave_like 'is an array'
  316.       it 'should have one item' do
  317.         assert_equal 9, @articles.size
  318.       end
  319.     end
  320.   end
  321.   describe 'body_and_extended=' do
  322.     before :each do
  323.       @article = contents(:article1)
  324.     end
  325.     it 'should split apart values at <!--more-->' do
  326.       @article.body_and_extended = 'foo<!--more-->bar'
  327.       @article.body.should == 'foo'
  328.       @article.extended.should == 'bar'
  329.     end
  330.     it 'should remove newlines around <!--more-->' do
  331.       @article.body_and_extended = "foon<!--more-->nbar"
  332.       @article.body.should == 'foo'
  333.       @article.extended.should == 'bar'
  334.     end
  335.     it 'should make extended empty if no <!--more--> tag' do
  336.       @article.body_and_extended = "foo"
  337.       @article.body.should == 'foo'
  338.       @article.extended.should be_empty
  339.     end
  340.     it 'should preserve extra <!--more--> tags' do
  341.       @article.body_and_extended = "foo<!--more-->bar<!--more-->baz"
  342.       @article.body.should == 'foo'
  343.       @article.extended.should == 'bar<!--more-->baz'
  344.     end
  345.     it 'should be settable via self.attributes=' do
  346.       @article.attributes = { :body_and_extended => 'foo<!--more-->bar' }
  347.       @article.body.should == 'foo'
  348.       @article.extended.should == 'bar'
  349.     end
  350.   end
  351.   describe '#comment_url' do
  352.     it 'should render complete url of comment' do
  353.       contents(:article1).comment_url.should == "http://myblog.net/comments?article_id=#{contents(:article1).id}"
  354.     end
  355.   end
  356.   describe '#preview_comment_url' do
  357.     it 'should render complete url of comment' do
  358.       contents(:article1).preview_comment_url.should == "http://myblog.net/comments/preview?article_id=#{contents(:article1).id}"
  359.     end
  360.   end
  361.   it "test_can_ping_fresh_article_iff_it_allows_pings" do
  362.     a = Article.find(contents(:article1).id)
  363.     assert_equal(false, a.pings_closed?)
  364.     a.allow_pings = false
  365.     assert_equal(true, a.pings_closed?)
  366.   end
  367.   it "test_cannot_ping_old_article" do
  368.     a = Article.find(contents(:article3).id)
  369.     assert_equal(true, a.pings_closed?)
  370.     a.allow_pings = false
  371.     assert_equal(true, a.pings_closed?)
  372.   end
  373.   describe '#published_at_like' do
  374.     before do
  375.       # Note: these choices of times depend on no other articles within
  376.       # these timeframes existing in test/fixtures/contents.yaml.
  377.       # In particular, all articles there are from 2005 or earlier, which
  378.       # is now more than two years ago, except for two, which are from
  379.       # yesterday and the day before. The existence of those two makes
  380.       # 1.month.ago not suitable, because yesterday can be last month.
  381.       @article_two_month_ago = Factory(:article, :published_at => 2.month.ago)
  382.       @article_four_months_ago = Factory(:article, :published_at => 4.month.ago)
  383.       @article_2_four_months_ago = Factory(:article, :published_at => 4.month.ago)
  384.       @article_two_year_ago = Factory(:article, :published_at => 2.year.ago)
  385.       @article_2_two_year_ago = Factory(:article, :published_at => 2.year.ago)
  386.     end
  387.     it 'should return all content for the year if only year sent' do
  388.       Article.published_at_like(2.year.ago.strftime('%Y')).map(&:id).sort.should == [@article_two_year_ago.id, @article_2_two_year_ago.id].sort
  389.     end
  390.     it 'should return all content for the month if year and month sent' do
  391.       Article.published_at_like(4.month.ago.strftime('%Y-%m')).map(&:id).sort.should == [@article_four_months_ago.id, @article_2_four_months_ago.id].sort
  392.     end
  393.     it 'should return all content on this date if date send' do
  394.       Article.published_at_like(2.month.ago.strftime('%Y-%m-%d')).map(&:id).sort.should == [@article_two_month_ago.id].sort
  395.     end
  396.   end
  397.   describe '#has_child?' do
  398.     it 'should be true if article has one to link it by parent_id' do
  399.       Factory(:article, :parent_id => contents(:article1).id)
  400.       contents(:article1).should be_has_child
  401.     end
  402.     it 'should be false if article has no article to link it by parent_id' do
  403.       contents(:article1).should_not be_has_child
  404.     end
  405.   end
  406.   describe 'self#last_draft(id)' do
  407.     it 'should return article if no draft associated' do
  408.       Article.last_draft(contents(:article1).id).should == contents(:article1)
  409.     end
  410.     it 'should return draft associated to this article if there are one' do
  411.       draft = Factory(:article, :parent_id => contents(:article1).id, :state => 'draft')
  412.       Article.last_draft(contents(:article1).id).should == draft
  413.     end
  414.   end
  415. end