dimitarvp

dimitarvp

Cannot find or invoke local XYZ inside match -- ideas?

I am trying to make ergonomic test helpers like so:

  def violated_unique_constraint?(
        field,
        {:error,
         %Changeset{
           errors: [
             {field,
              {_,
               [
                 {:constraint, :unique},
                 {:constraint_name, _}
               ]}}
           ]
         }}
      ),
      do: true

  def violated_unique_constraint?(_, _), do: false

Which in my tests I am invoking like so:

assert violated_unique_constraint?(:country_code) =
             insert(%{country_code: "us", ...})

Which fails with:

** (CompileError) test/schema/whatever_test.exs:15 cannot find or invoke local violated_unique_constraint?/1 inside match. Only macros can be invoked in a match and they must be defined before their invocation. Called as: violated_unique_constraint?(:country_code)

You’ll notice I am matching the first parameter inside the second which AFAIK is allowed in Elixir and worked really well for me in other scenarios.

What am I doing wrong?

Marked As Solved

fuelen

fuelen

violated_unique_constraint? has arity 2, so

assert violated_unique_constraint?(:country_code, insert(%{country_code: "us", ...}))

Also Liked

lud

lud

It does not work for me:

iex(1)> defmodule X do
...(1)> def indentity(x), do: x
...(1)> end
{:module, X,
 <<70, 79, 82, 49, 0, 0, 4, 212, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 137,
   0, 0, 0, 14, 8, 69, 108, 105, 120, 105, 114, 46, 88, 8, 95, 95, 105, 110,
   102, 111, 95, 95, 10, 97, 116, 116, 114, ...>>, {:indentity, 1}}
iex(2)> require ExUnit.Assertions
ExUnit.Assertions
iex(3)> ExUnit.Assertions.assert X.identity(1) = 1
** (CompileError) iex:3: cannot invoke remote function X.identity/1 inside a match
    (stdlib 3.14) lists.erl:1358: :lists.mapfoldl/3
    (stdlib 3.14) lists.erl:1358: :lists.mapfoldl/3
    expanding macro: ExUnit.Assertions.assert/1

To be more precise, I know you can assert with a valid match expression, but that’s it. No left-side function calls (same rules as for case, receive).

lud

lud

I ran mix new dimi and then wrote this:

defmodule Dimi do

  def hello do
    :world
  end

  def indentity(x), do: x
end

and this

defmodule DimiTest do
  use ExUnit.Case
  doctest Dimi

  test "greets the world" do
    assert Dimi.hello() == :world
    assert Dimi.identity(1) = 1
  end
end

And you get the same error. Left-side function calls on match operations are not supported. And I don’t see a reason they should be supported in assert since they would not be anywhere else anyway.

Edit: also it makes sense because you can do that:

assert {:ok, data} = stuff()
do_something_with(data)

So the match has to be executed since we may want to work with the bound variables. So it has to be a valid match expression.

Where Next?

Popular in Questions Top

Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call t...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
dotdotdotPaul
Okay, I’m having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I’m sure I’...
New

Other popular topics Top

JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
boundedvariable
I am going through the kafka architecture. All the features what the kafka is providing are already in Erlang. I would like hear your opi...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

Latest on Elixir Forum

We're in Beta

About us Mission Statement