metropolis.git  about / heads / tags
key-value store for Rack
blob 5cf102c8f741193e90db187dfba697ef0ae8d2ea 3810 bytes (raw)
$ git show HEAD:test/rack_read_write.rb	# shows this blob on the CLI

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
 
# -*- encoding: binary -*-
require 'test/unit'
require 'stringio'
require 'tempfile'
require 'rack'

module TestRackReadWrite
  attr_reader :app

  def test_rack_read_write_suffix_mime
    @app = Metropolis.new(@app_opts.merge(:encoding => :deflate,
                                          :use => Metropolis::SuffixMime))
    basic_rest

    o = { :lint => true, :fatal => true }
    req = Rack::MockRequest.new(@app)
    r = req.put("/asdf.jpg", o.merge(:input => "ASDF"))
    assert_equal 201, r.status
    assert_equal "text/plain", r.headers["Content-Type"]
    assert_equal "Created\n", r.body

    r = req.get("/asdf.jpg")
    assert_equal 200, r.status
    assert_equal "image/jpeg", r.headers["Content-Type"]
    assert_equal "ASDF", r.body

    r = req.request("HEAD", "/asdf.jpg")
    assert_equal 200, r.status
    assert_equal "image/jpeg", r.headers["Content-Type"]
    assert_equal "", r.body
  end

  def test_rack_read_write_deflated
    @app = Metropolis.new(@app_opts.merge(:encoding => :deflate))
    basic_rest

    blob = "." * 1024 * 1024
    o = { :lint => true, :fatal => true }
    req = Rack::MockRequest.new(app)

    r = req.put("/asdf", o.merge(:input => blob))
    assert_equal 201, r.status
    assert_equal "Created\n", r.body

    r = req.get("/asdf", o.merge("HTTP_ACCEPT_ENCODING" => "deflate"))
    assert_equal 200, r.status
    assert_equal "deflate", r.headers['Content-Encoding']
    assert r.body.size < blob.size

    r = req.get("/asdf", o.merge("HTTP_ACCEPT_ENCODING" => "gzip"))
    assert_equal 200, r.status
    assert_nil r.headers['Content-Encoding']
    assert_equal blob, r.body
  end

  def test_rack_read_write_gzipped
    @app = Metropolis.new(@app_opts.merge(:encoding => :gzip))
    basic_rest

    blob = "." * 1024 * 1024
    o = { :lint => true, :fatal => true }
    req = Rack::MockRequest.new(app)

    r = req.put("/asdf", o.merge(:input => blob))
    assert_equal 201, r.status
    assert_equal "Created\n", r.body

    r = req.get("/asdf", o.merge("HTTP_ACCEPT_ENCODING" => "gzip"))
    assert_equal 200, r.status
    assert_equal "gzip", r.headers['Content-Encoding']
    assert r.body.size < blob.size

    r = req.get("/asdf", o.merge("HTTP_ACCEPT_ENCODING" => "deflate"))
    assert_equal 200, r.status
    assert_nil r.headers['Content-Encoding']
    assert_equal blob, r.body
  end

  def test_rack_read_write
    @app = Metropolis.new(@app_opts)
    basic_rest
  end

  def basic_rest
    o = { :lint => true, :fatal => true }
    req = Rack::MockRequest.new(app)

    r = req.put("/asdf", o.merge(:input=>"ASDF"))
    assert_equal 201, r.status
    assert_equal "Created\n", r.body

    r = req.get("/asdf")
    assert_equal 200, r.status
    assert_equal "ASDF", r.body

    r = req.request("HEAD", "/asdf", {})
    assert_equal 200, r.status
    assert_equal "", r.body

    r = req.delete("/asdf", {})
    assert_equal 200, r.status
    assert_equal "OK\n", r.body

    r = req.get("/asdf")
    assert_equal 404, r.status
    assert_equal "Not Found\n", r.body

    r = req.delete("/asdf", {})
    assert_equal 404, r.status
    assert_equal "Not Found\n", r.body

    r = req.request("HEAD", "/asdf", {})
    assert_equal 404, r.status
    assert_equal "", r.body
  end

  def test_rack_readonly
    tmp = Metropolis.new(@app_opts)
    tmp.close!
    @app = Metropolis.new(@app_opts.merge(:readonly => true))
    basic_rest_readonly
  end

  def basic_rest_readonly
    o = { :lint => true, :fatal => true }
    req = Rack::MockRequest.new(app)

    r = req.put("/asdf", o.merge(:input=>"ASDF"))
    assert_equal 403, r.status

    r = req.get("/asdf")
    assert_equal 404, r.status

    r = req.request("HEAD", "/asdf", {})
    assert_equal 404, r.status

    r = req.delete("/asdf", {})
    assert_equal 403, r.status
  end
end

git clone https://yhbt.net/metropolis.git