server-redis.cr 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. require "kemal"
  2. require "redis"
  3. # Compose Objects (like Hash) to have a to_json method
  4. require "json/to_json"
  5. REDIS = Redis.new
  6. class CONTENT
  7. UTF8 = "; charset=UTF-8"
  8. JSON = "application/json"
  9. PLAIN = "text/plain"
  10. HTML = "text/html" + UTF8
  11. end
  12. ID_MAXIMUM = 10_000
  13. private def random_world
  14. id = rand(1..ID_MAXIMUM)
  15. num = REDIS.get("world:#{id}")
  16. {id: id, randomNumber: num}
  17. end
  18. private def set_world(world)
  19. id = "world:#{world[:id]}"
  20. REDIS.set(id, world[:randomNumber])
  21. world
  22. end
  23. private def fortunes
  24. data = [] of NamedTuple(id: Int32, message: String)
  25. REDIS.lrange("fortunes", 0, -1).each_with_index do |e, i|
  26. data.push({id: i + 1, message: e.to_s})
  27. end
  28. data
  29. end
  30. private def sanitized_query_count(request)
  31. queries = request.params.query["queries"].as(String)
  32. queries = queries.to_i? || 1
  33. queries.clamp(1..500)
  34. end
  35. before_all do |env|
  36. env.response.headers["Server"] = "Kemal"
  37. env.response.headers["Date"] = Time.now.to_s
  38. end
  39. #
  40. # Basic Tests
  41. #
  42. # Test 1: JSON Serialization
  43. get "/json" do |env|
  44. env.response.content_type = CONTENT::JSON
  45. {message: "Hello, World!"}.to_json
  46. end
  47. # Test 6: Plaintext
  48. get "/plaintext" do |env|
  49. env.response.content_type = CONTENT::PLAIN
  50. "Hello, World!"
  51. end
  52. #
  53. # Redis DatabaseTests
  54. #
  55. # Redis Test 2: Single database query
  56. get "/db" do |env|
  57. env.response.content_type = CONTENT::JSON
  58. random_world.to_json
  59. end
  60. # Redis Test 3: Multiple database query
  61. get "/queries" do |env|
  62. results = (1..sanitized_query_count(env)).map do
  63. random_world
  64. end
  65. env.response.content_type = CONTENT::JSON
  66. results.to_json
  67. end
  68. # Redis Test 4: Fortunes
  69. get "/fortunes" do |env|
  70. data = fortunes
  71. additional_fortune = {
  72. id: 0,
  73. message: "Additional fortune added at request time.",
  74. }
  75. data.push(additional_fortune)
  76. data.sort_by! { |fortune| fortune[:message] }
  77. render "views/fortunes.ecr"
  78. end
  79. # Redis Test 5: Database Updates
  80. get "/updates" do |env|
  81. updated = (1..sanitized_query_count(env)).map do
  82. set_world({id: random_world[:id], randomNumber: rand(1..ID_MAXIMUM)})
  83. end
  84. env.response.content_type = CONTENT::JSON
  85. updated.to_json
  86. end
  87. logging false
  88. Kemal.run