require 'spec_helper'

module Omnibus
  describe ManifestDiff do
    def manifest_entry_for(name, dv, lv)
      Omnibus::ManifestEntry.new(name, {:described_version => dv,
                                   :locked_version => lv,
                                   :locked_source => {
                                     :git => "git://#{name}@example.com"},
                                   :source_type => :git
                                 })
    end


    let(:manifest_one) do
      m = Omnibus::Manifest.new()
      m.add("foo", manifest_entry_for("foo", "1.2.4", "deadbeef"))
      m.add("bar", manifest_entry_for("bar", "1.2.4", "deadbeef"))
      m.add("baz", manifest_entry_for("baz", "1.2.4", "deadbeef"))
      m
    end

    let(:manifest_two) do
      m = Omnibus::Manifest.new()
      m.add("foo", manifest_entry_for("foo", "1.2.5", "deadbea0"))
      m.add("baz", manifest_entry_for("baz", "1.2.4", "deadbeef"))
      m.add("quux", manifest_entry_for("quux", "1.2.4", "deadbeef"))
      m
    end

    subject { described_class.new(manifest_one, manifest_two)}

    describe "#updated" do
      it "returns items that existed in the first manifest but have been changed" do
        expect(subject.updated).to eq([{ :name => "foo",
                                         :old_version => "deadbeef",
                                         :new_version => "deadbea0",
                                         :source_type => :git,
                                         :source => {:git => "git://foo@example.com"}
                                       }])
      end

      describe "#removed" do
        it "returns items that existed in the first manfiest but don't exist in the second" do
          expect(subject.removed).to eq([{ :name => "bar",
                                           :old_version => "deadbeef",
                                           :source_type => :git,
                                           :source => {:git => "git://bar@example.com"}
                                         }])
        end
      end

      describe "#added" do
        it "returns items that did not exist in the first manifest but do exist in the second" do
          expect(subject.added).to eq([{ :name => "quux",
                                         :new_version => "deadbeef",
                                         :source_type => :git,
                                         :source => {:git => "git://quux@example.com"}
                                       }])
        end
      end

      describe "#empty?" do
        it "returns false if there have been changes" do
          expect(subject.empty?).to eq(false)
        end

        it "returns true if nothing changed" do
          diff = Omnibus::ManifestDiff.new(manifest_one, manifest_one)
          expect(diff.empty?).to eq(true)
        end
      end
    end
  end
end