From d031b98a3d0b27022d13776fccad3137ee5cb2f5 Mon Sep 17 00:00:00 2001 From: Beth Skurrie Date: Thu, 28 Sep 2017 13:03:10 +1000 Subject: [PATCH] feat(cli): add command line tool to publish pacts --- bin/pact-publish | 3 + lib/pact_broker/client/publish_cli.rb | 56 +++++++++++++ lib/pact_broker/client/publish_pacts.rb | 4 + .../pact_broker/client/publish_cli_spec.rb | 84 +++++++++++++++++++ 4 files changed, 147 insertions(+) create mode 100755 bin/pact-publish create mode 100644 lib/pact_broker/client/publish_cli.rb create mode 100644 spec/lib/pact_broker/client/publish_cli_spec.rb diff --git a/bin/pact-publish b/bin/pact-publish new file mode 100755 index 00000000..5567f11d --- /dev/null +++ b/bin/pact-publish @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require 'pact_broker/client/publish_cli' +PactBroker::Client::PublishCLI.start diff --git a/lib/pact_broker/client/publish_cli.rb b/lib/pact_broker/client/publish_cli.rb new file mode 100644 index 00000000..fe7b30b2 --- /dev/null +++ b/lib/pact_broker/client/publish_cli.rb @@ -0,0 +1,56 @@ +require 'thor' +require 'pact_broker/client/publish_pacts' +require 'rake/file_list' + +module PactBroker + module Client + + # Thor::Error will have its backtrace hidden + class PactPublicationError < ::Thor::Error; end + + class PublishCLI < Thor + + desc 'publish', "Publish pacts to a Pact Broker." + method_option :pact_dir, required: true, aliases: "-d", desc: "The directory containing the pacts to publish" + method_option :consumer_version, required: true, aliases: "-v", desc: "The consumer application version" + method_option :base_url, required: true, aliases: "-b" + method_option :tag, aliases: "-t" + method_option :username, aliases: "-u" + method_option :password, aliases: "-p" + + def publish + success = PactBroker::Client::PublishPacts.call( + options[:base_url], + file_list, + options[:consumer_version], + tags, + pact_broker_client_options + ) + raise PactPublicationError, "One or more pacts failed to be published" unless success + end + + default_task :publish + + no_commands do + def file_list + Rake::FileList["#{options[:pact_dir]}/*.json"] + end + + def tags + [options[:tag]].compact + end + + def pact_broker_client_options + if options[:username] + { + username: options[:username], + password: options[:password] + } + else + {} + end + end + end + end + end +end diff --git a/lib/pact_broker/client/publish_pacts.rb b/lib/pact_broker/client/publish_pacts.rb index 3eed82a7..826e5293 100644 --- a/lib/pact_broker/client/publish_pacts.rb +++ b/lib/pact_broker/client/publish_pacts.rb @@ -6,6 +6,10 @@ module PactBroker module Client class PublishPacts + def self.call(pact_broker_base_url, pact_files, consumer_version, tags, pact_broker_client_options={}) + new(pact_broker_base_url, pact_files, consumer_version, tags, pact_broker_client_options).call + end + def initialize pact_broker_base_url, pact_files, consumer_version, tags, pact_broker_client_options={} @pact_broker_base_url = pact_broker_base_url @pact_files = pact_files diff --git a/spec/lib/pact_broker/client/publish_cli_spec.rb b/spec/lib/pact_broker/client/publish_cli_spec.rb new file mode 100644 index 00000000..90435f45 --- /dev/null +++ b/spec/lib/pact_broker/client/publish_cli_spec.rb @@ -0,0 +1,84 @@ +require 'pact_broker/client/publish_cli' + +module PactBroker + module Client + describe PublishCLI do + + before do + allow(PactBroker::Client::PublishPacts).to receive(:call).and_return(true) + end + + describe "#publish" do + let(:minimum_valid_options) do + { + pact_dir: 'spec/pacts', + consumer_version: '1.2.3', + base_url: 'http://pact-broker' + } + end + + context "with minimum valid options" do + before do + subject.options = minimum_valid_options + end + + it "invokes the PublishPacts command" do + expect(PactBroker::Client::PublishPacts).to receive(:call).with( + "http://pact-broker", + Rake::FileList["spec/pacts/*.json"], + "1.2.3", + [], + {} + ) + subject.publish + end + end + + context "with a tag" do + before do + subject.options = minimum_valid_options.merge(tag: 'foo') + end + + it "passes in the tag" do + expect(PactBroker::Client::PublishPacts).to receive(:call).with( + anything, + anything, + anything, + ['foo'], + anything + ) + subject.publish + end + end + + context "with basic auth options specified" do + before do + subject.options = minimum_valid_options.merge(username: 'foo', password: 'bar') + end + + it "passes in the basic auth options" do + expect(PactBroker::Client::PublishPacts).to receive(:call).with( + anything, + anything, + anything, + anything, + {username: 'foo', password: 'bar'} + ) + subject.publish + end + end + + context "when an error occurs publishing" do + before do + allow(PactBroker::Client::PublishPacts).to receive(:call).and_return(false) + subject.options = minimum_valid_options + end + + it "raises a PactBroker::Client::PactPublicationError" do + expect { subject.publish }.to raise_error PactBroker::Client::PactPublicationError + end + end + end + end + end +end