@@ -33,6 +33,8 @@ defmodule Ecto.Repo.AutogenerateTest do
3333
3434 schema "default" do
3535 field :code , Ecto.UUID , autogenerate: true
36+ field :uuid_v4 , Ecto.UUID , autogenerate: [ version: 4 ]
37+ field :uuid_v7 , Ecto.UUID , autogenerate: [ version: 7 ]
3638 has_one :manager , Manager
3739 has_many :offices , Office
3840 timestamps ( )
@@ -117,6 +119,7 @@ defmodule Ecto.Repo.AutogenerateTest do
117119 def load ( id , _ , % { prefix: prefix } ) , do: { :ok , prefix <> @ separator <> to_string ( id ) }
118120
119121 def dump ( nil , _ , _ ) , do: { :ok , nil }
122+
120123 def dump ( data , _ , % { prefix: _prefix } ) ,
121124 do: { :ok , data |> String . split ( @ separator ) |> List . last ( ) |> Integer . parse ( ) }
122125 end
@@ -160,6 +163,22 @@ defmodule Ecto.Repo.AutogenerateTest do
160163 assert byte_size ( code_uuid ) == 36
161164 end
162165
166+ test "autogenerates uuid v4 and v7 values" do
167+ schema = TestRepo . insert! ( % Company { } )
168+ assert byte_size ( schema . uuid_v4 ) == 36
169+ assert byte_size ( schema . uuid_v7 ) == 36
170+
171+ changeset = Ecto.Changeset . cast ( % Company { } , % { } , [ ] )
172+ schema = TestRepo . insert! ( changeset )
173+ assert byte_size ( schema . uuid_v4 ) == 36
174+ assert byte_size ( schema . uuid_v7 ) == 36
175+
176+ changeset = Ecto.Changeset . cast ( % Company { } , % { uuid_v4: nil , uuid_v7: nil } , [ ] )
177+ schema = TestRepo . insert! ( changeset )
178+ assert byte_size ( schema . uuid_v4 ) == 36
179+ assert byte_size ( schema . uuid_v7 ) == 36
180+ end
181+
163182 ## Timestamps
164183
165184 test "sets inserted_at and updated_at values" do
@@ -193,24 +212,27 @@ defmodule Ecto.Repo.AutogenerateTest do
193212 end
194213
195214 test "does not update updated_at when the associated record did not change" do
196- company = TestRepo . insert! ( % Company { offices: [ % Office { id: 1 , name: "1" } , % Office { id: 2 , name: "2" } ] } )
215+ company =
216+ TestRepo . insert! ( % Company { offices: [ % Office { id: 1 , name: "1" } , % Office { id: 2 , name: "2" } ] } )
217+
197218 [ office_one , office_two ] = company . offices
198219
199220 changes = % { offices: [ % { id: 1 , name: "updated" } , % { id: 2 , name: "2" } ] }
221+
200222 updated_company =
201223 company
202224 |> Ecto.Changeset . cast ( changes , [ ] )
203225 |> Ecto.Changeset . cast_assoc ( :offices )
204226 |> TestRepo . update! ( )
227+
205228 [ updated_office_one , updated_office_two ] = updated_company . offices
206229 assert updated_office_one . updated_at != office_one . updated_at
207230 assert updated_office_two . updated_at == office_two . updated_at
208231 end
209232
210233 test "does not set inserted_at and updated_at values if they were previously set" do
211234 naive_datetime = ~N[ 2000-01-01 00:00:00]
212- default = TestRepo . insert! ( % Company { inserted_at: naive_datetime ,
213- updated_at: naive_datetime } )
235+ default = TestRepo . insert! ( % Company { inserted_at: naive_datetime , updated_at: naive_datetime } )
214236 assert default . inserted_at == naive_datetime
215237 assert default . updated_at == naive_datetime
216238
@@ -226,7 +248,7 @@ defmodule Ecto.Repo.AutogenerateTest do
226248 assert % DateTime { time_zone: "Etc/UTC" , microsecond: { 0 , 0 } } = default . updated_on
227249 assert default . created_on == default . updated_on
228250
229- default = TestRepo . update! ( % Manager { id: 1 } |> Ecto.Changeset . change , force: true )
251+ default = TestRepo . update! ( % Manager { id: 1 } |> Ecto.Changeset . change ( ) , force: true )
230252 refute default . created_on
231253 assert % DateTime { time_zone: "Etc/UTC" , microsecond: { 0 , 0 } } = default . updated_on
232254 end
@@ -237,7 +259,7 @@ defmodule Ecto.Repo.AutogenerateTest do
237259 assert % NaiveDateTime { microsecond: { 0 , 0 } } = default . updated_at
238260 assert default . inserted_at == default . updated_at
239261
240- default = TestRepo . update! ( % NaiveMod { id: 1 } |> Ecto.Changeset . change , force: true )
262+ default = TestRepo . update! ( % NaiveMod { id: 1 } |> Ecto.Changeset . change ( ) , force: true )
241263 refute default . inserted_at
242264 assert % NaiveDateTime { microsecond: { 0 , 0 } } = default . updated_at
243265 end
@@ -248,7 +270,7 @@ defmodule Ecto.Repo.AutogenerateTest do
248270 assert % NaiveDateTime { microsecond: { _ , 6 } } = default . updated_at
249271 assert default . inserted_at == default . updated_at
250272
251- default = TestRepo . update! ( % NaiveUsecMod { id: 1 } |> Ecto.Changeset . change , force: true )
273+ default = TestRepo . update! ( % NaiveUsecMod { id: 1 } |> Ecto.Changeset . change ( ) , force: true )
252274 refute default . inserted_at
253275 assert % NaiveDateTime { microsecond: { _ , 6 } } = default . updated_at
254276 end
@@ -259,7 +281,7 @@ defmodule Ecto.Repo.AutogenerateTest do
259281 assert % DateTime { time_zone: "Etc/UTC" , microsecond: { 0 , 0 } } = default . updated_at
260282 assert default . inserted_at == default . updated_at
261283
262- default = TestRepo . update! ( % UtcMod { id: 1 } |> Ecto.Changeset . change , force: true )
284+ default = TestRepo . update! ( % UtcMod { id: 1 } |> Ecto.Changeset . change ( ) , force: true )
263285 refute default . inserted_at
264286 assert % DateTime { time_zone: "Etc/UTC" , microsecond: { 0 , 0 } } = default . updated_at
265287 end
@@ -270,7 +292,7 @@ defmodule Ecto.Repo.AutogenerateTest do
270292 assert % DateTime { time_zone: "Etc/UTC" , microsecond: { _ , 6 } } = default . updated_at
271293 assert default . inserted_at == default . updated_at
272294
273- default = TestRepo . update! ( % UtcUsecMod { id: 1 } |> Ecto.Changeset . change , force: true )
295+ default = TestRepo . update! ( % UtcUsecMod { id: 1 } |> Ecto.Changeset . change ( ) , force: true )
274296 refute default . inserted_at
275297 assert % DateTime { time_zone: "Etc/UTC" , microsecond: { _ , 6 } } = default . updated_at
276298 end
0 commit comments