nyara 0.0.1.pre.5 → 0.0.1.pre.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/example/factorial.rb +19 -0
  3. data/ext/accept.c +2 -2
  4. data/ext/event.c +48 -23
  5. data/ext/extconf.rb +2 -0
  6. data/ext/hashes.c +28 -3
  7. data/ext/http-parser/http_parser.h +1 -0
  8. data/ext/nyara.c +20 -3
  9. data/ext/nyara.h +13 -2
  10. data/ext/request.c +90 -13
  11. data/ext/request.h +8 -2
  12. data/ext/request_parse.c +135 -6
  13. data/ext/route.cc +7 -10
  14. data/ext/test_response.c +155 -0
  15. data/ext/url_encoded.c +0 -5
  16. data/lib/nyara/config.rb +5 -0
  17. data/lib/nyara/controller.rb +91 -28
  18. data/lib/nyara/cookie.rb +7 -0
  19. data/lib/nyara/flash.rb +23 -0
  20. data/lib/nyara/hashes/header_hash.rb +2 -0
  21. data/lib/nyara/nyara.rb +14 -2
  22. data/lib/nyara/part.rb +156 -0
  23. data/lib/nyara/patches/array.rb +5 -0
  24. data/lib/nyara/patches/blank.rb +128 -0
  25. data/lib/nyara/patches/json.rb +15 -0
  26. data/lib/nyara/patches/mini_support.rb +6 -0
  27. data/lib/nyara/patches/string.rb +21 -0
  28. data/lib/nyara/patches/to_query.rb +113 -0
  29. data/lib/nyara/request.rb +13 -15
  30. data/lib/nyara/route.rb +15 -80
  31. data/lib/nyara/route_entry.rb +69 -2
  32. data/lib/nyara/session.rb +66 -21
  33. data/lib/nyara/test.rb +170 -0
  34. data/lib/nyara/view.rb +5 -6
  35. data/lib/nyara.rb +7 -6
  36. data/nyara.gemspec +2 -2
  37. data/rakefile +34 -4
  38. data/readme.md +8 -1
  39. data/spec/config_spec.rb +28 -0
  40. data/spec/cpu_counter_spec.rb +9 -0
  41. data/spec/evented_io_spec.rb +1 -0
  42. data/spec/flash_spec.rb +29 -0
  43. data/spec/hashes_spec.rb +8 -0
  44. data/spec/mini_support_spec.rb +54 -0
  45. data/spec/part_spec.rb +52 -0
  46. data/spec/path_helper_spec.rb +22 -14
  47. data/spec/request_delegate_spec.rb +19 -11
  48. data/spec/route_entry_spec.rb +55 -0
  49. data/spec/session_spec.rb +69 -7
  50. data/spec/spec_helper.rb +3 -0
  51. data/spec/test_spec.rb +58 -0
  52. data/tools/hello.rb +11 -3
  53. data/tools/memcheck.rb +33 -0
  54. data/tools/s.rb +11 -0
  55. metadata +23 -7
  56. data/example/design.rb +0 -62
  57. data/example/fib.rb +0 -15
  58. data/spec/route_spec.rb +0 -84
  59. /data/ext/inc/{status_codes.inc → status_codes.h} +0 -0
data/readme.md CHANGED
@@ -2,6 +2,7 @@ Not Yet Another Ruby Async web framework and server.
2
2
 
3
3
  [![Build Status](https://travis-ci.org/luikore/nyara.png)](https://travis-ci.org/luikore/nyara)
4
4
 
5
+ - Fast
5
6
  - Evented IO while API remains synchrony
6
7
  - Prefork production server, mixing a bit blocking operations won't block other users
7
8
  - Sinatra-like http method and scanf-like http path and path helper
@@ -39,6 +40,7 @@ ruby nyahaha.rb
39
40
 
40
41
  # Documentation
41
42
 
43
+ - [Wiki](https://github.com/luikore/nyara/wiki/Home)
42
44
  - [Manual](https://github.com/luikore/nyara/wiki/Manual)
43
45
  - [API doc](http://rubydoc.info/github/luikore/nyara/master/frames)
44
46
  - [Building from source](https://github.com/luikore/nyara/wiki/Building)
@@ -50,4 +52,9 @@ ruby nyahaha.rb
50
52
 
51
53
  # License
52
54
 
53
- BSD, see [copying](https://github.com/luikore/nyara/blob/master/copying)
55
+ BSD 3-Clause, see [copying](https://github.com/luikore/nyara/blob/master/copying)
56
+
57
+ # Contributors
58
+
59
+ luikore
60
+ hooopo
@@ -0,0 +1,28 @@
1
+ require_relative "spec_helper"
2
+
3
+ module Nyara
4
+ describe Config do
5
+ after :all do
6
+ Config.reset
7
+ end
8
+
9
+ it "#workers" do
10
+ Nyara.config.workers '3'
11
+ assert_equal 3, Config['workers']
12
+ end
13
+
14
+ it "#port" do
15
+ Config.port '1000'
16
+ assert_equal 1000, Config['port']
17
+ end
18
+
19
+ it "env helpers" do
20
+ Config.set :env, 'test'
21
+ assert_equal true, Config.test?
22
+ assert_equal false, Config.development?
23
+
24
+ Config.set :env, 'production'
25
+ assert_equal false, Config.test?
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,9 @@
1
+ require_relative "spec_helper"
2
+
3
+ module Nyara
4
+ describe CpuCounter do
5
+ it "counts" do
6
+ assert CpuCounter.count.is_a?(Integer)
7
+ end
8
+ end
9
+ end
@@ -15,6 +15,7 @@ module Nyara
15
15
  end
16
16
 
17
17
  it "works" do
18
+ GC.stress = false # open-uri creates too many objects!
18
19
  result1 = open "http://localhost:3003", &:read
19
20
  result2 = open "http://baidu.com", &:read
20
21
  assert_equal result2, result1
@@ -0,0 +1,29 @@
1
+ require_relative "spec_helper"
2
+
3
+ module Nyara
4
+ describe Flash do
5
+ before :each do
6
+ @session = ParamHash.new
7
+ @flash = Flash.new @session
8
+ end
9
+
10
+ it "#next" do
11
+ @flash[:foo] = 'foo'
12
+ assert_equal 'foo', @flash.next['foo']
13
+ assert_not_empty @session.values.first
14
+
15
+ @flash.next[:bar] = 'bar'
16
+ assert_nil @flash[:bar]
17
+ end
18
+
19
+ it "#now" do
20
+ @flash.now['foo'] = 'foo'
21
+ assert_nil @flash.next['foo']
22
+ assert_empty @session.values.first
23
+ end
24
+
25
+ it "#now is from session, and #next is to session" do
26
+
27
+ end
28
+ end
29
+ end
data/spec/hashes_spec.rb CHANGED
@@ -26,6 +26,14 @@ module Nyara
26
26
  assert_equal ['Content-Type', 'text/plain'], h.to_a.first
27
27
  end
28
28
 
29
+ it "can serialize into an array" do
30
+ h = HeaderHash.new
31
+ h['Content-Length'] = 3
32
+ h['X-Weird'] = '奇怪'
33
+ arr = h.serialize
34
+ assert_equal ["Content-Length: 3\r\n", "X-Weird: 奇怪\r\n"], arr
35
+ end
36
+
29
37
  class HaHash < HeaderHash
30
38
  end
31
39
 
@@ -0,0 +1,54 @@
1
+ require_relative "spec_helper"
2
+
3
+ module Nyara
4
+ describe 'mini_support' do
5
+ it "Array#sum" do
6
+ assert_equal 0, [].sum
7
+ assert_equal 3, [1, 2].sum
8
+ end
9
+
10
+ # just test existence, no need to repeat activesupport tests
11
+ it "Object#blank?" do
12
+ assert [].respond_to? :blank?
13
+ end
14
+
15
+ # just test existence, no need to repeat activesupport tests
16
+ it "Object#to_query" do
17
+ assert ''.respond_to? :to_query
18
+ end
19
+
20
+ it "to_json works with inheritance" do
21
+ h = HeaderHash.new
22
+ h[:Accept] = 'en'
23
+ assert_equal('{"Accept":"en"}', h.to_json)
24
+ end
25
+
26
+ # just a class with .json_create(attrs)
27
+ class MyClass
28
+ def self.json_create attrs
29
+ 1
30
+ end
31
+ end
32
+ it "json load security" do
33
+ assert_equal({"json_class" => "MyClass", "length" => 1}, JSON.load('{"json_class":"MyClass","length":1}'))
34
+ end
35
+
36
+ it "json dump security" do
37
+ h = {"a" => '</script>', "b" => true}
38
+ assert_not_include(h.to_json, '</script>')
39
+ assert_equal h, JSON.parse(h.to_json)
40
+ end
41
+
42
+ if RUBY_VERSION <= '2.0.0'
43
+ it "String#b" do
44
+ assert_equal 'ASCII-8BIT', "你".b.encoding.to_s
45
+ end
46
+
47
+ it "String#scrub" do
48
+ # from rdoc examples
49
+ assert_equal "abc\u3042\uFFFD", "abc\u3042\x81".scrub
50
+ assert_equal "abc\u3042*", "abc\u3042\x81".scrub("*")
51
+ end
52
+ end
53
+ end
54
+ end
data/spec/part_spec.rb ADDED
@@ -0,0 +1,52 @@
1
+ require_relative "spec_helper"
2
+
3
+ module Nyara
4
+ describe Part do
5
+ it "bottom case" do
6
+ p = Part.new({})
7
+ p.final
8
+ assert_equal '', p['data']
9
+ end
10
+
11
+ it "parses base64" do
12
+ p = Part.new\
13
+ 'Content-Type' => 'image/jpeg; bla bla',
14
+ 'Content-Disposition' => "inline; fiLename *= gbk'zh-CN'%C8%CB%B2%CE.jpg; namE= \"file\"",
15
+ 'Content-Transfer-Encoding' => 'base64'
16
+
17
+ # total length a multiple to 8
18
+ data = [
19
+ "fNfaX7SRKfEfXMcYmHT/AHRXw94r0",
20
+ 'G',
21
+ 'xXxTqQFlaAC6l/5Yr/AHz7V6nAtam414yhf3',
22
+ 'jhzqEoODUt0f/Z'
23
+ ]
24
+ data.each do |datum|
25
+ p.update datum.dup
26
+ end
27
+ p.final
28
+
29
+ assert_equal 'base64', p['mechanism']
30
+ assert_equal 'image/jpeg', p['type']
31
+ assert_equal '人参.jpg', p['filename']
32
+ assert_equal 'file', p['name']
33
+ assert_equal data.join, Base64.strict_encode64(p['data'])
34
+ end
35
+
36
+ it "parses 7bit data" do
37
+ p = Part.new\
38
+ 'Content-Transfer-Encoding' => '7bit'
39
+ p.update 'foo bar'
40
+ assert_equal 'foo bar', p['data']
41
+ end
42
+
43
+ it "parses QP data" do
44
+ p = Part.new\
45
+ 'Content-Transfer-Encoding' => 'quoted-PrintaBle'
46
+ p.update "a =3F ="
47
+ p.update "04"
48
+ p.final
49
+ assert_equal "a \x3F \x04", p['data']
50
+ end
51
+ end
52
+ end
@@ -23,36 +23,39 @@ end
23
23
  module Nyara
24
24
  describe [Controller, Route] do
25
25
  before :all do
26
- Route.clear
27
26
  Config.configure do
27
+ reset
28
28
  set 'host', 'yavaeye.com'
29
29
  map '/', 'foo'
30
30
  map '/bar-prefix', 'foo_controller::bar'
31
31
  map '/baz-prefix', 'foo_controller::baz'
32
32
  end
33
- Route.compile
33
+ Nyara.setup
34
34
  end
35
35
 
36
- context '#path_for' do
36
+ context '#path_to' do
37
37
  it "local query" do
38
38
  c = FooController.new :stub_request
39
- assert_equal '/12', c.path_for('#index', 12)
39
+ assert_equal '/12', c.path_to('#index', 12)
40
40
  assert_raise ArgumentError do
41
- c.path_for '#index'
41
+ c.path_to '#index'
42
42
  end
43
43
  assert_raise ArgumentError do
44
- c.path_for('#index', 'a')
44
+ c.path_to('#index', 'a')
45
45
  end
46
46
  end
47
47
 
48
48
  it "global query" do
49
49
  c = FooController::BarController.new :stub_request
50
- assert_equal '/bar-prefix/', c.path_for('foo_controller::bar#index')
51
- assert_equal '/baz-prefix/1', c.path_for('baz#index', 1)
50
+ assert_equal '/bar-prefix/', c.path_to('foo_controller::bar#index')
51
+ assert_equal '/baz-prefix/1', c.path_to('baz#index', 1)
52
52
  end
53
53
 
54
54
  it "generates for nested query" do
55
- pending
55
+ c = FooController.new :stub_request
56
+ path = c.path_to('#index', 1, post: {array: [1, 2]})
57
+ items = URI.parse(path).query.split('&').map{|q| CGI.unescape q }
58
+ assert_equal ["post[array][]=1", "post[array][]=2"], items
56
59
  end
57
60
 
58
61
  it "perserves _method query" do
@@ -61,16 +64,21 @@ module Nyara
61
64
 
62
65
  it "appends format and query" do
63
66
  c = FooController.new :stub_request
64
- generated = c.path_for '#index', 1, format: 'js', 'utm_source' => 'a spam'
67
+ generated = c.path_to '#index', 1, format: 'js', 'utm_source' => 'a spam'
65
68
  assert_equal "/1.js?utm_source=a+spam", generated
66
69
  end
67
70
  end
68
71
 
69
- context '#url_for' do
72
+ context '#url_to' do
70
73
  it "works" do
71
- c = FooController::BazController.new :stub_request
72
- assert_equal '//yavaeye.com/baz-prefix/1', c.url_for('#index', 1)
73
- assert_equal 'https://localhost:4567/1', c.url_for('foo#index', 1, scheme: 'https', host: 'localhost:4567')
74
+ request = Object.new
75
+ class << request
76
+ attr_accessor :host_with_port
77
+ end
78
+ request.host_with_port = 'yavaeye.com'
79
+ c = FooController::BazController.new request
80
+ assert_equal '//yavaeye.com/baz-prefix/1', c.url_to('#index', 1)
81
+ assert_equal 'https://localhost:4567/1', c.url_to('foo#index', 1, scheme: 'https', host: 'localhost:4567')
74
82
  end
75
83
  end
76
84
  end
@@ -5,15 +5,26 @@ module Nyara
5
5
  class DelegateController < Controller
6
6
  end
7
7
 
8
+ before :all do
9
+ Session.init
10
+ end
11
+
8
12
  before :each do
9
13
  @request = Ext.request_new
14
+ session = ParamHash.new
10
15
  Ext.request_set_attrs @request, {
11
16
  method_num: HTTP_METHODS['GET'],
12
17
  path: '/search',
13
18
  query: ParamHash.new.tap{|h| h['q'] = 'nyara' },
14
19
  fiber: Fiber.new{},
15
20
  scope: '/scope',
16
- header: HeaderHash.new.tap{|h| h['Accept'] = 'en-US' }
21
+ header: HeaderHash.new.tap{|h| h['Accept'] = 'en-US' },
22
+ session: session,
23
+ flash: Flash.new(session),
24
+ cookie: ParamHash.new.tap{|h|
25
+ h['key1'] = 1
26
+ h['key2'] = 2
27
+ }
17
28
  # ext: nil
18
29
  # response_header:
19
30
  # response_header_extra_lines:
@@ -38,7 +49,7 @@ module Nyara
38
49
  assert_equal 'en-US', @c.header['accept']
39
50
  end
40
51
 
41
- context "Simulate IO" do
52
+ context "Emulate output IO" do
42
53
  before :each do
43
54
  @client, @server = Socket.pair :UNIX, :STREAM
44
55
  Ext.set_nonblock @server.fileno
@@ -61,23 +72,20 @@ module Nyara
61
72
 
62
73
  it "set cookie" do
63
74
  @c.set_cookie 'set', 'set'
64
- cookie = receive_header.lines.grep(/Set-Cookie:/).last
65
- assert_includes cookie, "set=set; HttpOnly"
75
+ cookie_lines = receive_header.lines.grep(/Set-Cookie:/)
76
+ assert cookie_lines.grep(/set=set; HttpOnly/).first, cookie_lines.inspect
66
77
  end
67
78
 
68
79
  it "delete cookie" do
69
80
  @c.delete_cookie 'del'
70
- cookie = receive_header.lines.grep(/Set-Cookie:/).last
71
- assert_includes cookie, "Expires"
81
+ cookie_lines = receive_header.lines.grep(/Set-Cookie:/)
82
+ assert cookie_lines.grep(/del.*Expires/).first, cookie_lines.inspect
72
83
  end
73
84
 
74
85
  it "clear cookie" do
75
86
  @c.clear_cookie
76
- pending 'incomplete implementation'
77
- end
78
-
79
- it "#session" do
80
- pending
87
+ cookie_lines = receive_header.lines
88
+ assert_equal 2, cookie_lines.grep(/Set-Cookie: (key1|key2);/).size, cookie_lines.inspect
81
89
  end
82
90
  end
83
91
  end
@@ -2,11 +2,66 @@ require_relative "spec_helper"
2
2
 
3
3
  module Nyara
4
4
  describe RouteEntry do
5
+ before :each do
6
+ @r = RouteEntry.new
7
+ end
8
+
9
+ it "#compile prefix, suffix and conv" do
10
+ @r.path = '/'
11
+ @r.compile :controller_stub, '/'
12
+ assert_equal '/', @r.prefix
13
+ assert_equal '', @r.suffix
14
+ assert_equal [], @r.conv
15
+
16
+ @r.path = '/'
17
+ @r.compile :controller_stub, '/scope'
18
+ assert_equal '/scope', @r.prefix
19
+ assert_equal '', @r.suffix
20
+ assert_equal [], @r.conv
21
+
22
+ @r.path = '/a/%d/b'
23
+ @r.compile :controller_stub, '/scope'
24
+ assert_equal "/scope/a/", @r.prefix
25
+ assert_equal "^(-?[0-9]+)/b$", @r.suffix
26
+ assert_equal [:to_i], @r.conv
27
+ end
28
+
5
29
  it "#set_accept_exts" do
6
30
  r = RouteEntry.new
7
31
  r.set_accept_exts ['html', :js]
8
32
  assert_equal [%w"text html html", %w"application javascript js"], r.accept_mimes
9
33
  assert_equal ({'html'=>true, 'js'=>true}), r.accept_exts
10
34
  end
35
+
36
+ it "#compile_re" do
37
+ re, conv = @r.compile_re '%s/%u/%d/%f/%x'
38
+ assert_equal [:to_s, :to_i, :to_i, :to_f, :hex], conv
39
+ s = '1/2/-3/4.5/F'
40
+ assert_equal [s, *s.split('/')], s.match(Regexp.new re).to_a
41
+
42
+ re, conv = @r.compile_re '/'
43
+ assert_equal '^/$', re
44
+ assert_equal [], conv
45
+ end
46
+
47
+ it "#compile_re with utf-8 chars" do
48
+ re, conv = @r.compile_re '/目录/%da/也可以'
49
+ assert_equal [:to_i], conv
50
+ s = "/目录/12a/也可以"
51
+ assert_equal [s, '12'], s.match(Regexp.new re).to_a
52
+ end
53
+
54
+ it "#analyse_path" do
55
+ r = @r.analyse_path '/hello/%d-world%u/%s/'
56
+ assert_equal ['/hello/', '%d-world%u/%s'], r
57
+
58
+ prefix, suffix = @r.analyse_path '/hello'
59
+ assert_equal '/hello', prefix
60
+ assert_equal nil, suffix
61
+
62
+ prefix, suffix = @r.analyse_path '/'
63
+ assert_equal '/', prefix
64
+ assert_equal nil, suffix
65
+ end
11
66
  end
12
67
  end
data/spec/session_spec.rb CHANGED
@@ -2,18 +2,74 @@ require_relative "spec_helper"
2
2
 
3
3
  module Nyara
4
4
  describe Session do
5
+ context ".encode_set_cookie options" do
6
+ before :all do
7
+ @session = {'hello' => 'world'}
8
+ end
9
+
10
+ it "is HttpOnly" do
11
+ Session.init
12
+ line = Session.encode_set_cookie @session, false
13
+ assert_includes line, '; HttpOnly'
14
+ end
15
+
16
+ it "adds Secure" do
17
+ init_configure_with :session, :secure, true
18
+ line = Session.encode_set_cookie @session, false
19
+ assert_includes line, '; Secure'
20
+
21
+ init_configure_with :session, :secure, false
22
+ line = Session.encode_set_cookie @session, true
23
+ assert_not_includes line, 'Secure'
24
+
25
+ init_configure_with :session, :secure, nil
26
+ line = Session.encode_set_cookie @session, true
27
+ assert_includes line, '; Secure'
28
+ line = Session.encode_set_cookie @session, false
29
+ assert_not_includes line, 'Secure'
30
+ end
31
+
32
+ it "adds Expires" do
33
+ init_configure_with :session, :expire, nil
34
+ line = Session.encode_set_cookie @session, false
35
+ assert_not_includes line, 'Expires'
36
+
37
+ init_configure_with :session, :expires, 30 * 60
38
+ line = Session.encode_set_cookie @session, false
39
+ assert_includes line, '; Expires='
40
+ end
41
+
42
+ it "raises for unkown keys" do
43
+ assert_raise RuntimeError do
44
+ init_configure_with :session, :ciphre_key, 'adsf'
45
+ end
46
+ end
47
+
48
+ def init_configure_with *options
49
+ Config.configure do
50
+ reset
51
+ set *options
52
+ end
53
+ Session.init
54
+ end
55
+ end
56
+
5
57
  context "no cipher" do
6
58
  before :all do
7
- Config['session', 'cipher_key'] = nil
59
+ Config.configure do
60
+ reset
61
+ set 'session', 'cipher_key', nil
62
+ end
8
63
  Session.init
9
64
  end
10
65
 
11
66
  it "should encode and decode" do
12
67
  cookie = {}
13
68
  session = {'hello' => 'world'}
14
- Session.encode session, cookie
69
+ Session.encode_to_cookie session, cookie
15
70
 
16
- assert_includes cookie[Session.name], 'world'
71
+ session_data = cookie[Session.name].split('/')[1]
72
+ assert_includes Base64.urlsafe_decode64(session_data), 'world'
17
73
 
18
74
  session2 = Session.decode cookie
19
75
  assert_equal 'world', session2[:hello]
@@ -22,7 +78,7 @@ module Nyara
22
78
  it "drops bad signature" do
23
79
  cookie = {}
24
80
  session = {'hello' => 'world'}
25
- Session.encode session, cookie
81
+ Session.encode_to_cookie session, cookie
26
82
 
27
83
  cookie[Session.name].sub!(/\w/, &:swapcase)
28
84
 
@@ -33,16 +89,22 @@ module Nyara
33
89
 
34
90
  context "with cipher" do
35
91
  before :all do
36
- Config['session', 'cipher_key'] = "some cipher key"
92
+ Config.configure do
93
+ reset
94
+ set 'session', 'cipher_key', "some cipher key"
95
+ end
37
96
  Session.init
38
97
  end
39
98
 
40
99
  it "encode and decode" do
41
100
  cookie = {}
42
101
  session = {'hello' => 'world'}
43
- Session.encode session, cookie
102
+ Session.encode_to_cookie session, cookie
44
103
 
45
- assert_not_includes cookie[Session.name], 'world'
104
+ session_data = cookie[Session.name].split('/')[1]
105
+ if session_data
106
+ assert_not_includes Base64.urlsafe_decode64(session_data), 'world'
107
+ end
46
108
 
47
109
  session2 = Session.decode cookie
48
110
  assert_equal 'world', session2[:hello]
data/spec/spec_helper.rb CHANGED
@@ -7,15 +7,18 @@ require "erb"
7
7
  require "haml"
8
8
  require "liquid"
9
9
  require "open-uri"
10
+ require "base64"
10
11
  require 'pp'
11
12
 
12
13
  if ENV['COVERAGE']
13
14
  require "simplecov"
14
15
  SimpleCov.start do
16
+ coverage_dir '.coverage'
15
17
  add_group 'lib', 'lib'
16
18
  end
17
19
  end
18
20
  require_relative "../lib/nyara/nyara"
21
+ require_relative "../lib/nyara/test"
19
22
 
20
23
  RSpec.configure do |config|
21
24
  config.expect_with :stdlib
data/spec/test_spec.rb ADDED
@@ -0,0 +1,58 @@
1
+ require_relative "spec_helper"
2
+
3
+ class TestController < Nyara::Controller
4
+ meta '#index'
5
+ get '/' do
6
+ content_type 'txt'
7
+ send_string '初めまして from test'
8
+ end
9
+
10
+ meta '#create'
11
+ post '/create' do
12
+ redirect_to '#index'
13
+ end
14
+ end
15
+
16
+ class MyTest
17
+ include Nyara::Test
18
+ end
19
+
20
+ module Nyara
21
+ describe Nyara::Test do
22
+ before :all do
23
+ configure do
24
+ reset
25
+ set :env, 'test'
26
+ map '/', TestController
27
+ end
28
+ Nyara.setup
29
+ @test = MyTest.new
30
+ end
31
+
32
+ it "response" do
33
+ @test.get "/", {'Xample' => 'résumé'}
34
+ assert @test.response.success?
35
+ assert_equal 'résumé', @test.request.header['Xample']
36
+ assert_equal '初めまして from test', @test.response.body
37
+ assert_equal 'text/plain; charset=UTF-8', @test.response.header['Content-Type']
38
+ end
39
+
40
+ it "redirect" do
41
+ @test.post @test.path_to('test#create')
42
+ assert @test.response.success?
43
+ assert_equal 'http://localhost/', @test.redirect_location
44
+ @test.follow_redirect
45
+ assert_equal '/', @test.request.path
46
+ end
47
+
48
+ it "session continuation" do
49
+ @test.session['a'] = '3'
50
+ @test.get "/"
51
+ assert_equal '3', @test.session['a']
52
+ @test.session['b'] = '4'
53
+ @test.get "/"
54
+ assert_equal '4', @test.session['b']
55
+ assert_equal '3', @test.session['a']
56
+ end
57
+ end
58
+ end
data/tools/hello.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require_relative "../lib/nyara"
2
- require "open-uri"
3
- require "pry"
2
+ # require "open-uri"
3
+ # require "pry"
4
4
 
5
5
  configure do
6
6
  # set :env, 'production'
@@ -8,8 +8,16 @@ configure do
8
8
  end
9
9
 
10
10
  get '/' do
11
- open 'http://baidu.com', &:read
11
+ # open 'http://baidu.com', &:read
12
12
  send_string 'hello world'
13
13
  end
14
14
 
15
+ get '/exit' do
16
+ exit
17
+ end
18
+
19
+ get '/redi' do
20
+ redirect '/'
21
+ end
22
+
15
23
  # GC.stress = true