2011-04-06 57 views
0

我正在研究需要能夠使用RestClient從遠程API下載插件文件的庫。該庫首先獲取插件列表,然後將每個插件作爲原始文件下載,並將每個插件保存在插件目錄中。如何規範文件下載

這裏是我迄今但它沒有我:

require 'yaml' 

module Monitaur 
    class Client 

    attr_accessor :logger, :client_key, :server_url, :config, :raw_config, 
        :plugin_manifest 

    def initialize 
     load_config 
     @plugin_manifest ||= [] 
    end 

    def run 
     get_plugin_manifest 
     sync_plugins 
    end 

    def get_plugin_manifest 
     res = RestClient.get("#{server_url}/nodes/#{client_key}/plugins") 
     @plugin_manifest = JSON.parse(res) 
    end 

    def sync_plugins 
     @plugin_manifest.each do |plugin| 
     res = RestClient.get("#{server_url}/plugins/#{plugin['name']}") 
     File.open(File.join(Monitaur.plugin_dir, "#{plugin['name']}.rb"), "w+") do |file| 
      file.write res.body 
     end 
     end 
    end 

    def load_config 
     if File.exist?(Monitaur.config_file_path) && File.readable?(Monitaur.config_file_path) 
     @raw_config = YAML.load_file(Monitaur.config_file_path) 
     else 
     raise IOError, "Cannot open or read #{Monitaur.config_file_path}" 
     end 

     @server_url = raw_config['server_url'] 
     @client_key = raw_config['client_key'] 
    end 


    end 
end 

而且client_spec.rb

require 'spec_helper' 

module Monitaur 
    describe Client do 
    let(:server_url) { "http://api.monitaurapp.com" } 
    let(:client_key) { "asdf1234" } 

    describe "#load_config" do 
     let(:client) { Monitaur::Client.new } 

     before do 
     File.open(Monitaur.config_file_path, "w") do |file| 
      file.puts "server_url: http://api.monitaurapp.com" 
      file.puts "client_key: asdf1234" 
     end 
     end 

     it "loads up the configuration file" do 
     client.load_config 
     client.server_url.should == "http://api.monitaurapp.com" 
     client.client_key.should == "asdf1234" 
     end 
    end 

    describe "#get_plugin_manifest" do 
     let(:client) { Monitaur::Client.new } 

     before do 
     stub_get_plugin_manifest 
     end 

     it "retrieves a plugins manifest from the server" do 
     client.get_plugin_manifest 
     client.plugin_manifest.should == plugin_manifest_response 
     end 
    end 

    describe "#sync_plugins" do 
     let(:client) { Monitaur::Client.new } 
     let(:foo_plugin) { mock('foo_plugin') } 
     let(:bar_plugin) { mock('bar_plugin') } 

     before do 
     FileUtils.mkdir("/tmp") 
     File.open("/tmp/foo_plugin.rb", "w+") do |file| 
      file.write %| 
      class FooPlugin < Monitaur::Plugin 
      name "foo_plugin" 
      desc "A test plugin to determine whether plugin sync works" 

      def run 
       { :foo => 'foo' } 
      end 
      end 
      | 
     end 
     File.open("/tmp/bar_plugin.rb", "w+") do |file| 
      file.write %| 
      class BarPlugin < Monitaur::Plugin 
      name "bar_plugin" 
      desc "A test plugin to determine whether plugin sync works" 

      def run 
       { :bar => 'bar' } 
      end 
      end 
      | 
     end 
     Monitaur.install 
     stub_get_plugin_manifest 
     stub_sync_plugins 
     client.get_plugin_manifest 

     end 

     it "downloads plugins to the cache directory" do 
     File.should_receive(:open). 
      with(File.join(Monitaur.plugin_dir, "foo_plugin.rb"), "w+") 
      and_yield(foo_plugin) 

     client.sync_plugins 

     File.exist?("/home/user/.monitaur/cache/plugins/foo_plugin.rb").should be_true 
     File.exist?("/home/user/.monitaur/cache/plugins/bar_plugin.rb").should be_true 
     end 
    end 
    end 
end 

def stub_get_plugin_manifest 
    stub_request(:get, "#{server_url}/nodes/#{client_key}/plugins"). 
    to_return(
     :status => 200, 
     :body => %Q{ 
     [ 
      { 
      "name": "foo_plugin", 
      "checksum": "qwer5678" 
      }, 
      { 
      "name": "bar_plugin", 
      "checksum": "hjkl4321" 
      } 
     ] 
     } 
    ) 
end 

def plugin_manifest_response 
    [ 
    { 
     "name" => "foo_plugin", 
     "checksum" => "qwer5678" 
    }, 
    { 
     "name" => "bar_plugin", 
     "checksum" => "hjkl4321" 
    } 
    ] 
end 

def stub_sync_plugins 
    stub_request(:get, "#{server_url}/plugins/foo_plugin"). 
    to_return(:body => File.open('/tmp/foo_plugin.rb').read) 

    stub_request(:get, "#{server_url}/plugins/bar_plugin"). 
    to_return(:body => File.open('/tmp/bar_plugin.rb').read) 
end 

如何測試下載過程?

+0

也許這有幫助嗎? http://stackoverflow.com/questions/5255250/cucumber-test-file-download/534130 – Spyros 2011-04-06 05:10:32

回答

0

我使用FakeWeb來達到這個目的,因爲如果其他網站停機或者其他網站確實不需要您的規範失敗。請參閱文檔中的「重播錄製的回覆」。我們所做的是curl這個頁面,將它保存在某個位置並在規格中重播。