summaryrefslogtreecommitdiff
path: root/spec/unit/forge/module_release_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/forge/module_release_spec.rb')
-rw-r--r--spec/unit/forge/module_release_spec.rb267
1 files changed, 178 insertions, 89 deletions
diff --git a/spec/unit/forge/module_release_spec.rb b/spec/unit/forge/module_release_spec.rb
index fbf5e157a..b763f0833 100644
--- a/spec/unit/forge/module_release_spec.rb
+++ b/spec/unit/forge/module_release_spec.rb
@@ -8,57 +8,14 @@ describe Puppet::Forge::ModuleRelease do
let(:agent) { "Test/1.0" }
let(:repository) { Puppet::Forge::Repository.new('http://fake.com', agent) }
let(:ssl_repository) { Puppet::Forge::Repository.new('https://fake.com', agent) }
-
- let(:release_json) do
- <<-EOF
- {
- "uri": "/v3/releases/puppetlabs-stdlib-4.1.0",
- "module": {
- "uri": "/v3/modules/puppetlabs-stdlib",
- "name": "stdlib",
- "owner": {
- "uri": "/v3/users/puppetlabs",
- "username": "puppetlabs",
- "gravatar_id": "fdd009b7c1ec96e088b389f773e87aec"
- }
- },
- "version": "4.1.0",
- "metadata": {
- "types": [ ],
- "license": "Apache 2.0",
- "checksums": { },
- "version": "4.1.0",
- "description": "Standard Library for Puppet Modules",
- "source": "git://github.com/puppetlabs/puppetlabs-stdlib.git",
- "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
- "summary": "Puppet Module Standard Library",
- "dependencies": [
-
- ],
- "author": "puppetlabs",
- "name": "puppetlabs-stdlib"
- },
- "tags": [
- "puppetlabs",
- "library",
- "stdlib",
- "standard",
- "stages"
- ],
- "file_uri": "/v3/files/puppetlabs-stdlib-4.1.0.tar.gz",
- "file_size": 67586,
- "file_md5": "bbf919d7ee9d278d2facf39c25578bf8",
- "downloads": 610751,
- "readme": "",
- "changelog": "",
- "license": "",
- "created_at": "2013-05-13 08:31:19 -0700",
- "updated_at": "2013-05-13 08:31:19 -0700",
- "deleted_at": null
- }
- EOF
- end
-
+ let(:api_version) { "v3" }
+ let(:module_author) { "puppetlabs" }
+ let(:module_name) { "stdlib" }
+ let(:module_version) { "4.1.0" }
+ let(:module_full_name) { "#{module_author}-#{module_name}" }
+ let(:module_full_name_versioned) { "#{module_full_name}-#{module_version}" }
+ let(:module_md5) { "bbf919d7ee9d278d2facf39c25578bf8" }
+ let(:uri) { " "}
let(:release) { Puppet::Forge::ModuleRelease.new(ssl_repository, JSON.parse(release_json)) }
let(:mock_file) {
@@ -69,63 +26,195 @@ describe Puppet::Forge::ModuleRelease do
let(:mock_dir) { '/tmp' }
- def mock_digest_file_with_md5(md5)
- Digest::MD5.stubs(:file).returns(stub(:hexdigest => md5))
- end
-
- describe '#prepare' do
- before :each do
- release.stubs(:tmpfile).returns(mock_file)
- release.stubs(:tmpdir).returns(mock_dir)
+ shared_examples 'a module release' do
+ def mock_digest_file_with_md5(md5)
+ Digest::MD5.stubs(:file).returns(stub(:hexdigest => md5))
end
- it 'should call sub methods with correct params' do
- release.expects(:download).with('/v3/files/puppetlabs-stdlib-4.1.0.tar.gz', mock_file)
- release.expects(:validate_checksum).with(mock_file, 'bbf919d7ee9d278d2facf39c25578bf8')
- release.expects(:unpack).with(mock_file, mock_dir)
+ describe '#prepare' do
+ before :each do
+ release.stubs(:tmpfile).returns(mock_file)
+ release.stubs(:tmpdir).returns(mock_dir)
+ end
+
+ it 'should call sub methods with correct params' do
+ release.expects(:download).with("/#{api_version}/files/#{module_full_name_versioned}.tar.gz", mock_file)
+ release.expects(:validate_checksum).with(mock_file, module_md5)
+ release.expects(:unpack).with(mock_file, mock_dir)
- release.prepare
+ release.prepare
+ end
end
- end
- describe '#tmpfile' do
+ describe '#tmpfile' do
- # This is impossible to test under Ruby 1.8.x, but should also occur there.
- it 'should be opened in binary mode', :unless => RUBY_VERSION >= '1.8.7' do
- Puppet::Forge::Cache.stubs(:base_path).returns(Dir.tmpdir)
- release.send(:tmpfile).binmode?.should be_true
+ # This is impossible to test under Ruby 1.8.x, but should also occur there.
+ it 'should be opened in binary mode', :unless => RUBY_VERSION >= '1.8.7' do
+ Puppet::Forge::Cache.stubs(:base_path).returns(Dir.tmpdir)
+ release.send(:tmpfile).binmode?.should be_true
+ end
end
- end
- describe '#download' do
- it 'should call make_http_request with correct params' do
- # valid URI comes from file_uri in JSON blob above
- ssl_repository.expects(:make_http_request).with('/v3/files/puppetlabs-stdlib-4.1.0.tar.gz', mock_file).returns(mock_file)
+ describe '#download' do
+ it 'should call make_http_request with correct params' do
+ # valid URI comes from file_uri in JSON blob above
+ ssl_repository.expects(:make_http_request).with("/#{api_version}/files/#{module_full_name_versioned}.tar.gz", mock_file).returns(stub(:body => '{}', :code => '200'))
+
+ release.send(:download, "/#{api_version}/files/#{module_full_name_versioned}.tar.gz", mock_file)
+ end
- release.send(:download, '/v3/files/puppetlabs-stdlib-4.1.0.tar.gz', mock_file)
+ it 'should raise a response error when it receives an error from forge' do
+ ssl_repository.stubs(:make_http_request).returns(stub(:body => '{"errors": ["error"]}', :code => '500', :message => 'server error'))
+ expect { release.send(:download, "/some/path", mock_file)}. to raise_error Puppet::Forge::Errors::ResponseError
+ end
end
- end
- describe '#verify_checksum' do
- it 'passes md5 check when valid' do
- # valid hash comes from file_md5 in JSON blob above
- mock_digest_file_with_md5('bbf919d7ee9d278d2facf39c25578bf8')
+ describe '#verify_checksum' do
+ it 'passes md5 check when valid' do
+ # valid hash comes from file_md5 in JSON blob above
+ mock_digest_file_with_md5(module_md5)
- release.send(:validate_checksum, mock_file, 'bbf919d7ee9d278d2facf39c25578bf8')
+ release.send(:validate_checksum, mock_file, module_md5)
+ end
+
+ it 'fails md5 check when invalid' do
+ mock_digest_file_with_md5('ffffffffffffffffffffffffffffffff')
+
+ expect { release.send(:validate_checksum, mock_file, module_md5) }.to raise_error(RuntimeError, /did not match expected checksum/)
+ end
end
- it 'fails md5 check when invalid' do
- mock_digest_file_with_md5('ffffffffffffffffffffffffffffffff')
+ describe '#unpack' do
+ it 'should call unpacker with correct params' do
+ Puppet::ModuleTool::Applications::Unpacker.expects(:unpack).with(mock_file.path, mock_dir).returns(true)
+
+ release.send(:unpack, mock_file, mock_dir)
+ end
+ end
+ end
- expect { release.send(:validate_checksum, mock_file, 'bbf919d7ee9d278d2facf39c25578bf8') }.to raise_error(RuntimeError, /did not match expected checksum/)
+ context 'standard forge module' do
+ let(:release_json) do %Q{
+ {
+ "uri": "/#{api_version}/releases/#{module_full_name_versioned}",
+ "module": {
+ "uri": "/#{api_version}/modules/#{module_full_name}",
+ "name": "#{module_name}",
+ "owner": {
+ "uri": "/#{api_version}/users/#{module_author}",
+ "username": "#{module_author}",
+ "gravatar_id": "fdd009b7c1ec96e088b389f773e87aec"
+ }
+ },
+ "version": "#{module_version}",
+ "metadata": {
+ "types": [ ],
+ "license": "Apache 2.0",
+ "checksums": { },
+ "version": "#{module_version}",
+ "description": "Standard Library for Puppet Modules",
+ "source": "git://github.com/puppetlabs/puppetlabs-stdlib.git",
+ "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
+ "summary": "Puppet Module Standard Library",
+ "dependencies": [
+
+ ],
+ "author": "#{module_author}",
+ "name": "#{module_full_name}"
+ },
+ "tags": [
+ "puppetlabs",
+ "library",
+ "stdlib",
+ "standard",
+ "stages"
+ ],
+ "file_uri": "/#{api_version}/files/#{module_full_name_versioned}.tar.gz",
+ "file_size": 67586,
+ "file_md5": "#{module_md5}",
+ "downloads": 610751,
+ "readme": "",
+ "changelog": "",
+ "license": "",
+ "created_at": "2013-05-13 08:31:19 -0700",
+ "updated_at": "2013-05-13 08:31:19 -0700",
+ "deleted_at": null
+ }
+ }
end
+
+ it_behaves_like 'a module release'
end
- describe '#unpack' do
- it 'should call unpacker with correct params' do
- Puppet::ModuleTool::Applications::Unpacker.expects(:unpack).with(mock_file.path, mock_dir).returns(true)
+ context 'forge module with no dependencies field' do
+ let(:release_json) do %Q{
+ {
+ "uri": "/#{api_version}/releases/#{module_full_name_versioned}",
+ "module": {
+ "uri": "/#{api_version}/modules/#{module_full_name}",
+ "name": "#{module_name}",
+ "owner": {
+ "uri": "/#{api_version}/users/#{module_author}",
+ "username": "#{module_author}",
+ "gravatar_id": "fdd009b7c1ec96e088b389f773e87aec"
+ }
+ },
+ "version": "#{module_version}",
+ "metadata": {
+ "types": [ ],
+ "license": "Apache 2.0",
+ "checksums": { },
+ "version": "#{module_version}",
+ "description": "Standard Library for Puppet Modules",
+ "source": "git://github.com/puppetlabs/puppetlabs-stdlib.git",
+ "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
+ "summary": "Puppet Module Standard Library",
+ "author": "#{module_author}",
+ "name": "#{module_full_name}"
+ },
+ "tags": [
+ "puppetlabs",
+ "library",
+ "stdlib",
+ "standard",
+ "stages"
+ ],
+ "file_uri": "/#{api_version}/files/#{module_full_name_versioned}.tar.gz",
+ "file_size": 67586,
+ "file_md5": "#{module_md5}",
+ "downloads": 610751,
+ "readme": "",
+ "changelog": "",
+ "license": "",
+ "created_at": "2013-05-13 08:31:19 -0700",
+ "updated_at": "2013-05-13 08:31:19 -0700",
+ "deleted_at": null
+ }
+ }
+ end
+
+ it_behaves_like 'a module release'
+ end
- release.send(:unpack, mock_file, mock_dir)
+ context 'forge module with the minimal set of fields' do
+ let(:release_json) do %Q{
+ {
+ "uri": "/#{api_version}/releases/#{module_full_name_versioned}",
+ "module": {
+ "uri": "/#{api_version}/modules/#{module_full_name}",
+ "name": "#{module_name}"
+ },
+ "metadata": {
+ "version": "#{module_version}",
+ "name": "#{module_full_name}"
+ },
+ "file_uri": "/#{api_version}/files/#{module_full_name_versioned}.tar.gz",
+ "file_size": 67586,
+ "file_md5": "#{module_md5}"
+ }
+ }
end
+
+ it_behaves_like 'a module release'
end
end