|
| 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 |
0 commit comments