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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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