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

Ajax

开发平台:

Others

  1. require File.dirname(__FILE__) + '/../spec_helper'
  2. require 'action_web_service/test_invoke'
  3. require 'backend_controller'
  4. require 'blogger_service'
  5. require 'meta_weblog_service'
  6. require 'app/apis/movable_type_service.rb'
  7. require 'digest/sha1'
  8. require 'base64'
  9. User.salt = 'change-me'
  10. BackendController.class_eval do
  11.   include ActionWebService::Protocol::XmlRpc
  12. end
  13. describe BackendController do
  14.   before do
  15.     @protocol = :xmlrpc
  16.   end
  17.   # BloggerApi Tests
  18.   it "test_blogger_delete_post" do
  19.     args = [ 'foo', contents(:article3).id, 'tobi', 'whatever', 1 ]
  20.     result = invoke_layered :blogger, :deletePost, *args
  21.     assert_raise(ActiveRecord::RecordNotFound) { Article.find(contents(:article3).id) }
  22.   end
  23.   it "test_blogger_get_users_blogs" do
  24.     args = [ 'foo', 'tobi', 'whatever' ]
  25.     result = invoke_layered :blogger, :getUsersBlogs, *args
  26.     assert_equal 'test blog', result.first['blogName']
  27.   end
  28.   it "test_blogger_get_user_info" do
  29.     args = [ 'foo', 'tobi', 'whatever' ]
  30.     result = invoke_layered :blogger, :getUserInfo, *args
  31.     assert_equal 'tobi', result['userid']
  32.   end
  33.   it "test_blogger_new_post" do
  34.     args = [ 'foo', '1', 'tobi', 'whatever', '<title>new post title</title>new post *body*', 1]
  35.     result = invoke_layered :blogger, :newPost, *args
  36.     assert_not_nil result
  37.     new_post = Article.find(result)
  38.     assert_equal "new post title", new_post.title
  39.     assert_equal "new post *body*", new_post.body
  40.     assert_equal "<p>new post <strong>body</strong></p>", new_post.html(:body)
  41.     assert_equal "textile", new_post.text_filter.name
  42.     assert_equal users(:tobi), new_post.user
  43.     assert new_post.published?
  44.     assert new_post[:published_at]
  45.   end
  46.   it "test_blogger_new_post_no_title" do
  47.     args = [ 'foo', '1', 'tobi', 'whatever', 'new post body for post without title but with a lenghty body', 1]
  48.     result = invoke_layered :blogger, :newPost, *args
  49.     assert_not_nil result
  50.     new_post = Article.find(result)
  51.     assert_equal "new post body for post without", new_post.title
  52.     assert_equal "new post body for post without title but with a lenghty body", new_post.body
  53.     assert_equal "<p>new post body for post without title but with a lenghty body</p>", new_post.html(:body)
  54.   end
  55.   it "test_blogger_new_post_with_categories" do
  56.     args = [ 'foo', '1', 'tobi', 'whatever', '<title>new post title</title><category>Software, Hardware</category>new post body', 1]
  57.     result = invoke_layered :blogger, :newPost, *args
  58.     assert_not_nil result
  59.     new_post = Article.find(result)
  60.     assert_equal "new post title", new_post.title
  61.     assert_equal "new post body", new_post.body
  62.     assert_equal [categories(:software), categories(:hardware)].sort_by(&:id), new_post.categories.sort_by { |c| c.id }
  63.     assert new_post.published?
  64.   end
  65.   it "test_blogger_new_post_with_non_existing_categories" do
  66.     args = [ 'foo', '1', 'tobi', 'whatever', '<title>new post title</title><category>Idontexist, Hardware</category>new post body', 1]
  67.     result = invoke_layered :blogger, :newPost, *args
  68.     assert_not_nil result
  69.     new_post = Article.find(result)
  70.     assert_equal [categories(:hardware)], new_post.categories
  71.   end
  72.   it "test_blogger_fail_authentication" do
  73.     args = [ 'foo', 'tobi', 'using a wrong password' ]
  74.     # This will be a little more useful with the upstream changes in [1093]
  75.     assert_raise(XMLRPC::FaultException) { invoke_layered :blogger, :getUsersBlogs, *args }
  76.   end
  77.   # Meta Weblog Tests
  78.   it "test_meta_weblog_get_categories" do
  79.     args = [ 1, 'tobi', 'whatever' ]
  80.     result = invoke_layered :metaWeblog, :getCategories, *args
  81.     assert_equal 'Software', result.first
  82.   end
  83.   it "test_meta_weblog_get_post" do
  84.     args = [ contents(:article1).id, 'tobi', 'whatever' ]
  85.     result = invoke_layered :metaWeblog, :getPost, *args
  86.     assert_equal result['title'], contents(:article1).title
  87.   end
  88.   it "test_meta_weblog_get_recent_posts" do
  89.     args = [ 1, 'tobi', 'whatever', 2 ]
  90.     result = invoke_layered :metaWeblog, :getRecentPosts, *args
  91.     assert_equal result.size, 2
  92.     assert_equal result.last['title'], Article.find(:first, :offset => 1, :order => 'created_at desc').title
  93.   end
  94.   it "test_meta_weblog_delete_post" do
  95.     art_id = contents(:article2).id
  96.     args = [ 1, art_id, 'tobi', 'whatever', 1 ]
  97.     result = invoke_layered :metaWeblog, :deletePost, *args
  98.     assert_raise(ActiveRecord::RecordNotFound) { Article.find(art_id) }
  99.   end
  100.   it "test_meta_weblog_edit_post" do
  101.     art_id = contents(:article1).id
  102.     article = Article.find(art_id)
  103.     article.title = "Modified!"
  104.     article.body = "this is a *test*"
  105.     article.text_filter = TextFilter.find_by_name("textile")
  106.     article.published_at = Time.now.utc.midnight
  107.     args = [ art_id, 'tobi', 'whatever', MetaWeblogService.new(@controller).article_dto_from(article), 1 ]
  108.     result = invoke_layered :metaWeblog, :editPost, *args
  109.     assert result
  110.     new_article = Article.find(art_id)
  111.     assert_equal article.title, new_article.title
  112.     assert_equal article.body, new_article.body
  113.     assert_equal "<p>this is a <strong>test</strong></p>", new_article.html(:body)
  114.     assert_equal article.published_at, new_article.published_at.utc
  115.   end
  116.   # TODO: Work out what the correct response is when a post can't be saved...
  117.   it "test_meta_weblog_new_post_fails" do
  118.     @article = Article.new(:title => 'test', :body => 'body', :extended => 'extended',
  119.                            :text_filter => TextFilter.find_by_name('textile'),
  120.                            :published_at => Time.now.utc.midnight)
  121.     @article.errors.add_to_base('test error')
  122.     @article.should_receive(:save).and_return(false)
  123.     Article.stub!(:new).and_return(@article)
  124.     args = [1, 'tobi', 'whatever', MetaWeblogService.new(@controller).article_dto_from(@article), 1]
  125.     lambda { invoke_layered :metaWeblog , :newPost, *args }.should 
  126.       raise_error(XMLRPC::FaultException,
  127.                   'Internal server error (exception raised)')
  128.   end
  129.   it "test_meta_weblog_new_post" do
  130.     article = Article.new
  131.     article.title = "Posted via Test"
  132.     article.body = "body"
  133.     article.extended = "extend me"
  134.     article.text_filter = TextFilter.find_by_name("textile")
  135.     article.published_at = Time.now.utc.midnight
  136.     args = [ 1, 'tobi', 'whatever', MetaWeblogService.new(@controller).article_dto_from(article), 1 ]
  137.     result = invoke_layered :metaWeblog, :newPost, *args
  138.     assert result
  139.     new_post = Article.find(result)
  140.     assert_equal "Posted via Test", new_post.title
  141.     assert_equal "textile", new_post.text_filter.name
  142.     assert_equal article.body, new_post.body
  143.     assert_equal "<p>body</p>", new_post.html(:body)
  144.     assert_equal article.extended, new_post.extended
  145.     assert_equal "<p>extend me</p>", new_post.html(:extended)
  146.     assert_equal article.published_at, new_post.published_at.utc
  147.   end
  148.   it "test_meta_weblog_new_unpublished_post_with_blank_creation_date" do
  149.     dto = MetaWeblogStructs::Article.new(
  150.       :description       => "Some text",
  151.       :title             => "A Title"
  152.     )
  153.     args = [ 1, 'tobi', 'whatever', dto, 0 ]
  154.     result = invoke_layered :metaWeblog, :newPost, *args
  155.     assert result
  156.     new_post = Article.find(result)
  157.     assert !new_post.published?
  158.   end
  159.   
  160.   it "test_meta_weblog_edit_unpublished_post_with_old_creation_date" do
  161.     article = Article.new
  162.     article.title = "Posted via Test"
  163.     article.body = "body"
  164.     article.extended = "extend me"
  165.     article.text_filter = TextFilter.find_by_name("textile")
  166.     article.published_at = Time.now - 1.days
  167.     args = [ 1, 'tobi', 'whatever', MetaWeblogService.new(@controller).article_dto_from(article), 0 ]
  168.     result = invoke_layered :metaWeblog, :newPost, *args
  169.     assert result
  170.     new_post = Article.find(result)
  171.     assert !new_post.published?
  172.   end
  173.   
  174.   it "test_meta_weblog_new_media_object" do
  175.     media_object = MetaWeblogStructs::MediaObject.new(
  176.       "name" => Digest::SHA1.hexdigest("upload-test--#{Time.now}--") + ".gif",
  177.       "type" => "image/gif",
  178.       "bits" => Base64.encode64(File.open(File.expand_path(RAILS_ROOT) + "/public/images/powered.gif", "rb") { |f| f.read })
  179.     )
  180.     args = [ 1, 'tobi', 'whatever', media_object ]
  181.     result = invoke_layered :metaWeblog, :newMediaObject, *args
  182.     assert result['url'] =~ /#{media_object['name']}/
  183.     assert File.unlink(File.expand_path(RAILS_ROOT) + "/public/files/#{media_object['name']}")
  184.   end
  185.   it "test_meta_weblog_fail_authentication" do
  186.     args = [ 1, 'tobi', 'using a wrong password', 2 ]
  187.     # This will be a little more useful with the upstream changes in [1093]
  188.     assert_raise(XMLRPC::FaultException) { invoke_layered :metaWeblog, :getRecentPosts, *args }
  189.   end
  190.   it "test_meta_weblog_should_preserve_date_time_on_roundtrip_edit" do
  191.     # The XML-RPC spec and the MetaWeblog API are ambiguous about how to
  192.     # intrepret the timezone in the dateCreated field.  But _however_ we
  193.     # interpret it, we want to be able to fetch an article from the server,
  194.     # edit it, and write it back to the server without changing its
  195.     # dateCreated field.
  196.     article = contents(:article1)
  197.     original_published_at = article.published_at
  198.     args = [ article.id, 'tobi', 'whatever' ]
  199.     result = invoke_layered :metaWeblog, :getPost, *args
  200.     assert_equal original_published_at, result['dateCreated'].to_time
  201.     args = [ article.id, 'tobi', 'whatever', result, 1 ]
  202.     result = invoke_layered :metaWeblog, :editPost, *args
  203.     article.reload
  204.     assert_equal original_published_at, article.published_at
  205.   end
  206.   # Movable Type Tests
  207.   it "test_mt_get_category_list" do
  208.     args = [ 1, 'tobi', 'whatever' ]
  209.     result = invoke_layered :mt, :getCategoryList, *args
  210.     assert result.map { |c| c['categoryName'] }.include?('Software')
  211.   end
  212.   it "test_mt_get_post_categories" do
  213.     art_id = contents(:article1).id
  214.     article = Article.find(art_id)
  215.     article.categories << categories(:software)
  216.     args = [ art_id, 'tobi', 'whatever' ]
  217.     result = invoke_layered :mt, :getPostCategories, *args
  218.     assert_equal Set.new(result.collect {|v| v['categoryName']}), Set.new(article.categories.collect(&:name))
  219.   end
  220.   it "test_mt_get_recent_post_titles" do
  221.     args = [ 1, 'tobi', 'whatever', 2 ]
  222.     result = invoke_layered :mt, :getRecentPostTitles, *args
  223.     assert_equal result.first['title'], contents(:article2).title
  224.   end
  225.   it "test_mt_set_post_categories" do
  226.     art_id = contents(:article2).id
  227.     args = [ art_id, 'tobi', 'whatever',
  228.       [MovableTypeStructs::CategoryPerPost.new('categoryName' => 'personal', 'categoryId' => categories(:personal).id, 'isPrimary' => 1)] ]
  229.     result = invoke_layered :mt, :setPostCategories, *args
  230.     assert_equal [categories(:personal)], contents(:article2).categories
  231.     args = [ art_id, 'tobi', 'whatever',
  232.       [MovableTypeStructs::CategoryPerPost.new('categoryName' => 'Software', 'categoryId' => categories(:software).id, 'isPrimary' => 1),
  233.        MovableTypeStructs::CategoryPerPost.new('categoryName' => 'Hardware', 'categoryId' => categories(:hardware).id, 'isPrimary' => 0) ]]
  234.      result = invoke_layered :mt, :setPostCategories, *args
  235.      assert contents(:article2).reload.categories.include?(categories(:hardware))
  236.   end
  237.   it "test_mt_supported_text_filters" do
  238.     result = invoke_layered :mt, :supportedTextFilters
  239.     assert result.map {|f| f['label']}.include?('Markdown')
  240.     assert result.map {|f| f['label']}.include?('Textile')
  241.   end
  242.   it "test_mt_supported_methods" do
  243.     result = invoke_layered :mt, :supportedMethods
  244.     assert_equal 8, result.size
  245.     assert result.include?("publishPost")
  246.   end
  247.   it "test_mt_get_trackback_pings" do
  248.     args = [ contents(:article1).id ]
  249.     result = invoke_layered :mt, :getTrackbackPings, *args
  250.     assert_equal result.first['pingTitle'], 'Trackback Entry'
  251.   end
  252.   it "test_mt_publish_post" do
  253.     art_id = contents(:article4).id
  254.     args = [ art_id, 'tobi', 'whatever' ]
  255.     assert (not Article.find(art_id).published?)
  256.     result = invoke_layered :mt, :publishPost, *args
  257.     assert result
  258.     assert Article.find(art_id).published?
  259.     assert Article.find(art_id)[:published_at]
  260.   end
  261.   it "test_mt_fail_authentication" do
  262.     args = [ 1, 'tobi', 'using a wrong password', 2 ]
  263.     # This will be a little more useful with the upstream changes in [1093]
  264.     assert_raise(XMLRPC::FaultException) { invoke_layered :mt, :getRecentPostTitles, *args }
  265.   end
  266. end