require File.dirname(__FILE__) + '/../spec_helper' module ReleaseSpecHelper def self.valid_parameters { :source_url => 'http://testplugin.com/tags/rel-0.1/', :name => 'rel-0.1', :author => 'Testy McTest', :email => 'test@testy.com', :homepage => 'http://mygreatplugins.com', :plugin => self.valid_plugin, :revision_number => 1234 } end def self.valid_plugin plugin = Plugin.new(:root => 'http://some-repos.com/', :auto_updatable => true, :name => 'some_plugin') plugin.stubs(:scan_root_for_releases).returns(Proc.new { release = plugin.releases.build( :source_url => plugin.root, :name => 'bleeding_edge', :author => 'Testy McTest', :email => 'test@testy.com', :homepage => 'http://www.mygreathomepage.com', :revision_number => 1234 ) release.stubs(:load_data_from_plugin_meta).returns(true) release.stubs(:get_revision_number_from_repository).returns(true) release.save }) plugin.save plugin end def self.valid_release Release.new(self.valid_parameters) end def self.valid_release_with_stubbed_meta_loading release = self.valid_release release.stubs(:load_data_from_plugin_meta).returns(true) release.stubs(:get_revision_number_from_repository).returns(true) release.plugin.save release end def self.example_about_yaml YAML.load(open(File.dirname(__FILE__) + '/../fixtures/files/about.yml')) end end context "New release" do setup do @release_params = ReleaseSpecHelper.valid_parameters @release = Release.new @release.stubs(:load_data_from_plugin_meta).returns(true) @release.stubs(:get_revision_number_from_repository).returns(true) end specify "should require a source URL" do @release.attributes = @release_params.except(:source_url) @release.should_not_be_valid end specify "should require a name" do @release.attributes = @release_params.except(:name) @release.should_not_be_valid end specify "should always belong to a plugin" do @release.attributes = @release_params.except(:plugin) @release.should_not_be_valid end specify "should require a revision number" do @release.attributes = @release_params.except(:revision_number) @release.should_not_be_valid end specify "should not be savable" do @release.save.should_be false end specify "should validate email if provided" do @release.attributes = @release_params @release.email = 'foobar' @release.should_not_be_valid @release.email = '' @release.should_be_valid end specify "should be creatable from full set of valid parameters" do release = Release.new(ReleaseSpecHelper.valid_parameters) release.stubs(:load_data_from_plugin_meta).returns(true) release.save.should_be true end end context "Saved release" do setup do @release = ReleaseSpecHelper.valid_release_with_stubbed_meta_loading @release.save end specify "should not be a new record" do @release.should_not_be_new_record end specify "should belong to a plugin" do @release.plugin.should_be_an_instance_of Plugin end specify "should have a release name" do @release.name.should_equal "rel-0.1" end specify "should have a source url" do @release.source_url.should_equal "http://testplugin.com/tags/rel-0.1/" end specify "should make sure source url always has a trailing slash" do @release.source_url = "http://testplugin.com/foo" @release.save @release.source_url.should_equal "http://testplugin.com/foo/" end end context "Saved release without a revision number" do setup do @release = Release.new(ReleaseSpecHelper.valid_parameters) @release.stubs(:load_data_from_plugin_meta).returns(true) RemoteResources.stubs(:read_svn_repository_info).returns("Last Changed Rev: 123456") @release.revision_number = nil @release.save end specify "should automatically detect and store the revision number" do @release.revision_number.should_equal 123456 end end context "Release with an about.yml file" do setup do RemoteResources.stubs(:remote_yaml_document).returns(ReleaseSpecHelper.example_about_yaml) @release = Release.new(ReleaseSpecHelper.valid_parameters.except(:author, :homepage, :email)) @release.save end specify "should have its author populated from the about.yml file on create" do @release.author.should_equal 'Joe Bloggs' end specify "should have its email populated from the about.yml file on create" do @release.email.should_equal 'joe@bloggs.com' end specify "should have its homepage populated from the about.yml file on create" do @release.homepage.should_equal 'www.joebloggs.com' end specify "should have its summary populated from the about.yml file on create" do @release.summary.should_equal 'The plugin summary' end specify "should have its description populated from the about.yml file on create" do @release.description.should_equal 'The plugin description' end specify "should have its license populated from the about.yml file on create" do @release.license.should_equal 'MIT' end specify "should indicate an about.yml file was found" do @release.has_meta_file.should_be true end end context "Release without an about.yml file" do setup do RemoteResources.stubs(:remote_yaml_document).raises(Errno::ENOENT) @release = Release.new(ReleaseSpecHelper.valid_parameters.except(:author, :homepage, :email)) end # specify "should raise an exception on create" do # lambda { @release.save }.should_raise ReleaseMetaDataMissing # end specify "should indicate an about.yml file was not found" do @release.has_meta_file.should_be false end end context "Release with revision number matching some of its parent plugins test results" do setup do @release = ReleaseSpecHelper.valid_release_with_stubbed_meta_loading @release.name = "rel-0.1" @release.save @release.plugin.test_results.create(SpecFixtures.valid_test_result_parameters(@release.revision_number, 80).except(:plugin)) @release.plugin.test_results.create(SpecFixtures.valid_test_result_parameters(@release.revision_number, 40).except(:plugin)) @release.plugin.test_results.create(SpecFixtures.valid_test_result_parameters(9324).except(:plugin)) end specify "should be related directly to those test results" do @release.plugin.should_have(3).test_results @release.should_have(2).test_results end specify "should have health that is an average of all its test results" do @release.health.should_equal 60 end end context "Bleeding edge release belonging to plugin that has test results" do setup do @release = ReleaseSpecHelper.valid_release_with_stubbed_meta_loading @release.name = "bleeding_edge" @release.save @release.plugin.releases.create(ReleaseSpecHelper.valid_parameters.except(:plugin)) @release.plugin.test_results.create(SpecFixtures.valid_test_result_parameters(@release.revision_number + 1).except(:plugin)) @release.plugin.test_results.create(SpecFixtures.valid_test_result_parameters(@release.revision_number + 2).except(:plugin)) @release.plugin.test_results.create(SpecFixtures.valid_test_result_parameters(@release.revision_number - 1).except(:plugin)) end specify "should be related to the test results with a revision number greater than that of the plugins latest release" do @release.plugin.latest_release.name.should_equal "rel-0.1" @release.plugin.should_have(3).test_results @release.should_have(2).test_results end end