diff --git a/lib/open_rtb_ecto/v2/bid_request/brand_version.ex b/lib/open_rtb_ecto/v2/bid_request/brand_version.ex index a849a65..df51dee 100644 --- a/lib/open_rtb_ecto/v2/bid_request/brand_version.ex +++ b/lib/open_rtb_ecto/v2/bid_request/brand_version.ex @@ -20,7 +20,6 @@ defmodule OpenRtbEcto.V2.BidRequest.BrandVersion do version |> cast(attrs, [:brand, :version]) |> OpenRtbEcto.safe_cast_ext(attrs) - |> validate_required([:brand]) end def changeset(version, _), do: change(version) diff --git a/lib/open_rtb_ecto/v2/bid_request/user_agent.ex b/lib/open_rtb_ecto/v2/bid_request/user_agent.ex index cca02ef..44f9f88 100644 --- a/lib/open_rtb_ecto/v2/bid_request/user_agent.ex +++ b/lib/open_rtb_ecto/v2/bid_request/user_agent.ex @@ -29,9 +29,17 @@ defmodule OpenRtbEcto.V2.BidRequest.UserAgent do user_agent |> cast(attrs, [:mobile, :architecture, :bitness, :model, :source]) |> OpenRtbEcto.safe_cast_ext(attrs) - |> cast_embed(:browsers) + |> safe_cast_browsers(attrs) |> cast_embed(:platform) end def changeset(user_agent, _), do: change(user_agent) + + defp safe_cast_browsers(changeset, %{"browsers" => browsers}) when is_list(browsers), + do: cast_embed(changeset, :browsers) + + defp safe_cast_browsers(changeset, %{browsers: browsers}) when is_list(browsers), + do: cast_embed(changeset, :browsers) + + defp safe_cast_browsers(changeset, _attrs), do: changeset end diff --git a/test/open_rtb_ecto/v2/bid_request_test.exs b/test/open_rtb_ecto/v2/bid_request_test.exs index 38aec34..feb1e71 100644 --- a/test/open_rtb_ecto/v2/bid_request_test.exs +++ b/test/open_rtb_ecto/v2/bid_request_test.exs @@ -134,6 +134,20 @@ defmodule OpenRtbEcto.V2.BidRequestTest do }} = OpenRtbEcto.cast(BidRequest, data) end + test "structured user-agent with null browsers and empty brand" do + data = TestHelper.test_data("v2/request", "structured-ua.json") + + data = + put_in(data, ["device", "sua"], %{ + "browsers" => nil, + "platform" => %{"brand" => ""}, + "source" => 0 + }) + + assert {:ok, %BidRequest{device: %Device{sua: %UserAgent{browsers: [], source: 0}}}} = + OpenRtbEcto.cast(BidRequest, data) + end + test "multiple imps" do data = TestHelper.test_data("v2/request", "multi-imp.json") assert {:ok, %BidRequest{} = req} = OpenRtbEcto.cast(BidRequest, data)