spec/unit/solve/graph_spec.rb in solve-0.2.1 vs spec/unit/solve/graph_spec.rb in solve-0.3.0

- old
+ new

@@ -1,8 +1,54 @@ require 'spec_helper' describe Solve::Graph do + describe "ClassMethods" do + subject { Solve::Graph } + + describe "::key_for" do + context "given a Solve::Artifact" do + let(:artifact) { Solve::Artifact.new(double('graph'), "nginx", "1.2.3") } + + it "delegates to ::artifact_key with the name and version of the artifact" do + subject.should_receive(:artifact_key).with(artifact.name, artifact.version) + + subject.key_for(artifact) + end + end + + context "given a Solve::Dependency" do + let(:demand) { Solve::Dependency.new(double('artifact'), "ntp", "= 2.3.4") } + + it "delegates to ::dependency_key with the name and constraint of the dependency" do + subject.should_receive(:dependency_key).with(demand.name, anything) + + subject.key_for(demand) + end + end + + context "given an unknown object" do + it "raises an ArgumentError" do + lambda { + subject.key_for("hello") + }.should raise_error(ArgumentError) + end + end + end + + describe "::artifact_key" do + it "returns a symbol containing the name and version of the artifact" do + subject.artifact_key("nginx", "1.2.3").should eql(:'nginx-1.2.3') + end + end + + describe "::dependency_key" do + it "returns a symbol containing the name and constraint of the dependency" do + subject.dependency_key("ntp", "= 2.3.4").should eql(:'ntp-= 2.3.4') + end + end + end + subject { Solve::Graph.new } describe "#artifacts" do context "given a name and version argument" do let(:name) { "nginx" } @@ -76,198 +122,108 @@ }.should raise_error(ArgumentError, 'A name and version must be specified. You gave: ["nginx", nil].') end end end - describe "#add_artifact" do - let(:artifact) { double('artifact', name: "nginx", version: "1.0.0") } - - it "adds a Solve::Artifact to the collection of artifacts" do - subject.add_artifact(artifact) - - subject.should have_artifact(artifact) - subject.artifacts.should have(1).item + describe "#get_artifact" do + before(:each) do + subject.artifacts("nginx", "1.0.0") end - it "should not add the same artifact twice to the collection" do - subject.add_artifact(artifact) - subject.add_artifact(artifact) + it "returns an instance of artifact of the matching name and version" do + artifact = subject.get_artifact("nginx", "1.0.0") - subject.artifacts.should have(1).item + artifact.should be_a(Solve::Artifact) + artifact.name.should eql("nginx") + artifact.version.to_s.should eql("1.0.0") end - end - describe "#remove_artifact" do - let(:artifact) { double('artifact', name: "nginx", version: "1.0.0") } - - context "given the artifact is a member of the collection" do - before(:each) { subject.add_artifact(artifact) } - - it "removes the Solve::Artifact from the collection of artifacts" do - subject.remove_artifact(artifact) - - subject.artifacts.should have(0).items + context "when an artifact of the given name is not in the collection of artifacts" do + it "returns nil" do + subject.get_artifact("nothere", "1.0.0").should be_nil end - - it "returns the removed Solve::Artifact" do - subject.remove_artifact(artifact).should eql(artifact) - end end - - context "given the artifact is not a member of the collection" do - it "should return nil" do - subject.remove_artifact(artifact).should be_nil - end - end end - describe "#has_artifact?" do - let(:artifact) { double('artifact', name: "nginx", version: "1.0.0") } - - it "returns true if the given Solve::Artifact is a member of the collection" do - subject.add_artifact(artifact) - - subject.has_artifact?(artifact).should be_true + describe "#versions" do + let(:artifacts) do + [ + double('artifact', name: 'nginx', version: Solve::Version.new('1.0.0')), + double('artifact', name: 'nginx', version: Solve::Version.new('2.0.0')), + double('artifact', name: 'nginx', version: Solve::Version.new('3.0.0')), + double('artifact', name: 'nginx', version: Solve::Version.new('4.0.0')), + double('artifact', name: 'nginx', version: Solve::Version.new('5.0.0')), + double('artifact', name: 'mysql', version: Solve::Version.new('4.0.0')) + ] end - it "returns false if the given Solve::Artifact is not a member of the collection" do - subject.has_artifact?(artifact).should be_false + before(:each) do + subject.stub(:artifacts).and_return(artifacts) end - end - describe "#demands" do - context "given a name and constraint argument" do - let(:name) { "nginx" } - let(:constraint) { "~> 0.101.5" } - - context "given the artifact of the given name and constraint does not exist" do - it "returns a Solve::Demand" do - subject.demands(name, constraint).should be_a(Solve::Demand) - end - - it "the artifact has the given name" do - subject.demands(name, constraint).name.should eql(name) - end - - it "the artifact has the given constraint" do - subject.demands(name, constraint).constraint.to_s.should eql(constraint) - end - - it "adds an artifact to the demands collection" do - subject.demands(name, constraint) - - subject.demands.should have(1).item - end - - it "the artifact added matches the given name" do - subject.demands(name, constraint) - - subject.demands[0].name.should eql(name) - end - - it "the artifact added matches the given constraint" do - subject.demands(name, constraint) - - subject.demands[0].constraint.to_s.should eql(constraint) - end - end + it "returns all the artifacts matching the given name" do + subject.versions("nginx").should have(5).items end - context "given only a name argument" do - it "returns a demand with a match all version constraint (>= 0.0.0)" do - subject.demands("nginx").constraint.to_s.should eql(">= 0.0.0") + context "given an optional constraint value" do + it "returns only the artifacts matching the given constraint value and name" do + subject.versions("nginx", ">= 4.0.0").should have(2).items end end - - context "given no arguments" do - it "returns an array" do - subject.demands.should be_a(Array) - end - - it "returns an empty array if no demands have been accessed" do - subject.demands.should have(0).items - end - - it "returns an array containing a demand if one was accessed" do - subject.demands("nginx", "~> 0.101.5") - - subject.demands.should have(1).item - end - end - - context "given an unexpected number of arguments" do - it "raises an ArgumentError if more than two are provided" do - lambda { - subject.demands(1, 2, 3) - }.should raise_error(ArgumentError, "Unexpected number of arguments. You gave: 3. Expected: 2 or less.") - end - - it "raises an ArgumentError if a name argument of nil is provided" do - lambda { - subject.demands(nil) - }.should raise_error(ArgumentError, "A name must be specified. You gave: [nil].") - end - - it "raises an ArgumentError if a name and constraint argument are provided but name is nil" do - lambda { - subject.demands(nil, "= 1.0.0") - }.should raise_error(ArgumentError, 'A name must be specified. You gave: [nil, "= 1.0.0"].') - end - end end - describe "#add_demand" do - let(:demand) { double('demand') } + describe "#add_artifact" do + let(:artifact) { Solve::Artifact.new(double('graph'), "nginx", "1.0.0") } it "adds a Solve::Artifact to the collection of artifacts" do - subject.add_demand(demand) + subject.add_artifact(artifact) - subject.should have_demand(demand) - subject.demands.should have(1).item + subject.should have_artifact(artifact.name, artifact.version) + subject.artifacts.should have(1).item end - it "should not add the same demand twice to the collection" do - subject.add_demand(demand) - subject.add_demand(demand) + it "should not add the same artifact twice to the collection" do + subject.add_artifact(artifact) + subject.add_artifact(artifact) - subject.demands.should have(1).item + subject.artifacts.should have(1).item end end - describe "#remove_demand" do - let(:demand) { double('demand') } + describe "#remove_artifact" do + let(:artifact) { Solve::Artifact.new(double('graph'), "nginx", "1.0.0") } - context "given the demand is a member of the collection" do - before(:each) { subject.add_demand(demand) } + context "given the artifact is a member of the collection" do + before(:each) { subject.add_artifact(artifact) } - it "removes the Solve::Artifact from the collection of demands" do - subject.remove_demand(demand) + it "removes the Solve::Artifact from the collection of artifacts" do + subject.remove_artifact(artifact) - subject.demands.should have(0).items + subject.artifacts.should have(0).items end it "returns the removed Solve::Artifact" do - subject.remove_demand(demand).should eql(demand) + subject.remove_artifact(artifact).should eql(artifact) end end - context "given the demand is not a member of the collection" do + context "given the artifact is not a member of the collection" do it "should return nil" do - subject.remove_demand(demand).should be_nil + subject.remove_artifact(artifact).should be_nil end end end - describe "#has_demand?" do - let(:demand) { double('demand') } + describe "#has_artifact?" do + let(:artifact) { Solve::Artifact.new(double('graph'), "nginx", "1.0.0") } it "returns true if the given Solve::Artifact is a member of the collection" do - subject.add_demand(demand) + subject.add_artifact(artifact) - subject.has_demand?(demand).should be_true + subject.has_artifact?(artifact.name, artifact.version).should be_true end it "returns false if the given Solve::Artifact is not a member of the collection" do - subject.has_demand?(demand).should be_false + subject.has_artifact?(artifact.name, artifact.version).should be_false end end end