Are not showing erros of the unique index constraint

I am trying to show the error message and test the unique index
I create the index on the produtcs table:
create unique_index(:products, [:name])

on the schema I put:
|> unique_constraint(:name, name: :products_name_index)
also used:
|> unique_constraint(:name)
but it isn’t showing the error on the liveview and tests.
When I try to add by iex:

Products.create_product(prod)
2022-06-25 02:08:30.181 CEST [38686] ERROR:  duplicate key value violates unique constraint "products_name_index"
        2022-06-25 02:08:30.181 CEST [38686] DETAIL:  Key (name)=(water) already exists.
                                                                                        2022-06-25 02:08:30.181 CEST [38686] STATEMENT:  INSERT INTO "products" ("description","name","price","size","inserted_at","updated_at","id") VALUES ($1,$2,$3,$4,$5,$6,$7)
                                                 [debug] QUERY ERROR db=2.0ms queue=2.1ms idle=1179.5ms
INSERT INTO "products" ("description","name","price","size","inserted_at","updated_at","id") VALUES ($1,$2,$3,$4,$5,$6,$7) ["water 1l", "water", 5, "small", ~N[2022-06-25 00:08:30], ~N[2022-06-25 00:08:30], <<38, 38, 232, 141, 234, 198, 71, 215, 176, 145, 70, 194, 33, 70, 125, 209>>]
↳ :erl_eval.do_apply/6, at: erl_eval.erl:685
{:error,
 #Ecto.Changeset<
   action: :insert,
   changes: %{
     description: "water 1l",
     name: "water",
     price: %Money{amount: 5, currency: :BRL},
     size: "small"
   },
   errors: [
     name: {"has already been taken",
      [constraint: :unique, constraint_name: "products_name_index"]}
   ],
   data: #FoodOrder.Products.Product<>,
   valid?: false
 >}

It works but it is not showing on the liveview error_tag and when I test.
The others validation is showing like the can’t be blank.
What do I need to do?

Can you show your live view template code? It would also be helpful to show the logs from a live view request.

my app on github.

my form_component.html.heex:

<div>
  <.form let={f} for={@changeset} id={@id} phx-change="validate" phx-submit="save" phx-target={@myself} data-role="product-form">
    <div class="mb-4">
      <%= label f, :name, "Name*", class: "block text-gray-700 text-sm font-bold mb-2" %>
      <%= text_input f, :name, class: "shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline", placeholder: "Name*" %>
      <%= error_tag f, :name %>
    </div>
    <div class="mb-4">
      <%= label f, :description, class: "block text-gray-700 text-sm font-bold mb-2" %>
      <%= textarea f, :description, class: "shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline", placeholder: "Description" %>
      <%= error_tag f, :description %>
    </div>
    <div class="mb-4">
      <%= label f, :price, "Price*", class: "block text-gray-700 text-sm font-bold mb-2" %>
      <%= text_input f, :price, class: "shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline", placeholder: "Price*" %>
      <%= error_tag f, :price %>
    </div>
    <div class="mb-4">
      <%= label f, :size, "Size*", class: "block text-gray-700 text-sm font-bold mb-2" %>
      <%= text_input f, :size, class: "shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline", placeholder: "Size*" %>
      <%= error_tag f, :size %>
    </div>
    <div class="flex items-center">
      <%= submit "Create Product", phx_disable_with: "Creating...", class: "btn-primary rounded-full text-sm text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline" %>
    </div>
  </.form>
</div>

form_component.ex:

defmodule FoodOrderWeb.Admin.Products.Form.FormComponent do
  use FoodOrderWeb, :live_component
  alias FoodOrder.Products
  alias FoodOrder.Products.Product

  def update(assigns, socket) do
    changeset = Products.change_product()

    {:ok,
     socket
     |> assign(assigns)
     |> assign(changeset: changeset)
     |> assign(product: %Product{})}
  end

  def handle_event("validate", %{"product" => product_params}, socket) do
    changeset =
      socket.assigns.product
      |> Products.change_product(product_params)
      |> Map.put(:action, :validate)

    {:noreply, assign(socket, :changeset, changeset)}
  end

  def handle_event("save", %{"product" => product_params}, socket) do
    case Products.create_product(product_params) do
      {:ok, _product} ->
        {:noreply,
         socket
         |> put_flash(:info, "Product has created.")
         |> push_redirect(to: "/admin/products")}

      {:error, changeset} ->
        {:noreply, assign(socket, changeset: changeset)}
    end

    {:noreply, socket}
  end
end

and I am using inside the product_live.html.heex as:

<.modal>
  <.live_component module={FormComponent} id="new_product" />
</.modal>

I saw the error now it was the last {:noreply, socket} on the handle_event("save", ....)

I removed and worked.
thank you for reply @benwilson512