# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with this # work for additional information regarding copyright ownership. The ASF # licenses this file to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. require File.expand_path('../spec_helpers', File.dirname(__FILE__)) require File.expand_path(File.join(File.dirname(__FILE__), '..', 'xpath_matchers')) describe Buildr::CustomPom do def xml_document(filename) File.should be_exist(filename) REXML::Document.new(File.read(filename)) end def project_pom_xml(project) xml_document(project.packages[0].pom.to_s) end def verify_license(pom_xml, name, url) pom_xml.should match_xpath("/project/licenses/license/url[../name/text() = '#{name}']", url) end def dependency_xpath(artifact_id) "/project/dependencies/dependency[artifactId/text() = '#{artifact_id}']" end def verify_dependency_group(pom_xml, artifact_id, group) pom_xml.should match_xpath("#{dependency_xpath(artifact_id)}/groupId", group) end def verify_dependency_version(pom_xml, artifact_id, version) pom_xml.should match_xpath("#{dependency_xpath(artifact_id)}/version", version) end def verify_dependency_scope(pom_xml, artifact_id, scope) pom_xml.should match_xpath("#{dependency_xpath(artifact_id)}/scope", scope) end def verify_dependency_optional(pom_xml, artifact_id, optional) pom_xml.should match_xpath("#{dependency_xpath(artifact_id)}/optional", optional) end def verify_dependency(pom_xml, artifact_id, group, version, scope, optional) verify_dependency_group(pom_xml, artifact_id, group) verify_dependency_version(pom_xml, artifact_id, version) verify_dependency_scope(pom_xml, artifact_id, scope) verify_dependency_optional(pom_xml, artifact_id, optional) pom_xml.should match_xpath("#{dependency_xpath(artifact_id)}/exclusions/exclusion/groupId", '*') pom_xml.should match_xpath("#{dependency_xpath(artifact_id)}/exclusions/exclusion/artifactId", '*') end describe 'with explicitly specified pom details' do before do %w(id-provided id-optional id-runtime id-test).each do |artifact_id| artifact("group:#{artifact_id}:jar:1.0") do |t| mkdir_p File.dirname(t.to_s) Zip::OutputStream.open t.to_s do |zip| zip.put_next_entry 'empty.txt' end end end write 'src/main/java/Example.java', 'public class Example {}' @foo = define 'foo' do project.group = 'org.myproject' project.version = '1.0' pom.licenses['The Apache Software License, Version 2.0'] = 'http://www.apache.org/licenses/LICENSE-2.0.txt' pom.licenses['GNU General Public License (GPL) version 3.0'] = 'http://www.gnu.org/licenses/gpl-3.0.html' pom.scm_connection = pom.scm_developer_connection = 'scm:git:git@github.com:jbloggs/myproject' pom.scm_url = 'git@github.com:jbloggs/myproject' pom.url = 'https://github.com/jbloggs/myproject' pom.issues_url = 'https://github.com/jbloggs/myproject/issues' pom.issues_system = 'GitHub Issues' pom.add_developer('jbloggs', 'Joe Bloggs', 'jbloggs@example.com', ['Project Lead']) pom.provided_dependencies = ['group:id-provided:jar:1.0'] pom.optional_dependencies = ['group:id-optional:jar:1.0'] compile.with 'group:id-runtime:jar:1.0', 'group:id-optional:jar:1.0', 'group:id-provided:jar:1.0' test.with 'group:id-test:jar:1.0' package(:jar) end task('package').invoke @pom_xml = project_pom_xml(@foo) #$stderr.puts @pom_xml.to_s end it 'has correct static metadata' do @pom_xml.should match_xpath('/project/modelVersion', '4.0.0') @pom_xml.should match_xpath('/project/parent/groupId', 'org.sonatype.oss') @pom_xml.should match_xpath('/project/parent/artifactId', 'oss-parent') @pom_xml.should match_xpath('/project/parent/version', '8') end it 'has correct project level metadata' do @pom_xml.should match_xpath('/project/groupId', 'org.myproject') @pom_xml.should match_xpath('/project/artifactId', 'foo') @pom_xml.should match_xpath('/project/version', '1.0') @pom_xml.should match_xpath('/project/packaging', 'jar') @pom_xml.should match_xpath('/project/name', 'foo') @pom_xml.should match_xpath('/project/description', 'foo') @pom_xml.should match_xpath('/project/url', 'https://github.com/jbloggs/myproject') end it 'has correct scm details' do @pom_xml.should match_xpath('/project/scm/connection', 'scm:git:git@github.com:jbloggs/myproject') @pom_xml.should match_xpath('/project/scm/developerConnection', 'scm:git:git@github.com:jbloggs/myproject') @pom_xml.should match_xpath('/project/scm/url', 'git@github.com:jbloggs/myproject') end it 'has correct issueManagement details' do @pom_xml.should match_xpath('/project/issueManagement/url', 'https://github.com/jbloggs/myproject/issues') @pom_xml.should match_xpath('/project/issueManagement/system', 'GitHub Issues') end it 'has correct developers details' do @pom_xml.should match_xpath('/project/developers/developer/id', 'jbloggs') @pom_xml.should match_xpath('/project/developers/developer/name', 'Joe Bloggs') @pom_xml.should match_xpath('/project/developers/developer/email', 'jbloggs@example.com') @pom_xml.should match_xpath('/project/developers/developer/roles/role', 'Project Lead') end it 'has correct license details' do verify_license(@pom_xml, 'The Apache Software License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0.txt') verify_license(@pom_xml, 'GNU General Public License (GPL) version 3.0', 'http://www.gnu.org/licenses/gpl-3.0.html') end it 'has correct dependency details' do verify_dependency(@pom_xml, 'id-runtime', 'group', '1.0', nil, nil) verify_dependency(@pom_xml, 'id-optional', 'group', '1.0', nil, 'true') verify_dependency(@pom_xml, 'id-provided', 'group', '1.0', 'provided', nil) verify_dependency(@pom_xml, 'id-test', 'group', '1.0', 'test', nil) end end describe 'with a multi-module project' do before do write 'foo/src/main/java/Foo.java', 'public class Foo {}' write 'bar/src/main/java/Bar.java', 'public class Bar {}' define('myproject', :group => 'group', :version => '1.0') do define('foo') do package(:jar) end define(:bar) do compile.with project('foo') package(:jar) pom.description = 'BAR Project' end end task('package').invoke @pom_xml = project_pom_xml(project('myproject:bar')) end it 'should add foo to the dependencies of bar\'s pom.xml' do verify_dependency(@pom_xml, 'myproject-foo', 'group', '1.0', nil, nil) end end end