|
| 1 | +package w1 |
| 2 | + |
| 3 | +import org.scalamock.scalatest.MockFactory |
| 4 | +import org.scalatest.concurrent.ScalaFutures |
| 5 | +import org.scalatest.time.{Millis, Seconds, Span} |
| 6 | +import org.scalatest.{FlatSpec, Matchers} |
| 7 | + |
| 8 | +import scala.concurrent.Future |
| 9 | + |
| 10 | +class ControllerSpec extends FlatSpec with ScalaFutures with Matchers with MockFactory { |
| 11 | + |
| 12 | + import Request._ |
| 13 | + |
| 14 | + import scala.concurrent.ExecutionContext.Implicits.global |
| 15 | + |
| 16 | + implicit val defaultPatience: PatienceConfig = PatienceConfig(timeout = Span(2, Seconds), interval = Span(5, Millis)) |
| 17 | + |
| 18 | + trait Context { |
| 19 | + val repo: DataRepository = mock[DataRepository] |
| 20 | + implicit val printer: Printer = mock[ConsolePrinter] |
| 21 | + val controller = new DataController(repo) |
| 22 | + } |
| 23 | + |
| 24 | + "DataController" should "add new item" in new Context { |
| 25 | + repo.put _ expects Data("a", "b") returning Future.unit |
| 26 | + controller(Add(Data("a", "b"))).futureValue |
| 27 | + } |
| 28 | + |
| 29 | + "DataController" should "print item by key" in new Context { |
| 30 | + repo.get _ expects "a" returning Future.successful(Data("a", "b")) |
| 31 | + printer.println _ expects Data("a", "b") |
| 32 | + controller(Get("a")).futureValue |
| 33 | + } |
| 34 | + |
| 35 | + "DataController" should "print not found for wrong key" in new Context { |
| 36 | + repo.get _ expects "a" returning Future.failed(new NoSuchElementException()) |
| 37 | + printer.println _ expects "Not Found" |
| 38 | + controller(Get("a")).futureValue |
| 39 | + } |
| 40 | + |
| 41 | + "DataController" should "print all items" in new Context { |
| 42 | + repo.all _ expects() returning Future.successful(Seq(Data("a", "b"), Data("b", "a"))) |
| 43 | + inSequence { |
| 44 | + printer.println _ expects Data("a", "b") |
| 45 | + printer.println _ expects Data("b", "a") |
| 46 | + } |
| 47 | + |
| 48 | + controller(PrintAll).futureValue |
| 49 | + } |
| 50 | + |
| 51 | + "DataController" should "print grouped by value" in new Context { |
| 52 | + repo.all _ expects() returning Future.successful(Seq(Data("a", "b"), Data("c", "b"), Data("b", "a"))) |
| 53 | + inSequence { |
| 54 | + printer.println _ expects List(Data("a", "b"), Data("c", "b")) |
| 55 | + printer.println _ expects List(Data("b", "a")) |
| 56 | + } |
| 57 | + |
| 58 | + controller(GroupByValue).futureValue |
| 59 | + } |
| 60 | +} |
0 commit comments