aboutsummaryrefslogtreecommitdiff
path: root/src/test/scala/xyz/driver/restquery/rest/parsers/TestUtils.scala
blob: 9ea75b66f8400493ee5985e9c269b16b64fefa90 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package xyz.driver.restquery.http.parsers

import
org.scalacheck.Prop
import org.scalacheck.Prop.BooleanOperators
import org.scalatest.matchers.{MatchResult, Matcher}
import xyz.driver.restquery.utils.Utils

import scala.reflect.ClassTag
import scala.util.{Failure, Success, Try}

object TestUtils {

  object success extends Matcher[Try[Any]] {
    override def apply(left: Try[Any]) = {
      MatchResult(left.isSuccess, s"$left did not fail", s"did fail with $left")
    }
  }

  class FailWith[ThrowableT <: Throwable](implicit ct: ClassTag[ThrowableT]) extends Matcher[Try[Any]] {
    override def apply(left: Try[Any]): MatchResult = {
      MatchResult(
        left.isFailure && left.failed.get.getClass == ct.runtimeClass,
        left match {
          case Success(_) => s"$left did not fail"
          case Failure(e) =>
            s"$left did fail with ${Utils.getClassSimpleName(e.getClass)}, " +
              s"not ${Utils.getClassSimpleName(ct.runtimeClass)}"
        },
        left match {
          case Success(_) => s"$left failed with ${Utils.getClassSimpleName(ct.runtimeClass)}"
          case Failure(e) => s"$left failed with ${Utils.getClassSimpleName(e.getClass)}"
        }
      )
    }
  }

  def failWith[ThrowableT <: Throwable](implicit ct: ClassTag[ThrowableT]) = new FailWith[ThrowableT]

  final implicit class TryPropOps(val self: Try[Any]) extends AnyVal {

    def successProp: Prop = self match {
      case Success(_) => true :| "ok"
      case Failure(e) => false :| e.getMessage
    }

    def failureProp: Prop = self match {
      case Success(x) => false :| s"invalid: $x"
      case Failure(_) => true
    }

  }

}