trellis 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. data/History.txt +7 -0
  2. data/Manifest.txt +6 -181
  3. data/examples/crud_components/source/crud_components.rb +0 -1
  4. data/examples/examples.txt +32 -30
  5. data/examples/flickr/source/flickr.rb +0 -4
  6. data/examples/hangman/source/hangman.rb +1 -2
  7. data/examples/hilo/html/guess.xhtml +2 -2
  8. data/examples/hilo/source/hilo.rb +6 -6
  9. data/examples/routing/source/routing.rb +50 -0
  10. data/examples/stateful_counters/source/stateful_counters.rb +9 -4
  11. data/lib/trellis/{core_components.rb → component_library/core_components.rb} +48 -398
  12. data/lib/trellis/component_library/grid.rb +311 -0
  13. data/lib/trellis/{jquery.rb → component_library/jquery.rb} +0 -0
  14. data/lib/trellis/component_library/object_editor.rb +110 -0
  15. data/lib/trellis/trellis.rb +162 -52
  16. data/lib/trellis/utils.rb +9 -3
  17. data/lib/trellis/version.rb +1 -1
  18. data/tasks/rspec.rake +2 -1
  19. data/test/application_spec.rb +55 -30
  20. data/test/component_spec.rb +95 -81
  21. data/test/core_extensions_spec.rb +34 -2
  22. data/test/default_router_spec.rb +91 -0
  23. data/test/fixtures/application_spec_applications.rb +91 -3
  24. data/test/page_spec.rb +18 -8
  25. data/test/router_spec.rb +49 -49
  26. metadata +8 -185
  27. data/.git/COMMIT_EDITMSG +0 -1
  28. data/.git/HEAD +0 -1
  29. data/.git/config +0 -9
  30. data/.git/description +0 -1
  31. data/.git/hooks/applypatch-msg.sample +0 -15
  32. data/.git/hooks/commit-msg.sample +0 -24
  33. data/.git/hooks/post-commit.sample +0 -8
  34. data/.git/hooks/post-receive.sample +0 -15
  35. data/.git/hooks/post-update.sample +0 -8
  36. data/.git/hooks/pre-applypatch.sample +0 -14
  37. data/.git/hooks/pre-commit.sample +0 -18
  38. data/.git/hooks/pre-rebase.sample +0 -169
  39. data/.git/hooks/prepare-commit-msg.sample +0 -36
  40. data/.git/hooks/update.sample +0 -107
  41. data/.git/index +0 -0
  42. data/.git/info/exclude +0 -6
  43. data/.git/logs/HEAD +0 -1
  44. data/.git/logs/refs/heads/master +0 -1
  45. data/.git/logs/refs/remotes/origin/master +0 -1
  46. data/.git/objects/01/2368d4dd3162ed570e6c1423ecb07a6a35f8c0 +0 -0
  47. data/.git/objects/02/238c88c522b88e71529495460cc5c2c8abe110 +0 -0
  48. data/.git/objects/07/03d3b123189f1da72d3889d9340e681841c96d +0 -0
  49. data/.git/objects/0b/3935fdbf3ce8d37e6cb2a6ec94edaccb1c58dc +0 -0
  50. data/.git/objects/0f/ecd1ad35f280c874ce070b7a97a4c1f86ace54 +0 -0
  51. data/.git/objects/12/61911b063b7e6883c5e9db7ab4396183f6f2b5 +0 -0
  52. data/.git/objects/13/0b7e2d214ec198d07aeed5b462597670ce85ad +0 -0
  53. data/.git/objects/13/214d40f02b63f1233fd7881b1df9bb75d9c0a7 +0 -0
  54. data/.git/objects/14/7522bdc96af0b578935d81c1a7347b40573940 +0 -0
  55. data/.git/objects/16/a7fde706fe92b3548254d29722f5ca311ce63b +0 -2
  56. data/.git/objects/16/fe580663cc29d141bf416dff5bf21bf4ea42a3 +0 -0
  57. data/.git/objects/17/2d55806918bafb4e701515edb27147a4ef6498 +0 -0
  58. data/.git/objects/17/686ef1882ed6c3c07b781fab18739b1c5e48bd +0 -0
  59. data/.git/objects/17/824053c41a2cb523303e20cac42f66f9ca2134 +0 -0
  60. data/.git/objects/18/68448c5f88bc73b2fef6b8f3aa75b663013a3a +0 -1
  61. data/.git/objects/1a/6d9051dc4c7db10bdcf5e17c5cb717b072d30a +0 -0
  62. data/.git/objects/1a/8bdb445fb5668dcd1309cb9de5dedf846c822f +0 -0
  63. data/.git/objects/1b/6fa67b70358fdb82eabcd7ef3bc46d518d0426 +0 -0
  64. data/.git/objects/1c/f6510ed08a274fb3292d40557cebb3e7090767 +0 -0
  65. data/.git/objects/1d/e661ce11d5335e5dd7968ef5698e2eb164eb52 +0 -0
  66. data/.git/objects/1e/301ee672d6040e734af6d0a5491185129d7b67 +0 -0
  67. data/.git/objects/21/2201d46200f13d23d8199bd4a7ecc9165205b3 +0 -0
  68. data/.git/objects/22/f687370babdf38d224d2a9ff039707e8d0aac1 +0 -0
  69. data/.git/objects/24/202d2de95dc31f5f1802e629a16ad45b723267 +0 -0
  70. data/.git/objects/25/4c5b6b8d211d8b9f07310fd342fd7b078a81af +0 -0
  71. data/.git/objects/25/5832653fde9e9748855347fe7bce013aa0a6c7 +0 -0
  72. data/.git/objects/25/806945c89b4b5adb8c8676c308e4653361109c +0 -5
  73. data/.git/objects/26/cb8deaca28bf275769cbb71b88e53a44adb9ca +0 -0
  74. data/.git/objects/2e/1c13fb5f154f89cccd4c645540a2ec8ee0f57a +0 -0
  75. data/.git/objects/2f/437425b2c085bb529379e409d6b4bc7f9f9fba +0 -0
  76. data/.git/objects/2f/7cf4a25937b71f3de52e70c7a47cb2f7da07ea +0 -0
  77. data/.git/objects/31/31bdbbac6e6e7e24fd6ea84332461f67e6e5b6 +0 -0
  78. data/.git/objects/32/02e02de478263912b729283eabc7cdab8a8037 +0 -0
  79. data/.git/objects/32/839ed9baa8c800d9033655d1ee995499825fb5 +0 -0
  80. data/.git/objects/34/2e479c61796125b0e025b483401ec12f3c5824 +0 -2
  81. data/.git/objects/36/7acb017aebab3f627a5208c25885c21fa7fdbb +0 -0
  82. data/.git/objects/38/12910d2e2a8e6eeb79a399d20751675d3fbe77 +0 -0
  83. data/.git/objects/38/3fe1e1a07537db6e0f39c6005b7b4e40fa5ccd +0 -0
  84. data/.git/objects/39/5ef328bc94df9191f4d80a77503a5be9f1f673 +0 -0
  85. data/.git/objects/39/dc76dc096fdf737e9f4f7062b78cbf4ab9628f +0 -0
  86. data/.git/objects/3b/09eb196140b471556ed4c3987c0bc739733617 +0 -0
  87. data/.git/objects/3b/9f97f1bf55834832a92bab1ab900918dc49570 +0 -0
  88. data/.git/objects/40/5ffd3925b39dd905638ec24640dd8efa27cc1b +0 -0
  89. data/.git/objects/42/4a5f37c6fe3a7cac54b0f85688c1cce7da9cdf +0 -0
  90. data/.git/objects/44/9e23363d4e20da6a67be7ab78fc610b4e9852a +0 -0
  91. data/.git/objects/48/90bb5d241cecaa30b28148c920b833056c7508 +0 -0
  92. data/.git/objects/4c/558c43676410a2c0a7d5c7b94fca18923a9af1 +0 -0
  93. data/.git/objects/4f/bf572175dd5245104679ff8f676f6a34466c29 +0 -0
  94. data/.git/objects/53/8583edf00c9f656b32149a0e69e030371737c5 +0 -0
  95. data/.git/objects/5b/8a2c4bf7bb56ae199414096dbda21fd4b8cd63 +0 -0
  96. data/.git/objects/5c/9fe8ff998d56dc076657ef88ee9f784ec160f9 +0 -0
  97. data/.git/objects/5f/8441f9d3507587940f31af04dd9fd5911d2812 +0 -0
  98. data/.git/objects/61/4f2752550e63b793e31dcf98b5ea26c32eb0be +0 -0
  99. data/.git/objects/65/801b0fabdfd673861dbb2ac134d438ab2cc5e4 +0 -3
  100. data/.git/objects/66/2746dffaddbcd311f4ac070b5b9bddcd8894a7 +0 -0
  101. data/.git/objects/69/1ed3b65603a0d0dabfb66720e7163664be78f5 +0 -0
  102. data/.git/objects/69/3dc3b6037df8c1c8dfda916d649e7975481124 +0 -0
  103. data/.git/objects/69/67538427b3a371b33c01c72726ac7e67a04c39 +0 -0
  104. data/.git/objects/69/6cd6c3508e2adcc68829497884ff3d4b774dc2 +0 -0
  105. data/.git/objects/69/6ee93917040308ccd0bfc245d63c1cbeb23dae +0 -0
  106. data/.git/objects/6a/3ac317746a8a2cfc88f3580bbd2b03dc0d50b5 +0 -0
  107. data/.git/objects/6d/6ba435839a65b96cb3f7584a40dd3767a0990f +0 -0
  108. data/.git/objects/6f/32c190a651a82caeefeb55eb797fc5daf05426 +0 -0
  109. data/.git/objects/71/fecbce1bec36eaf4de655763d4bb7ceffc991d +0 -0
  110. data/.git/objects/72/01d78a9e90347fd2f7790f9e8665587791d853 +0 -0
  111. data/.git/objects/73/6c97d6a551363ba4a4956408ba228fcab7f91f +0 -0
  112. data/.git/objects/75/3264271e935e18f4eada49aa1818c6fb9e6abb +0 -0
  113. data/.git/objects/75/cc7d390b4a565495cbdc5a08d4479e7e8dbfeb +0 -0
  114. data/.git/objects/76/7c0c96f68b9ccec34ae538045a63bbe4f97d3e +0 -0
  115. data/.git/objects/7b/47fe9b1ab9f2692b9706054de706430089ecd4 +0 -0
  116. data/.git/objects/7c/73144ef6847d1bc2315aee0925c0e5cf5c09d1 +0 -0
  117. data/.git/objects/7d/9c177c155386606aa1024d5cb020a097eea64a +0 -0
  118. data/.git/objects/7d/e9a3296007c09ba9b7bc1802e1c5d9ad1d5dbb +0 -0
  119. data/.git/objects/7e/b73d408147c8d84881109189a9724292abcb8d +0 -0
  120. data/.git/objects/82/0e3bf5449a8f6b8eb637a653dcb2dc387b393c +0 -0
  121. data/.git/objects/83/a10ce96763cb30d0b81425e9372f89c52f4c9f +0 -0
  122. data/.git/objects/83/bdb801e78444d59225f83cf2f336f114cd23cf +0 -0
  123. data/.git/objects/85/24e583e822abc18b1ffdd0aa356c9c079b5548 +0 -0
  124. data/.git/objects/88/b46cc8de5237897d4ba5023d3efdc83fec4f7c +0 -0
  125. data/.git/objects/89/5eea66474f48a2cbf643ad0ef266fd26f9d2a3 +0 -0
  126. data/.git/objects/8a/539c5fc35d5b770d67241d2ccb6c6855df6a43 +0 -0
  127. data/.git/objects/8a/82cdbfb20cc58fdffe4e13b70b55977deb92c6 +0 -0
  128. data/.git/objects/8b/2b537442e4ac8719ffa71b3ae0c707133df06f +0 -0
  129. data/.git/objects/8c/2a45f0c81284a081f8d7980e9a54210a9dd52c +0 -0
  130. data/.git/objects/8e/10355b4ab312450031966107ef6a65b13833ee +0 -0
  131. data/.git/objects/90/f6c76767ae725f15fa6790dcb6afd1719fa0e2 +0 -0
  132. data/.git/objects/92/92b696aba9840c089241c68d4c6ca14be38a64 +0 -2
  133. data/.git/objects/93/e03faa6906892434fa9f2ad230c4ececc64055 +0 -0
  134. data/.git/objects/93/eca2e28d80fda45d327fdfc6c39ae690af41cd +0 -0
  135. data/.git/objects/95/92fe63bd5403654730cdec76cbf116ef83bbff +0 -0
  136. data/.git/objects/96/bc6dd471c1c188a2eb4308bcc3ca4e6c8faac8 +0 -0
  137. data/.git/objects/96/d855221a9ff4fba57d2b70680b57bd5115cfde +0 -0
  138. data/.git/objects/97/4ec92b2b9eb01a73fb57dc78d463cafdda69a7 +0 -0
  139. data/.git/objects/97/b7ec01ebe089832a0972d20b0a40d54456985c +0 -2
  140. data/.git/objects/97/fa6aaae4cfc7654feb39971e7aee5c41ed1679 +0 -1
  141. data/.git/objects/98/18351c6685a1df5d23686e6346d11d261cc6f0 +0 -0
  142. data/.git/objects/98/3d3b7e55cbbce2f2a52c6e6d830a5dca7b4d42 +0 -0
  143. data/.git/objects/a2/e551049a5388112c21e7f3a4a720bf720601fa +0 -0
  144. data/.git/objects/a3/7066bea4fae90d34761a3ebb3f8a348d94eba1 +0 -0
  145. data/.git/objects/a6/c99619145d1b9b75aa15ca04fbe4db0b2ee79b +0 -0
  146. data/.git/objects/aa/e2234d0a8c1485096c7a7de039eceb4e019e13 +0 -0
  147. data/.git/objects/b0/3b52f4269c9719e02ecd6caabd8aff5adf3aac +0 -0
  148. data/.git/objects/b1/50dbbd89f825302a9e82d8fdd66f238b8e6fc4 +0 -0
  149. data/.git/objects/b4/545fbe393aaa18f1c48de4d9f68f64ebf09ddc +0 -0
  150. data/.git/objects/b6/8691404e088692929d40b988b993f815d76756 +0 -0
  151. data/.git/objects/b7/daa3d844ef5f5cd917084e48edd82e67f8f476 +0 -0
  152. data/.git/objects/bf/4232281dba5a0f17e8b5c16b9cbd0f52274fa8 +0 -0
  153. data/.git/objects/bf/9b84d10f19188beffe5ee99e6f5af035ba77d3 +0 -2
  154. data/.git/objects/c0/06e664b306145de804f74ab27550d62a92f58a +0 -1
  155. data/.git/objects/c2/2806b16775f66453012d085d21fb8698521ea9 +0 -0
  156. data/.git/objects/c2/7f6559350f7adb19d43742b55b2f91d07b6550 +0 -0
  157. data/.git/objects/c3/833df21ed674a77374fd40ed931f900134d38b +0 -0
  158. data/.git/objects/c3/b9da021eb76abad0b17ad6c4be75595e41a7e6 +0 -0
  159. data/.git/objects/c5/ca6b7e3561ea88aba1712aabb984d1167787f1 +0 -0
  160. data/.git/objects/c6/39f65e1f43c75b7f57c5ab28623d295dfb2afd +0 -0
  161. data/.git/objects/c8/6f05fa5539f8e69e94850d1cd917919ff581be +0 -0
  162. data/.git/objects/cb/5e499c8dcc6f2901014a08e74f04b7a4bd6596 +0 -0
  163. data/.git/objects/cc/1289d25eeee6ba31b4e406372cb9abf969fc6f +0 -0
  164. data/.git/objects/cc/784e1b49111c42fa7eae10ad0e788186e672d1 +0 -0
  165. data/.git/objects/cc/bcae254dad515d7ef01a461980544e4483c41e +0 -0
  166. data/.git/objects/ce/bfadad3a7c17148998e04275e6d0d1cf1b2e1e +0 -0
  167. data/.git/objects/ce/f3335522abdc47a2c94be70455dcfaa9a51a27 +0 -0
  168. data/.git/objects/cf/6add7ea568d3d90d6a1f8afb0898b0119b14ff +0 -0
  169. data/.git/objects/d0/719abd196033fec0e4cbe2af68a26ca435389c +0 -0
  170. data/.git/objects/d1/ce63ff0eaec4dba419e5547f99195dfb9b5b20 +0 -0
  171. data/.git/objects/d2/c3feb3c74b892cca0049c0aced6ce786a784c8 +0 -0
  172. data/.git/objects/d7/8a91da13413419da71b539a3c6c7df4d8a2458 +0 -0
  173. data/.git/objects/d8/c7bed2b1357d54b6935536a8a51a3c73d535b4 +0 -0
  174. data/.git/objects/da/c3a1277ccb4806011e33eb32c5609cc45c46f2 +0 -0
  175. data/.git/objects/dc/3f920f4b937d0e2ac512f0bb31d477624c46d5 +0 -0
  176. data/.git/objects/dc/6c389abf5bd0d7b9be2a6bb6af90738a410e59 +0 -0
  177. data/.git/objects/df/07c423309f39c4d5570b0fad65dff23af654ae +0 -0
  178. data/.git/objects/e2/93a5c9e2257b9f3fcb8fa5d5c8147a2f07ba1b +0 -0
  179. data/.git/objects/e4/8464df56bf487e96e21ea99487330266dae3c9 +0 -0
  180. data/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  181. data/.git/objects/e8/0c13a1d1f62756fb9f1e4fb9f7512e5b8c5816 +0 -0
  182. data/.git/objects/e9/b8ade2125b2615ddc4c8043940c40ed36215c9 +0 -0
  183. data/.git/objects/ed/59a7599a81ef7ea7c230c3332345a3484febf8 +0 -0
  184. data/.git/objects/f0/d2a74226877e9a28af814d0d3727e4a3487439 +0 -0
  185. data/.git/objects/f0/f3ba7264f1d8e60eb93a907092af98fdc248e4 +0 -0
  186. data/.git/objects/f1/cdcc7ff2dc6298318523b2c4e425f515a58bf7 +0 -3
  187. data/.git/objects/f4/45c96f406f4d2f9839b3fe2fe8bc7f943ab469 +0 -0
  188. data/.git/objects/f7/eef7ce0a650d6f0c85dc4982f481da7bd44362 +0 -0
  189. data/.git/objects/f9/0abf96c5059ce1ba115f73bc9cf33e4663b3e1 +0 -0
  190. data/.git/objects/f9/cf7ae572eaebbd63f809f16a5ef14b9c679790 +0 -0
  191. data/.git/objects/fc/300df53fe2c9467210e2fd4c2f34e1c9c7c89a +0 -0
  192. data/.git/objects/fc/45546596ab8debc4c9f49a7abc7fc14a7bcc7f +0 -4
  193. data/.git/objects/fc/68d89167f69614eda17bd56dfccb4355d818e6 +0 -0
  194. data/.git/objects/fc/e4c02bb132e73b3cb957da182db7b75a47c242 +0 -0
  195. data/.git/objects/fe/be283da7f326344013f1fc847c12c8f29ab6ef +0 -0
  196. data/.git/refs/heads/master +0 -1
  197. data/.git/refs/remotes/origin/master +0 -1
  198. data/.gitignore +0 -5
  199. data/README.txt +0 -156
  200. data/examples/simplest/html/start.xhtml +0 -0
  201. data/website/index.html +0 -124
  202. data/website/index.txt +0 -119
  203. data/website/javascripts/rounded_corners_lite.inc.js +0 -285
  204. data/website/stylesheets/screen.css +0 -138
  205. data/website/template.html.erb +0 -48
@@ -1,88 +1,102 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
- describe Trellis::Component do
4
- before(:each) do
5
- #@component = Component.new
3
+ require "rack"
4
+ require 'rack/test'
5
+ require_fixtures 'component_spec_components'
6
+
7
+ describe Trellis::Component, " in an application" do
8
+ include Rack::Test::Methods
9
+
10
+ def app
11
+ TestComponents::ApplicationWithComponents.new
6
12
  end
7
13
 
8
- it "should desc" do
9
- # TODO
14
+ it "should return its intended content" do
15
+ get '/'
16
+ last_response.body.should eql('<html><body>hello from simple component</body></html>')
17
+ end
18
+
19
+ it "should render each instance of a component in the template" do
20
+ get '/counters'
21
+ counter_one_markup = %[<div id="one">0<a href="/page_with_stateful_component/events/add.counter_one">++</a><a href="/page_with_stateful_component/events/subtract.counter_one">--</a></div>]
22
+ counter_two_markup = %[<div id="two">0<a href="/page_with_stateful_component/events/add.counter_two">++</a><a href="/page_with_stateful_component/events/subtract.counter_two">--</a></div>]
23
+ counter_three_markup = %[<div id="three">0<a href="/page_with_stateful_component/events/add.counter_three">++</a><a href="/page_with_stateful_component/events/subtract.counter_three">--</a></div]
24
+ last_response.body.should include(counter_one_markup)
25
+ last_response.body.should include(counter_two_markup)
26
+ last_response.body.should include(counter_three_markup)
27
+ end
28
+
29
+ it "should provide an instance of each component in the template to the page" do
30
+ counters_page = TestComponents::PageWithStatefulComponent.new
31
+ counter_one = counters_page.instance_eval { @counter_one }
32
+ counter_two = counters_page.instance_eval { @counter_two }
33
+ counter_three = counters_page.instance_eval { @counter_three }
34
+ counter_one.should be_an_instance_of(TestComponents::Counter)
35
+ counter_two.should be_an_instance_of(TestComponents::Counter)
36
+ counter_three.should be_an_instance_of(TestComponents::Counter)
37
+ end
38
+
39
+ it "should provide a logger" do
40
+ counters_page = TestComponents::PageWithStatefulComponent.new
41
+ counter_one = counters_page.instance_eval { @counter_one }
42
+ counter_one.should respond_to(:logger)
43
+ end
44
+
45
+ it "should respond to an event for which it provides an event handler" do
46
+ env = Hash.new
47
+ env["rack.session"] = Hash.new
48
+
49
+ get '/page_with_stateful_component/events/add.counter_one', {}, env
50
+
51
+ redirect = last_response.headers['Location']
52
+
53
+ redirect.should eql('/page_with_stateful_component')
54
+
55
+ get redirect, {}, env
56
+
57
+ counter_one_markup = %[<div id="one">1]
58
+ counter_two_markup = %[<div id="two">0]
59
+ counter_three_markup = %[<div id="three">0]
60
+
61
+ last_response.body.should include(counter_one_markup)
62
+ last_response.body.should include(counter_two_markup)
63
+ last_response.body.should include(counter_three_markup)
64
+ end
65
+
66
+ it "should be able to provide a style link contribution to the page" do
67
+ get '/page_with_contributions'
68
+ last_response.body.should include('<link href="/someplace/my_styles.css" rel="stylesheet" type="text/css" />')
69
+ end
70
+
71
+ it "should be able to provide a script link contribution to the page" do
72
+ get '/page_with_contributions'
73
+ last_response.body.should include('<script src="/someplace/my_script.js" type="text/javascript"></script>')
74
+ end
75
+
76
+ it "should be able to provide a style contribution to the page" do
77
+ get '/page_with_contributions'
78
+ last_response.body.should include('<style type="text/css">html { color:#555555; background-color:#303030; }</style>')
10
79
  end
11
- end
12
80
 
81
+ it "should be able to provide a style contribution to the page per instance" do
82
+ get '/page_with_contributions'
83
+ last_response.body.scan(%[<style type=\"text/css\">/* just a comment */</style>]).should have_exactly(2).matches
84
+ end
13
85
 
14
- # module TestTrellis
15
- # class TestComponent < Test::Unit::TestCase
16
- # def test_class_body
17
- # raise NotImplementedError, 'Need to write test_class_body'
18
- # end
19
- #
20
- # def test_class_contained_in
21
- # raise NotImplementedError, 'Need to write test_class_contained_in'
22
- # end
23
- #
24
- # def test_class_depends_on
25
- # raise NotImplementedError, 'Need to write test_class_depends_on'
26
- # end
27
- #
28
- # def test_class_dom_contribution
29
- # raise NotImplementedError, 'Need to write test_class_dom_contribution'
30
- # end
31
- #
32
- # def test_class_enhance_page
33
- # raise NotImplementedError, 'Need to write test_class_enhance_page'
34
- # end
35
- #
36
- # def test_class_field
37
- # raise NotImplementedError, 'Need to write test_class_field'
38
- # end
39
- #
40
- # def test_class_get_component
41
- # raise NotImplementedError, 'Need to write test_class_get_component'
42
- # end
43
- #
44
- # def test_class_inherited
45
- # raise NotImplementedError, 'Need to write test_class_inherited'
46
- # end
47
- #
48
- # def test_class_is_stateful
49
- # raise NotImplementedError, 'Need to write test_class_is_stateful'
50
- # end
51
- #
52
- # def test_class_page_contribution
53
- # raise NotImplementedError, 'Need to write test_class_page_contribution'
54
- # end
55
- #
56
- # def test_class_register_with_tag_context
57
- # raise NotImplementedError, 'Need to write test_class_register_with_tag_context'
58
- # end
59
- #
60
- # def test_class_tag_name
61
- # raise NotImplementedError, 'Need to write test_class_tag_name'
62
- # end
63
- #
64
- # def test_load_component_session_information
65
- # raise NotImplementedError, 'Need to write test_load_component_session_information'
66
- # end
67
- #
68
- # def test_logger
69
- # raise NotImplementedError, 'Need to write test_logger'
70
- # end
71
- #
72
- # def test_logger_equals
73
- # raise NotImplementedError, 'Need to write test_logger_equals'
74
- # end
75
- #
76
- # def test_page
77
- # raise NotImplementedError, 'Need to write test_page'
78
- # end
79
- #
80
- # def test_page_equals
81
- # raise NotImplementedError, 'Need to write test_page_equals'
82
- # end
83
- #
84
- # def test_save_component_session_information
85
- # raise NotImplementedError, 'Need to write test_save_component_session_information'
86
- # end
87
- # end
88
- # end
86
+ it "should be able to provide a script contribution per instance and access instance information" do
87
+ get '/page_with_contributions'
88
+ last_response.body.should include(%[<script type="text/javascript">alert('hello from one');</script>])
89
+ last_response.body.should include(%[<script type="text/javascript">alert('hello from two');</script>])
90
+ end
91
+
92
+ it "should be able to provide a script contribution per class" do
93
+ get '/page_with_contributions'
94
+ last_response.body.should include(%[alert('hello just once');])
95
+ end
96
+
97
+ it "should be able to provide a dom modification block" do
98
+ get '/page_with_contributions'
99
+ last_response.body.scan(%[<body class=\"new_class\">]).should have_exactly(1).match
100
+ end
101
+
102
+ end
@@ -80,7 +80,7 @@ end
80
80
 
81
81
  describe Class, " when calling attr_array with default options" do
82
82
 
83
- before(:each) do
83
+ before :each do
84
84
  @target = Class.new
85
85
  @target.attr_array(:elements)
86
86
  end
@@ -95,7 +95,7 @@ end
95
95
 
96
96
  describe Class, " when calling attr_array with options {:create_accessor => false}" do
97
97
 
98
- before(:each) do
98
+ before :each do
99
99
  @target = Class.new
100
100
  @target.attr_array(:elements, :create_accessor => false)
101
101
  end
@@ -105,4 +105,36 @@ describe Class, " when calling attr_array with options {:create_accessor => fals
105
105
  it "should not create an accessor method for the array" do
106
106
  @target.should_not respond_to(:elements)
107
107
  end
108
+ end
109
+
110
+ describe Class do
111
+
112
+ it "when calling class_attr_accessor should add class attribute accessors for each symbol passed" do
113
+ class Foo; end
114
+ Foo.class_attr_accessor(:bar)
115
+ Foo.should respond_to(:bar)
116
+ Foo.should respond_to(:bar=)
117
+ end
118
+
119
+ it "when calling class_attr_reader should add class attribute readers for each symbol passed" do
120
+ class Bar; end
121
+ Bar.class_attr_reader(:foo)
122
+ Bar.should respond_to(:foo)
123
+ Bar.should_not respond_to(:foo=)
124
+ end
125
+
126
+ it "when calling class_attr_writer should add class attribute readers for each symbol passed" do
127
+ class FooBar; end
128
+ FooBar.class_attr_writer(:bar)
129
+ FooBar.should_not respond_to(:bar)
130
+ FooBar.should respond_to(:bar=)
131
+ end
132
+
133
+ it "when calling instance_attr_accessor should add instance attribute accessors for each symbol passed" do
134
+ class Snafu; end
135
+ Snafu.instance_attr_accessor(:bar)
136
+ instance = Snafu.new
137
+ instance.should respond_to(:bar)
138
+ instance.should respond_to(:bar=)
139
+ end
108
140
  end
@@ -0,0 +1,91 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Trellis::DefaultRouter, " when processing a request" do
4
+ before do
5
+ @regexp = Trellis::DefaultRouter::ROUTE_REGEX
6
+ @router = Trellis::DefaultRouter.new
7
+ end
8
+
9
+ it "should extract the page" do
10
+ value, source, event, destination = "/some_page".match(@regexp).to_a.reverse
11
+ value.should be_nil
12
+ source.should be_nil
13
+ event.should be_nil
14
+ destination.should_not be_nil
15
+ destination.should == "some_page"
16
+ end
17
+
18
+ it "should extract the page and event" do
19
+ value, source, event, destination = "/some_page/events/event".match(@regexp).to_a.reverse
20
+ value.should be_nil
21
+ source.should be_nil
22
+ event.should == "event"
23
+ destination.should_not be_nil
24
+ destination.should == "some_page"
25
+ end
26
+
27
+ it "should extract the page, event and source" do
28
+ value, source, event, destination = "/some_page/events/event.source".match(@regexp).to_a.reverse
29
+ value.should be_nil
30
+ source.should == "source"
31
+ event.should == "event"
32
+ destination.should_not be_nil
33
+ destination.should == "some_page"
34
+ end
35
+
36
+ it "should extract the page, event and source and value" do
37
+ value, source, event, destination = "/some_page/events/event.source/123".match(@regexp).to_a.reverse
38
+ value.should == "123"
39
+ source.should == "source"
40
+ event.should == "event"
41
+ destination.should_not be_nil
42
+ destination.should == "some_page"
43
+ end
44
+
45
+ it "should extract the page, event and value" do
46
+ value, source, event, destination = "/some_page/events/event/123".match(@regexp).to_a.reverse
47
+ value.should == "123"
48
+ source.should be_nil
49
+ event.should == "event"
50
+ destination.should_not be_nil
51
+ destination.should == "some_page"
52
+ end
53
+
54
+ it "should build a path given page" do
55
+ page = TestApp::Home.new
56
+ path = Trellis::DefaultRouter.to_uri(:page => page)
57
+ path.should == "/home"
58
+ end
59
+
60
+ it "should build a path given page and an event" do
61
+ page = TestApp::Home.new
62
+ path = Trellis::DefaultRouter.to_uri(:page => page, :event => 'event')
63
+ path.should == "/home/events/event"
64
+ end
65
+
66
+ it "should build a path given page, an event and a source" do
67
+ page = TestApp::Home.new
68
+ path = Trellis::DefaultRouter.to_uri(:page => page, :event => 'event', :source => 'source')
69
+ path.should == "/home/events/event.source"
70
+ end
71
+
72
+ it "should build a path given page, an event, a source and a value" do
73
+ page = TestApp::Home.new
74
+ path = Trellis::DefaultRouter.to_uri(:page => page, :event => 'event', :source => 'source', :value => 'value')
75
+ path.should == "/home/events/event.source/value"
76
+ end
77
+
78
+ it "should match valid patterns" do
79
+ page_request = mock('request', :path_info => '/page')
80
+ page_event_request = mock('request', :path_info => '/page/events/event')
81
+ page_event_source_request = mock('request', :path_info => '/page/events/event.source')
82
+ page_event_value_request = mock('request', :path_info => '/page/events/event/value')
83
+ page_event_source_value_request = mock('request', :path_info => '/page/events/event.source/value')
84
+
85
+ @router.matches?(page_request).should be_true
86
+ @router.matches?(page_event_request).should be_true
87
+ @router.matches?(page_event_source_request).should be_true
88
+ @router.matches?(page_event_value_request).should be_true
89
+ @router.matches?(page_event_source_value_request).should be_true
90
+ end
91
+ end
@@ -1,10 +1,9 @@
1
1
  module TestApp
2
2
  class MyApp < Trellis::Application
3
3
  home :home
4
- pages :other
5
4
 
6
5
  map_static ['/images', '/style', '/favicon.ico']
7
- map_static ['/yui'], "./js"
6
+ map_static ['/jquery'], "./js"
8
7
  end
9
8
 
10
9
  class Home < Trellis::Page
@@ -47,5 +46,94 @@ module TestApp
47
46
  end
48
47
 
49
48
  template do html { body { text %[<trellis:value name="some_value"/>] }} end
50
- end
49
+ end
50
+
51
+ class RoutedDifferently < Trellis::Page
52
+ route '/whoa'
53
+
54
+ template do html { body { text %[whoa!] }} end
55
+ end
56
+
57
+ class RoutedDifferentlyWithAParam < Trellis::Page
58
+ route '/hello/:name'
59
+
60
+ template do
61
+ html {
62
+ body {
63
+ h2 "Hello"
64
+ text %[<trellis:value name="name"/>]
65
+ }
66
+ }
67
+ end
68
+ end
69
+
70
+ class RoutedDifferentlyWithParams < Trellis::Page
71
+ route '/report/:year/:month/:day'
72
+
73
+ template do
74
+ html {
75
+ body {
76
+ h2 "Report for"
77
+ text %[<trellis:value name="month"/>]
78
+ text '/'
79
+ text %[<trellis:value name="day"/>]
80
+ text '/'
81
+ text %[<trellis:value name="year"/>]
82
+ }
83
+ }
84
+ end
85
+ end
86
+
87
+ class RoutedWithOptionalParams < Trellis::Page
88
+ route '/foobar/?:foo?/?:bar?'
89
+
90
+ template do
91
+ html {
92
+ body {
93
+ text %[<trellis:value name="foo"/>]
94
+ text '-'
95
+ text %[<trellis:value name="bar"/>]
96
+ }
97
+ }
98
+ end
99
+ end
100
+
101
+ class RoutedWithSingleWildcard < Trellis::Page
102
+ route '/splat/*'
103
+
104
+ template do
105
+ html {
106
+ body {
107
+ text %[<trellis:value name="splat"/>]
108
+ }
109
+ }
110
+ end
111
+ end
112
+
113
+ class RoutedWithMultipleWildcards < Trellis::Page
114
+ route '/splats/*/foo/*/*'
115
+
116
+ template do
117
+ html {
118
+ body {
119
+ text %[<trellis:value name="splat"/>]
120
+ }
121
+ }
122
+ end
123
+ end
124
+
125
+ class RoutedWithMixedParams < Trellis::Page
126
+ route '/mixed/:foo/*'
127
+
128
+ template do
129
+ html {
130
+ body {
131
+ text %[<trellis:value name="splat"/>]
132
+ text '-'
133
+ text %[<trellis:value name="foo"/>]
134
+ }
135
+ }
136
+ end
137
+ end
138
+
51
139
  end
data/test/page_spec.rb CHANGED
@@ -9,19 +9,21 @@ describe Trellis::Page, " when sending an event to a page" do
9
9
  @request = Rack::MockRequest.new(@application)
10
10
  end
11
11
 
12
- it "if the event handler returns self it should render the receiving page" do
13
- response = @request.get("/home.event1")
14
- response.body.should == "<html><body><h1>Hello World!</h1></body></html>"
12
+ it "should redirect to the receiving page if the event handler returns self" do
13
+ response = @request.get("/home/events/event1")
14
+ response.status.should be(302)
15
+ response.headers['Location'].should == '/home'
15
16
  end
16
17
 
17
18
  it "should return a response as a string if the event handler returns a String" do
18
- response = @request.get("/home.event2")
19
+ response = @request.get("/home/events/event2")
19
20
  response.body.should == "just some text"
20
21
  end
21
22
 
22
- it "should render the injected page as a response if the event handler returns an injected page " do
23
- response = @request.get("/home.event3")
24
- response.body.should == "<html><body><p>Goodbye Cruel World </p></body></html>"
23
+ it "should redirect to the injected page as a response if the event handler returns an injected page " do
24
+ response = @request.get("/home/events/event3")
25
+ response.status.should be(302)
26
+ response.headers['Location'].should == '/other'
25
27
  end
26
28
 
27
29
  it "should invoke the before_load method if provided by the page" do
@@ -35,7 +37,7 @@ describe Trellis::Page, " when sending an event to a page" do
35
37
  end
36
38
  end
37
39
 
38
- describe Trellis::Page, " when calling inject_dependent_pages on an instance of child class of Page" do
40
+ describe Trellis::Page, " when calling inject_dependent_pages on an instance of Page" do
39
41
  it "should contain instances of the injected pages" do
40
42
  homepage = TestApp::Home.new
41
43
  homepage.inject_dependent_pages
@@ -44,3 +46,11 @@ describe Trellis::Page, " when calling inject_dependent_pages on an instance of
44
46
  end
45
47
  end
46
48
 
49
+ describe Trellis::Page, " when created with a custom route" do
50
+ it "should contain an instance of Router" do
51
+ router = TestApp::RoutedDifferently.router
52
+ router.should_not be_nil
53
+ router.should be_an_instance_of(Trellis::Router)
54
+ end
55
+ end
56
+
data/test/router_spec.rb CHANGED
@@ -1,52 +1,52 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
- describe Trellis::DefaultRouter, " when processing a request" do
4
- before do
5
- @regexp = Trellis::DefaultRouter::ROUTE_REGEX
6
- end
7
-
8
- it "should extract the page " do
9
- value, source, event, destination = "/some_page".match(@regexp).to_a.reverse
10
- value.should be_nil
11
- source.should be_nil
12
- event.should be_nil
13
- destination.should_not be_nil
14
- destination.should == "some_page"
15
- end
16
-
17
- it "should extract the page and event " do
18
- value, source, event, destination = "/some_page.event".match(@regexp).to_a.reverse
19
- value.should be_nil
20
- source.should be_nil
21
- event.should == "event"
22
- destination.should_not be_nil
23
- destination.should == "some_page"
24
- end
25
-
26
- it "should extract the page, event and source " do
27
- value, source, event, destination = "/some_page.event_source".match(@regexp).to_a.reverse
28
- value.should be_nil
29
- source.should == "source"
30
- event.should == "event"
31
- destination.should_not be_nil
32
- destination.should == "some_page"
33
- end
34
-
35
- it "should extract the page, event and source and value" do
36
- value, source, event, destination = "/some_page.event_source/123".match(@regexp).to_a.reverse
37
- value.should == "123"
38
- source.should == "source"
39
- event.should == "event"
40
- destination.should_not be_nil
41
- destination.should == "some_page"
42
- end
43
-
44
- it "should extract the page, event and value" do
45
- value, source, event, destination = "/some_page.event/123".match(@regexp).to_a.reverse
46
- value.should == "123"
47
- source.should be_nil
48
- event.should == "event"
49
- destination.should_not be_nil
50
- destination.should == "some_page"
51
- end
3
+ describe Trellis::Router, " when constructed" do
4
+
5
+ it "with a page parameter should route to that page " do
6
+ @router = Trellis::Router.new(:page => TestApp::Home)
7
+ @router.route().destination.should == TestApp::Home
8
+ end
9
+
10
+ it "with a simple path it should match that path" do
11
+ request = mock('request', :path_info => '/hello')
12
+ @router = Trellis::Router.new(:path => '/hello')
13
+ @router.matches?(request).should be_true
14
+ end
15
+
16
+ it "with a path containing a single named parameter should match valid variations of that path" do
17
+ request_brian = mock('request', :path_info => '/hello/brian')
18
+ request_michael = mock('request', :path_info => '/hello/michael')
19
+ @router = Trellis::Router.new(:path => '/hello/:name')
20
+ @router.matches?(request_brian).should be_true
21
+ @router.matches?(request_michael).should be_true
22
+ end
23
+
24
+ it "with a path containing multiple named parameters should match valid variations of that path" do
25
+ request_xmas = mock('request', :path_info => '/hello/2009/12/25')
26
+ request_labor_day = mock('request', :path_info => '/hello/2009/09/07')
27
+ @router = Trellis::Router.new(:path => '/hello/:year/:month/:day')
28
+ @router.matches?(request_xmas).should be_true
29
+ @router.matches?(request_labor_day).should be_true
30
+ end
31
+
32
+ it "with a path containing a single named parameters should collect the parameter" do
33
+ @router = Trellis::Router.new(:path => '/hello/:name')
34
+ @router.keys.should include('name')
35
+ end
36
+
37
+ it "with a path containing multiple parameters should collect all parameters" do
38
+ @router = Trellis::Router.new(:path => '/hello/:year/:month/:day')
39
+ @router.keys.should include('year', 'month', 'day')
40
+ end
41
+
42
+ it "with a path containing multiple optional parameters should collect all parameters" do
43
+ @router = Trellis::Router.new(:path => '/?:foo?/?:bar?')
44
+ @router.keys.should include('foo', 'bar')
45
+ end
46
+
47
+ it "with a path containing a single wildcard param it should capture the values in splat" do
48
+ @router = Trellis::Router.new(:path => '/*')
49
+ @router.keys.should include('splat')
50
+ end
51
+
52
52
  end