test/unit/diagram_test.rb in rails-erd-0.2.0 vs test/unit/diagram_test.rb in rails-erd-0.3.0

- old
+ new

@@ -7,10 +7,46 @@ def teardown RailsERD.send :remove_const, :Diagram end + def retrieve_relationships(options = {}) + klass = Class.new(Diagram) + [].tap do |relationships| + klass.class_eval do + define_method :process_relationship do |relationship| + relationships << relationship + end + end + klass.create(options) + end + end + + def retrieve_entities(options = {}) + klass = Class.new(Diagram) + [].tap do |entities| + klass.class_eval do + define_method :process_entity do |entity, attributes| + entities << entity + end + end + klass.create(options) + end + end + + def retrieve_attribute_lists(options = {}) + klass = Class.new(Diagram) + {}.tap do |attribute_lists| + klass.class_eval do + define_method :process_entity do |entity, attributes| + attribute_lists[entity.model] = attributes + end + end + klass.create(options) + end + end + # Diagram ================================================================== test "create class method should return result of save" do create_simple_domain subclass = Class.new(Diagram) do def save @@ -51,7 +87,141 @@ end def process_relationship(*args) end end.create end + end + + # Entity filtering ========================================================= + test "generate should yield entities" do + create_model "Foo" + assert_equal [Foo], retrieve_entities.map(&:model) + end + + test "generate should filter disconnected entities if disconnected is false" do + create_model "Book", :author => :references do + belongs_to :author + end + create_model "Author" + create_model "Table", :type => :string + assert_equal [Author, Book], retrieve_entities(:disconnected => false).map(&:model) + end + + test "generate should yield disconnected entities if disconnected is true" do + create_model "Foo", :type => :string + assert_equal [Foo], retrieve_entities(:disconnected => true).map(&:model) + end + + test "generate should filter descendant entities" do + create_model "Foo", :type => :string + Object.const_set :SpecialFoo, Class.new(Foo) + assert_equal [Foo], retrieve_entities.map(&:model) + end + + test "generate should yield descended entities with distinct tables" do + create_model "Foo" + Object.const_set :SpecialFoo, Class.new(Foo) + SpecialFoo.class_eval do + set_table_name "special_foo" + end + create_table "special_foo", {}, true + assert_equal [Foo, SpecialFoo], retrieve_entities.map(&:model) + end + + # Relationship filtering =================================================== + test "generate should yield relationships" do + create_simple_domain + assert_equal 1, retrieve_relationships.length + end + + test "generate should yield indirect relationships if indirect is true" do + create_model "Foo" do + has_many :bazs + has_many :bars + end + create_model "Bar", :foo => :references do + belongs_to :foo + has_many :bazs, :through => :foo + end + create_model "Baz", :foo => :references do + belongs_to :foo + end + assert_equal [false, false, true], retrieve_relationships(:indirect => true).map(&:indirect?) + end + + test "generate should filter indirect relationships if indirect is false" do + create_model "Foo" do + has_many :bazs + has_many :bars + end + create_model "Bar", :foo => :references do + belongs_to :foo + has_many :bazs, :through => :foo + end + create_model "Baz", :foo => :references do + belongs_to :foo + end + assert_equal [false, false], retrieve_relationships(:indirect => false).map(&:indirect?) + end + + test "generate should filter relationships from descendant entities" do + create_model "Foo", :bar => :references + create_model "Bar", :type => :string + Object.const_set :SpecialBar, Class.new(Bar) + SpecialBar.class_eval do + has_many :foos + end + assert_equal [], retrieve_relationships + end + + test "generate should filter relationships to descendant entities" do + create_model "Foo", :type => :string, :bar => :references + Object.const_set :SpecialFoo, Class.new(Foo) + create_model "Bar" do + has_many :special_foos + end + assert_equal [], retrieve_relationships + end + + # Attribute filtering ====================================================== + test "generate should yield regular attributes by default" do + create_model "Book", :title => :string, :created_at => :datetime, :author => :references do + belongs_to :author + end + create_model "Author" + assert_equal %w{title}, retrieve_attribute_lists[Book].map(&:name) + end + + test "generate should yield primary key attributes if included" do + create_model "Book", :title => :string + create_model "Page", :book => :references do + belongs_to :book + end + assert_equal %w{id}, retrieve_attribute_lists(:attributes => [:primary_keys])[Book].map(&:name) + end + + test "generate should yield foreign key attributes if included" do + create_model "Book", :author => :references do + belongs_to :author + end + create_model "Author" + assert_equal %w{author_id}, retrieve_attribute_lists(:attributes => [:foreign_keys])[Book].map(&:name) + end + + test "generate should yield timestamp attributes if included" do + create_model "Book", :created_at => :datetime, :created_on => :date, :updated_at => :datetime, :updated_on => :date + create_model "Page", :book => :references do + belongs_to :book + end + assert_equal %w{created_at created_on updated_at updated_on}, + retrieve_attribute_lists(:attributes => [:timestamps])[Book].map(&:name) + end + + test "generate should yield combinations of attributes if included" do + create_model "Book", :created_at => :datetime, :title => :string, :author => :references do + belongs_to :author + end + create_model "Author" + assert_equal %w{created_at title}, + retrieve_attribute_lists(:attributes => [:regular, :timestamps])[Book].map(&:name) end end