diff options
Diffstat (limited to 'spec/node_spec.rb')
-rw-r--r-- | spec/node_spec.rb | 602 |
1 files changed, 298 insertions, 304 deletions
diff --git a/spec/node_spec.rb b/spec/node_spec.rb index f77d7c3..fe1edfb 100644 --- a/spec/node_spec.rb +++ b/spec/node_spec.rb @@ -1,315 +1,309 @@ -# -*- coding: UTF-8 -*- - require 'spec_helper' def clean_static_path - static_base_path = Node0.app.static_base_path - Dir.glob( File.join(static_base_path,'**','*') ).each do |f| File.unlink f if File.file? f end - Dir.glob( File.join(static_base_path,'*') ).each do |d| Dir.rmdir d end - Dir.rmdir static_base_path if File.directory? static_base_path + static_base_path = Node0.app.static_base_path + Dir.glob(File.join(static_base_path, '**', '*')).each { |f| File.unlink f if File.file? f } + Dir.glob(File.join(static_base_path, '*')).each { |d| Dir.rmdir d } + Dir.rmdir static_base_path if File.directory? static_base_path end describe Zorglub do + describe Zorglub::Node do + before(:all) do + clean_static_path + end + + after(:all) do + clean_static_path + end + + it "engine should return default Node's engine" do + expect(Node0.engine).to eq Node0.app.opt(:engine) + end + + it "layout should return default Node's layout" do + expect(Node0.layout).to eq Node0.app.opt(:layout) + end + + it "engine should return class defined Node's engine" do + expect(Node1.engine).to eq 'engine-1' + expect(Node3.engine).to eq 'engine-2' + end + + it "layout should return class defined Node's layout" do + expect(Node1.layout).to eq 'layout-1' + expect(Node3.layout).to eq 'layout-2' + end + + it 'engine should return engine inherited from Node2' do + expect(Node2.engine).to eq 'engine-1' + end + + it 'layout should return layout inherited from Node2' do + expect(Node2.layout).to eq 'layout-1' + end + + it 'r should build a well formed path' do + expect(Node1.r(1, 'arg2', 'some')).to eq '/node1/1/arg2/some' + end + + it 'instance level map should work' do + r = Node0.my_call '/with_2args/1/2' + h = YAML.load r.body[0] + expect(h[:map]).to eq '/node0' + end + + it 'should return err404 response when no method found' do + expect(Node0.respond_to?('noresponse')).to be_falsey + r = Node0.my_call '/noresponse' + expect(r.status).to eq 404 + end + + it 'simple method should respond' do + r = Node0.my_call '/hello' + expect(r.status).to eq 200 + expect(r.body[0]).to eq 'world' + end + + it 'instance level args should work' do + r = Node0.my_call '/with_2args/1/2' + h = YAML.load r.body[0] + expect(h[:args][0]).to eq '1' + expect(h[:args][1]).to eq '2' + end + + it 'should raise error when too much arguments' do + expect(-> { Node0.my_call '/with_2args/1/2/3' }).to raise_error ArgumentError + end + + it 'layout proc, method level layout and engine definitions should work' do + r = Node0.my_call '/index' + expect(r.status).to eq 200 + h = YAML.load r.body[0] + ly = File.join Node0.app.layout_base_path, Node0.layout + vu = File.join Node0.app.view_base_path, Node0.r, 'index' + expect(h[:path]).to eq ly + expect(h[:layout]).to eq ly + expect(h[:view]).to eq vu + end + + it 'layout proc, method level layout and engine definitions should work' do + r = Node1.my_call '/index' + expect(r.status).to eq 200 + h = YAML.load r.body[0] + ly = File.join Node1.app.layout_base_path, 'main.spec' + vu = File.join Node1.app.view_base_path, Node1.r, 'index.spec' + expect(h[:path]).to eq ly + expect(h[:layout]).to eq ly + expect(h[:view]).to eq vu + end + + it 'before_all hook should work' do + Node3.before = 0 + Node3.after = 0 + expect(Node3.before).to eq 0 + expect(Node3.my_call_i('/index')).to eq 1 + expect(Node3.before).to eq 1 + expect(Node3.my_call_i('/index')).to eq 1 + expect(Node3.before).to eq 2 + expect(Node3.my_call_i('/index')).to eq 1 + expect(Node3.before).to eq 3 + end + + it 'after_all hook should work' do + Node3.before = 0 + Node3.after = 0 + expect(Node3.after).to eq 0 + expect(Node3.my_call_i('/index')).to eq 1 + expect(Node3.after).to eq 1 + expect(Node3.my_call_i('/index')).to eq 1 + expect(Node3.after).to eq 2 + expect(Node3.my_call_i('/index')).to eq 1 + expect(Node3.after).to eq 3 + end + + it 'inherited before_all hook should work' do + Node3.before = 0 + Node3.after = 0 + expect(Node3.before).to eq 0 + expect(Node8.my_call_i('/index')).to eq 1 + expect(Node3.before).to eq 1 + expect(Node8.my_call_i('/index')).to eq 1 + expect(Node3.before).to eq 2 + expect(Node8.my_call_i('/index')).to eq 1 + expect(Node3.before).to eq 3 + end + + it 'inherited after_all hook should work' do + Node3.before = 0 + Node3.after = 0 + expect(Node3.after).to eq 0 + expect(Node8.my_call_i('/index')).to eq 1 + expect(Node3.after).to eq 1 + expect(Node8.my_call_i('/index')).to eq 1 + expect(Node3.after).to eq 2 + expect(Node8.my_call_i('/index')).to eq 1 + expect(Node3.after).to eq 3 + end + + it 'should find view and layout and render them' do + r = Node0.my_call '/do_render' + expect(r.status).to eq 200 + expect(r.body[0]).to eq 'layout_start view_content layout_end' + end + + it 'default mime-type should be text/html' do + r = Node0.my_call '/index' + expect(r.headers['Content-type']).to eq 'text/html' + end + + it 'should be able to override mime-type' do + r = Node0.my_call '/do_render' + expect(r.headers['Content-type']).to eq 'text/view' + end + + it 'should be able to override through rack response mime-type' do + r = Node0.my_call '/do_content_type' + expect(r.headers['Content-type']).to eq 'text/mine' + end + + it 'partial should render correctly' do + expect(Node0.partial({}, :do_partial, 1, 2)).to eq 'partial_content' + end + + it 'method level view should work' do + expect(Node0.partial({}, :other_view)).to eq 'partial_content' + end + + it 'partial with hooks should be default' do + Node3.before = 0 + Node3.after = 0 + expect(Node3.partial({}, :do_partial, 1, 2)).to eq 'partial_content' + expect(Node3.before).to eq 1 + expect(Node3.after).to eq 1 + end - describe Zorglub::Node do - - before(:all) do - clean_static_path - end - - after(:all) do - clean_static_path - end - - it "engine should return default Node's engine" do - expect(Node0.engine).to eq Node0.app.opt(:engine) - end - - it "layout should return default Node's layout" do - expect(Node0.layout).to eq Node0.app.opt(:layout) - end - - it "engine should return class defined Node's engine" do - expect(Node1.engine).to eq "engine-1" - expect(Node3.engine).to eq "engine-2" - end - - it "layout should return class defined Node's layout" do - expect(Node1.layout).to eq "layout-1" - expect(Node3.layout).to eq "layout-2" - end - - it "engine should return engine inherited from Node2" do - expect(Node2.engine).to eq "engine-1" - end - - it "layout should return layout inherited from Node2" do - expect(Node2.layout).to eq "layout-1" - end - - it "r should build a well formed path" do - expect(Node1.r(1,'arg2',"some")).to eq "/node1/1/arg2/some" - end - - it "instance level map should work" do - r = Node0.my_call '/with_2args/1/2' - h = YAML.load r.body[0] - expect(h[:map]).to eq '/node0' - end - - it "should return err404 response when no method found" do - expect(Node0.respond_to?('noresponse')).to be_falsey - r = Node0.my_call '/noresponse' - expect(r.status).to eq 404 - end - - it "simple method should respond" do - r = Node0.my_call '/hello' - expect(r.status).to eq 200 - expect(r.body[0]).to eq 'world' - end - - it "instance level args should work" do - r = Node0.my_call '/with_2args/1/2' - h = YAML.load r.body[0] - expect(h[:args][0]).to eq '1' - expect(h[:args][1]).to eq '2' - end - - it "should raise error when too much arguments" do - expect(lambda{ r = Node0.my_call '/with_2args/1/2/3' }).to raise_error ArgumentError - end - - it "layout proc, method level layout and engine definitions should work" do - r = Node0.my_call '/index' - expect(r.status).to eq 200 - h = YAML.load r.body[0] - ly = File.join Node0.app.layout_base_path, Node0.layout - vu = File.join Node0.app.view_base_path, Node0.r, 'index' - expect(h[:path]).to eq ly - expect(h[:layout]).to eq ly - expect(h[:view]).to eq vu - end - - it "layout proc, method level layout and engine definitions should work" do - r = Node1.my_call '/index' - expect(r.status).to eq 200 - h = YAML.load r.body[0] - ly = File.join Node1.app.layout_base_path, 'main.spec' - vu = File.join Node1.app.view_base_path, Node1.r, 'index.spec' - expect(h[:path]).to eq ly - expect(h[:layout]).to eq ly - expect(h[:view]).to eq vu - end - - it "before_all hook should work" do - Node3.before = 0 - Node3.after = 0 - expect(Node3.before).to eq 0 - expect(Node3.my_call_i('/index')).to eq 1 - expect(Node3.before).to eq 1 - expect(Node3.my_call_i('/index')).to eq 1 - expect(Node3.before).to eq 2 - expect(Node3.my_call_i('/index')).to eq 1 - expect(Node3.before).to eq 3 - end - - it "after_all hook should work" do - Node3.before = 0 - Node3.after = 0 - expect(Node3.after).to eq 0 - expect(Node3.my_call_i('/index')).to eq 1 - expect(Node3.after).to eq 1 - expect(Node3.my_call_i('/index')).to eq 1 - expect(Node3.after).to eq 2 - expect(Node3.my_call_i('/index')).to eq 1 - expect(Node3.after).to eq 3 - end - - it "inherited before_all hook should work" do - Node3.before = 0 - Node3.after = 0 - expect(Node3.before).to eq 0 - expect(Node8.my_call_i('/index')).to eq 1 - expect(Node3.before).to eq 1 - expect(Node8.my_call_i('/index')).to eq 1 - expect(Node3.before).to eq 2 - expect(Node8.my_call_i('/index')).to eq 1 - expect(Node3.before).to eq 3 - end - - it "inherited after_all hook should work" do - Node3.before = 0 - Node3.after = 0 - expect(Node3.after).to eq 0 - expect(Node8.my_call_i('/index')).to eq 1 - expect(Node3.after).to eq 1 - expect(Node8.my_call_i('/index')).to eq 1 - expect(Node3.after).to eq 2 - expect(Node8.my_call_i('/index')).to eq 1 - expect(Node3.after).to eq 3 - end - - it "should find view and layout and render them" do - r = Node0.my_call '/do_render' - expect(r.status).to eq 200 - expect(r.body[0]).to eq "layout_start view_content layout_end" - end - - it "default mime-type should be text/html" do - r = Node0.my_call '/index' - expect(r.headers['Content-type']).to eq 'text/html' - end - - it "should be able to override mime-type" do - r = Node0.my_call '/do_render' - expect(r.headers['Content-type']).to eq 'text/view' - end - - it "should be able to override through rack response mime-type" do - r = Node0.my_call '/do_content_type' - expect(r.headers['Content-type']).to eq 'text/mine' - end - - it "partial should render correctly" do - expect(Node0.partial({},:do_partial, 1, 2)).to eq 'partial_content' - end - - it "method level view should work" do - expect(Node0.partial({},:other_view)).to eq 'partial_content' - end - - it "partial with hooks should be default" do - Node3.before = 0 - Node3.after = 0 - expect(Node3.partial({},:do_partial,1,2)).to eq 'partial_content' - expect(Node3.before).to eq 1 - expect(Node3.after).to eq 1 - end - - it "partial without hooks should work" do - Node3.before = 0 - Node3.after = 0 - expect(Node3.partial({:no_hooks=>true},:do_partial,1,2)).to eq 'partial_content' - expect(Node3.before).to eq 0 - expect(Node3.after).to eq 0 - end - - it "static pages should be generated" do - r = Node6.my_call '/do_static' - expect(r.body[0]).to eq 'VAL 1' - expect(r.headers['Content-type']).to eq 'text/static' - r = Node6.my_call '/do_static' - expect(r.body[0]).to eq 'VAL 1' - expect(r.headers['Content-type']).to eq 'text/static' - r = Node6.my_call '/do_static' - expect(r.body[0]).to eq 'VAL 1' - expect(r.headers['Content-type']).to eq 'text/static' - r = Node6.my_call '/no_static' - expect(r.body[0]).to eq 'VAL 4' - expect(r.headers['Content-type']).to eq 'text/static' - r = Node6.my_call '/do_static' - expect(r.body[0]).to eq 'VAL 1' - expect(r.headers['Content-type']).to eq 'text/static' - Node6.static! true, 0.000001 - sleep 0.0001 - r = Node6.my_call '/do_static' - expect(r.body[0]).to eq 'VAL 6' - expect(r.headers['Content-type']).to eq 'text/static' - end - - it "redirect should work" do - r = Node0.my_call '/do_redirect' - expect(r.status).to eq 302 - expect(r.headers['location']).to eq Node0.r(:do_partial,1,2,3) - end - - it "no_layout! should be inherited" do - expect(Node5.layout).to be_nil - end - - it "cli_vals should be inherited and extended" do - r = Node5.my_call '/index' - vars = YAML.load r.body[0] - expect(vars).to eq ['js0','js1','js3','jsx','css0','css1','css2'] - expect(vars[7]).to be_nil - end - - it "cli_vals should be extended at method level" do - r = Node4.my_call '/more' - vars = YAML.load r.body[0] - expect(vars).to eq ['js0','js1','js2'] - expect(vars[3]).to be_nil - end - - it "cli_vals should be untouched" do - r = Node4.my_call '/index' - vars = YAML.load r.body[0] - expect(vars).to eq ['js0','js1'] - expect(vars[2]).to be_nil - r = Node5.my_call '/index' - vars = YAML.load r.body[0] - expect(vars).to eq ['js0','js1','js3','jsx','css0','css1','css2'] - expect(vars[7]).to be_nil - end - - it "ext definition and file engine should work" do - r = Node0.my_call '/xml_file' - expect(r.body[0]).to eq "<xml>file<\/xml>\n" - expect(r.headers['Content-type']).to eq 'application/xml' - r = Node0.my_call '/plain_file' - expect(r.body[0]).to eq "plain file\n" - expect(r.headers['Content-type']).to eq 'text/plain' - end - - it "no view no layout should work as well" do - r = Node0.my_call '/no_view_no_layout' - expect(r.body[0]).to eq "hello world" - end - - it "haml engine should work" do - Node0.app.opt! :engines_cache_enabled, false - r = Node0.my_call '/engines/haml' - expect(r.body[0]).to eq "<h1>Hello world</h1>\n" - Node0.app.opt! :engines_cache_enabled, true - r = Node0.my_call '/engines/haml' - expect(r.body[0]).to eq "<h1>Hello world</h1>\n" - end - - it "sass engine should work" do - Node0.app.opt! :engines_cache_enabled, true - r = Node0.my_call '/engines/sass' - expect(r.body[0]).to eq "vbar{width:80%;height:23px}vbar ul{list-style-type:none}vbar li{float:left}vbar li a{font-weight:bold}\n" - Node0.app.opt! :engines_cache_enabled, false - r = Node0.my_call '/engines/sass' - expect(r.body[0]).to eq "vbar{width:80%;height:23px}vbar ul{list-style-type:none}vbar li{float:left}vbar li a{font-weight:bold}\n" - end - - it "view_base_path! should work" do - r = Node7.my_call '/view_path' - h = YAML.load r.body[0] - expect(h[:view]).to eq File.join(Node7.app.opt(:root), 'alt','do_render') - end - - it "layout_base_path! should work" do - r = Node7.my_call '/view_path' - h = YAML.load r.body[0] - expect(h[:layout]).to eq File.join(Node7.app.opt(:root), 'alt','layout','default') - end - - it "debug out should work" do - stderr0= $stderr.dup - stderrs = StringIO.new - $stderr = stderrs - begin - APP.opt! :debug, true - Node0.my_call '/hello' - ensure - $stderr = stderr0 - end - expect(stderrs.string.include?('spec/data/view/node0/hello')).to be true - end + it 'partial without hooks should work' do + Node3.before = 0 + Node3.after = 0 + expect(Node3.partial({ no_hooks: true }, :do_partial, 1, 2)).to eq 'partial_content' + expect(Node3.before).to eq 0 + expect(Node3.after).to eq 0 + end + + it 'static pages should be generated' do + r = Node6.my_call '/do_static' + expect(r.body[0]).to eq 'VAL 1' + expect(r.headers['Content-type']).to eq 'text/static' + r = Node6.my_call '/do_static' + expect(r.body[0]).to eq 'VAL 1' + expect(r.headers['Content-type']).to eq 'text/static' + r = Node6.my_call '/do_static' + expect(r.body[0]).to eq 'VAL 1' + expect(r.headers['Content-type']).to eq 'text/static' + r = Node6.my_call '/no_static' + expect(r.body[0]).to eq 'VAL 4' + expect(r.headers['Content-type']).to eq 'text/static' + r = Node6.my_call '/do_static' + expect(r.body[0]).to eq 'VAL 1' + expect(r.headers['Content-type']).to eq 'text/static' + Node6.static! true, 0.000001 + sleep 0.0001 + r = Node6.my_call '/do_static' + expect(r.body[0]).to eq 'VAL 6' + expect(r.headers['Content-type']).to eq 'text/static' + end + + it 'redirect should work' do + r = Node0.my_call '/do_redirect' + expect(r.status).to eq 302 + expect(r.headers['location']).to eq Node0.r(:do_partial, 1, 2, 3) + end + it 'no_layout! should be inherited' do + expect(Node5.layout).to be_nil end + it 'cli_vals should be inherited and extended' do + r = Node5.my_call '/index' + vars = YAML.load r.body[0] + expect(vars).to eq %w[js0 js1 js3 jsx css0 css1 css2] + expect(vars[7]).to be_nil + end + + it 'cli_vals should be extended at method level' do + r = Node4.my_call '/more' + vars = YAML.load r.body[0] + expect(vars).to eq %w[js0 js1 js2] + expect(vars[3]).to be_nil + end + + it 'cli_vals should be untouched' do + r = Node4.my_call '/index' + vars = YAML.load r.body[0] + expect(vars).to eq %w[js0 js1] + expect(vars[2]).to be_nil + r = Node5.my_call '/index' + vars = YAML.load r.body[0] + expect(vars).to eq %w[js0 js1 js3 jsx css0 css1 css2] + expect(vars[7]).to be_nil + end + + it 'ext definition and file engine should work' do + r = Node0.my_call '/xml_file' + expect(r.body[0]).to eq "<xml>file<\/xml>\n" + expect(r.headers['Content-type']).to eq 'application/xml' + r = Node0.my_call '/plain_file' + expect(r.body[0]).to eq "plain file\n" + expect(r.headers['Content-type']).to eq 'text/plain' + end + + it 'no view no layout should work as well' do + r = Node0.my_call '/no_view_no_layout' + expect(r.body[0]).to eq 'hello world' + end + + it 'haml engine should work' do + Node0.app.opt! :engines_cache_enabled, false + r = Node0.my_call '/engines/haml' + expect(r.body[0]).to eq "<h1>Hello world</h1>\n" + Node0.app.opt! :engines_cache_enabled, true + r = Node0.my_call '/engines/haml' + expect(r.body[0]).to eq "<h1>Hello world</h1>\n" + end + + it 'sass engine should work' do + Node0.app.opt! :engines_cache_enabled, true + r = Node0.my_call '/engines/sass' + expect(r.body[0]).to eq "vbar{width:80%;height:23px}vbar ul{list-style-type:none}vbar li{float:left}vbar li a{font-weight:bold}\n" + Node0.app.opt! :engines_cache_enabled, false + r = Node0.my_call '/engines/sass' + expect(r.body[0]).to eq "vbar{width:80%;height:23px}vbar ul{list-style-type:none}vbar li{float:left}vbar li a{font-weight:bold}\n" + end + + it 'view_base_path! should work' do + r = Node7.my_call '/view_path' + h = YAML.load r.body[0] + expect(h[:view]).to eq File.join(Node7.app.opt(:root), 'alt', 'do_render') + end + + it 'layout_base_path! should work' do + r = Node7.my_call '/view_path' + h = YAML.load r.body[0] + expect(h[:layout]).to eq File.join(Node7.app.opt(:root), 'alt', 'layout', 'default') + end + + it 'debug out should work' do + stderr0 = $stderr.dup + stderrs = StringIO.new + $stderr = stderrs + begin + APP.opt! :debug, true + Node0.my_call '/hello' + ensure + $stderr = stderr0 + end + expect(stderrs.string.include?('spec/data/view/node0/hello')).to be true + end + end end |