From 3a82183563986d368e81b5c314e69f169805fd1f Mon Sep 17 00:00:00 2001 From: Stormwind Date: Sun, 6 Jan 2013 20:24:39 +0100 Subject: Improve test structure Created folder spec/unit/zero and moved all unittest into this folder. --- spec/unit/controller/call_spec.rb | 41 ------ spec/unit/controller/render_spec.rb | 19 --- spec/unit/controller/renderer_spec.rb | 11 -- spec/unit/renderer/read_template_path_spec.rb | 66 --------- spec/unit/renderer/render_spec.rb | 54 -------- spec/unit/renderer/template_path.rb | 8 -- spec/unit/renderer/type_map_spec.rb | 13 -- spec/unit/request/accept/encoding_spec.rb | 11 -- spec/unit/request/accept/language_spec.rb | 11 -- spec/unit/request/accept/types_spec.rb | 11 -- spec/unit/request/accept_spec.rb | 7 - spec/unit/request/accepttype/each_spec.rb | 10 -- spec/unit/request/accepttype/preferred_spec.rb | 40 ------ spec/unit/request/client/address_spec.rb | 9 -- spec/unit/request/client/hostname_spec.rb | 9 -- spec/unit/request/client/user_agent_spec.rb | 9 -- spec/unit/request/client_spec.rb | 8 -- spec/unit/request/content_type_spec.rb | 16 --- spec/unit/request/delete_spec.rb | 15 --- spec/unit/request/get_spec.rb | 15 --- spec/unit/request/head_spec.rb | 15 --- spec/unit/request/method_spec.rb | 8 -- spec/unit/request/new_spec.rb | 21 --- spec/unit/request/parameter/custom_spec.rb | 23 ---- .../request/parameter/element_reference_spec.rb | 56 -------- spec/unit/request/parameter/initialize_spec.rb | 13 -- spec/unit/request/parameter/payload_spec.rb | 43 ------ spec/unit/request/parameter/query_spec.rb | 25 ---- spec/unit/request/params_spec.rb | 8 -- spec/unit/request/patch_spec.rb | 15 --- spec/unit/request/path_spec.rb | 9 -- spec/unit/request/post_spec.rb | 15 --- spec/unit/request/put_spec.rb | 15 --- spec/unit/request/server/hostname_spec.rb | 9 -- spec/unit/request/server/port_spec.rb | 15 --- spec/unit/request/server/protocol_spec.rb | 9 -- spec/unit/request/server/software_spec.rb | 9 -- spec/unit/request/server_spec.rb | 8 -- spec/unit/response/response_spec.rb | 148 --------------------- spec/unit/router/call_spec.rb | 60 --------- spec/unit/zero/controller/call_spec.rb | 41 ++++++ spec/unit/zero/controller/render_spec.rb | 19 +++ spec/unit/zero/controller/renderer_spec.rb | 11 ++ spec/unit/zero/renderer/read_template_path_spec.rb | 66 +++++++++ spec/unit/zero/renderer/render_spec.rb | 54 ++++++++ spec/unit/zero/renderer/template_path.rb | 8 ++ spec/unit/zero/renderer/type_map_spec.rb | 13 ++ spec/unit/zero/request/accept/encoding_spec.rb | 11 ++ spec/unit/zero/request/accept/language_spec.rb | 11 ++ spec/unit/zero/request/accept/types_spec.rb | 11 ++ spec/unit/zero/request/accept_spec.rb | 7 + spec/unit/zero/request/accepttype/each_spec.rb | 10 ++ .../unit/zero/request/accepttype/preferred_spec.rb | 40 ++++++ spec/unit/zero/request/client/address_spec.rb | 9 ++ spec/unit/zero/request/client/hostname_spec.rb | 9 ++ spec/unit/zero/request/client/user_agent_spec.rb | 9 ++ spec/unit/zero/request/client_spec.rb | 8 ++ spec/unit/zero/request/content_type_spec.rb | 16 +++ spec/unit/zero/request/delete_spec.rb | 15 +++ spec/unit/zero/request/get_spec.rb | 15 +++ spec/unit/zero/request/head_spec.rb | 15 +++ spec/unit/zero/request/method_spec.rb | 8 ++ spec/unit/zero/request/new_spec.rb | 21 +++ spec/unit/zero/request/parameter/custom_spec.rb | 23 ++++ .../request/parameter/element_reference_spec.rb | 56 ++++++++ .../unit/zero/request/parameter/initialize_spec.rb | 13 ++ spec/unit/zero/request/parameter/payload_spec.rb | 43 ++++++ spec/unit/zero/request/parameter/query_spec.rb | 25 ++++ spec/unit/zero/request/params_spec.rb | 8 ++ spec/unit/zero/request/patch_spec.rb | 15 +++ spec/unit/zero/request/path_spec.rb | 9 ++ spec/unit/zero/request/post_spec.rb | 15 +++ spec/unit/zero/request/put_spec.rb | 15 +++ spec/unit/zero/request/server/hostname_spec.rb | 9 ++ spec/unit/zero/request/server/port_spec.rb | 15 +++ spec/unit/zero/request/server/protocol_spec.rb | 9 ++ spec/unit/zero/request/server/software_spec.rb | 9 ++ spec/unit/zero/request/server_spec.rb | 8 ++ spec/unit/zero/response/response_spec.rb | 148 +++++++++++++++++++++ spec/unit/zero/router/call_spec.rb | 60 +++++++++ 80 files changed, 907 insertions(+), 907 deletions(-) delete mode 100644 spec/unit/controller/call_spec.rb delete mode 100644 spec/unit/controller/render_spec.rb delete mode 100644 spec/unit/controller/renderer_spec.rb delete mode 100644 spec/unit/renderer/read_template_path_spec.rb delete mode 100644 spec/unit/renderer/render_spec.rb delete mode 100644 spec/unit/renderer/template_path.rb delete mode 100644 spec/unit/renderer/type_map_spec.rb delete mode 100644 spec/unit/request/accept/encoding_spec.rb delete mode 100644 spec/unit/request/accept/language_spec.rb delete mode 100644 spec/unit/request/accept/types_spec.rb delete mode 100644 spec/unit/request/accept_spec.rb delete mode 100644 spec/unit/request/accepttype/each_spec.rb delete mode 100644 spec/unit/request/accepttype/preferred_spec.rb delete mode 100644 spec/unit/request/client/address_spec.rb delete mode 100644 spec/unit/request/client/hostname_spec.rb delete mode 100644 spec/unit/request/client/user_agent_spec.rb delete mode 100644 spec/unit/request/client_spec.rb delete mode 100644 spec/unit/request/content_type_spec.rb delete mode 100644 spec/unit/request/delete_spec.rb delete mode 100644 spec/unit/request/get_spec.rb delete mode 100644 spec/unit/request/head_spec.rb delete mode 100644 spec/unit/request/method_spec.rb delete mode 100644 spec/unit/request/new_spec.rb delete mode 100644 spec/unit/request/parameter/custom_spec.rb delete mode 100644 spec/unit/request/parameter/element_reference_spec.rb delete mode 100644 spec/unit/request/parameter/initialize_spec.rb delete mode 100644 spec/unit/request/parameter/payload_spec.rb delete mode 100644 spec/unit/request/parameter/query_spec.rb delete mode 100644 spec/unit/request/params_spec.rb delete mode 100644 spec/unit/request/patch_spec.rb delete mode 100644 spec/unit/request/path_spec.rb delete mode 100644 spec/unit/request/post_spec.rb delete mode 100644 spec/unit/request/put_spec.rb delete mode 100644 spec/unit/request/server/hostname_spec.rb delete mode 100644 spec/unit/request/server/port_spec.rb delete mode 100644 spec/unit/request/server/protocol_spec.rb delete mode 100644 spec/unit/request/server/software_spec.rb delete mode 100644 spec/unit/request/server_spec.rb delete mode 100644 spec/unit/response/response_spec.rb delete mode 100644 spec/unit/router/call_spec.rb create mode 100644 spec/unit/zero/controller/call_spec.rb create mode 100644 spec/unit/zero/controller/render_spec.rb create mode 100644 spec/unit/zero/controller/renderer_spec.rb create mode 100644 spec/unit/zero/renderer/read_template_path_spec.rb create mode 100644 spec/unit/zero/renderer/render_spec.rb create mode 100644 spec/unit/zero/renderer/template_path.rb create mode 100644 spec/unit/zero/renderer/type_map_spec.rb create mode 100644 spec/unit/zero/request/accept/encoding_spec.rb create mode 100644 spec/unit/zero/request/accept/language_spec.rb create mode 100644 spec/unit/zero/request/accept/types_spec.rb create mode 100644 spec/unit/zero/request/accept_spec.rb create mode 100644 spec/unit/zero/request/accepttype/each_spec.rb create mode 100644 spec/unit/zero/request/accepttype/preferred_spec.rb create mode 100644 spec/unit/zero/request/client/address_spec.rb create mode 100644 spec/unit/zero/request/client/hostname_spec.rb create mode 100644 spec/unit/zero/request/client/user_agent_spec.rb create mode 100644 spec/unit/zero/request/client_spec.rb create mode 100644 spec/unit/zero/request/content_type_spec.rb create mode 100644 spec/unit/zero/request/delete_spec.rb create mode 100644 spec/unit/zero/request/get_spec.rb create mode 100644 spec/unit/zero/request/head_spec.rb create mode 100644 spec/unit/zero/request/method_spec.rb create mode 100644 spec/unit/zero/request/new_spec.rb create mode 100644 spec/unit/zero/request/parameter/custom_spec.rb create mode 100644 spec/unit/zero/request/parameter/element_reference_spec.rb create mode 100644 spec/unit/zero/request/parameter/initialize_spec.rb create mode 100644 spec/unit/zero/request/parameter/payload_spec.rb create mode 100644 spec/unit/zero/request/parameter/query_spec.rb create mode 100644 spec/unit/zero/request/params_spec.rb create mode 100644 spec/unit/zero/request/patch_spec.rb create mode 100644 spec/unit/zero/request/path_spec.rb create mode 100644 spec/unit/zero/request/post_spec.rb create mode 100644 spec/unit/zero/request/put_spec.rb create mode 100644 spec/unit/zero/request/server/hostname_spec.rb create mode 100644 spec/unit/zero/request/server/port_spec.rb create mode 100644 spec/unit/zero/request/server/protocol_spec.rb create mode 100644 spec/unit/zero/request/server/software_spec.rb create mode 100644 spec/unit/zero/request/server_spec.rb create mode 100644 spec/unit/zero/response/response_spec.rb create mode 100644 spec/unit/zero/router/call_spec.rb (limited to 'spec') diff --git a/spec/unit/controller/call_spec.rb b/spec/unit/controller/call_spec.rb deleted file mode 100644 index 6cc56a4..0000000 --- a/spec/unit/controller/call_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -require 'spec_helper' - -describe Zero::Controller, '.call' do - subject { controller.call(env) } - let(:controller) { SpecController } - let(:env) { EnvGenerator.get('/foo') } - - before :each do - controller.renderer = Object.new - end - - it "returns a response" do - subject.should be_respond_to(:to_a) - end - - it "returns an object with the first element being a status" do - subject[0].should be_kind_of(Numeric) - end - - it "does not modify an existing request" do - r = Zero::Request.new(env) - r.params['foo'] = 'bar' - subject - r = Zero::Request.new(env) - expect(r.params['foo']).to eq('bar') - end - - context "with the response" do - let(:response_class) { mock } - before :each do - Zero::Controller.response = response_class - response_class.should_receive(:new) - end - - after :each do - Zero::Controller.response = nil - end - - it { subject } - end -end diff --git a/spec/unit/controller/render_spec.rb b/spec/unit/controller/render_spec.rb deleted file mode 100644 index 771db28..0000000 --- a/spec/unit/controller/render_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'spec_helper' - -describe Zero::Controller, '#render' do - subject { Zero::Controller.new(env) } - let(:env) { EnvGenerator.get('/foo') } - let(:renderer) { mock } - let(:template) { '/foo' } - - before :each do - Zero::Controller.renderer = renderer - renderer.should_receive(:render).with(template, - kind_of(Zero::Request::AcceptType), subject) - end - after :each do - Zero::Controller.renderer = nil - end - - it { subject.render(template) } -end diff --git a/spec/unit/controller/renderer_spec.rb b/spec/unit/controller/renderer_spec.rb deleted file mode 100644 index 21664ec..0000000 --- a/spec/unit/controller/renderer_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'spec_helper' - -describe Zero::Controller, '#renderer' do - subject { Zero::Controller } - let(:renderer) { Object.new } - - it 'returns the set renderer' do - subject.renderer = renderer - expect(subject.new({}).renderer).to be(renderer) - end -end diff --git a/spec/unit/renderer/read_template_path_spec.rb b/spec/unit/renderer/read_template_path_spec.rb deleted file mode 100644 index 8655777..0000000 --- a/spec/unit/renderer/read_template_path_spec.rb +++ /dev/null @@ -1,66 +0,0 @@ -require 'spec_helper' - -describe Zero::Renderer, 'read_template_path!' do - subject { Zero::Renderer.new(template_path, type_map) } - let(:template_path) { 'foo' } - let(:file_list) { ['foo/welcome/index.html.erb'] } - - before :each do - Dir.stub(:[]) do |arg| - if arg == 'foo/**/*.*' - file_list - else - [] - end - end - end - - shared_examples_for 'a template loader' do - it 'creates a template tree' do - subject.read_template_path! - subject.templates['welcome/index'].should eq(result) - end - end - - context 'without mapping' do - let(:type_map) { {} } - let(:result) { { 'html' => 'foo/welcome/index.html.erb' } } - - it_behaves_like 'a template loader' - end - - context 'with a single mapping' do - let(:type_map) { {'html' => 'text/html' } } - let(:result) { { 'text/html' => 'foo/welcome/index.html.erb' } } - - it_behaves_like 'a template loader' - end - - context 'with multiple mappings' do - let(:type_map) { {'html' => ['text/html', 'text/xml'] } } - let(:result) { { - 'text/html' => 'foo/welcome/index.html.erb', - 'text/xml' => 'foo/welcome/index.html.erb' - } } - - it_behaves_like 'a template loader' - end - - context 'with default template' do - let(:file_list) {['foo/welcome/index.erb']} - let(:type_map) { {'default' => ['text/html', 'text/xml'] } } - let(:result) { { - 'text/html' => 'foo/welcome/index.erb', - 'text/xml' => 'foo/welcome/index.erb' - } } - - it_behaves_like 'a template loader' - end - - it 'creates an empty templates list without templates in path' do - subject = Zero::Renderer.new("bar", {}) - subject.read_template_path! - - subject.templates.should eq({}) - end -end diff --git a/spec/unit/renderer/render_spec.rb b/spec/unit/renderer/render_spec.rb deleted file mode 100644 index 30d2225..0000000 --- a/spec/unit/renderer/render_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'spec_helper' - -describe Zero::Renderer, '#render' do - subject { Zero::Renderer.new(template_path, type_map) } - let(:template_path) { 'spec/fixtures/templates' } - let(:type_map) {{ - 'html' => ['text/html', 'text/xml', '*/*'], - 'json' => ['application/json', 'plain/text'] - }} - let(:html_types) { ['text/html'] } - let(:json_types) { ['application/json'] } - let(:foo_types) { ['foo/bar', 'bar/foo'] } - let(:binding) { SpecTemplateContext.new('foo') } - - before :each do - subject.read_template_path! - end - - it 'returns a tilt template' do - subject.render('index', html_types, binding).should be_kind_of(String) - end - - it 'renders html content' do - subject.render('index', html_types, binding).should match('success') - end - - it 'returns a tilt template for different types' do - subject.render('index', json_types, binding).should be_kind_of(String) - end - - it 'renders json content' do - subject.render('index', json_types, binding).should match("{text: 'success'}") - end - - it 'returns an ArgumentError, if given template does not exist' do - expect { - subject.render('foobar', html_types, binding) - }.to raise_error(ArgumentError, "No template found for 'foobar'!") - end - - it 'returns an ArgumentError, if no template fits types' do - expect { - subject.render('index', foo_types, binding) - }.to raise_error( - ArgumentError, - "No template found for any of this types #{foo_types.join ', '}!" - ) - end - - it 'uses the context' do - subject.render('context', html_types, binding).should match('foo') - - end -end diff --git a/spec/unit/renderer/template_path.rb b/spec/unit/renderer/template_path.rb deleted file mode 100644 index 261faa8..0000000 --- a/spec/unit/renderer/template_path.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'spec_helper' - -describe Zero::Renderer, '#template_path' do - subject { Zero::Renderer.new(template_path) } - let(:template_path) { 'foo' } - - its(:type_map) { should be(template_path) } -end diff --git a/spec/unit/renderer/type_map_spec.rb b/spec/unit/renderer/type_map_spec.rb deleted file mode 100644 index 290e579..0000000 --- a/spec/unit/renderer/type_map_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'spec_helper' - -describe Zero::Renderer, '#type_map' do - subject { Zero::Renderer.new(template_path, type_map) } - let(:template_path) { 'foo' } - let(:type_map) { {'html' => ['text/html']} } - - its(:type_map) { should be(type_map) } - - it 'returns an empty Hash, if type_map is not set while initialization' do - Zero::Renderer.new(template_path).type_map.should eq({}) - end -end diff --git a/spec/unit/request/accept/encoding_spec.rb b/spec/unit/request/accept/encoding_spec.rb deleted file mode 100644 index 9353cd1..0000000 --- a/spec/unit/request/accept/encoding_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Accept, '#encoding' do - subject { Zero::Request::Accept.new(env) } - let(:encoding) { 'en_US' } - let(:env) { EnvGenerator.get('/foo', {'HTTP_ACCEPT_ENCODING' => encoding}) } - - it 'sets the encoding to the given value' do - subject.encoding.preferred.should eq('en_US') - end -end diff --git a/spec/unit/request/accept/language_spec.rb b/spec/unit/request/accept/language_spec.rb deleted file mode 100644 index 188d8af..0000000 --- a/spec/unit/request/accept/language_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Accept, '#language' do - subject { Zero::Request::Accept.new(env) } - let(:language) { 'en_US' } - let(:env) { EnvGenerator.get('/foo', {'HTTP_ACCEPT_LANGUAGE' => language}) } - - it 'sets the language to the given value' do - subject.language.preferred.should eq('en_US') - end -end diff --git a/spec/unit/request/accept/types_spec.rb b/spec/unit/request/accept/types_spec.rb deleted file mode 100644 index b5f2da7..0000000 --- a/spec/unit/request/accept/types_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Accept, '#types' do - subject { Zero::Request::Accept.new(env) } - let(:media_types) { 'text/html' } - let(:env) { EnvGenerator.get('/foo', {'HTTP_ACCEPT' => media_types}) } - - it 'sets the media type to the given value' do - subject.types.preferred.should eq('text/html') - end -end diff --git a/spec/unit/request/accept_spec.rb b/spec/unit/request/accept_spec.rb deleted file mode 100644 index 67840ac..0000000 --- a/spec/unit/request/accept_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#accept' do - subject { Zero::Request.new(env) } - let(:env) { EnvGenerator.get('/foo') } - its(:accept) { should be_an_instance_of(Zero::Request::Accept) } -end diff --git a/spec/unit/request/accepttype/each_spec.rb b/spec/unit/request/accepttype/each_spec.rb deleted file mode 100644 index 964a63e..0000000 --- a/spec/unit/request/accepttype/each_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::AcceptType, '#each' do - subject { Zero::Request::AcceptType.new(types) } - let(:html) { 'text/html' } - let(:json) { 'application/json' } - let(:types) { [html, json].join(',') } - - specify { expect {|b| subject.each(&b) }.to yield_successive_args(html, json) } -end diff --git a/spec/unit/request/accepttype/preferred_spec.rb b/spec/unit/request/accepttype/preferred_spec.rb deleted file mode 100644 index ef21e8d..0000000 --- a/spec/unit/request/accepttype/preferred_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::AcceptType, '#preferred' do - subject { Zero::Request::AcceptType } - let(:html) { 'text/html' } - let(:json) { 'application/json' } - let(:foo) { 'text/foo' } - let(:lower_quality) { foo + ';q=0.5' } - let(:default) { '*/*;q=0.1' } - let(:option) { [foo + ';b=23', html].join(',') } - let(:simple_accept) { [html, json].join(',') } - let(:quality_accept) { [html, lower_quality, default].join(',') } - let(:random_accept) { [lower_quality, default, html].join(',') } - let(:lower_accept) { [lower_quality, default].join(',') } - - context 'without mapping' do - it { subject.new(html).preferred.should == html } - it { subject.new(json).preferred.should == json } - it { subject.new(option).preferred.should == foo } - it { subject.new(simple_accept).preferred.should == html } - it { subject.new(quality_accept).preferred.should == html } - it { subject.new(random_accept).preferred.should == html } - it { subject.new(lower_accept).preferred.should == foo } - it { subject.new(nil).preferred.should == '*/*' } - it { subject.new('').preferred.should == '*/*' } - it { subject.new('text / html').preferred.should == html } - end - -# context 'with mapping' do -# before :all do -# Zero::Request::Accept.map = {'text/html' => 'html'} -# end -# -# after :all do -# Zero::Request::Accept.map = {} -# end -# -# it { subject.new(html).preferred.should == 'html' } -# end -end diff --git a/spec/unit/request/client/address_spec.rb b/spec/unit/request/client/address_spec.rb deleted file mode 100644 index 5e0b65d..0000000 --- a/spec/unit/request/client/address_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Client, '#address' do - subject { Zero::Request::Client.new(env) } - let(:address) { '127.0.0.1' } - let(:env) { {'REMOTE_ADDR' => address} } - - its(:address) { should == address } -end diff --git a/spec/unit/request/client/hostname_spec.rb b/spec/unit/request/client/hostname_spec.rb deleted file mode 100644 index 2742641..0000000 --- a/spec/unit/request/client/hostname_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Client, '#hostname' do - subject { Zero::Request::Client.new(env) } - let(:hostname) { 'foo.bar' } - let(:env) { {'REMOTE_HOST' => hostname} } - - its(:hostname) { should == hostname } -end diff --git a/spec/unit/request/client/user_agent_spec.rb b/spec/unit/request/client/user_agent_spec.rb deleted file mode 100644 index 2f29bf1..0000000 --- a/spec/unit/request/client/user_agent_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Client, '#user_agent' do - subject { Zero::Request::Client.new(env) } - let(:user_agent) { 'Mozilla (dummy agent)' } - let(:env) { {'HTTP_USER_AGENT' => user_agent} } - - its(:user_agent) { should == user_agent } -end diff --git a/spec/unit/request/client_spec.rb b/spec/unit/request/client_spec.rb deleted file mode 100644 index 5ccd155..0000000 --- a/spec/unit/request/client_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#client' do - subject { Zero::Request.new(env) } - let(:env) { EnvGenerator.get('/foo') } - - its(:client) { should be_an_instance_of(Zero::Request::Client) } -end diff --git a/spec/unit/request/content_type_spec.rb b/spec/unit/request/content_type_spec.rb deleted file mode 100644 index 7482ccc..0000000 --- a/spec/unit/request/content_type_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#content_type' do - subject { Zero::Request.new(env) } - - context 'returns nil with no content type' do - let(:env) { EnvGenerator.get('/foo') } - its('content_type') { should be(nil) } - end - - context 'returns the set content type' do - let(:content_type) { 'bogus/type' } - let(:env) { EnvGenerator.post('/foo', {'CONTENT_TYPE' => content_type}) } - its('content_type') { should be(content_type) } - end -end diff --git a/spec/unit/request/delete_spec.rb b/spec/unit/request/delete_spec.rb deleted file mode 100644 index 9a5737d..0000000 --- a/spec/unit/request/delete_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#delete?' do - subject { Zero::Request.new(env) } - - context "with a delete request" do - let(:env) { EnvGenerator.delete('/foo') } - its(:delete?) { should be(true) } - end - - context "with a get request" do - let(:env) { EnvGenerator.get('/foo') } - its(:delete?) { should be(false) } - end -end diff --git a/spec/unit/request/get_spec.rb b/spec/unit/request/get_spec.rb deleted file mode 100644 index 0b96abc..0000000 --- a/spec/unit/request/get_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#get?' do - subject { Zero::Request.new(env) } - - context "with a get request" do - let(:env) { EnvGenerator.get('/foo') } - its(:get?) { should be(true) } - end - - context "with a post request" do - let(:env) { EnvGenerator.post('/foo') } - its(:get?) { should be(false) } - end -end diff --git a/spec/unit/request/head_spec.rb b/spec/unit/request/head_spec.rb deleted file mode 100644 index 5622fd6..0000000 --- a/spec/unit/request/head_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#head?' do - subject { Zero::Request.new(env) } - - context "with a head request" do - let(:env) { EnvGenerator.head('/foo') } - its(:head?) { should be(true) } - end - - context "with a get request" do - let(:env) { EnvGenerator.get('/foo') } - its(:head?) { should be(false) } - end -end diff --git a/spec/unit/request/method_spec.rb b/spec/unit/request/method_spec.rb deleted file mode 100644 index 42ea56a..0000000 --- a/spec/unit/request/method_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#method' do - subject { Zero::Request.new(env) } - let(:env) { EnvGenerator.get('/foo') } - - its(:method) { should == :get } -end diff --git a/spec/unit/request/new_spec.rb b/spec/unit/request/new_spec.rb deleted file mode 100644 index d057800..0000000 --- a/spec/unit/request/new_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '.new' do - subject { Zero::Request.new(env) } - - context "with a fresh environment" do - let(:env) { EnvGenerator.get('/foo') } - it "creates an instance of Zero::Request" do - Zero::Request.new(env).should be_an_instance_of(Zero::Request) - end - end - - context "with an already used environment" do - let(:env) { EnvGenerator.get('/foo') } - let(:new_env) { subject.env } - - it "returns an already build request" do - Zero::Request.new(new_env).should be(subject) - end - end -end diff --git a/spec/unit/request/parameter/custom_spec.rb b/spec/unit/request/parameter/custom_spec.rb deleted file mode 100644 index 1abebc9..0000000 --- a/spec/unit/request/parameter/custom_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Parameter, '#custom' do - subject { Zero::Request::Parameter.new(env) } - let(:env) { EnvGenerator.get('/foo') } - - it 'returns a set custom parameter' do - subject['foo'] = 'bar' - expect(subject.custom['foo']).to eq('bar') - end - - it 'returns the latest set value' do - subject['foo'] = 'first' - subject['foo'] = 'latest' - - expect(subject.custom['foo']).to eq('latest') - end - - it 'is empty if no custom parameter is set' do - expect(subject.custom).to eq({}) - expect(env['zero.params.custom']).to eq({}) - end -end diff --git a/spec/unit/request/parameter/element_reference_spec.rb b/spec/unit/request/parameter/element_reference_spec.rb deleted file mode 100644 index 1136eae..0000000 --- a/spec/unit/request/parameter/element_reference_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Parameter, '#[]' do - subject { Zero::Request::Parameter.new(env) } - - context 'without parameters' do - let(:env) { EnvGenerator.get('/foo') } - - it 'returns the custom parameter' do - subject['foo'] = 'bar' - expect(subject['foo']).to eq('bar') - end - end - - context 'with query parameters' do - let(:env) { EnvGenerator.get('/foo?foo=bar') } - - it 'returns the query parameter' do - expect(subject['foo']).to eq('bar') - end - - it 'returns the custom parameter' do - subject['foo'] = 'baz' - expect(subject['foo']).to eq('baz') - end - end - - context 'with payload parameters' do - let(:env) do - EnvGenerator.post('/foo', { - :input => 'foo=bar', 'CONTENT_TYPE' => 'multipart/form-data' - }) - end - - it 'returns the payload value' do - expect(subject['foo']).to eq('bar') - end - - it 'returns the custom parameter' do - subject['foo'] = 'baz' - expect(subject['foo']).to eq('baz') - end - end - - context 'with query and payload parameters' do - let(:env) do - EnvGenerator.post('/foo?foo=baz', { - :input => 'foo=bar', 'CONTENT_TYPE' => 'multipart/form-data' - }) - end - - it 'returns the payload parameter' do - expect(subject['foo']).to eq('bar') - end - end -end diff --git a/spec/unit/request/parameter/initialize_spec.rb b/spec/unit/request/parameter/initialize_spec.rb deleted file mode 100644 index 58432cb..0000000 --- a/spec/unit/request/parameter/initialize_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Parameter, '#initialize' do - subject { Zero::Request::Parameter.new(env) } - let(:env) { EnvGenerator.get('/get', { - 'zero.params.custom' => {'foo' => 'bar'} - }) } - - it 'does not overwrite parameters' do - subject - expect(env['zero.params.custom']).to have_key('foo') - end -end diff --git a/spec/unit/request/parameter/payload_spec.rb b/spec/unit/request/parameter/payload_spec.rb deleted file mode 100644 index 563b21d..0000000 --- a/spec/unit/request/parameter/payload_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Parameter, '#payload' do - subject { Zero::Request::Parameter.new(env) } - - context 'without parameters' do - let(:env) { EnvGenerator.get('/foo') } - its(:payload) { should == {} } - end - - context 'with a query string' do - let(:env) { EnvGenerator.get('/foo?bar=baz') } - its(:payload) { should == {} } - end - - context 'with a post body' do - let(:env) do - EnvGenerator.post('/foo', { - :input => 'bar=baz', 'CONTENT_TYPE' => 'multipart/form-data' - }) - end - its(:payload) { should == {'bar' => 'baz'} } - end - - context 'with special characters' do - let(:env) do - EnvGenerator.post('/foo', { - :input => 'bar=foo%20bar', 'CONTENT_TYPE' => 'multipart/form-data' - }) - end - its(:payload) { should == {'bar' => 'foo bar'} } - end - - # TODO behaves like this, but is this really good like this? - context 'with a post body and content type application/json' do - let(:env) do - EnvGenerator.post('/foo', { - :input => '"foobar"', 'CONTENT_TYPE' => 'application/json' - }) - end - its(:payload) { should == {} } - end -end diff --git a/spec/unit/request/parameter/query_spec.rb b/spec/unit/request/parameter/query_spec.rb deleted file mode 100644 index 940e80e..0000000 --- a/spec/unit/request/parameter/query_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Parameter, '#query' do - subject { Zero::Request::Parameter.new(env) } - - context 'without parameters' do - let(:env) { EnvGenerator.get('/foo') } - its(:query) { should == {} } - end - - context 'with a query string' do - let(:env) { EnvGenerator.get('/foo?bar=baz') } - its(:query) { should == {'bar' => 'baz'} } - end - - context 'with a post body' do - let(:env) { EnvGenerator.post('/foo', {:input => 'bar=baz'}) } - its(:query) { should == {} } - end - - context 'with special characters' do - let(:env) { EnvGenerator.get('/foo?bar=foo%20bar') } - its(:query) { should == {'bar' => 'foo bar'} } - end -end diff --git a/spec/unit/request/params_spec.rb b/spec/unit/request/params_spec.rb deleted file mode 100644 index 116e57e..0000000 --- a/spec/unit/request/params_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#params' do - subject { Zero::Request.new(env) } - let(:env) { EnvGenerator.get('/foo?bar=baz') } - - its(:params) { should be_an_instance_of(Zero::Request::Parameter) } -end diff --git a/spec/unit/request/patch_spec.rb b/spec/unit/request/patch_spec.rb deleted file mode 100644 index ae0d2db..0000000 --- a/spec/unit/request/patch_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#patch?' do - subject { Zero::Request.new(env) } - - context "with a patch request" do - let(:env) { EnvGenerator.patch('/foo') } - its(:patch?) { should be(true) } - end - - context "with a get request" do - let(:env) { EnvGenerator.get('/foo') } - its(:patch?) { should be(false) } - end -end diff --git a/spec/unit/request/path_spec.rb b/spec/unit/request/path_spec.rb deleted file mode 100644 index 3873e48..0000000 --- a/spec/unit/request/path_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#path' do - subject { Zero::Request.new(env) } - let(:path) { '/foo' } - let(:env) { EnvGenerator.get(path) } - - its(:path) { should == path } -end diff --git a/spec/unit/request/post_spec.rb b/spec/unit/request/post_spec.rb deleted file mode 100644 index 2bfa834..0000000 --- a/spec/unit/request/post_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#post?' do - subject { Zero::Request.new(env) } - - context "with a post request" do - let(:env) { EnvGenerator.post('/foo') } - its(:post?) { should be(true) } - end - - context "with a get request" do - let(:env) { EnvGenerator.get('/foo') } - its(:post?) { should be(false) } - end -end diff --git a/spec/unit/request/put_spec.rb b/spec/unit/request/put_spec.rb deleted file mode 100644 index 937d904..0000000 --- a/spec/unit/request/put_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#put?' do - subject { Zero::Request.new(env) } - - context "with a put request" do - let(:env) { EnvGenerator.put('/foo') } - its(:put?) { should be(true) } - end - - context "with a get request" do - let(:env) { EnvGenerator.get('/foo') } - its(:put?) { should be(false) } - end -end diff --git a/spec/unit/request/server/hostname_spec.rb b/spec/unit/request/server/hostname_spec.rb deleted file mode 100644 index b2275b4..0000000 --- a/spec/unit/request/server/hostname_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Server, '#hostname' do - subject { Zero::Request::Server.new(env) } - let(:hostname) { 'FooName' } - let(:env) { EnvGenerator.get('/foo', {'SERVER_NAME' => hostname}) } - its(:hostname) { should be(hostname) } -end - diff --git a/spec/unit/request/server/port_spec.rb b/spec/unit/request/server/port_spec.rb deleted file mode 100644 index 24f6b5c..0000000 --- a/spec/unit/request/server/port_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Server, '#port' do - subject { Zero::Request::Server.new(env) } - - context 'sets the port to the given value' do - let(:env) { EnvGenerator.get('/foo', {'SERVER_PORT' => 80}) } - its(:port) { should be(80) } - end - - context 'casts also the port to an integer, while setting it' do - let(:env) { EnvGenerator.get('/foo', {'SERVER_PORT' => '80'}) } - its(:port) { should be(80) } - end -end diff --git a/spec/unit/request/server/protocol_spec.rb b/spec/unit/request/server/protocol_spec.rb deleted file mode 100644 index 5aac149..0000000 --- a/spec/unit/request/server/protocol_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Server, '#protocol' do - subject { Zero::Request::Server.new(env) } - let(:protocol) { 'HTTP FOO' } - let(:env) { EnvGenerator.get('/foo', {'SERVER_PROTOCOL' => protocol}) } - its(:protocol) { should be(protocol) } -end - diff --git a/spec/unit/request/server/software_spec.rb b/spec/unit/request/server/software_spec.rb deleted file mode 100644 index 374f8a2..0000000 --- a/spec/unit/request/server/software_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'spec_helper' - -describe Zero::Request::Server, '#software' do - subject { Zero::Request::Server.new(env) } - let(:software) { 'SpecWare Server' } - let(:env) { EnvGenerator.get('/foo', {'SERVER_SOFTWARE' => software}) } - its(:software) { should be(software) } -end - diff --git a/spec/unit/request/server_spec.rb b/spec/unit/request/server_spec.rb deleted file mode 100644 index ea16fbe..0000000 --- a/spec/unit/request/server_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'spec_helper' - -describe Zero::Request, '#server' do - subject { Zero::Request.new(env) } - let(:env) { EnvGenerator.get('/foo') } - - its(:server) { should be_an_instance_of(Zero::Request::Server) } -end diff --git a/spec/unit/response/response_spec.rb b/spec/unit/response/response_spec.rb deleted file mode 100644 index 0cdd099..0000000 --- a/spec/unit/response/response_spec.rb +++ /dev/null @@ -1,148 +0,0 @@ -# encoding: UTF-8 -require 'spec_helper' - -describe Zero::Response do - subject { Zero::Response.new() } - - describe '#to_a' do - it "returns an array within status header and body" do - subject.status = 200 - subject.header = {} - subject.body = [] - - value = subject.to_a - - value.should be_an_instance_of(Array) - value[0].should eq(200) # Status code - value[1].should be_an_instance_of(Hash) # Headers - value[2].should eq([]) # Body - end - - it "returns the content length in the header" do - subject.body = ['foobar'] - value = subject.to_a - - value[1]['Content-Length'].should eq('6') # Headers - end - - it "does not fix the Content-Length, if it's already set" do - subject.body = ['foobar'] - subject.header = {'Content-Length' => '3'} - value = subject.to_a - - value[1]['Content-Length'].should eq('3') # Headers - end - - it "returns the Content-Type in the header" do - subject.header = {'Content-Type' => 'application/json'} - value = subject.to_a - - value[1]['Content-Type'].should eq('application/json') # Headers - end - - it "returns as default 'text/html' as Content-Type" do - value = subject.to_a - - value[1]['Content-Type'].should eq('text/html') # Headers - end - - it "removes Content-Type, Content-Length and body on status code 204" do - subject.body.push '"foobar"' - subject.content_type = 'application/json' - subject.header['Content-Length'] = 8 - - subject.status = 204 - value = subject.to_a - - value[1].should eq({}) # Headers - value[2].should eq([]) # Body - end - - it "removes Content-Type, Content-Length and body on status code 304" do - subject.body.push '"foobar"' - subject.content_type = 'application/json' - subject.header['Content-Length'] = 8 - - subject.status = 304 - value = subject.to_a - - value[1].should eq({}) # Headers - value[2].should eq([]) # Body - end - end - - describe '#status' do - it "must return the status always as an integer" do - subject.status = "foobar" - subject.status.should eq(0) - - subject.status = 240.5 - subject.status.should eq(240) - end - - it "must return 200, if no status code was set" do - subject.status.should eq(200) - end - end - - describe '#header' do - it "must return an empty hash, if no header was set" do - subject.header.should eq({}) - end - end - - describe '#body' do - it "must return an empty array, if no body was set" do - subject.body.should eq([]) - end - end - - describe '#content_length' do - it "sets the Content-Length to '0', if there is no content" do - subject.content_length - - subject.header['Content-Length'].should eq('0') - end - - it "sets the Content-Length to the size of the message body" do - subject.body = ['foo', 'bar'] - subject.content_length - - subject.header['Content-Length'].should eq('6') - end - - it "sets the Content-Length to the bytesize of the message body" do - subject.body = ['föö', 'bär'] - subject.content_length - - subject.header['Content-Length'].should eq('9') - end - end - - describe '#content_type' do - it "sets the Content-Type to the given value" do - subject.content_type = 'application/json' - - subject.header['Content-Type'].should eq('application/json') - end - end - - describe '#redirect' do - it "sets the status to 302 and the given Location URL in header" do - subject.redirect 'http://foo.bar/relocated/thingy' - value = subject.to_a - - value[0].should eq(302) - value[1]['Location'].should eq('http://foo.bar/relocated/thingy') - end - - it "sets the given status code and the given Location" do - subject.redirect('http://foo.bar/relocated/other_thingy', 307) - value = subject.to_a - - value[0].should eq(307) - value[1]['Location'].should eq('http://foo.bar/relocated/other_thingy') - end - end - -end \ No newline at end of file diff --git a/spec/unit/router/call_spec.rb b/spec/unit/router/call_spec.rb deleted file mode 100644 index 6f01e3c..0000000 --- a/spec/unit/router/call_spec.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'spec_helper' - -describe Zero::Router, '#call' do - subject { Zero::Router.new(routes) } - let(:result) { ['success'] } - let(:content_type) { {'Content-Type' => 'text/html'} } - let(:status_code) { 200 } - - let(:wrong_app) do - lambda {|env| [200, {'Content-Type' => 'text/html'}, 'Wrong'] } - end - let(:app) { SpecApp } - - shared_examples_for 'a sample app' do - it "returns a response" do - subject.call(env).to_a[0].should eq(status_code) - subject.call(env).to_a[1].should eq(content_type) - subject.call(env).to_a[2].should eq(result) - end - end - - context 'with a single route' do - let(:routes) {{ '/' => app }} - let(:env) { EnvGenerator.get('/') } - it_behaves_like "a sample app" - end - - context 'with multiple router' do - let(:routes) {{ '/foo' => app, '/wrong' => wrong_app }} - let(:env) { EnvGenerator.get('/foo') } - it_behaves_like "a sample app" - end - - context 'with nested routes' do - let(:routes) {{ '/' => wrong_app, '/foo' => app, '/foo/bar' => wrong_app }} - let(:env) { EnvGenerator.get('/foo') } - it_behaves_like "a sample app" - end - - context 'with a route not found' do - let(:routes) {{ '/foo' => wrong_app, '/foo/bar/baz' => app }} - let(:env) { EnvGenerator.get('/foo/bar') } - let(:result) { ['Not found!'] } - let(:status_code) { 404 } - it_behaves_like "a sample app" - end - - context 'with parameters' do - let(:routes) {{ '/foo/:id' => app }} - let(:env) { EnvGenerator.get('/foo/bar') } - let(:app) do - lambda do |env| - [200, content_type, [Zero::Request.new(env).params['id']]] - end - end - let(:result) { ['bar'] } - - it_behaves_like 'a sample app' - end -end diff --git a/spec/unit/zero/controller/call_spec.rb b/spec/unit/zero/controller/call_spec.rb new file mode 100644 index 0000000..6cc56a4 --- /dev/null +++ b/spec/unit/zero/controller/call_spec.rb @@ -0,0 +1,41 @@ +require 'spec_helper' + +describe Zero::Controller, '.call' do + subject { controller.call(env) } + let(:controller) { SpecController } + let(:env) { EnvGenerator.get('/foo') } + + before :each do + controller.renderer = Object.new + end + + it "returns a response" do + subject.should be_respond_to(:to_a) + end + + it "returns an object with the first element being a status" do + subject[0].should be_kind_of(Numeric) + end + + it "does not modify an existing request" do + r = Zero::Request.new(env) + r.params['foo'] = 'bar' + subject + r = Zero::Request.new(env) + expect(r.params['foo']).to eq('bar') + end + + context "with the response" do + let(:response_class) { mock } + before :each do + Zero::Controller.response = response_class + response_class.should_receive(:new) + end + + after :each do + Zero::Controller.response = nil + end + + it { subject } + end +end diff --git a/spec/unit/zero/controller/render_spec.rb b/spec/unit/zero/controller/render_spec.rb new file mode 100644 index 0000000..771db28 --- /dev/null +++ b/spec/unit/zero/controller/render_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe Zero::Controller, '#render' do + subject { Zero::Controller.new(env) } + let(:env) { EnvGenerator.get('/foo') } + let(:renderer) { mock } + let(:template) { '/foo' } + + before :each do + Zero::Controller.renderer = renderer + renderer.should_receive(:render).with(template, + kind_of(Zero::Request::AcceptType), subject) + end + after :each do + Zero::Controller.renderer = nil + end + + it { subject.render(template) } +end diff --git a/spec/unit/zero/controller/renderer_spec.rb b/spec/unit/zero/controller/renderer_spec.rb new file mode 100644 index 0000000..21664ec --- /dev/null +++ b/spec/unit/zero/controller/renderer_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe Zero::Controller, '#renderer' do + subject { Zero::Controller } + let(:renderer) { Object.new } + + it 'returns the set renderer' do + subject.renderer = renderer + expect(subject.new({}).renderer).to be(renderer) + end +end diff --git a/spec/unit/zero/renderer/read_template_path_spec.rb b/spec/unit/zero/renderer/read_template_path_spec.rb new file mode 100644 index 0000000..8655777 --- /dev/null +++ b/spec/unit/zero/renderer/read_template_path_spec.rb @@ -0,0 +1,66 @@ +require 'spec_helper' + +describe Zero::Renderer, 'read_template_path!' do + subject { Zero::Renderer.new(template_path, type_map) } + let(:template_path) { 'foo' } + let(:file_list) { ['foo/welcome/index.html.erb'] } + + before :each do + Dir.stub(:[]) do |arg| + if arg == 'foo/**/*.*' + file_list + else + [] + end + end + end + + shared_examples_for 'a template loader' do + it 'creates a template tree' do + subject.read_template_path! + subject.templates['welcome/index'].should eq(result) + end + end + + context 'without mapping' do + let(:type_map) { {} } + let(:result) { { 'html' => 'foo/welcome/index.html.erb' } } + + it_behaves_like 'a template loader' + end + + context 'with a single mapping' do + let(:type_map) { {'html' => 'text/html' } } + let(:result) { { 'text/html' => 'foo/welcome/index.html.erb' } } + + it_behaves_like 'a template loader' + end + + context 'with multiple mappings' do + let(:type_map) { {'html' => ['text/html', 'text/xml'] } } + let(:result) { { + 'text/html' => 'foo/welcome/index.html.erb', + 'text/xml' => 'foo/welcome/index.html.erb' + } } + + it_behaves_like 'a template loader' + end + + context 'with default template' do + let(:file_list) {['foo/welcome/index.erb']} + let(:type_map) { {'default' => ['text/html', 'text/xml'] } } + let(:result) { { + 'text/html' => 'foo/welcome/index.erb', + 'text/xml' => 'foo/welcome/index.erb' + } } + + it_behaves_like 'a template loader' + end + + it 'creates an empty templates list without templates in path' do + subject = Zero::Renderer.new("bar", {}) + subject.read_template_path! + + subject.templates.should eq({}) + end +end diff --git a/spec/unit/zero/renderer/render_spec.rb b/spec/unit/zero/renderer/render_spec.rb new file mode 100644 index 0000000..30d2225 --- /dev/null +++ b/spec/unit/zero/renderer/render_spec.rb @@ -0,0 +1,54 @@ +require 'spec_helper' + +describe Zero::Renderer, '#render' do + subject { Zero::Renderer.new(template_path, type_map) } + let(:template_path) { 'spec/fixtures/templates' } + let(:type_map) {{ + 'html' => ['text/html', 'text/xml', '*/*'], + 'json' => ['application/json', 'plain/text'] + }} + let(:html_types) { ['text/html'] } + let(:json_types) { ['application/json'] } + let(:foo_types) { ['foo/bar', 'bar/foo'] } + let(:binding) { SpecTemplateContext.new('foo') } + + before :each do + subject.read_template_path! + end + + it 'returns a tilt template' do + subject.render('index', html_types, binding).should be_kind_of(String) + end + + it 'renders html content' do + subject.render('index', html_types, binding).should match('success') + end + + it 'returns a tilt template for different types' do + subject.render('index', json_types, binding).should be_kind_of(String) + end + + it 'renders json content' do + subject.render('index', json_types, binding).should match("{text: 'success'}") + end + + it 'returns an ArgumentError, if given template does not exist' do + expect { + subject.render('foobar', html_types, binding) + }.to raise_error(ArgumentError, "No template found for 'foobar'!") + end + + it 'returns an ArgumentError, if no template fits types' do + expect { + subject.render('index', foo_types, binding) + }.to raise_error( + ArgumentError, + "No template found for any of this types #{foo_types.join ', '}!" + ) + end + + it 'uses the context' do + subject.render('context', html_types, binding).should match('foo') + + end +end diff --git a/spec/unit/zero/renderer/template_path.rb b/spec/unit/zero/renderer/template_path.rb new file mode 100644 index 0000000..261faa8 --- /dev/null +++ b/spec/unit/zero/renderer/template_path.rb @@ -0,0 +1,8 @@ +require 'spec_helper' + +describe Zero::Renderer, '#template_path' do + subject { Zero::Renderer.new(template_path) } + let(:template_path) { 'foo' } + + its(:type_map) { should be(template_path) } +end diff --git a/spec/unit/zero/renderer/type_map_spec.rb b/spec/unit/zero/renderer/type_map_spec.rb new file mode 100644 index 0000000..290e579 --- /dev/null +++ b/spec/unit/zero/renderer/type_map_spec.rb @@ -0,0 +1,13 @@ +require 'spec_helper' + +describe Zero::Renderer, '#type_map' do + subject { Zero::Renderer.new(template_path, type_map) } + let(:template_path) { 'foo' } + let(:type_map) { {'html' => ['text/html']} } + + its(:type_map) { should be(type_map) } + + it 'returns an empty Hash, if type_map is not set while initialization' do + Zero::Renderer.new(template_path).type_map.should eq({}) + end +end diff --git a/spec/unit/zero/request/accept/encoding_spec.rb b/spec/unit/zero/request/accept/encoding_spec.rb new file mode 100644 index 0000000..9353cd1 --- /dev/null +++ b/spec/unit/zero/request/accept/encoding_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe Zero::Request::Accept, '#encoding' do + subject { Zero::Request::Accept.new(env) } + let(:encoding) { 'en_US' } + let(:env) { EnvGenerator.get('/foo', {'HTTP_ACCEPT_ENCODING' => encoding}) } + + it 'sets the encoding to the given value' do + subject.encoding.preferred.should eq('en_US') + end +end diff --git a/spec/unit/zero/request/accept/language_spec.rb b/spec/unit/zero/request/accept/language_spec.rb new file mode 100644 index 0000000..188d8af --- /dev/null +++ b/spec/unit/zero/request/accept/language_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe Zero::Request::Accept, '#language' do + subject { Zero::Request::Accept.new(env) } + let(:language) { 'en_US' } + let(:env) { EnvGenerator.get('/foo', {'HTTP_ACCEPT_LANGUAGE' => language}) } + + it 'sets the language to the given value' do + subject.language.preferred.should eq('en_US') + end +end diff --git a/spec/unit/zero/request/accept/types_spec.rb b/spec/unit/zero/request/accept/types_spec.rb new file mode 100644 index 0000000..b5f2da7 --- /dev/null +++ b/spec/unit/zero/request/accept/types_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe Zero::Request::Accept, '#types' do + subject { Zero::Request::Accept.new(env) } + let(:media_types) { 'text/html' } + let(:env) { EnvGenerator.get('/foo', {'HTTP_ACCEPT' => media_types}) } + + it 'sets the media type to the given value' do + subject.types.preferred.should eq('text/html') + end +end diff --git a/spec/unit/zero/request/accept_spec.rb b/spec/unit/zero/request/accept_spec.rb new file mode 100644 index 0000000..67840ac --- /dev/null +++ b/spec/unit/zero/request/accept_spec.rb @@ -0,0 +1,7 @@ +require 'spec_helper' + +describe Zero::Request, '#accept' do + subject { Zero::Request.new(env) } + let(:env) { EnvGenerator.get('/foo') } + its(:accept) { should be_an_instance_of(Zero::Request::Accept) } +end diff --git a/spec/unit/zero/request/accepttype/each_spec.rb b/spec/unit/zero/request/accepttype/each_spec.rb new file mode 100644 index 0000000..964a63e --- /dev/null +++ b/spec/unit/zero/request/accepttype/each_spec.rb @@ -0,0 +1,10 @@ +require 'spec_helper' + +describe Zero::Request::AcceptType, '#each' do + subject { Zero::Request::AcceptType.new(types) } + let(:html) { 'text/html' } + let(:json) { 'application/json' } + let(:types) { [html, json].join(',') } + + specify { expect {|b| subject.each(&b) }.to yield_successive_args(html, json) } +end diff --git a/spec/unit/zero/request/accepttype/preferred_spec.rb b/spec/unit/zero/request/accepttype/preferred_spec.rb new file mode 100644 index 0000000..ef21e8d --- /dev/null +++ b/spec/unit/zero/request/accepttype/preferred_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe Zero::Request::AcceptType, '#preferred' do + subject { Zero::Request::AcceptType } + let(:html) { 'text/html' } + let(:json) { 'application/json' } + let(:foo) { 'text/foo' } + let(:lower_quality) { foo + ';q=0.5' } + let(:default) { '*/*;q=0.1' } + let(:option) { [foo + ';b=23', html].join(',') } + let(:simple_accept) { [html, json].join(',') } + let(:quality_accept) { [html, lower_quality, default].join(',') } + let(:random_accept) { [lower_quality, default, html].join(',') } + let(:lower_accept) { [lower_quality, default].join(',') } + + context 'without mapping' do + it { subject.new(html).preferred.should == html } + it { subject.new(json).preferred.should == json } + it { subject.new(option).preferred.should == foo } + it { subject.new(simple_accept).preferred.should == html } + it { subject.new(quality_accept).preferred.should == html } + it { subject.new(random_accept).preferred.should == html } + it { subject.new(lower_accept).preferred.should == foo } + it { subject.new(nil).preferred.should == '*/*' } + it { subject.new('').preferred.should == '*/*' } + it { subject.new('text / html').preferred.should == html } + end + +# context 'with mapping' do +# before :all do +# Zero::Request::Accept.map = {'text/html' => 'html'} +# end +# +# after :all do +# Zero::Request::Accept.map = {} +# end +# +# it { subject.new(html).preferred.should == 'html' } +# end +end diff --git a/spec/unit/zero/request/client/address_spec.rb b/spec/unit/zero/request/client/address_spec.rb new file mode 100644 index 0000000..5e0b65d --- /dev/null +++ b/spec/unit/zero/request/client/address_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe Zero::Request::Client, '#address' do + subject { Zero::Request::Client.new(env) } + let(:address) { '127.0.0.1' } + let(:env) { {'REMOTE_ADDR' => address} } + + its(:address) { should == address } +end diff --git a/spec/unit/zero/request/client/hostname_spec.rb b/spec/unit/zero/request/client/hostname_spec.rb new file mode 100644 index 0000000..2742641 --- /dev/null +++ b/spec/unit/zero/request/client/hostname_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe Zero::Request::Client, '#hostname' do + subject { Zero::Request::Client.new(env) } + let(:hostname) { 'foo.bar' } + let(:env) { {'REMOTE_HOST' => hostname} } + + its(:hostname) { should == hostname } +end diff --git a/spec/unit/zero/request/client/user_agent_spec.rb b/spec/unit/zero/request/client/user_agent_spec.rb new file mode 100644 index 0000000..2f29bf1 --- /dev/null +++ b/spec/unit/zero/request/client/user_agent_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe Zero::Request::Client, '#user_agent' do + subject { Zero::Request::Client.new(env) } + let(:user_agent) { 'Mozilla (dummy agent)' } + let(:env) { {'HTTP_USER_AGENT' => user_agent} } + + its(:user_agent) { should == user_agent } +end diff --git a/spec/unit/zero/request/client_spec.rb b/spec/unit/zero/request/client_spec.rb new file mode 100644 index 0000000..5ccd155 --- /dev/null +++ b/spec/unit/zero/request/client_spec.rb @@ -0,0 +1,8 @@ +require 'spec_helper' + +describe Zero::Request, '#client' do + subject { Zero::Request.new(env) } + let(:env) { EnvGenerator.get('/foo') } + + its(:client) { should be_an_instance_of(Zero::Request::Client) } +end diff --git a/spec/unit/zero/request/content_type_spec.rb b/spec/unit/zero/request/content_type_spec.rb new file mode 100644 index 0000000..7482ccc --- /dev/null +++ b/spec/unit/zero/request/content_type_spec.rb @@ -0,0 +1,16 @@ +require 'spec_helper' + +describe Zero::Request, '#content_type' do + subject { Zero::Request.new(env) } + + context 'returns nil with no content type' do + let(:env) { EnvGenerator.get('/foo') } + its('content_type') { should be(nil) } + end + + context 'returns the set content type' do + let(:content_type) { 'bogus/type' } + let(:env) { EnvGenerator.post('/foo', {'CONTENT_TYPE' => content_type}) } + its('content_type') { should be(content_type) } + end +end diff --git a/spec/unit/zero/request/delete_spec.rb b/spec/unit/zero/request/delete_spec.rb new file mode 100644 index 0000000..9a5737d --- /dev/null +++ b/spec/unit/zero/request/delete_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Zero::Request, '#delete?' do + subject { Zero::Request.new(env) } + + context "with a delete request" do + let(:env) { EnvGenerator.delete('/foo') } + its(:delete?) { should be(true) } + end + + context "with a get request" do + let(:env) { EnvGenerator.get('/foo') } + its(:delete?) { should be(false) } + end +end diff --git a/spec/unit/zero/request/get_spec.rb b/spec/unit/zero/request/get_spec.rb new file mode 100644 index 0000000..0b96abc --- /dev/null +++ b/spec/unit/zero/request/get_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Zero::Request, '#get?' do + subject { Zero::Request.new(env) } + + context "with a get request" do + let(:env) { EnvGenerator.get('/foo') } + its(:get?) { should be(true) } + end + + context "with a post request" do + let(:env) { EnvGenerator.post('/foo') } + its(:get?) { should be(false) } + end +end diff --git a/spec/unit/zero/request/head_spec.rb b/spec/unit/zero/request/head_spec.rb new file mode 100644 index 0000000..5622fd6 --- /dev/null +++ b/spec/unit/zero/request/head_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Zero::Request, '#head?' do + subject { Zero::Request.new(env) } + + context "with a head request" do + let(:env) { EnvGenerator.head('/foo') } + its(:head?) { should be(true) } + end + + context "with a get request" do + let(:env) { EnvGenerator.get('/foo') } + its(:head?) { should be(false) } + end +end diff --git a/spec/unit/zero/request/method_spec.rb b/spec/unit/zero/request/method_spec.rb new file mode 100644 index 0000000..42ea56a --- /dev/null +++ b/spec/unit/zero/request/method_spec.rb @@ -0,0 +1,8 @@ +require 'spec_helper' + +describe Zero::Request, '#method' do + subject { Zero::Request.new(env) } + let(:env) { EnvGenerator.get('/foo') } + + its(:method) { should == :get } +end diff --git a/spec/unit/zero/request/new_spec.rb b/spec/unit/zero/request/new_spec.rb new file mode 100644 index 0000000..d057800 --- /dev/null +++ b/spec/unit/zero/request/new_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' + +describe Zero::Request, '.new' do + subject { Zero::Request.new(env) } + + context "with a fresh environment" do + let(:env) { EnvGenerator.get('/foo') } + it "creates an instance of Zero::Request" do + Zero::Request.new(env).should be_an_instance_of(Zero::Request) + end + end + + context "with an already used environment" do + let(:env) { EnvGenerator.get('/foo') } + let(:new_env) { subject.env } + + it "returns an already build request" do + Zero::Request.new(new_env).should be(subject) + end + end +end diff --git a/spec/unit/zero/request/parameter/custom_spec.rb b/spec/unit/zero/request/parameter/custom_spec.rb new file mode 100644 index 0000000..1abebc9 --- /dev/null +++ b/spec/unit/zero/request/parameter/custom_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe Zero::Request::Parameter, '#custom' do + subject { Zero::Request::Parameter.new(env) } + let(:env) { EnvGenerator.get('/foo') } + + it 'returns a set custom parameter' do + subject['foo'] = 'bar' + expect(subject.custom['foo']).to eq('bar') + end + + it 'returns the latest set value' do + subject['foo'] = 'first' + subject['foo'] = 'latest' + + expect(subject.custom['foo']).to eq('latest') + end + + it 'is empty if no custom parameter is set' do + expect(subject.custom).to eq({}) + expect(env['zero.params.custom']).to eq({}) + end +end diff --git a/spec/unit/zero/request/parameter/element_reference_spec.rb b/spec/unit/zero/request/parameter/element_reference_spec.rb new file mode 100644 index 0000000..1136eae --- /dev/null +++ b/spec/unit/zero/request/parameter/element_reference_spec.rb @@ -0,0 +1,56 @@ +require 'spec_helper' + +describe Zero::Request::Parameter, '#[]' do + subject { Zero::Request::Parameter.new(env) } + + context 'without parameters' do + let(:env) { EnvGenerator.get('/foo') } + + it 'returns the custom parameter' do + subject['foo'] = 'bar' + expect(subject['foo']).to eq('bar') + end + end + + context 'with query parameters' do + let(:env) { EnvGenerator.get('/foo?foo=bar') } + + it 'returns the query parameter' do + expect(subject['foo']).to eq('bar') + end + + it 'returns the custom parameter' do + subject['foo'] = 'baz' + expect(subject['foo']).to eq('baz') + end + end + + context 'with payload parameters' do + let(:env) do + EnvGenerator.post('/foo', { + :input => 'foo=bar', 'CONTENT_TYPE' => 'multipart/form-data' + }) + end + + it 'returns the payload value' do + expect(subject['foo']).to eq('bar') + end + + it 'returns the custom parameter' do + subject['foo'] = 'baz' + expect(subject['foo']).to eq('baz') + end + end + + context 'with query and payload parameters' do + let(:env) do + EnvGenerator.post('/foo?foo=baz', { + :input => 'foo=bar', 'CONTENT_TYPE' => 'multipart/form-data' + }) + end + + it 'returns the payload parameter' do + expect(subject['foo']).to eq('bar') + end + end +end diff --git a/spec/unit/zero/request/parameter/initialize_spec.rb b/spec/unit/zero/request/parameter/initialize_spec.rb new file mode 100644 index 0000000..58432cb --- /dev/null +++ b/spec/unit/zero/request/parameter/initialize_spec.rb @@ -0,0 +1,13 @@ +require 'spec_helper' + +describe Zero::Request::Parameter, '#initialize' do + subject { Zero::Request::Parameter.new(env) } + let(:env) { EnvGenerator.get('/get', { + 'zero.params.custom' => {'foo' => 'bar'} + }) } + + it 'does not overwrite parameters' do + subject + expect(env['zero.params.custom']).to have_key('foo') + end +end diff --git a/spec/unit/zero/request/parameter/payload_spec.rb b/spec/unit/zero/request/parameter/payload_spec.rb new file mode 100644 index 0000000..563b21d --- /dev/null +++ b/spec/unit/zero/request/parameter/payload_spec.rb @@ -0,0 +1,43 @@ +require 'spec_helper' + +describe Zero::Request::Parameter, '#payload' do + subject { Zero::Request::Parameter.new(env) } + + context 'without parameters' do + let(:env) { EnvGenerator.get('/foo') } + its(:payload) { should == {} } + end + + context 'with a query string' do + let(:env) { EnvGenerator.get('/foo?bar=baz') } + its(:payload) { should == {} } + end + + context 'with a post body' do + let(:env) do + EnvGenerator.post('/foo', { + :input => 'bar=baz', 'CONTENT_TYPE' => 'multipart/form-data' + }) + end + its(:payload) { should == {'bar' => 'baz'} } + end + + context 'with special characters' do + let(:env) do + EnvGenerator.post('/foo', { + :input => 'bar=foo%20bar', 'CONTENT_TYPE' => 'multipart/form-data' + }) + end + its(:payload) { should == {'bar' => 'foo bar'} } + end + + # TODO behaves like this, but is this really good like this? + context 'with a post body and content type application/json' do + let(:env) do + EnvGenerator.post('/foo', { + :input => '"foobar"', 'CONTENT_TYPE' => 'application/json' + }) + end + its(:payload) { should == {} } + end +end diff --git a/spec/unit/zero/request/parameter/query_spec.rb b/spec/unit/zero/request/parameter/query_spec.rb new file mode 100644 index 0000000..940e80e --- /dev/null +++ b/spec/unit/zero/request/parameter/query_spec.rb @@ -0,0 +1,25 @@ +require 'spec_helper' + +describe Zero::Request::Parameter, '#query' do + subject { Zero::Request::Parameter.new(env) } + + context 'without parameters' do + let(:env) { EnvGenerator.get('/foo') } + its(:query) { should == {} } + end + + context 'with a query string' do + let(:env) { EnvGenerator.get('/foo?bar=baz') } + its(:query) { should == {'bar' => 'baz'} } + end + + context 'with a post body' do + let(:env) { EnvGenerator.post('/foo', {:input => 'bar=baz'}) } + its(:query) { should == {} } + end + + context 'with special characters' do + let(:env) { EnvGenerator.get('/foo?bar=foo%20bar') } + its(:query) { should == {'bar' => 'foo bar'} } + end +end diff --git a/spec/unit/zero/request/params_spec.rb b/spec/unit/zero/request/params_spec.rb new file mode 100644 index 0000000..116e57e --- /dev/null +++ b/spec/unit/zero/request/params_spec.rb @@ -0,0 +1,8 @@ +require 'spec_helper' + +describe Zero::Request, '#params' do + subject { Zero::Request.new(env) } + let(:env) { EnvGenerator.get('/foo?bar=baz') } + + its(:params) { should be_an_instance_of(Zero::Request::Parameter) } +end diff --git a/spec/unit/zero/request/patch_spec.rb b/spec/unit/zero/request/patch_spec.rb new file mode 100644 index 0000000..ae0d2db --- /dev/null +++ b/spec/unit/zero/request/patch_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Zero::Request, '#patch?' do + subject { Zero::Request.new(env) } + + context "with a patch request" do + let(:env) { EnvGenerator.patch('/foo') } + its(:patch?) { should be(true) } + end + + context "with a get request" do + let(:env) { EnvGenerator.get('/foo') } + its(:patch?) { should be(false) } + end +end diff --git a/spec/unit/zero/request/path_spec.rb b/spec/unit/zero/request/path_spec.rb new file mode 100644 index 0000000..3873e48 --- /dev/null +++ b/spec/unit/zero/request/path_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe Zero::Request, '#path' do + subject { Zero::Request.new(env) } + let(:path) { '/foo' } + let(:env) { EnvGenerator.get(path) } + + its(:path) { should == path } +end diff --git a/spec/unit/zero/request/post_spec.rb b/spec/unit/zero/request/post_spec.rb new file mode 100644 index 0000000..2bfa834 --- /dev/null +++ b/spec/unit/zero/request/post_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Zero::Request, '#post?' do + subject { Zero::Request.new(env) } + + context "with a post request" do + let(:env) { EnvGenerator.post('/foo') } + its(:post?) { should be(true) } + end + + context "with a get request" do + let(:env) { EnvGenerator.get('/foo') } + its(:post?) { should be(false) } + end +end diff --git a/spec/unit/zero/request/put_spec.rb b/spec/unit/zero/request/put_spec.rb new file mode 100644 index 0000000..937d904 --- /dev/null +++ b/spec/unit/zero/request/put_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Zero::Request, '#put?' do + subject { Zero::Request.new(env) } + + context "with a put request" do + let(:env) { EnvGenerator.put('/foo') } + its(:put?) { should be(true) } + end + + context "with a get request" do + let(:env) { EnvGenerator.get('/foo') } + its(:put?) { should be(false) } + end +end diff --git a/spec/unit/zero/request/server/hostname_spec.rb b/spec/unit/zero/request/server/hostname_spec.rb new file mode 100644 index 0000000..b2275b4 --- /dev/null +++ b/spec/unit/zero/request/server/hostname_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe Zero::Request::Server, '#hostname' do + subject { Zero::Request::Server.new(env) } + let(:hostname) { 'FooName' } + let(:env) { EnvGenerator.get('/foo', {'SERVER_NAME' => hostname}) } + its(:hostname) { should be(hostname) } +end + diff --git a/spec/unit/zero/request/server/port_spec.rb b/spec/unit/zero/request/server/port_spec.rb new file mode 100644 index 0000000..24f6b5c --- /dev/null +++ b/spec/unit/zero/request/server/port_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Zero::Request::Server, '#port' do + subject { Zero::Request::Server.new(env) } + + context 'sets the port to the given value' do + let(:env) { EnvGenerator.get('/foo', {'SERVER_PORT' => 80}) } + its(:port) { should be(80) } + end + + context 'casts also the port to an integer, while setting it' do + let(:env) { EnvGenerator.get('/foo', {'SERVER_PORT' => '80'}) } + its(:port) { should be(80) } + end +end diff --git a/spec/unit/zero/request/server/protocol_spec.rb b/spec/unit/zero/request/server/protocol_spec.rb new file mode 100644 index 0000000..5aac149 --- /dev/null +++ b/spec/unit/zero/request/server/protocol_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe Zero::Request::Server, '#protocol' do + subject { Zero::Request::Server.new(env) } + let(:protocol) { 'HTTP FOO' } + let(:env) { EnvGenerator.get('/foo', {'SERVER_PROTOCOL' => protocol}) } + its(:protocol) { should be(protocol) } +end + diff --git a/spec/unit/zero/request/server/software_spec.rb b/spec/unit/zero/request/server/software_spec.rb new file mode 100644 index 0000000..374f8a2 --- /dev/null +++ b/spec/unit/zero/request/server/software_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe Zero::Request::Server, '#software' do + subject { Zero::Request::Server.new(env) } + let(:software) { 'SpecWare Server' } + let(:env) { EnvGenerator.get('/foo', {'SERVER_SOFTWARE' => software}) } + its(:software) { should be(software) } +end + diff --git a/spec/unit/zero/request/server_spec.rb b/spec/unit/zero/request/server_spec.rb new file mode 100644 index 0000000..ea16fbe --- /dev/null +++ b/spec/unit/zero/request/server_spec.rb @@ -0,0 +1,8 @@ +require 'spec_helper' + +describe Zero::Request, '#server' do + subject { Zero::Request.new(env) } + let(:env) { EnvGenerator.get('/foo') } + + its(:server) { should be_an_instance_of(Zero::Request::Server) } +end diff --git a/spec/unit/zero/response/response_spec.rb b/spec/unit/zero/response/response_spec.rb new file mode 100644 index 0000000..0cdd099 --- /dev/null +++ b/spec/unit/zero/response/response_spec.rb @@ -0,0 +1,148 @@ +# encoding: UTF-8 +require 'spec_helper' + +describe Zero::Response do + subject { Zero::Response.new() } + + describe '#to_a' do + it "returns an array within status header and body" do + subject.status = 200 + subject.header = {} + subject.body = [] + + value = subject.to_a + + value.should be_an_instance_of(Array) + value[0].should eq(200) # Status code + value[1].should be_an_instance_of(Hash) # Headers + value[2].should eq([]) # Body + end + + it "returns the content length in the header" do + subject.body = ['foobar'] + value = subject.to_a + + value[1]['Content-Length'].should eq('6') # Headers + end + + it "does not fix the Content-Length, if it's already set" do + subject.body = ['foobar'] + subject.header = {'Content-Length' => '3'} + value = subject.to_a + + value[1]['Content-Length'].should eq('3') # Headers + end + + it "returns the Content-Type in the header" do + subject.header = {'Content-Type' => 'application/json'} + value = subject.to_a + + value[1]['Content-Type'].should eq('application/json') # Headers + end + + it "returns as default 'text/html' as Content-Type" do + value = subject.to_a + + value[1]['Content-Type'].should eq('text/html') # Headers + end + + it "removes Content-Type, Content-Length and body on status code 204" do + subject.body.push '"foobar"' + subject.content_type = 'application/json' + subject.header['Content-Length'] = 8 + + subject.status = 204 + value = subject.to_a + + value[1].should eq({}) # Headers + value[2].should eq([]) # Body + end + + it "removes Content-Type, Content-Length and body on status code 304" do + subject.body.push '"foobar"' + subject.content_type = 'application/json' + subject.header['Content-Length'] = 8 + + subject.status = 304 + value = subject.to_a + + value[1].should eq({}) # Headers + value[2].should eq([]) # Body + end + end + + describe '#status' do + it "must return the status always as an integer" do + subject.status = "foobar" + subject.status.should eq(0) + + subject.status = 240.5 + subject.status.should eq(240) + end + + it "must return 200, if no status code was set" do + subject.status.should eq(200) + end + end + + describe '#header' do + it "must return an empty hash, if no header was set" do + subject.header.should eq({}) + end + end + + describe '#body' do + it "must return an empty array, if no body was set" do + subject.body.should eq([]) + end + end + + describe '#content_length' do + it "sets the Content-Length to '0', if there is no content" do + subject.content_length + + subject.header['Content-Length'].should eq('0') + end + + it "sets the Content-Length to the size of the message body" do + subject.body = ['foo', 'bar'] + subject.content_length + + subject.header['Content-Length'].should eq('6') + end + + it "sets the Content-Length to the bytesize of the message body" do + subject.body = ['föö', 'bär'] + subject.content_length + + subject.header['Content-Length'].should eq('9') + end + end + + describe '#content_type' do + it "sets the Content-Type to the given value" do + subject.content_type = 'application/json' + + subject.header['Content-Type'].should eq('application/json') + end + end + + describe '#redirect' do + it "sets the status to 302 and the given Location URL in header" do + subject.redirect 'http://foo.bar/relocated/thingy' + value = subject.to_a + + value[0].should eq(302) + value[1]['Location'].should eq('http://foo.bar/relocated/thingy') + end + + it "sets the given status code and the given Location" do + subject.redirect('http://foo.bar/relocated/other_thingy', 307) + value = subject.to_a + + value[0].should eq(307) + value[1]['Location'].should eq('http://foo.bar/relocated/other_thingy') + end + end + +end \ No newline at end of file diff --git a/spec/unit/zero/router/call_spec.rb b/spec/unit/zero/router/call_spec.rb new file mode 100644 index 0000000..6f01e3c --- /dev/null +++ b/spec/unit/zero/router/call_spec.rb @@ -0,0 +1,60 @@ +require 'spec_helper' + +describe Zero::Router, '#call' do + subject { Zero::Router.new(routes) } + let(:result) { ['success'] } + let(:content_type) { {'Content-Type' => 'text/html'} } + let(:status_code) { 200 } + + let(:wrong_app) do + lambda {|env| [200, {'Content-Type' => 'text/html'}, 'Wrong'] } + end + let(:app) { SpecApp } + + shared_examples_for 'a sample app' do + it "returns a response" do + subject.call(env).to_a[0].should eq(status_code) + subject.call(env).to_a[1].should eq(content_type) + subject.call(env).to_a[2].should eq(result) + end + end + + context 'with a single route' do + let(:routes) {{ '/' => app }} + let(:env) { EnvGenerator.get('/') } + it_behaves_like "a sample app" + end + + context 'with multiple router' do + let(:routes) {{ '/foo' => app, '/wrong' => wrong_app }} + let(:env) { EnvGenerator.get('/foo') } + it_behaves_like "a sample app" + end + + context 'with nested routes' do + let(:routes) {{ '/' => wrong_app, '/foo' => app, '/foo/bar' => wrong_app }} + let(:env) { EnvGenerator.get('/foo') } + it_behaves_like "a sample app" + end + + context 'with a route not found' do + let(:routes) {{ '/foo' => wrong_app, '/foo/bar/baz' => app }} + let(:env) { EnvGenerator.get('/foo/bar') } + let(:result) { ['Not found!'] } + let(:status_code) { 404 } + it_behaves_like "a sample app" + end + + context 'with parameters' do + let(:routes) {{ '/foo/:id' => app }} + let(:env) { EnvGenerator.get('/foo/bar') } + let(:app) do + lambda do |env| + [200, content_type, [Zero::Request.new(env).params['id']]] + end + end + let(:result) { ['bar'] } + + it_behaves_like 'a sample app' + end +end -- cgit v1.2.3-70-g09d2