# frozen_string_literal: true
require 'spec_helper'
require 'rexml/document'
describe KPM::NexusFacade, skip_me_if_nil: ENV['CLOUDSMITH_TOKEN'].nil? do
let(:logger) do
logger = ::Logger.new(STDOUT)
logger.level = Logger::INFO
logger
end
let(:coordinates_map) do
{ version: '0.22.21-20210319.010242-1',
group_id: 'org.kill-bill.billing',
artifact_id: 'killbill',
packaging: 'pom',
classifier: nil }
end
let(:coordinates) { KPM::Coordinates.build_coordinates(coordinates_map) }
let(:nexus_remote) { described_class::CloudsmithApiCalls.new({ :url => "https://dl.cloudsmith.io/#{ENV['CLOUDSMITH_TOKEN']}/#{ENV['CLOUDSMITH_ORG']}/#{ENV['CLOUDSMITH_REPO']}/maven" }, true, logger) }
it {
# Not implemented
expect { nexus_remote.search_for_artifacts(coordinates) }.to raise_exception(NoMethodError, 'Cloudsmith has no search support')
}
# Upload as: cloudsmith push maven -v --group-id com.mycompany.app --artifact-id my-app --packaging pom --version 1.2.3 org/repo my-app-1.2.3.pom
#
# 4.0.0
# com.mycompany.app
# my-app
# 1.2.3
# pom
#
context 'when pulling release artifact' do
let(:coordinates_map) do
{ version: '1.2.3',
group_id: 'com.mycompany.app',
artifact_id: 'my-app',
packaging: 'pom',
classifier: nil }
end
let(:coordinates) { KPM::Coordinates.build_coordinates(coordinates_map) }
it {
response = nil
expect { response = nexus_remote.get_artifact_info(coordinates) }.not_to raise_exception
parsed_doc = REXML::Document.new(response)
expect(parsed_doc.elements['//version'].text).to eq('1.2.3')
expect(parsed_doc.elements['//repositoryPath'].text).to eq('/com/mycompany/app/1.2.3/my-app-1.2.3.pom')
expect(parsed_doc.elements['//snapshot'].text).to eq('false')
}
it {
response = nil
destination = Dir.mktmpdir('artifact')
expect { response = nexus_remote.pull_artifact(coordinates, destination) }.not_to raise_exception
destination = File.join(File.expand_path(destination), response[:file_name])
parsed_pom = REXML::Document.new(File.read(destination))
expect(parsed_pom.elements['//groupId'].text).to eq('com.mycompany.app')
expect(parsed_pom.elements['//artifactId'].text).to eq('my-app')
expect(parsed_pom.elements['//version'].text).to eq('1.2.3')
}
end
# File uploaded twice (the first doesn't have any )
#
# 4.0.0
# com.mycompany.app
# my-app
# 1.2.4-SNAPSHOT
# pom
#
# true
#
#
context 'when pulling SNAPSHOT artifact' do
let(:coordinates_map) do
{ version: '1.2.4-SNAPSHOT',
group_id: 'com.mycompany.app',
artifact_id: 'my-app',
packaging: 'pom',
classifier: nil }
end
let(:coordinates) { KPM::Coordinates.build_coordinates(coordinates_map) }
it {
response = nil
expect { response = nexus_remote.get_artifact_info(coordinates) }.not_to raise_exception
parsed_doc = REXML::Document.new(response)
expect(parsed_doc.elements['//version'].text).to eq('1.2.4-SNAPSHOT')
expect(parsed_doc.elements['//repositoryPath'].text).to eq('/com/mycompany/app/1.2.4-SNAPSHOT/my-app-1.2.4-SNAPSHOT.pom')
expect(parsed_doc.elements['//snapshot'].text).to eq('true')
}
it {
response = nil
destination = Dir.mktmpdir('artifact')
expect { response = nexus_remote.pull_artifact(coordinates, destination) }.not_to raise_exception
destination = File.join(File.expand_path(destination), response[:file_name])
parsed_pom = REXML::Document.new(File.read(destination))
expect(parsed_pom.elements['//groupId'].text).to eq('com.mycompany.app')
expect(parsed_pom.elements['//artifactId'].text).to eq('my-app')
expect(parsed_pom.elements['//version'].text).to eq('1.2.4-SNAPSHOT')
# Verify that if multiple SNAPSHOTs are uploaded, the last one is downloaded (the first one doesn't have )
expect(parsed_pom.elements['//properties/for-kpm'].text).to eq('true')
}
end
end