rack-bunto 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +7 -0
- data/History.markdown +5 -0
- data/LICENSE +22 -0
- data/README.markdown +93 -0
- data/Rakefile +38 -0
- data/example/404.md +10 -0
- data/example/_config.yml +5 -0
- data/example/_layouts/default.html +15 -0
- data/example/_layouts/post.html +7 -0
- data/example/_posts/2009-12-21-hello-world.md +8 -0
- data/example/config.ru +6 -0
- data/example/css/site.css +6 -0
- data/example/index.md +16 -0
- data/features/requests.feature +36 -0
- data/features/step_definitions/rack_bunto_steps.rb +58 -0
- data/features/support/env.rb +9 -0
- data/lib/rack/bunto/filehandler.rb +56 -0
- data/lib/rack/bunto/utils.rb +21 -0
- data/lib/rack/bunto/version.rb +7 -0
- data/lib/rack/bunto.rb +133 -0
- data/rack-bunto.gemspec +45 -0
- data/test/helper.rb +72 -0
- data/test/source/_config.yml +1 -0
- data/test/source/_posts/2015-10-05-hello-world.md +3 -0
- data/test/source/buenos_dias.md +3 -0
- data/test/source/css/test.css +1 -0
- data/test/source/dir-with-index/index.md +3 -0
- data/test/source/dir-without-index/page.md +3 -0
- data/test/source/index.md +3 -0
- data/test/source/js/test.js +1 -0
- data/test/source/js/test.min.js +1 -0
- data/test/source/no-extension +1 -0
- data/test/test_build.rb +55 -0
- data/test/test_configuration.rb +110 -0
- data/test/test_filehandler.rb +91 -0
- data/test/test_requests.rb +179 -0
- data/test/test_utils.rb +54 -0
- metadata +177 -0
data/test/helper.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "stringio"
|
3
|
+
require "time"
|
4
|
+
require "rack/mock"
|
5
|
+
|
6
|
+
require_relative "../lib/rack/bunto"
|
7
|
+
|
8
|
+
TEST_DIR = File.expand_path("..", __FILE__)
|
9
|
+
|
10
|
+
|
11
|
+
def silence_warnings
|
12
|
+
original_verbose, $VERBOSE = $VERBOSE, nil
|
13
|
+
|
14
|
+
yield
|
15
|
+
ensure
|
16
|
+
$VERBOSE = original_verbose
|
17
|
+
end
|
18
|
+
|
19
|
+
def silence_output
|
20
|
+
original_stderr, original_stdout = $stderr, $stdout
|
21
|
+
$stderr, $stdout = StringIO.new, StringIO.new
|
22
|
+
|
23
|
+
yield
|
24
|
+
ensure
|
25
|
+
$stderr, $stdout = original_stderr, original_stdout
|
26
|
+
end
|
27
|
+
|
28
|
+
def without_processing
|
29
|
+
silence_warnings do
|
30
|
+
Bunto::Site.class_eval do
|
31
|
+
alias :original_process :process
|
32
|
+
def process; end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
yield
|
37
|
+
ensure
|
38
|
+
silence_warnings do
|
39
|
+
Bunto::Site.class_eval do
|
40
|
+
alias :process :original_process
|
41
|
+
remove_method :original_process
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def rack_bunto(options = {})
|
47
|
+
bunto = nil
|
48
|
+
silence_output do
|
49
|
+
bunto = Rack::Bunto.new(options)
|
50
|
+
end
|
51
|
+
|
52
|
+
bunto
|
53
|
+
end
|
54
|
+
|
55
|
+
def rack_bunto_without_build(options = {})
|
56
|
+
bunto = nil
|
57
|
+
without_processing do
|
58
|
+
bunto = rack_bunto(options)
|
59
|
+
end
|
60
|
+
|
61
|
+
bunto
|
62
|
+
end
|
63
|
+
|
64
|
+
def file_must_exist(filename)
|
65
|
+
assert File.exist?(filename),
|
66
|
+
"Expected file `#{filename}' to exist."
|
67
|
+
end
|
68
|
+
|
69
|
+
def file_wont_exist(filename)
|
70
|
+
assert !File.exist?(filename),
|
71
|
+
"Expected file `#{filename}' to not exist."
|
72
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
fake_option: "ok"
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
Test
|
data/test/test_build.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
|
4
|
+
describe "when initializing a Rack::Bunto instance" do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@tempdir = File.join(TEST_DIR, "tmp")
|
8
|
+
FileUtils.mkdir_p(@tempdir) unless File.exist?(@tempdir)
|
9
|
+
Dir.chdir(@tempdir)
|
10
|
+
|
11
|
+
@sourcedir = File.join(TEST_DIR, "source")
|
12
|
+
@destdir = File.join(@tempdir, "_site")
|
13
|
+
FileUtils.mkdir_p(@sourcedir) unless File.exist?(@sourcedir)
|
14
|
+
FileUtils.mkdir_p(@destdir) unless File.exist?(@destdir)
|
15
|
+
|
16
|
+
@page = File.join(@destdir, "index.html")
|
17
|
+
@fake_page = File.join(@destdir, "fake.html")
|
18
|
+
end
|
19
|
+
|
20
|
+
after do
|
21
|
+
FileUtils.rm_rf(@tempdir) if File.exist?(@tempdir)
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "when non-empty destination directory exists" do
|
25
|
+
|
26
|
+
before do
|
27
|
+
FileUtils.touch(@fake_page)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not build the site by default" do
|
31
|
+
file_wont_exist(@page)
|
32
|
+
rack_bunto(:source => @sourcedir,
|
33
|
+
:destination => @destdir)
|
34
|
+
file_wont_exist(@page)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should build the site when :force_build option is set" do
|
38
|
+
file_wont_exist(@page)
|
39
|
+
rack_bunto(:force_build => true,
|
40
|
+
:source => @sourcedir,
|
41
|
+
:destination => @destdir)
|
42
|
+
file_must_exist(@page)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "when empty destination directory exists" do
|
47
|
+
|
48
|
+
it "should build the site" do
|
49
|
+
file_wont_exist(@page)
|
50
|
+
rack_bunto(:source => @sourcedir,
|
51
|
+
:destination => @destdir)
|
52
|
+
file_must_exist(@page)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
|
4
|
+
describe "when configuring site" do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@tempdir = File.join(TEST_DIR, "tmp")
|
8
|
+
FileUtils.mkdir_p(@tempdir) unless File.exist?(@tempdir)
|
9
|
+
Dir.chdir(@tempdir)
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
FileUtils.rmdir(@tempdir) if File.exist?(@tempdir)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "when no options are given and no config file exists" do
|
17
|
+
|
18
|
+
it "loads the correct default destination" do
|
19
|
+
bunto = rack_bunto_without_build
|
20
|
+
bunto.destination.must_equal File.join(Dir.pwd, "_site")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "when using default config file" do
|
25
|
+
|
26
|
+
it "loads the configuration from file" do
|
27
|
+
begin
|
28
|
+
File.open("_config.yml", "w") do |f|
|
29
|
+
f.puts "config_file_opt: ok"
|
30
|
+
end
|
31
|
+
|
32
|
+
bunto = rack_bunto_without_build
|
33
|
+
bunto.config.must_include "config_file_opt"
|
34
|
+
bunto.config["config_file_opt"].must_equal "ok"
|
35
|
+
ensure
|
36
|
+
FileUtils.rm("_config.yml")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "when using custom config file" do
|
42
|
+
|
43
|
+
it "loads the configuration from file" do
|
44
|
+
begin
|
45
|
+
File.open("_my_config.yml", "w") do |f|
|
46
|
+
f.puts "config_file_opt: ok"
|
47
|
+
end
|
48
|
+
|
49
|
+
bunto = rack_bunto_without_build(:config => "_my_config.yml")
|
50
|
+
bunto.config.must_include "config_file_opt"
|
51
|
+
bunto.config["config_file_opt"].must_equal "ok"
|
52
|
+
ensure
|
53
|
+
FileUtils.rm("_my_config.yml")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "when initialization options are given" do
|
59
|
+
|
60
|
+
it "has the initialization options" do
|
61
|
+
bunto = rack_bunto_without_build(:init_opt => "ok")
|
62
|
+
bunto.config.must_include "init_opt"
|
63
|
+
bunto.config["init_opt"].must_equal "ok"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "has the correct destination" do
|
67
|
+
bunto = rack_bunto_without_build(:destination => "/project/_site")
|
68
|
+
bunto.destination.must_equal "/project/_site"
|
69
|
+
end
|
70
|
+
|
71
|
+
it ":auto is not passed on to Bunto" do
|
72
|
+
bunto = rack_bunto_without_build(:auto => "ok")
|
73
|
+
bunto.config.wont_include "auto"
|
74
|
+
end
|
75
|
+
|
76
|
+
it ":force_build is not passed on to Bunto" do
|
77
|
+
bunto = rack_bunto_without_build(:force_build => "ok")
|
78
|
+
bunto.config.wont_include "force_build"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "when initialization options are given and a config file exists" do
|
83
|
+
|
84
|
+
before do
|
85
|
+
File.open("_config.yml", "w") do |f|
|
86
|
+
f.puts "config_file_opt: ok"
|
87
|
+
f.puts "common_opt: from config"
|
88
|
+
f.puts "destination: /project/_site_from_config"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
after do
|
93
|
+
FileUtils.rm("_config.yml")
|
94
|
+
end
|
95
|
+
|
96
|
+
it "has all options and initialization options override file options" do
|
97
|
+
bunto = rack_bunto_without_build(:init_opt => "ok",
|
98
|
+
:common_opt => "from init")
|
99
|
+
bunto.config.must_include "init_opt"
|
100
|
+
bunto.config.must_include "config_file_opt"
|
101
|
+
bunto.config.must_include "common_opt"
|
102
|
+
bunto.config["common_opt"].must_equal "from init"
|
103
|
+
end
|
104
|
+
|
105
|
+
it "has the correct destination" do
|
106
|
+
bunto = rack_bunto_without_build(:destination => "/project/_site_from_init")
|
107
|
+
bunto.destination.must_equal "/project/_site_from_init"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
|
4
|
+
describe Rack::Bunto::FileHandler do
|
5
|
+
|
6
|
+
describe "when asked for filenames with #get_filename" do
|
7
|
+
|
8
|
+
before do
|
9
|
+
files = [
|
10
|
+
"/site/index.html",
|
11
|
+
"/site/page.html",
|
12
|
+
"/site/README",
|
13
|
+
"/site/dir-with-index/index.html",
|
14
|
+
"/site/dir-without-index/page.html",
|
15
|
+
"/site/dir1/dir2/dir3/index.html"
|
16
|
+
]
|
17
|
+
@filehandler = Rack::Bunto::FileHandler.new("/site", files)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return path for '/'" do
|
21
|
+
@filehandler.get_filename("/").must_equal "/site/index.html"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return existing path" do
|
25
|
+
@filehandler.get_filename("/page.html").must_equal "/site/page.html"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return nil for non-existent path" do
|
29
|
+
@filehandler.get_filename("/not-a-page.html").must_be_nil
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return existing path for resource without extension" do
|
33
|
+
@filehandler.get_filename("/README").must_equal "/site/README"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return nil for partially matching paths" do
|
37
|
+
@filehandler.get_filename("/dir1/dir2/").must_be_nil
|
38
|
+
@filehandler.get_filename("/dir2/dir3").must_be_nil
|
39
|
+
@filehandler.get_filename("ir1/di").must_be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should return path for directory/ with index" do
|
43
|
+
@filehandler.get_filename("/dir-with-index/").must_equal "/site/dir-with-index/index.html"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return path for directory with index" do
|
47
|
+
@filehandler.get_filename("/dir-with-index").must_equal "/site/dir-with-index/index.html"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should return nil for directory/ without index" do
|
51
|
+
@filehandler.get_filename("/dir-without-index/").must_be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should return nil for directory without index" do
|
55
|
+
@filehandler.get_filename("/dir-without-index").must_be_nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
describe "when retrieving the file list from root directory" do
|
61
|
+
|
62
|
+
before do
|
63
|
+
sourcedir = File.join(TEST_DIR, "source")
|
64
|
+
@filehandler = Rack::Bunto::FileHandler.new(sourcedir)
|
65
|
+
@existing_file = File.join(sourcedir, "index.md")
|
66
|
+
@existing_dir = File.join(sourcedir, "css")
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should include regular files" do
|
70
|
+
@filehandler.files.must_include @existing_file
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should not include directories" do
|
74
|
+
@filehandler.files.wont_include @existing_dir
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
describe "when initialized" do
|
80
|
+
|
81
|
+
it "should strip trailing slash from root" do
|
82
|
+
filehandler = Rack::Bunto::FileHandler.new("/site/", [])
|
83
|
+
filehandler.root.must_equal "/site"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should not append a trailing slash to root" do
|
87
|
+
filehandler = Rack::Bunto::FileHandler.new("/site", [])
|
88
|
+
filehandler.root.must_equal "/site"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require_relative "helper"
|
4
|
+
|
5
|
+
|
6
|
+
describe "when handling requests" do
|
7
|
+
|
8
|
+
before do
|
9
|
+
@tempdir = File.join(TEST_DIR, "tmp")
|
10
|
+
FileUtils.mkdir_p(@tempdir) unless File.exist?(@tempdir)
|
11
|
+
Dir.chdir(@tempdir)
|
12
|
+
|
13
|
+
@sourcedir = File.join(TEST_DIR, "source")
|
14
|
+
@destdir = File.join(@tempdir, "_site")
|
15
|
+
FileUtils.mkdir_p(@sourcedir) unless File.exist?(@sourcedir)
|
16
|
+
FileUtils.mkdir_p(@destdir) unless File.exist?(@destdir)
|
17
|
+
|
18
|
+
@bunto = rack_bunto(:force_build => true,
|
19
|
+
:source => @sourcedir,
|
20
|
+
:destination => @destdir)
|
21
|
+
@request = Rack::MockRequest.new(@bunto)
|
22
|
+
end
|
23
|
+
|
24
|
+
after do
|
25
|
+
FileUtils.rm_rf(@tempdir) if File.exist?(@tempdir)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "can be created" do
|
29
|
+
@bunto.wont_be_nil
|
30
|
+
@request.wont_be_nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should return status 200 for existing path" do
|
34
|
+
@request.get("/").status.must_equal 200
|
35
|
+
@request.get("/2015/10/05/hello-world.html").status.must_equal 200
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return status 404 for nonexistent path" do
|
39
|
+
@request.get("/show/me/404").status.must_equal 404
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should return status 404 for partially matching path 1" do
|
43
|
+
@request.get("/2015/10/05/hello").status.must_equal 404
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return status 404 for partially matching path 2" do
|
47
|
+
@request.get("/10/05/hello-world.html").status.must_equal 404
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should return correct status code for If-Modified-Since" do
|
51
|
+
modify_time = @request.get("/").headers["Last-Modified"]
|
52
|
+
earlier_time = (Time.parse(modify_time) - 3600).httpdate
|
53
|
+
|
54
|
+
@request.get("/", {"HTTP_IF_MODIFIED_SINCE" => modify_time}).status.must_equal 304
|
55
|
+
@request.get("/", {"HTTP_IF_MODIFIED_SINCE" => earlier_time}).status.must_equal 200
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should return correct status code for If-Modified-Since with 404s" do
|
59
|
+
modify_time = @request.get("/").headers["Last-Modified"]
|
60
|
+
earlier_time = (Time.parse(modify_time) - 3600).httpdate
|
61
|
+
|
62
|
+
@request.get("/show/me/404", {"HTTP_IF_MODIFIED_SINCE" => earlier_time}).status.must_equal 404
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should return correct Content-Type header" do
|
66
|
+
@request.get("/").headers["Content-Type"].must_equal "text/html"
|
67
|
+
@request.get("/css/test.css").headers["Content-Type"].must_equal "text/css"
|
68
|
+
@request.get("/js/test.js").headers["Content-Type"].must_equal "application/javascript"
|
69
|
+
@request.get("/js/test.min.js").headers["Content-Type"].must_equal "application/javascript"
|
70
|
+
@request.get("/show/me/404").headers["Content-Type"].must_equal "text/html"
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should return correct Content-Length header for '/'" do
|
74
|
+
@request.get("/").original_headers["Content-Length"].to_i.must_equal 24
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should return correct Content-Length header for If-Modified-Since" do
|
78
|
+
modify_time = @request.get("/").headers["Last-Modified"]
|
79
|
+
@request.get("/", {"HTTP_IF_MODIFIED_SINCE" => modify_time}).original_headers["Content-Length"].must_be_nil
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should return correct body for '/'" do
|
83
|
+
@request.get("/").body.must_equal "<p>Rack-Bunto Test</p>\n"
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
describe "when a directory is requested" do
|
88
|
+
|
89
|
+
it "should redirect with status 301 to 'directory/' for 'directory' with index.html" do
|
90
|
+
skip
|
91
|
+
@request.get("/dir-with-index").status.must_equal 301
|
92
|
+
@request.get("/dir-with-index").headers["Location"].must_equal "/dir-with-index/"
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should return status 200 for 'directory/' with index.html" do
|
96
|
+
@request.get("/dir-with-index/").status.must_equal 200
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should return status 404 for 'directory' without index.html" do
|
100
|
+
@request.get("/dir-without-index").status.must_equal 404
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should return status 404 for 'directory/' without index.html" do
|
104
|
+
@request.get("/dir-without-index/").status.must_equal 404
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
describe "when a resource of unknown mime type is requested" do
|
110
|
+
|
111
|
+
it "should return status 200" do
|
112
|
+
@request.get("/no-extension").status.must_equal 200
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should return Content-Type 'application/octet-stream'" do
|
116
|
+
@request.get("/no-extension").headers["Content-Type"].must_equal "application/octet-stream"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
describe "when page contains multibyte characters" do
|
122
|
+
|
123
|
+
before do
|
124
|
+
@response = @request.get("/buenos_dias.html")
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should return correct body" do
|
128
|
+
@response.body.must_equal "<p>¡Buenos días!</p>\n"
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should return the bytesize as Content-Length header" do
|
132
|
+
@response.original_headers["Content-Length"].to_i.must_equal 23
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
describe "when returning 404s" do
|
138
|
+
|
139
|
+
it "should return correct body for default 404" do
|
140
|
+
@request.get("/show/me/404").body.must_equal "Not found"
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should return correct Content-Length header for default 404" do
|
144
|
+
@request.get("/show/me/404").original_headers["Content-Length"].to_i.must_equal 9
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should return correct body for custom 404" do
|
148
|
+
begin
|
149
|
+
filename = File.join(@sourcedir, "404.html")
|
150
|
+
File.open(filename, "w") {|f| f.puts "Custom 404" }
|
151
|
+
|
152
|
+
bunto = rack_bunto(:force_build => true,
|
153
|
+
:source => @sourcedir,
|
154
|
+
:destination => @destdir)
|
155
|
+
request = Rack::MockRequest.new(bunto)
|
156
|
+
|
157
|
+
request.get("/show/me/404").body.must_match %r{Custom 404}
|
158
|
+
ensure
|
159
|
+
FileUtils.rm(filename)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
describe "when handling HEAD requests" do
|
166
|
+
|
167
|
+
it "should return status 200 for '/'" do
|
168
|
+
@request.head("/").status.must_equal 200
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should return correct Content-Length header for '/'" do
|
172
|
+
@request.head("/").original_headers["Content-Length"].to_i.must_equal 24
|
173
|
+
end
|
174
|
+
|
175
|
+
it "should not return a body" do
|
176
|
+
@request.head("/").body.must_equal ""
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
data/test/test_utils.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
|
4
|
+
describe Rack::Bunto::Utils do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@utils = Rack::Bunto::Utils
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
describe "when asked for #media_type" do
|
12
|
+
|
13
|
+
it "returns correct type for HTML" do
|
14
|
+
@utils.media_type("index.html").must_equal "text/html"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns correct type for HTML with full path" do
|
18
|
+
@utils.media_type("/path/index.html").must_equal "text/html"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns correct type for CSS" do
|
22
|
+
@utils.media_type("/path/style.css").must_equal "text/css"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns correct type for *.min.js" do
|
26
|
+
@utils.media_type("script.min.js").must_equal "application/javascript"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "returns correct default type for files without extension" do
|
30
|
+
@utils.media_type("README").must_equal "application/octet-stream"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "ignores lower/upper case in file extensions" do
|
34
|
+
@utils.media_type("image.JpG").must_equal "image/jpeg"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
describe "when asked for #file_info" do
|
40
|
+
|
41
|
+
before do
|
42
|
+
@filename = __FILE__
|
43
|
+
@info = @utils.file_info(@filename)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "has the file content" do
|
47
|
+
@info[:body].must_equal ::File.read(@filename)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "has the modification time in httpdate format" do
|
51
|
+
@info[:time].must_equal ::File.mtime(@filename).httpdate
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|