Commit ef3a662

mokha <mokha@cisco.com>
2019-01-11 01:20:18
add specs for type validations
1 parent 1970146
Changed files (2)
lib
spec
lib/scim/kit/v2/attribute_type.rb
@@ -32,7 +32,7 @@ module Scim
           datetime: ->(x) { x.is_a?(DateTime) },
           decimal: ->(x) { x.is_a?(Float) },
           integer: ->(x) { x&.integer? },
-          reference: ->(x) { URI.parse(x) },
+          reference: ->(x) { x =~ /\A#{URI.regexp(%w[http https])}\z/ },
           string: ->(x) { x.is_a?(String) }
         }.freeze
         attr_accessor :canonical_values
spec/scim/kit/v2/attribute_type_spec.rb
@@ -63,4 +63,40 @@ RSpec.describe Scim::Kit::V2::AttributeType do
       specify { expect(build(canonical_values: %w[User Group]).to_h[:canonicalValues]).to match_array(%w[User Group]) }
     end
   end
+
+  describe '#valid?' do
+    let(:image) { Base64.strict_encode64(IO.read('./spec/fixtures/avatar.png', mode: 'rb')) }
+
+    specify { expect(described_class.new(name: :x, type: :binary)).to be_valid(image) }
+    specify { expect(described_class.new(name: :x, type: :binary)).not_to be_valid('hello') }
+    specify { expect(described_class.new(name: :x, type: :binary)).not_to be_valid(1) }
+    specify { expect(described_class.new(name: :x, type: :binary)).not_to be_valid([1]) }
+
+    specify { expect(described_class.new(name: :x, type: :boolean)).to be_valid(true) }
+    specify { expect(described_class.new(name: :x, type: :boolean)).to be_valid(false) }
+    specify { expect(described_class.new(name: :x, type: :boolean)).not_to be_valid('false') }
+    specify { expect(described_class.new(name: :x, type: :boolean)).not_to be_valid(1) }
+
+    specify { expect(described_class.new(name: :x, type: :datetime)).to be_valid(DateTime.now) }
+    specify { expect(described_class.new(name: :x, type: :datetime)).not_to be_valid(DateTime.now.iso8601) }
+    specify { expect(described_class.new(name: :x, type: :datetime)).not_to be_valid(Time.now.to_i) }
+    specify { expect(described_class.new(name: :x, type: :datetime)).not_to be_valid(Time.now) }
+
+    specify { expect(described_class.new(name: :x, type: :decimal)).to be_valid(1.0) }
+    specify { expect(described_class.new(name: :x, type: :decimal)).not_to be_valid(1) }
+    specify { expect(described_class.new(name: :x, type: :decimal)).not_to be_valid('1.0') }
+
+    specify { expect(described_class.new(name: :x, type: :integer)).to be_valid(1) }
+    specify { expect(described_class.new(name: :x, type: :integer)).to be_valid(1_000) }
+    specify { expect(described_class.new(name: :x, type: :integer)).not_to be_valid(10.0) }
+
+    specify { expect(described_class.new(name: :x, type: :reference)).to be_valid(FFaker::Internet.uri('https')) }
+    specify { expect(described_class.new(name: :x, type: :reference)).not_to be_valid('hello') }
+    specify { expect(described_class.new(name: :x, type: :reference)).not_to be_valid(1) }
+    specify { expect(described_class.new(name: :x, type: :reference)).not_to be_valid(['hello']) }
+
+    specify { expect(described_class.new(name: :x)).to be_valid('name') }
+    specify { expect(described_class.new(name: :x)).not_to be_valid(1) }
+    specify { expect(described_class.new(name: :x)).not_to be_valid(['string']) }
+  end
 end