@@ -62,62 +62,63 @@ defmodule Together.Test.Fixtures do
6262 @ spec randomize ( any , [ String . t ( ) ] ) :: any
6363 def randomize ( value , extra_keys ) do
6464 id_map = Process . get ( @ id_map_dictionary_key , % { } )
65- { id_map , value } = randomize ( id_map , value , extra_keys )
65+ { id_map , value } = do_randomize ( id_map , value , extra_keys , false )
6666 Process . put ( @ id_map_dictionary_key , id_map )
6767
6868 value
6969 end
7070
71- @ spec randomize ( map , any , [ String . t ( ) ] ) :: { map , any }
72- defp randomize ( id_map , map_value , extra_keys ) when is_map ( map_value ) do
73- Enum . reduce ( map_value , { id_map , % { } } , fn
74- { key , value } , { id_map , modified_map } ->
75- if key == "id" or String . ends_with? ( key , "_id" ) or key in extra_keys do
76- cond do
77- is_nil ( value ) ->
78- { id_map , modified_map }
79-
80- is_integer ( value ) ->
81- new_id = Map . get_lazy ( id_map , value , fn -> System . unique_integer ( [ :positive ] ) end )
82- { Map . put ( id_map , value , new_id ) , Map . put ( modified_map , key , new_id ) }
83-
84- is_binary ( value ) ->
85- case Regex . scan ( @ uuid_re , value ) do
86- [ ] ->
87- new_id = Map . get_lazy ( id_map , value , fn -> "gen_" <> Ecto.UUID . generate ( ) end )
88- { Map . put ( id_map , value , new_id ) , Map . put ( modified_map , key , new_id ) }
89-
90- matches ->
91- { id_map , modified_value } =
92- Enum . reduce ( matches , { id_map , value } , fn [ match ] , { id_map , modified_value } ->
93- new_id = Map . get_lazy ( id_map , match , fn -> Ecto.UUID . generate ( ) end )
94-
95- { Map . put ( id_map , match , new_id ) ,
96- String . replace ( modified_value , match , new_id ) }
97- end )
98-
99- { id_map , Map . put ( modified_map , key , modified_value ) }
100- end
101-
102- :else ->
103- { id_map , modified_map }
104- end
105- else
106- { id_map , modified_value } = randomize ( id_map , value , extra_keys )
107- { id_map , Map . put ( modified_map , key , modified_value ) }
108- end
71+ @ spec do_randomize ( map , any , [ String . t ( ) ] , boolean ) :: { map , any }
72+ defp do_randomize ( ids , value , extra_keys , is_id? )
73+
74+ # Maps
75+ defp do_randomize ( id_map , map_value , extra_keys , _is_id? ) when is_map ( map_value ) do
76+ Enum . reduce ( map_value , { id_map , % { } } , fn { key , value } , { id_map , modified_map } ->
77+ is_id? = key == "id" or String . ends_with? ( key , "_id" ) or key in extra_keys
78+
79+ { id_map , modified_value } = do_randomize ( id_map , value , extra_keys , is_id? )
80+ { id_map , Map . put ( modified_map , key , modified_value ) }
10981 end )
11082 end
11183
112- defp randomize ( id_map , list_value , extra_keys ) when is_list ( list_value ) do
84+ # Lists
85+ defp do_randomize ( id_map , list_value , extra_keys , _is_id? ) when is_list ( list_value ) do
11386 { id_map , list_value } =
11487 Enum . reduce ( list_value , { id_map , [ ] } , fn list_element , { id_map , modified_list } ->
115- { id_map , modified_list_element } = randomize ( id_map , list_element , extra_keys )
88+ { id_map , modified_list_element } = do_randomize ( id_map , list_element , extra_keys , false )
11689 { id_map , [ modified_list_element | modified_list ] }
11790 end )
11891
11992 { id_map , Enum . reverse ( list_value ) }
12093 end
12194
122- defp randomize ( id_map , value , _extra_keys ) , do: { id_map , value }
95+ # Integer IDs
96+ defp do_randomize ( id_map , integer_value , _extra_keys , true ) when is_integer ( integer_value ) do
97+ new_id = Map . get_lazy ( id_map , integer_value , fn -> System . unique_integer ( [ :positive ] ) end )
98+ new_id_map = Map . put_new ( id_map , integer_value , new_id )
99+
100+ { new_id_map , new_id }
101+ end
102+
103+ # Binary IDs
104+ defp do_randomize ( id_map , binary_value , _extra_keys , true ) when is_binary ( binary_value ) do
105+ case Regex . scan ( @ uuid_re , binary_value ) do
106+ [ ] ->
107+ new_id = Map . get_lazy ( id_map , binary_value , fn -> "gen_" <> Ecto.UUID . generate ( ) end )
108+ { Map . put ( id_map , binary_value , new_id ) , new_id }
109+
110+ matches ->
111+ { id_map , modified_value } =
112+ Enum . reduce ( matches , { id_map , binary_value } , fn [ match ] , { id_map , modified_value } ->
113+ new_id = Map . get_lazy ( id_map , match , fn -> Ecto.UUID . generate ( ) end )
114+
115+ { Map . put ( id_map , match , new_id ) , String . replace ( modified_value , match , new_id ) }
116+ end )
117+
118+ { id_map , modified_value }
119+ end
120+ end
121+
122+ # Nil and non-ID values
123+ defp do_randomize ( id_map , value , _extra_keys , _is_id? ) , do: { id_map , value }
123124end
0 commit comments