test/unit/relationship_test.rb in rails-erd-0.3.0 vs test/unit/relationship_test.rb in rails-erd-0.4.0

- old
+ new

@@ -1,9 +1,9 @@ require File.expand_path("../test_helper", File.dirname(__FILE__)) class RelationshipTest < ActiveSupport::TestCase - N = Relationship::N + N = Domain::Relationship::N def domain_cardinalities Domain.generate.relationships.map(&:cardinality) end @@ -11,29 +11,29 @@ test "inspect should show source and destination" do create_model "Foo", :bar => :references do belongs_to :bar end create_model "Bar" - assert_match %r{#<RailsERD::Relationship:.* @source=Bar @destination=Foo>}, Domain.generate.relationships.first.inspect + assert_match %r{#<RailsERD::Domain::Relationship:.* @source=Bar @destination=Foo>}, Domain.generate.relationships.first.inspect end test "source should return relationship source" do create_model "Foo", :bar => :references do belongs_to :bar end create_model "Bar" domain = Domain.generate - assert_equal [domain.entity_for(Bar)], domain.relationships.map(&:source) + assert_equal [domain.entity_by_name("Bar")], domain.relationships.map(&:source) end test "destination should return relationship destination" do create_model "Foo", :bar => :references do belongs_to :bar end create_model "Bar" domain = Domain.generate - assert_equal [domain.entity_for(Foo)], domain.relationships.map(&:destination) + assert_equal [domain.entity_by_name("Foo")], domain.relationships.map(&:destination) end # Relationship properties ================================================== test "mutual should return false for one way relationship" do create_model "Foo", :bar => :references do @@ -136,53 +136,66 @@ has_many :foos has_many :special_foos, :class_name => "Foo", :foreign_key => :bar_id end assert_equal [4], Domain.generate.relationships.map(&:strength) end + + test "strength should count polymorphic associations only once" do + create_model "Foo", :bar => :references do + belongs_to :bar, :polymorphic => true + end + create_model "Qux" do + has_many :foos, :as => :bar + end + create_model "Quux" do + has_many :foos, :as => :bar + end + assert_equal [1], Domain.generate.relationships.map(&:strength) + end # Cardinalities ============================================================ test "cardinality should be zero-one to zero-one for optional one to one associations" do create_one_to_one_assoc_domain - assert_equal [Relationship::Cardinality.new(0..1, 0..1)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 0..1)], domain_cardinalities end test "cardinality should be one to one for mutually mandatory one to one associations" do create_one_to_one_assoc_domain One.class_eval do validates_presence_of :other end Other.class_eval do validates_presence_of :one end - assert_equal [Relationship::Cardinality.new(1, 1)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(1, 1)], domain_cardinalities end test "cardinality should be zero-one to zero-many for optional one to many associations" do create_one_to_many_assoc_domain - assert_equal [Relationship::Cardinality.new(0..1, 0..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 0..N)], domain_cardinalities end test "cardinality should be one to zero-many for one to many associations with not null foreign key" do create_model "One" do has_many :many end create_model "Many" do belongs_to :one end add_column :manies, :one_id, :integer, :null => false, :default => 0 - assert_equal [Relationship::Cardinality.new(1, 0..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(1, 0..N)], domain_cardinalities end test "cardinality should be one to one-many for mutually mandatory one to many associations" do create_one_to_many_assoc_domain One.class_eval do validates_presence_of :many end Many.class_eval do validates_presence_of :one end - assert_equal [Relationship::Cardinality.new(1, 1..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(1, 1..N)], domain_cardinalities end test "cardinality should be zero-one to one-n for maximised one to many associations" do create_one_to_many_assoc_domain One.class_eval do @@ -190,67 +203,67 @@ # This kind of validation is bizarre, but we support it. validates_length_of :many, :maximum => 5 validates_length_of :many, :maximum => 2 # The lowest maximum should be used. end - assert_equal [Relationship::Cardinality.new(0..1, 1..2)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 1..2)], domain_cardinalities end test "cardinality should be zero-one to n-many for minimised one to many associations" do create_one_to_many_assoc_domain One.class_eval do validates_presence_of :many validates_length_of :many, :minimum => 2 validates_length_of :many, :minimum => 5 # The highest minimum should be used. end - assert_equal [Relationship::Cardinality.new(0..1, 5..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 5..N)], domain_cardinalities end test "cardinality should be zero-one to n-m for limited one to many associations with single validation" do create_one_to_many_assoc_domain One.class_eval do validates_length_of :many, :minimum => 5, :maximum => 17 end - assert_equal [Relationship::Cardinality.new(0..1, 5..17)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 5..17)], domain_cardinalities end test "cardinality should be zero-one to n-m for limited one to many associations with multiple validations" do create_one_to_many_assoc_domain One.class_eval do validates_presence_of :many validates_length_of :many, :maximum => 17 validates_length_of :many, :minimum => 5 validates_length_of :many, :minimum => 2, :maximum => 28 end - assert_equal [Relationship::Cardinality.new(0..1, 5..17)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 5..17)], domain_cardinalities end test "cardinality should be zero-many to zero-many for optional many to many associations" do create_many_to_many_assoc_domain - assert_equal [Relationship::Cardinality.new(0..N, 0..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..N, 0..N)], domain_cardinalities end test "cardinality should be one-many to one-many for mutually mandatory many to many associations" do create_many_to_many_assoc_domain Many.class_eval do validates_presence_of :more end More.class_eval do validates_presence_of :many end - assert_equal [Relationship::Cardinality.new(1..N, 1..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(1..N, 1..N)], domain_cardinalities end test "cardinality should be n-m to n-m for limited many to many associations with single validations" do create_many_to_many_assoc_domain Many.class_eval do validates_length_of :more, :minimum => 3, :maximum => 18 end More.class_eval do validates_length_of :many, :maximum => 29, :minimum => 7 end - assert_equal [Relationship::Cardinality.new(3..18, 7..29)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(3..18, 7..29)], domain_cardinalities end test "cardinality should be n-m to n-m for limited many to many associations with multiple validations" do create_many_to_many_assoc_domain Many.class_eval do @@ -263,45 +276,45 @@ validates_presence_of :many validates_length_of :many, :minimum => 2 validates_length_of :many, :minimum => 9 validates_length_of :many, :maximum => 17 end - assert_equal [Relationship::Cardinality.new(3..20, 9..17)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(3..20, 9..17)], domain_cardinalities end # Cardinality for non-mutual relationships ================================= test "cardinality should be zero-one to zero-many for non mutual relationship with belongs_to association" do create_model "One" create_model "Many", :one => :references do belongs_to :one end - assert_equal [Relationship::Cardinality.new(0..1, 0..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 0..N)], domain_cardinalities end test "cardinality should be zero-one to zero-many for non mutual relationship with has_many association" do create_model "One" do has_many :many end create_model "Many", :one => :references - assert_equal [Relationship::Cardinality.new(0..1, 0..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 0..N)], domain_cardinalities end test "cardinality should be zero-one to zero-one for non mutual relationship with has_one association" do create_model "One" do has_one :other end create_model "Other", :one => :references - assert_equal [Relationship::Cardinality.new(0..1, 0..1)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 0..1)], domain_cardinalities end test "cardinality should be zero-many to zero-many for non mutual relationship with has_and_belongs_to_many association" do create_table "many_more", :many_id => :integer, :more_id => :integer create_model "Many" create_model "More" do has_and_belongs_to_many :many end - assert_equal [Relationship::Cardinality.new(0..N, 0..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..N, 0..N)], domain_cardinalities end # Cardinality for multiple associations ==================================== test "cardinality should be zero-one to zero-many for conflicting one to many associations" do create_model "CreditCard", :person => :references do @@ -312,11 +325,11 @@ # A person may have a preferred card, but they are still able to have # many cards. The association has an infinite maximum cardinality. has_one :preferred_credit_card, :class_name => "CreditCard" end - assert_equal [Relationship::Cardinality.new(0..1, 0..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 0..N)], domain_cardinalities end test "cardinality should be zero-one to one-many for conflicting validations in one to many associations" do create_model "Book", :author => :references do belongs_to :author @@ -327,11 +340,11 @@ # The author certainly has books, therefore, this association has a # minimum cardinality of one. validates_presence_of :books end - assert_equal [Relationship::Cardinality.new(0..1, 1..N)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 1..N)], domain_cardinalities end test "cardinality should be n-m to n-m for conflicting validations in one to many associations" do create_model "Spell", :wizard => :references do end @@ -343,13 +356,29 @@ # We don't go that far yet. We ignore the lower values and opt for the # higher values. It'll be okay. Really... You'll never need this. validates_length_of :ice_spells, :in => 10..20 validates_length_of :fire_spells, :in => 50..100 end - assert_equal [Relationship::Cardinality.new(0..1, 50..100)], domain_cardinalities + assert_equal [Domain::Relationship::Cardinality.new(0..1, 50..100)], domain_cardinalities end + test "cardinality should be one to one-many for mandatory one to many associations on polymorphic interfaces" do + create_model "Cannon", :defensible => :references do + belongs_to :defensible, :polymorphic => true + validates_presence_of :defensible + end + create_model "Stronghold" do + has_many :cannons, :as => :defensible + validates_presence_of :cannons + end + create_model "Galleon" do + has_many :cannons, :as => :defensible + validates_presence_of :cannons + end + assert_equal [Domain::Relationship::Cardinality.new(1, 1..N)], domain_cardinalities + end + # Cardinality classes ====================================================== test "cardinality should be one to one for has_one associations" do create_one_to_one_assoc_domain domain = Domain.generate @@ -412,7 +441,27 @@ belongs_to :bar end create_model "Bar" domain = Domain.generate assert_equal [:one_to_many], domain.relationships.map(&:cardinality).map(&:name) + end + + test "cardinality should be one to many for has_many associations from generalized entity" do + create_model "Stronghold" do + has_many :cannons, :as => :defensible + end + create_model "Cannon", :defensible => :references do + belongs_to :defensible, :polymorphic => true + end + domain = Domain.generate + + assert_equal [:one_to_many], domain.relationships.map(&:cardinality).map(&:name) + assert_equal [false], domain.relationships.map(&:one_to_one?) + assert_equal [true], domain.relationships.map(&:one_to_many?) + assert_equal [false], domain.relationships.map(&:many_to_many?) + + assert_equal [true], domain.relationships.map(&:one_to?) + assert_equal [false], domain.relationships.map(&:many_to?) + assert_equal [false], domain.relationships.map(&:to_one?) + assert_equal [true], domain.relationships.map(&:to_many?) end end