When running the “create session_occurence” test in test/dbservice_web/controllers/session_occurence_controller_test.exs
, I encountered the following error:
1) test update session_occurence renders session_occurence when data is valid (DbserviceWeb.SessionOccurenceControllerTest)
test/dbservice_web/controllers/session_occurence_controller_test.exs:67
** (Postgrex.Error) ERROR 42883 (undefined_function) operator does not exist: bigint = character varying
query: SELECT u0."id", u0."address", u0."city", u0."district", u0."email", u0."full_name", u0."gender", u0."phone", u0."pincode", u0."role", u0."state", u0."whatsapp_phone", u0."date_of_birth", u0."country", u0."inserted_at", u0."updated_at", u1."session_occurence_id"::bigint FROM "user" AS u0 INNER JOIN "user_session" AS u1 ON u0."id" = u1."user_id" WHERE (u1."session_occurence_id" = ANY($1)) ORDER BY u1."session_occurence_id"::bigint
hint: No operator matches the given name and argument types. You might need to add explicit type casts.
code: put(
stacktrace:
(ecto_sql 3.8.3) lib/ecto/adapters/sql.ex:932: Ecto.Adapters.SQL.raise_sql_call_error/1
(ecto_sql 3.8.3) lib/ecto/adapters/sql.ex:847: Ecto.Adapters.SQL.execute/6
(ecto 3.8.4) lib/ecto/repo/queryable.ex:221: Ecto.Repo.Queryable.execute/4
(ecto 3.8.4) lib/ecto/repo/queryable.ex:19: Ecto.Repo.Queryable.all/3
(elixir 1.14.2) lib/enum.ex:1658: Enum."-map/2-lists^map/1-0-"/2
(dbservice 0.1.0) lib/dbservice_web/views/session_occurence_view.ex:26: DbserviceWeb.SessionOccurenceView.render/2
(phoenix_view 1.1.2) lib/phoenix/view.ex:475: Phoenix.View.render_to_iodata/3
(phoenix 1.6.10) lib/phoenix/controller.ex:772: Phoenix.Controller.render_and_send/4
(dbservice 0.1.0) lib/dbservice_web/controllers/session_occurence_controller.ex:1: DbserviceWeb.SessionOccurenceController.action/2
(dbservice 0.1.0) lib/dbservice_web/controllers/session_occurence_controller.ex:1: DbserviceWeb.SessionOccurenceController.phoenix_controller_pipeline/2
(phoenix 1.6.10) lib/phoenix/router.ex:354: Phoenix.Router.__call__/2
(dbservice 0.1.0) lib/dbservice_web/endpoint.ex:1: DbserviceWeb.Endpoint.plug_builder_call/2
(dbservice 0.1.0) lib/dbservice_web/endpoint.ex:1: DbserviceWeb.Endpoint.call/2
(phoenix 1.6.10) lib/phoenix/test/conn_test.ex:225: Phoenix.ConnTest.dispatch/5
test/dbservice_web/controllers/session_occurence_controller_test.exs:72: (test)
Here is my test code
describe "create session_occurence" do
test "renders session_occurence when data is valid", %{conn: conn} do
conn = post(conn, Routes.session_occurence_path(conn, :create), get_ids_create_attrs())
%{"id" => id} = json_response(conn, 201)
conn = get(conn, Routes.session_occurence_path(conn, :show, id))
assert %{
"id" => ^id,
"end_time" => "2022-04-28T14:05:00Z",
"start_time" => "2022-04-28T14:05:00Z"
} = json_response(conn, 200)
end
defp get_ids_create_attrs do
session_occurence_fixture = session_occurence_fixture()
session_id = session_occurence_fixture.session_id
Map.merge(@create_attrs, %{session_id: session_id})
end
and here is my sessions_fixtures.ex
def session_occurence_fixture(attrs \\ %{}) do
{:ok, session_occurence} =
attrs
|> Enum.into(%{
end_time: ~U[2022-04-28 14:05:00Z],
start_time: ~U[2022-04-28 14:05:00Z],
session_id: get_session_id()
})
|> Dbservice.Sessions.create_session_occurence()
session_occurence
end
def get_session_id do
[head | _tail] = Sessions.list_session_occurence()
session_id = head.session_id
session_id
end
and here is my Dbservice.Sessions
def create_session_occurence(attrs \\ %{}) do
%SessionOccurence{}
|> SessionOccurence.changeset(attrs)
|> Repo.insert()
end
and here is my session_occurrence.ex
defmodule Dbservice.Sessions.SessionOccurence do
@moduledoc false
use Ecto.Schema
import Ecto.Changeset
import Dbservice.Utils.Util
alias Dbservice.Users.User
schema "session_occurrence" do
field :end_time, :utc_datetime
field :start_time, :utc_datetime
field :session_fk, :id
field :session_id, :string
timestamps()
many_to_many :users, User, join_through: "user_session", on_replace: :delete
end
@doc false
def changeset(session_occurrence, attrs) do
session_occurrence
|> cast(attrs, [:session_id, :start_time, :end_time, :session_fk])
|> validate_required([:session_id])
|> validate_start_end_date_time
end
defp validate_start_end_date_time(changeset) do
if get_field(changeset, :start_time, :end_time) != nil do
validate_start_end_datetime(changeset, :start_time, :end_time)
else
changeset
end
end
end