trellis 0.0.1 → 0.0.2

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 (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