require "spec_helper" require "pact_broker/api/decorators/pact_decorator" module PactBroker module Api module Decorators describe PactDecorator do before do allow(decorator).to receive(:templated_diff_url).and_return("templated-diff-url") allow(decorator).to receive(:verification_publication_url).and_return("verification-publication-url") end let(:content_hash) { { "consumer" => {"name" => "Consumer"}, "provider" => {"name" => "Provider"}, "interactions" => [], "metadata" => {} } } let(:base_url) { "http://example.org" } let(:created_at) { Time.new(2014, 3, 4) } let(:pact) { double("pact", content_hash: content_hash, created_at: created_at, consumer: consumer, consumer_name: consumer.name, provider: provider, provider_name: provider.name, consumer_version: consumer_version, consumer_version_number: "1234", pact_version_sha: "9999", revision_number: 2, name: "A Pact" )} let(:consumer) { instance_double(PactBroker::Domain::Pacticipant, name: "A Consumer")} let(:provider) { instance_double(PactBroker::Domain::Pacticipant, name: "A Provider")} let(:consumer_version) { instance_double(PactBroker::Domain::Version, number: "1234", pacticipant: consumer)} let(:metadata) { "abcd" } let(:decorator) { PactDecorator.new(pact) } let(:json) { decorator.to_json(user_options: { base_url: base_url, metadata: metadata }) } subject { JSON.parse(json, symbolize_names: true) } describe "#to_json" do it "creates the verification link" do expect(decorator).to receive(:verification_publication_url).with(pact, base_url, metadata) subject end it "includes the json_content" do expect(subject[:consumer]).to eq name: "Consumer" end it "includes the createdAt date" do expect(subject[:createdAt]).to eq FormatDateTime.call(created_at) end it "includes a link to itself" do expect(subject[:_links][:self]).to eq href: "http://example.org/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1234", name: "A Pact", title: "Pact" end it "includes a link to the diff with the previous distinct version" do expect(subject[:_links][:'pb:diff-previous-distinct']).to eq({href: "http://example.org/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1234/diff/previous-distinct", title: "Diff with previous distinct version of this pact"}) end it "includes a link to the previous distinct pact version" do expect(subject[:_links][:'pb:previous-distinct']).to eq({href: "http://example.org/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1234/previous-distinct", title: "Previous distinct version of this pact"}) end it "includes a link to tag this version" do expect(subject[:_links][:'pb:tag-version'][:href]).to eq "http://example.org/pacticipants/A%20Consumer/versions/1234/tags/{tag}" end it "includes a link to the consumer" do expect(subject[:_links][:'pb:consumer']).to eq name: "A Consumer", title: "Consumer", href: "http://example.org/pacticipants/A%20Consumer" end it "includes a link to the provider" do expect(subject[:_links][:'pb:provider']).to eq name: "A Provider", title: "Provider", href: "http://example.org/pacticipants/A%20Provider" end it "includes a link to the webhooks for this pact" do expect(subject[:_links][:'pb:pact-webhooks'][:href]).to eq "http://example.org/webhooks/provider/A%20Provider/consumer/A%20Consumer" end it "includes a link to the latest pact" do expect(subject[:_links][:'pb:latest-pact-version'][:title]).to eq "Latest version of this pact" expect(subject[:_links][:'pb:latest-pact-version'][:href]).to eq "http://example.org/pacts/provider/A%20Provider/consumer/A%20Consumer/latest" end it "includes a link to all pact versions" do expect(subject[:_links][:'pb:all-pact-versions'][:title]).to eq "All versions of this pact" expect(subject[:_links][:'pb:all-pact-versions'][:href]).to eq "http://example.org/pacts/provider/A%20Provider/consumer/A%20Consumer/versions" end it "includes a link to the pact version" do expect(subject[:_links][:'pb:consumer-version'][:title]).to eq "Consumer version" expect(subject[:_links][:'pb:consumer-version'][:name]).to eq "1234" expect(subject[:_links][:'pb:consumer-version'][:href]).to eq "http://example.org/pacticipants/A%20Consumer/versions/1234" end it "includes a link to the latest untagged version" do expect(subject[:_links][:'pb:latest-untagged-pact-version'][:href]).to eq "http://example.org/pacts/provider/A%20Provider/consumer/A%20Consumer/latest-untagged" end it "includes a link to the latest tagged version" do expect(subject[:_links][:'pb:latest-tagged-pact-version'][:href]).to eq "http://example.org/pacts/provider/A%20Provider/consumer/A%20Consumer/latest/{tag}" end it "includes a link to publish a verification" do expect(subject[:_links][:'pb:publish-verification-results'][:href]).to eq "verification-publication-url" end it "includes a link to diff this pact version with another pact version" do expect(subject[:_links][:'pb:diff'][:href]).to eq "templated-diff-url" expect(subject[:_links][:'pb:diff'][:templated]).to eq true end it "includes a curie" do expect(subject[:_links][:curies]).to eq [{ name: "pb", href: "http://example.org/doc/{rel}?context=pact", templated: true }] end context "when the json_content is not a Hash" do let(:content_hash) { [1] } it "returns the plain JSON without any links" do expect(subject).to eq content_hash end end end end end end end