Preventing repeated test code with Vex

So I have been learning Elixir, apologies if this is a simple question, i don’t even know what to search for to get what i want.

I have been using Vex to validate all of the validations i’ve set up but want to have tests around making sure the rules are all being met.

So far i’ve written a lot of code that is repetitive like the below. I’m curious if it’s possible to make these generic and then just pass in the struct and key?

    test "should fail when name is nil", s do
      # Arrange
      subject = %{s[:subject] | name: nil}

      # Act
      is_valid = Vex.valid?(subject)
      errors = Vex.errors(subject)

      # Assert
      refute is_valid

      assert Enum.member?(errors, {:error, :name, :presence, "is required"})
    end

    test "should fail when value is nil", s do
      # Arrange
      subject = %{s[:subject] | value: nil}

      # Act
      is_valid = Vex.valid?(subject)
      errors = Vex.errors(subject)

      # Assert
      refute is_valid

      assert Enum.member?(errors, {:error, :value, :presence, "is required"})
    end

I’d just pass in an empty map %{} and then make an assertion that all there.

I’m not sure i understand, what i’m basically trying to do is something like this…
I’m basically trying to work out how to pass an atom to name and then use that in place so that i can just do the tests in one line as configuration

    def checkRequired(%{} = subject, name) do
      # Arrange
      subject = %{subject | [name]: nil}

      # Act
      is_valid = Vex.valid?(subject)
      errors = Vex.errors(subject)

      # Assert
      refute is_valid

      assert Enum.member?(errors, {:error, name, :presence, "is required"})
    end

Don’t worry, i figured it out

    def checkRequired(%{} = subject, name) do
      # Arrange
      subject = Map.put(subject, name, nil)

      # Act
      is_valid = Vex.valid?(subject)
      errors = Vex.errors(subject)

      # Assert
      refute is_valid

      assert Enum.member?(errors, {:error, name, :presence, "is required"})
    end
2 Likes