2011-04-06 1 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

답변

0

다른 사이트가 다운되었거나 다른 것이 있으면 스펙을 실패 할 필요가 없으므로이 목적으로 FakeWeb을 사용합니다. 문서의 "녹음 된 응답 재생"을 참조하십시오. 우리가하는 일은 curl 페이지이며, 어딘가에 조명기로 저장하고 스펙에서 재생합니다.