Skip to content

Commit 4080160

Browse files
authored
Avoid CaseClouseError when an update does not modify the document (#135)
1 parent 27475f9 commit 4080160

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

lib/mongo/repo.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ defmodule Mongo.Repo do
7575

7676
case Mongo.update_one(@topology, collection, %{_id: id}, %{"$set" => module.dump(doc)}, []) do
7777
{:error, reason} -> {:error, reason}
78-
{:ok, %{modified_count: 1}} -> {:ok, doc}
78+
{:ok, %{modified_count: _}} -> {:ok, doc}
7979
end
8080
end
8181

@@ -85,7 +85,7 @@ defmodule Mongo.Repo do
8585
case Mongo.update_one(@topology, collection, %{_id: id}, %{"$set" => module.dump(doc)}, upsert: true) do
8686
{:error, reason} -> {:error, reason}
8787
{:ok, %{upserted_ids: [id]}} -> {:ok, %{doc | _id: id}}
88-
{:ok, %{modified_count: 1}} -> {:ok, doc}
88+
{:ok, %{modified_count: _}} -> {:ok, doc}
8989
end
9090
end
9191

@@ -117,7 +117,7 @@ defmodule Mongo.Repo do
117117

118118
case update_one_result do
119119
%{upserted_ids: [id]} -> %{doc | _id: id}
120-
%{modified_count: 1} -> doc
120+
%{modified_count: _} -> doc
121121
end
122122
end
123123

test/mongo/repo_test.exs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,15 @@ defmodule Mongo.RepoTest do
348348
|> Map.put(:title, "updated")
349349
|> MyRepo.update()
350350
end
351+
352+
test "updates a document without changes" do
353+
{:ok, post} =
354+
Post.new()
355+
|> Map.put(:title, "test")
356+
|> MyRepo.insert()
357+
358+
{:ok, %Post{title: "test"}} = MyRepo.update(post)
359+
end
351360
end
352361

353362
describe "update!/1" do
@@ -362,6 +371,15 @@ defmodule Mongo.RepoTest do
362371
|> Map.put(:title, "updated")
363372
|> MyRepo.update!()
364373
end
374+
375+
test "updates a document without changes" do
376+
{:ok, post} =
377+
Post.new()
378+
|> Map.put(:title, "test")
379+
|> MyRepo.insert()
380+
381+
%Post{title: "test"} = MyRepo.update!(post)
382+
end
365383
end
366384

367385
describe "insert_or_update/1" do
@@ -388,6 +406,18 @@ defmodule Mongo.RepoTest do
388406
assert Map.get(post, :_id) == Map.get(updated, :_id)
389407
assert updated.title == "updated"
390408
end
409+
410+
test "updates a document without changes if it does already exist" do
411+
{:ok, post} =
412+
Post.new()
413+
|> Map.put(:title, "test")
414+
|> MyRepo.insert_or_update()
415+
416+
{:ok, updated} = MyRepo.insert_or_update(post)
417+
418+
assert Map.get(post, :_id) == Map.get(updated, :_id)
419+
assert updated.title == "test"
420+
end
391421
end
392422

393423
describe "insert_or_update!/1" do
@@ -414,6 +444,18 @@ defmodule Mongo.RepoTest do
414444
assert Map.get(post, :_id) == Map.get(updated, :_id)
415445
assert updated.title == "updated"
416446
end
447+
448+
test "updates a document without changes if it does already exist" do
449+
post =
450+
Post.new()
451+
|> Map.put(:title, "test")
452+
|> MyRepo.insert_or_update!()
453+
454+
updated = MyRepo.insert_or_update!(post)
455+
456+
assert Map.get(post, :_id) == Map.get(updated, :_id)
457+
assert updated.title == "test"
458+
end
417459
end
418460

419461
describe "delete/2" do

0 commit comments

Comments
 (0)