Guest User

Untitled

a guest
May 24th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. // Usage:
  2. val checker = SqlChecker[IO](transactor)
  3. import checker.checkSql
  4.  
  5. checkSql(sql"invalid")
  6.  
  7.  
  8. // Implementation:
  9.  
  10. package doobie.util.testing
  11.  
  12. import cats.effect.Effect
  13. import cats.syntax.foldable._
  14. import cats.instances.list._
  15. import doobie.util.pretty.Block
  16. import doobie.util.query.Query0
  17. import doobie.util.testing.{AnalysisArgs, AnalysisReport, Analyzable, analyzeIO}
  18. import doobie.util.transactor.Transactor
  19. import doobie.util.update.Update0
  20.  
  21. import scala.reflect.runtime.universe.TypeTag
  22.  
  23. class SqlChecker[F[_]: Effect](transactor: Transactor[F]) {
  24.  
  25. private def formatReport(
  26. args: AnalysisArgs,
  27. report: AnalysisReport
  28. ): Block = {
  29. val sql = args.cleanedSql
  30. .wrap(68)
  31. // SQL should use the default color
  32. .padLeft(Console.RESET.toString)
  33. val items = report.items.foldMap(formatItem)
  34. Block
  35. .fromString(args.header)
  36. .above(sql)
  37. .above(items)
  38. }
  39.  
  40. private val formatItem: AnalysisReport.Item => Block = {
  41. case AnalysisReport.Item(desc, None) =>
  42. Block.fromString(s"${Console.GREEN}✓${Console.RESET} $desc")
  43. case AnalysisReport.Item(desc, Some(err)) =>
  44. Block
  45. .fromString(s"${Console.RED}✕${Console.RESET} $desc")
  46. // No color for error details - ScalaTest paints each line of failure
  47. // red by default.
  48. .above(err.wrap(66).padLeft(" "))
  49. }
  50.  
  51. case class SqlAnalysisError(msg: String)
  52. extends java.lang.AssertionError(msg) {
  53. override def getStackTrace: Array[StackTraceElement] = Array()
  54. }
  55.  
  56. def checkSql(q: Update0): Unit =
  57. checkImpl(Analyzable.unpack(q))
  58.  
  59. def checkSql[A](q: Query0[A])(implicit A: TypeTag[A]): Unit =
  60. checkImpl(Analyzable.unpack(q))
  61.  
  62. private def checkImpl(args: AnalysisArgs): Unit = {
  63. val report = analyzeIO(args, transactor).unsafeRunSync()
  64. if (!report.succeeded) {
  65. throw SqlAnalysisError(formatReport(args, report).toString)
  66. }
  67. }
  68. }
  69.  
  70. object SqlChecker {
  71. def apply[F[_]: Effect](transactor: Transactor[F]): SqlChecker[F] =
  72. new SqlChecker(transactor)
  73. }
Add Comment
Please, Sign In to add comment