Skip to content

Commit d5cdfcd

Browse files
greg-rychlewskiGreg Rychlewski
and
Greg Rychlewski
authored
Extract json tests and tailor them for sqlite3 (#82)
Co-authored-by: Greg Rychlewski <[email protected]>
1 parent c72aa10 commit d5cdfcd

File tree

2 files changed

+98
-4
lines changed

2 files changed

+98
-4
lines changed

integration_test/json_test.exs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
defmodule Ecto.Integration.JsonTest do
2+
use Ecto.Integration.Case, async: true
3+
4+
import Ecto.Query
5+
6+
alias Ecto.Integration.TestRepo
7+
alias Ecto.Integration.Order
8+
9+
test "json_extract_path with primitive values" do
10+
order = %Order{
11+
meta: %{
12+
:id => 123,
13+
:time => ~T[09:00:00],
14+
"code" => "good",
15+
"'single quoted'" => "bar",
16+
"\"double quoted\"" => "baz",
17+
"enabled" => true,
18+
"extra" => [%{"enabled" => false}]
19+
}
20+
}
21+
22+
order = TestRepo.insert!(order)
23+
24+
assert TestRepo.one(from(o in Order, select: o.meta["id"])) == 123
25+
assert TestRepo.one(from(o in Order, select: o.meta["bad"])) == nil
26+
assert TestRepo.one(from(o in Order, select: o.meta["bad"]["bad"])) == nil
27+
28+
field = "id"
29+
assert TestRepo.one(from(o in Order, select: o.meta[^field])) == 123
30+
assert TestRepo.one(from(o in Order, select: o.meta["time"])) == "09:00:00"
31+
assert TestRepo.one(from(o in Order, select: o.meta["'single quoted'"])) == "bar"
32+
assert TestRepo.one(from(o in Order, select: o.meta["';"])) == nil
33+
assert TestRepo.one(from(o in Order, select: o.meta["\"double quoted\""])) == "baz"
34+
assert TestRepo.one(from(o in Order, select: o.meta["enabled"])) == 1
35+
assert TestRepo.one(from(o in Order, select: o.meta["extra"][0]["enabled"])) == 0
36+
37+
# where
38+
assert TestRepo.one(from(o in Order, where: o.meta["id"] == 123, select: o.id)) ==
39+
order.id
40+
41+
assert TestRepo.one(from(o in Order, where: o.meta["id"] == 456, select: o.id)) ==
42+
nil
43+
44+
assert TestRepo.one(from(o in Order, where: o.meta["code"] == "good", select: o.id)) ==
45+
order.id
46+
47+
assert TestRepo.one(from(o in Order, where: o.meta["code"] == "bad", select: o.id)) ==
48+
nil
49+
50+
assert TestRepo.one(
51+
from(o in Order, where: o.meta["enabled"] == true, select: o.id)
52+
) == order.id
53+
54+
assert TestRepo.one(
55+
from(o in Order,
56+
where: o.meta["extra"][0]["enabled"] == false,
57+
select: o.id
58+
)
59+
) == order.id
60+
end
61+
62+
test "json_extract_path with arrays and objects" do
63+
order = %Order{meta: %{tags: [%{name: "red"}, %{name: "green"}]}}
64+
order = TestRepo.insert!(order)
65+
66+
assert TestRepo.one(from(o in Order, select: o.meta["tags"][0]["name"])) == "red"
67+
assert TestRepo.one(from(o in Order, select: o.meta["tags"][99]["name"])) == nil
68+
69+
index = 1
70+
71+
assert TestRepo.one(from(o in Order, select: o.meta["tags"][^index]["name"])) ==
72+
"green"
73+
74+
# where
75+
assert TestRepo.one(
76+
from(o in Order, where: o.meta["tags"][0]["name"] == "red", select: o.id)
77+
) == order.id
78+
79+
assert TestRepo.one(
80+
from(o in Order, where: o.meta["tags"][0]["name"] == "blue", select: o.id)
81+
) == nil
82+
83+
assert TestRepo.one(
84+
from(o in Order, where: o.meta["tags"][99]["name"] == "red", select: o.id)
85+
) == nil
86+
end
87+
88+
test "json_extract_path with embeds" do
89+
order = %Order{items: [%{valid_at: ~D[2020-01-01]}]}
90+
TestRepo.insert!(order)
91+
92+
assert TestRepo.one(from(o in Order, select: o.items[0]["valid_at"])) ==
93+
"2020-01-01"
94+
end
95+
end

integration_test/test_helper.exs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,9 @@ ExUnit.start(
111111

112112
# SQLite3 does not support the concat function
113113
:concat,
114-
114+
# SQLite3 does not support placeholders
115115
:placeholders,
116-
117-
# Fails the regex matching because it uses square brackets outside of the parameter list
118-
:parameter_logging
116+
# SQLite3 stores booleans as integers, causing Ecto's json_extract_path tests to fail
117+
:json_extract_path
119118
]
120119
)

0 commit comments

Comments
 (0)