require_relative "spec_helper.rb" class MyObject < JsonObject attribute :name attribute :version attribute :licenses attribute :urls do attribute :homepage attribute :download end attribute :custom end class MyDerivedObject < MyObject end class MyOtherObject < JsonObject attribute :hello end describe JsonObject do describe "construction" do it "works when two JsonObjects are defined" do object = MyOtherObject.new object.hello = "world" expect(object.hello).to eq "world" end it "defines internal classes" do object = MyObject.new expect(object.urls).to be_a MyObject::Urls end it "inherits keys from super class" do expect(MyDerivedObject.all_keys).to include(:name) end it "can instantiate sub class" do object = MyDerivedObject.new object.name = "Sub Jason" expect(object.name).to eq "Sub Jason" end end describe "attributes" do it "defines accessors" do object = MyObject.new object.name = "Jason" expect(object.name).to eq "Jason" object.version = "1.2.3" expect(object.version).to eq "1.2.3" object.licenses = ["GPLv2", "LGPLv2.1"] expect(object.licenses).to eq ["GPLv2", "LGPLv2.1"] object.urls.homepage = "http://example.com" expect(object.urls.homepage).to eq "http://example.com" end it "returns validity of objects" do object = MyObject.new expect(object.valid?).to be false expect(object.urls.valid?).to be false object.name = "Jason" expect(object.valid?).to be true expect(object.urls.valid?).to be false object.urls.homepage = "http://example.com" expect(object.valid?).to be true expect(object.urls.valid?).to be true end it "returns nil for unset attribute" do json = < "1", "two" => "2" }) end it "raises exception on unexpected attribute" do json = < "Jason", :version => "1.2.3", :licenses => ["GPLv2", "LGPLv2.1"], :urls => { :homepage => "http://example.com", :download => "http://example.org/download" } } expect(object.to_hash).to eq expected_hash end it "to JSON" do expected_json = @json object = MyObject.new object.name = "Jason" object.version = "1.2.3" object.licenses = ["GPLv2", "LGPLv2.1"] object.urls.homepage = "http://example.com" object.urls.download = "http://example.org/download" expect(object.to_json).to eq expected_json end it "only attributes which have a value" do object = MyObject.new object.name = "Jason" expected_json = <