spec/gemirro/server_spec.rb in gemirro-0.7.0 vs spec/gemirro/server_spec.rb in gemirro-0.8.0

- old
+ new

@@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- require 'rack/test' +require 'json' require 'gemirro/mirror_directory' require 'gemirro/mirror_file' require 'gemirro/gem_version_collection' ENV['RACK_ENV'] = 'test' @@ -31,119 +32,201 @@ MirrorFile.new('/var/www/gemirro/test').write('content') Gemirro.configuration.destination = '/var/www/gemirro' FakeFS::FileSystem.clone(Gemirro::Configuration.views_directory) end - it 'should display index page' do - allow(Logger).to receive(:new).twice.and_return(@fake_logger) - allow(@fake_logger).to receive(:tap).and_return(nil) - .and_yield(@fake_logger) + context 'HTML render' do + it 'should display index page' do + allow(Logger).to receive(:new).twice.and_return(@fake_logger) + allow(@fake_logger).to receive(:tap).and_return(nil) + .and_yield(@fake_logger) - get '/' - expect(last_response).to be_ok - end + get '/' + expect(last_response).to be_ok + end - it 'should return 404' do - get '/wrong-path' - expect(last_response.status).to eq(404) - expect(last_response).to_not be_ok - end + it 'should return 404' do + get '/wrong-path' + expect(last_response.status).to eq(404) + expect(last_response).to_not be_ok + end - it 'should return 404 when gem does not exist' do - get '/gem/something' - expect(last_response.status).to eq(404) - expect(last_response).to_not be_ok - end + it 'should return 404 when gem does not exist' do + get '/gem/something' + expect(last_response.status).to eq(404) + expect(last_response).to_not be_ok + end - it 'should display gem specifications' do - marshal_dump = Marshal.dump([['groove-dl', - ::Gem::Version.create('0.1.0'), - 'ruby']]) + it 'should display gem specifications' do + marshal_dump = Marshal.dump([['groove-dl', + ::Gem::Version.create('0.1.0'), + 'ruby']]) - MirrorFile.new('/var/www/gemirro/specs.4.8.gz.orig').write(marshal_dump) - Struct.new('SuccessGzipReader', :read) - gzip_reader = Struct::SuccessGzipReader.new(marshal_dump) + MirrorFile.new('/var/www/gemirro/specs.4.8.gz.orig').write(marshal_dump) + Struct.new('SuccessGzipReader', :read) + gzip_reader = Struct::SuccessGzipReader.new(marshal_dump) - allow(Zlib::GzipReader).to receive(:open) - .once - .with('/var/www/gemirro/specs.4.8.gz.orig') - .and_return(gzip_reader) + allow(Zlib::GzipReader).to receive(:open) + .once + .with('/var/www/gemirro/specs.4.8.gz.orig') + .and_return(gzip_reader) - get '/gem/groove-dl' - expect(last_response.status).to eq(200) - expect(last_response).to be_ok + get '/gem/groove-dl' + expect(last_response.status).to eq(200) + expect(last_response).to be_ok + end end - it 'should download existing file' do - get '/test' - expect(last_response.body).to eq('content') - expect(last_response).to be_ok - end + context 'Download' do + it 'should download existing file' do + get '/test' + expect(last_response.body).to eq('content') + expect(last_response).to be_ok + end - it 'should try to download gems.' do - source = Gemirro::Source.new('test', 'http://rubygems.org') + it 'should try to download gems.' do + source = Gemirro::Source.new('test', 'http://rubygems.org') - versions_fetcher = Gemirro::VersionsFetcher.new(source) - allow(versions_fetcher).to receive(:fetch).once.and_return(true) + versions_fetcher = Gemirro::VersionsFetcher.new(source) + allow(versions_fetcher).to receive(:fetch).once.and_return(true) - gems_fetcher = Gemirro::VersionsFetcher.new(source) - allow(gems_fetcher).to receive(:fetch).once.and_return(true) + gems_fetcher = Gemirro::VersionsFetcher.new(source) + allow(gems_fetcher).to receive(:fetch).once.and_return(true) - Struct.new('GemIndexer') - gem_indexer = Struct::GemIndexer.new - allow(gem_indexer).to receive(:only_origin=).once.and_return(true) - allow(gem_indexer).to receive(:ui=).once.and_return(true) - allow(gem_indexer).to receive(:generate_index).once.and_return(true) + Struct.new('GemIndexer') + gem_indexer = Struct::GemIndexer.new + allow(gem_indexer).to receive(:only_origin=).once.and_return(true) + allow(gem_indexer).to receive(:ui=).once.and_return(true) + allow(gem_indexer).to receive(:generate_index).once.and_return(true) - allow(Gemirro.configuration).to receive(:source).twice.and_return(source) - allow(Gemirro::GemsFetcher).to receive(:new).once.and_return(gems_fetcher) - allow(Gemirro::VersionsFetcher).to receive(:new) - .once.and_return(versions_fetcher) - allow(Gemirro::Indexer).to receive(:new).once.and_return(gem_indexer) - allow(::Gem::SilentUI).to receive(:new).once.and_return(true) + allow(Gemirro.configuration).to receive(:source) + .twice.and_return(source) + allow(Gemirro::GemsFetcher).to receive(:new) + .once.and_return(gems_fetcher) + allow(Gemirro::VersionsFetcher).to receive(:new) + .once.and_return(versions_fetcher) + allow(Gemirro::Indexer).to receive(:new).once.and_return(gem_indexer) + allow(::Gem::SilentUI).to receive(:new).once.and_return(true) - allow(Gemirro.configuration).to receive(:logger) - .exactly(3).and_return(@fake_logger) - allow(@fake_logger).to receive(:info).exactly(3) + allow(Gemirro.configuration).to receive(:logger) + .exactly(3).and_return(@fake_logger) + allow(@fake_logger).to receive(:info).exactly(3) - get '/gems/gemirro-0.0.1.gem' - expect(last_response).to_not be_ok - expect(last_response.status).to eq(404) + get '/gems/gemirro-0.0.1.gem' + expect(last_response).to_not be_ok + expect(last_response.status).to eq(404) - MirrorFile.new('/var/www/gemirro/gems/gemirro-0.0.1.gem').write('content') - get '/gems/gemirro-0.0.1.gem' - expect(last_response).to be_ok - expect(last_response.status).to eq(200) - expect(last_response.body).to eq('content') - end + MirrorFile.new('/var/www/gemirro/gems/gemirro-0.0.1.gem') + .write('content') + get '/gems/gemirro-0.0.1.gem' + expect(last_response).to be_ok + expect(last_response.status).to eq(200) + expect(last_response.body).to eq('content') + end - it 'should catch exceptions' do - source = Gemirro::Source.new('test', 'http://rubygems.org') + it 'should catch exceptions' do + source = Gemirro::Source.new('test', 'http://rubygems.org') - versions_fetcher = Gemirro::VersionsFetcher.new(source) - allow(versions_fetcher).to receive(:fetch).once.and_return(true) + versions_fetcher = Gemirro::VersionsFetcher.new(source) + allow(versions_fetcher).to receive(:fetch).once.and_return(true) - gems_fetcher = Gemirro::VersionsFetcher.new(source) - allow(gems_fetcher).to receive(:fetch).once.and_raise( - StandardError, 'Not ok') + gems_fetcher = Gemirro::VersionsFetcher.new(source) + allow(gems_fetcher).to receive(:fetch) + .once.and_raise(StandardError, 'Not ok') - gem_indexer = Struct::GemIndexer.new - allow(gem_indexer).to receive(:only_origin=).once.and_return(true) - allow(gem_indexer).to receive(:ui=).once.and_return(true) - allow(gem_indexer).to receive(:generate_index).once.and_raise(SystemExit) + gem_indexer = Struct::GemIndexer.new + allow(gem_indexer).to receive(:only_origin=).once.and_return(true) + allow(gem_indexer).to receive(:ui=).once.and_return(true) + allow(gem_indexer).to receive(:generate_index) + .once.and_raise(SystemExit) - allow(Gemirro.configuration).to receive(:source).twice.and_return(source) - allow(Gemirro::GemsFetcher).to receive(:new).once.and_return(gems_fetcher) - allow(Gemirro::VersionsFetcher).to receive(:new) - .once.and_return(versions_fetcher) - allow(Gemirro::Indexer).to receive(:new).once.and_return(gem_indexer) - allow(::Gem::SilentUI).to receive(:new).once.and_return(true) + allow(Gemirro.configuration).to receive(:source) + .twice.and_return(source) + allow(Gemirro::GemsFetcher).to receive(:new) + .once.and_return(gems_fetcher) + allow(Gemirro::VersionsFetcher).to receive(:new) + .once.and_return(versions_fetcher) + allow(Gemirro::Indexer).to receive(:new).once.and_return(gem_indexer) + allow(::Gem::SilentUI).to receive(:new).once.and_return(true) - allow(Gemirro.configuration).to receive(:logger) - .exactly(4).and_return(@fake_logger) - allow(@fake_logger).to receive(:info).exactly(3) - allow(@fake_logger).to receive(:error) - get '/gems/gemirro-0.0.1.gem' - expect(last_response).to_not be_ok + allow(Gemirro.configuration).to receive(:logger) + .exactly(4).and_return(@fake_logger) + allow(@fake_logger).to receive(:info).exactly(3) + allow(@fake_logger).to receive(:error) + get '/gems/gemirro-0.0.1.gem' + expect(last_response).to_not be_ok + end + end + + context 'dependencies' do + it 'should retrieve nothing' do + get '/api/v1/dependencies' + expect(last_response.headers['Content-Type']) + .to eq('application/octet-stream') + expect(last_response.body).to eq('') + expect(last_response).to be_ok + end + + it 'should retrieve empty json' do + get '/api/v1/dependencies.json' + expect(last_response.headers['Content-Type']) + .to eq('application/json') + expect(last_response.body).to eq('') + expect(last_response).to be_ok + end + + it 'should retrieve empty json when gem was not found' do + get '/api/v1/dependencies.json?gems=gemirro' + expect(last_response.headers['Content-Type']) + .to eq('application/json') + expect(last_response.body).to eq('[""]') + expect(last_response).to be_ok + end + + it 'should retrieve empty json when gem was not found' do + MirrorDirectory.new('/var/www/gemirro') + .add_directory('quick/Marshal.4.8') + MirrorFile.new('/var/www/gemirro/quick/Marshal.4.8/' \ + 'volay-0.1.0.gemspec.rz') + .write("x\x9C\x8D\x94]\x8F\xD2@\x14\x86\x89Y\xBB\xB4|\xEC\x12\xD7h" \ + "\xD4h\xD3K\x13J\x01\x97\xC84n\x9A\xA8\xBBi\xE2\xC5\x06\xBB" \ + "{\xC3\x85)\xE5\x00\x13f:u:E\xD1\xC4\xDF\xE6\xB5\xBF\xCAiK" \ + "\x11\xE3GK\xEF\x98\xF7\xBC\xCFy\xCF\xC9\xCCQ=A\x0F\xAE\x80" \ + "\"\xF4>\x82\x00/p\xE0\v\xCC\xC2;\xC1\xDD\xA3\xFA\xF4\xA1k4" \ + "\x06\xA6e\xF6_(Hy\xEBa\xD55\xB4\r#\xFEV\xB1k\xDE\r\xEAdu" \ + "\xB7\xC0cY1U\xE4\xA1\x95\x8A\xD3C7A\xAA\x87)\xB4\x9C\x1FO" \ + "\xBE\xD7\xE4OA\xEA\x17\x16\x82k\xD4o\xBC\xD7\x99\xC2x\xEC" \ + "\xAD@\xBFe$\xA1\xA0\xC7\xDBX\x00\xD5\x05/\xBC\xEFg\xDE\x13" \ + "\xF8\x98`\x0E\x14B1U\xE4w\xEC\x1A\xC7\x17\xAF2\x85\xADd\xC4" \ + "\xBE96\x87\xF9\x1F\xEA\xDF%\x8A\x95\xE3T\x9E\xCC2\xF3i\x9B" \ + "\xA1\xB3\xCC\xFE\rD\x10\xCE!\f\xB6\x1A\xD2\x9C\xD0\xA7\xB2" \ + "\xBF\x13\x8A?\x13<\xEB\x06\x04\xA7b\xD4q\xF8\xAF&\x0E!\xDF" \ + ".~\xEF\xE3\xDC\xCC@\xD2Hl\#@M\x9E\x84BN\x00\x9D:\x11\a\x0E" \ + "\x04\xFC\x18.\xD1#g\x93\xCF\xEB\xC3\x81m\\\xC1\x97\xD9" \ + "\x9Af7\\\xE3l\xD7_\xBC\x02BX\"\xD23\xBB\xF9o\x83A\xB1\x12" \ + "\xBBe\xB7\xED\x93K\xFB\xB4\x82\xB6\x80\xA9K\xB1\x1E\x96" \ + "\x10\xEA\x03sP\xCD\xBFP\x16\xEE\x8D\x85\xBF\x86E\\\x96" \ + "\xC02G\xF9\b\xEC\x16:\x9D\xC3\x06\b\x8B\xD2\xA9\x95\x84" \ + "\xD9\x97\xED\xC3p\x89+\x81\xA9}\xAB`\xD9\x9D\xFF\x03\xF6" \ + "\xD2\xC2\xBF\xCD\xFD`\xDD\x15\x10\x97\xED\xA4.[\xAB\xC6(" \ + "\x94\x05B\xE3\xB1\xBC\xA5e\xF6\xC3\xAA\x11\n\xE5>A\x8CiD " \ + "`\x9B\xF2\x04\xE3\xCA\t\xC6\x87\by-f,`Q\xD9\x1E,sp^q\x0F" \ + "\x85\xD4r\x8Dg\x11\x06\xCE\xC1\xE4>\x9D\xF9\xC9\xFC\xE5" \ + "\xC8YR\x1F\x133`4\xBB\xF9R~\xEF:\x93\xE8\x93\\\x92\xBF\r" \ + "\xA3\t\xF8\x84l\xF5<\xBF\xBE\xF9\xE3Q\xD2?q,\x04\x84:\x0E" \ + "\xF5\xF4\x1D1\xF3\xBA\xE7+!\"\xD4\xEB-\xB1X%\xB3\x14\xD3" \ + "\xCB\xEDw\xEE\xBD\xFDk\xE99OSz\xF3\xEA\xFA]w7\xF5\xAF\xB5" \ + "\x9F+\xFEG\x96") + + gem = Gemirro::GemVersion.new('volay', '0.1.0', 'ruby') + collection = Gemirro::GemVersionCollection.new([gem]) + allow_any_instance_of(Gemirro::Server).to receive(:gems_collection) + .and_return(collection) + get '/api/v1/dependencies.json?gems=volay' + expect(last_response.headers['Content-Type']) + .to eq('application/json') + expect(last_response.body).to match(/"name":"volay"/) + expect(last_response).to be_ok + end end end end