main.swift 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import Foundation
  2. import Vapor
  3. import JSON
  4. import HTTP
  5. import VaporMongo
  6. import TfbCommon
  7. let drop = Droplet()
  8. try drop.addProvider(VaporMongo.Provider.self)
  9. // All test types require `Server` and `Date` HTTP response headers.
  10. // Vapor has standard middleware that adds `Date` header.
  11. // We use custom middleware that adds `Server` header.
  12. drop.middleware.append(ServerMiddleware())
  13. // Normally we would add preparation for Fluent Models.
  14. // `drop.preparations.append(World.self)` etc.
  15. // During preparation Fluent creates `fluent` table to track migrations.
  16. // But TFB environment does not grant user rights to create tables.
  17. // So we just configure our Models with correct database.
  18. World.database = drop.database
  19. Fortune.database = drop.database
  20. // Test type 1: JSON serialization
  21. drop.get("json") { req in
  22. return try JSON(node: Message("Hello, World!"))
  23. }
  24. // Test type 2: Single database query
  25. drop.get("db") { _ in
  26. let worldId = WorldMeta.randomId()
  27. return try World.find(worldId)?.makeJSON() ?? JSON(node: .null)
  28. }
  29. // Test type 3: Multiple database queries
  30. drop.get("queries") { req in
  31. let queries = queriesParam(for: req)
  32. let ids = (1...queries).map({ _ in WorldMeta.randomId() })
  33. let worlds = try ids.flatMap { try World.find($0)?.makeJSON() }
  34. return JSON(worlds)
  35. }
  36. // Test type 4: Fortunes
  37. private let posixLocale = Locale(identifier: "en_US_POSIX")
  38. drop.get("fortunes") { _ in
  39. var fortunes = try Fortune.all()
  40. let additional = Fortune(id: 0, message: "Additional fortune added at request time.")
  41. fortunes.insert(additional, at: 0)
  42. fortunes.sort(by: { lhs, rhs -> Bool in
  43. return lhs.message.compare(rhs.message, locale: posixLocale) == .orderedAscending
  44. })
  45. let nodes = try fortunes.map { try $0.makeJSONNode() }
  46. return try drop.view.make("fortune", ["fortunes": Node(nodes)])
  47. }
  48. // Test type 5: Database updates
  49. drop.get("updates") { req in
  50. let queries = queriesParam(for: req)
  51. let ids = (1...queries).map({ _ in WorldMeta.randomId() })
  52. var worlds = try ids.flatMap { try World.find($0) }
  53. worlds.forEach { $0.randomNumber = WorldMeta.randomRandomNumber() }
  54. worlds = try worlds.flatMap { world in
  55. var modifiedWorld = world
  56. try modifiedWorld.save()
  57. return modifiedWorld
  58. }
  59. let updatedWorlds = try worlds.flatMap { try $0.makeJSON() }
  60. return JSON(updatedWorlds)
  61. }
  62. // Test type 6: Plaintext
  63. let helloWorldBuffer = "Hello, World!".utf8.array
  64. drop.get("plaintext") { req in
  65. return Response(headers: ["Content-Type": "text/plain; charset=utf-8"], body: helloWorldBuffer)
  66. }
  67. drop.run()