mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Treat invalid uuid as nil
This commit is contained in:
parent
defc68004d
commit
f378f23653
3 changed files with 51 additions and 1 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
* PostgreSQL invalid `uuid` are convert to nil.
|
||||||
|
|
||||||
|
*Abdelkader Boudih*
|
||||||
|
|
||||||
* Fix the schema dump generated for tables without constraints and with
|
* Fix the schema dump generated for tables without constraints and with
|
||||||
primary key with default value of custom PostgreSQL function result.
|
primary key with default value of custom PostgreSQL function result.
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,21 @@ module ActiveRecord
|
||||||
module PostgreSQL
|
module PostgreSQL
|
||||||
module OID # :nodoc:
|
module OID # :nodoc:
|
||||||
class Uuid < Type::Value # :nodoc:
|
class Uuid < Type::Value # :nodoc:
|
||||||
|
RFC_4122 = %r{\A\{?[a-fA-F0-9]{4}-?
|
||||||
|
[a-fA-F0-9]{4}-?
|
||||||
|
[a-fA-F0-9]{4}-?
|
||||||
|
[1-5][a-fA-F0-9]{3}-?
|
||||||
|
[8-Bab][a-fA-F0-9]{3}-?
|
||||||
|
[a-fA-F0-9]{4}-?
|
||||||
|
[a-fA-F0-9]{4}-?
|
||||||
|
[a-fA-F0-9]{4}-?\}?\z}x
|
||||||
|
|
||||||
def type
|
def type
|
||||||
:uuid
|
:uuid
|
||||||
end
|
end
|
||||||
|
|
||||||
def type_cast(value)
|
def type_cast(value)
|
||||||
value.presence
|
value.to_s[RFC_4122, 0]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -60,6 +60,43 @@ class PostgresqlUUIDTest < ActiveRecord::TestCase
|
||||||
assert_equal(nil, UUIDType.last.guid)
|
assert_equal(nil, UUIDType.last.guid)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_treat_invalid_uuid_as_nil
|
||||||
|
uuid = UUIDType.create! guid: 'foobar'
|
||||||
|
assert_equal(nil, uuid.guid)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_uuid_dont_modify_before_type_cast
|
||||||
|
uuid = UUIDType.new guid: 'foobar'
|
||||||
|
assert_equal 'foobar', uuid.guid_before_type_cast
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_rfc_4122_regex
|
||||||
|
# Valid uuids
|
||||||
|
['A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11',
|
||||||
|
'{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}',
|
||||||
|
'a0eebc999c0b4ef8bb6d6bb9bd380a11',
|
||||||
|
'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11',
|
||||||
|
'{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}'].each do |valid_uuid|
|
||||||
|
uuid = UUIDType.new guid: valid_uuid
|
||||||
|
assert_not_nil uuid.guid
|
||||||
|
end
|
||||||
|
|
||||||
|
# Invalid uuids
|
||||||
|
[['A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11'],
|
||||||
|
Hash.new,
|
||||||
|
0,
|
||||||
|
0.0,
|
||||||
|
true,
|
||||||
|
'Z0000C99-9C0B-4EF8-BB6D-6BB9BD380A11',
|
||||||
|
'{a0eebc99-9c0b-4ef8-fb6d-6bb9bd380a11}',
|
||||||
|
'a0eebc999r0b4ef8ab6d6bb9bd380a11',
|
||||||
|
'a0ee-bc99------4ef8-bb6d-6bb9-bd38-0a11',
|
||||||
|
'{a0eebc99-bb6d6bb9-bd380a11}'].each do |invalid_uuid|
|
||||||
|
uuid = UUIDType.new guid: invalid_uuid
|
||||||
|
assert_nil uuid.guid
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_uuid_formats
|
def test_uuid_formats
|
||||||
["A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11",
|
["A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11",
|
||||||
"{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}",
|
"{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}",
|
||||||
|
|
Loading…
Reference in a new issue