require "test_helper" class DefinitionsTest < Minitest::Spec NestedBuilder = ->(options) { base = options[:_base] || Declarative::Definitions.new(Declarative::Definitions::Definition) base.instance_exec(&options[:_block]) base } let (:schema) { Declarative::Definitions.new(Declarative::Definitions::Definition).extend(Declarative::Definitions::Inspect) } it "what" do # #add works with name schema.add :id # get works with symbol schema.get(:id).inspect.must_equal '#"id"}>' # get works with string schema.get("id").inspect.must_equal '#"id"}>' # #add with name and options schema.add(:id, unique: true) schema.get(:id).inspect.must_equal '#true, :name=>"id"}>' pp schema end it "overwrites old when called twice" do schema.add :id schema.add :id, cool: true schema.inspect.must_equal '{"id"=>#true, :name=>"id"}>}' end it "#add with block" do schema.add :artist, _nested_builder: NestedBuilder do add :name add :band, _nested_builder: NestedBuilder do add :location end end schema.inspect.must_equal '{"artist"=>#{"name"=>#"name"}>, "band"=>#{"location"=>#"location"}>}, :name=>"band"}>}, :name=>"artist"}>}' pp schema end it "#add with :nested instead of block" do nested_schema = Declarative::Definitions.new(Declarative::Definitions::Definition) nested_schema.extend(Declarative::Definitions::Inspect) nested_schema.add :name schema.add :artist, nested: nested_schema schema.inspect.must_equal '{"artist"=>#{"name"=>#"name"}>}, :name=>"artist"}>}' end it "#add with inherit: true and block" do schema.add :artist, cool: true, _nested_builder: NestedBuilder do add :name add :band, crazy: nil, _nested_builder: NestedBuilder do add :location end end schema.add :id, unique: true, value: 1 schema.add :artist, uncool: false, _nested_builder: NestedBuilder, inherit: true do add :band, normal: false, _nested_builder: NestedBuilder, inherit: true do add :genre end end schema.add :id, unique: false, inherit: true pp schema schema.inspect.must_equal '{"artist"=>#true, :nested=>{"name"=>#"name"}>, "band"=>#nil, :nested=>{"location"=>#"location"}>, "genre"=>#"genre"}>}, :name=>"band", :normal=>false}>}, :name=>"artist", :uncool=>false}>, "id"=>#false, :value=>1, :name=>"id"}>}' end it "#add with nested options followed by inherit: true" do schema.add :id, deserializer: options = { render: false } schema.add :id, inherit: true schema.get(:id)[:deserializer][:parse] = true options.must_equal(render: false) end end class DefinitionTest < Minitest::Spec let (:definition) { Declarative::Definitions::Definition.new(:name) } it "#merge does return deep copy" do options = { render: false } merged = definition.merge(options) definition.merge!(render: true) merged.must_equal(:name=>"name", render: false) end end