elm-explorations/test

Reintroduce `Expect.true/false` with a better API?

Janiczek opened this issue · 1 comments

Maybe we should make it easier to do this:

|> Expect.equal True
|> Expect.onFail "The URL should still be present in the final URL after running autolinksUrl"

by having something like

|> Expect.true { onFalse = "The URL ..." }

The previous maintainers' reasons for removing Expect.true was that it took away the spotlight from better solutions (Expect.equalLists, ...), but sometimes you just have to work with predicates. It's not always possible/practical to use the other helpers. Let's trust our users to understand when to use which solution?

💯

Spitballing some ideas:

Expect.predicate : (a -> Bool) -> (a -> String) -> a -> Expectation

One issue I found making custom predicate based assertions is that to make the error message good you need to have a way of including whatever you computed into the error message, but given that you usually do this in pipelines, this becomes annoying.

\someFuzz ->
   someFuzz 
      |> SystemUnderTest.performOperation
      |> TestUtils.assertProperty
      |> Expect.equal True

to add nicer error message:

\someFuzz ->
   let 
      resultingValue =
           someFuzz 
               |> SystemUnderTest.performOperation
   in
   resultingValue
      |> TestUtils.assertProperty
      |> Expect.equal True
      |> Expect.onFail ("assertProperty failed because " ++ Debug.toString resultingValue ++ " had this specific issue")

Perhaps this API could even be improved to:

Expect.predicate : (a -> Bool) -> (String -> String) -> a -> Expectation

Where elm-test calls Debug.toString for you, so that its easier to package up custom assertions into elm packages?

\someFuzz ->
   someFuzz 
      |> SystemUnderTest.performOperation
      |> Expect.predicate TestUtils.assertProperty 
           (\repr -> 
              "assertProperty failed because " ++ rear ++ " had this specific issue"
           )