main.swift 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import Foundation
  2. import Vapor
  3. import JSON
  4. import HTTP
  5. import VaporMySQL
  6. import TfbCommon
  7. let drop = Droplet()
  8. try drop.addProvider(VaporMySQL.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. /// Locale for string comparison to workaround https://bugs.swift.org/browse/SR-530
  38. private let posixLocale = Locale(identifier: "en_US_POSIX")
  39. drop.get("fortunes") { _ in
  40. var fortunes = try Fortune.all()
  41. let additional = Fortune(id: 0, message: "Additional fortune added at request time.")
  42. fortunes.insert(additional, at: 0)
  43. fortunes.sort(by: { lhs, rhs -> Bool in
  44. return lhs.message.compare(rhs.message, locale: posixLocale) == .orderedAscending
  45. })
  46. let nodes = try fortunes.map { try $0.makeNode() }
  47. return try drop.view.make("fortune", ["fortunes": Node(nodes)])
  48. }
  49. // Test type 5: Database updates
  50. drop.get("updates") { req in
  51. let queries = queriesParam(for: req)
  52. let ids = (1...queries).map({ _ in WorldMeta.randomId() })
  53. var worlds = try ids.flatMap { try World.find($0) }
  54. worlds.forEach { $0.randomNumber = WorldMeta.randomRandomNumber() }
  55. worlds = try worlds.flatMap { world in
  56. var modifiedWorld = world
  57. try modifiedWorld.save()
  58. return modifiedWorld
  59. }
  60. let updatedWorlds = try worlds.flatMap { try $0.makeJSON() }
  61. return JSON(updatedWorlds)
  62. }
  63. // Test type 6: Plaintext
  64. let helloWorldBuffer = "Hello, World!".utf8.array
  65. drop.get("plaintext") { req in
  66. return Response(headers: ["Content-Type": "text/plain; charset=utf-8"], body: helloWorldBuffer)
  67. }
  68. drop.run()