amrita2 1.9.6 → 2.0.0

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 (112) hide show
  1. data/README +112 -0
  2. data/init.rb +6 -0
  3. data/lib/amrita2/gettext.rb +116 -0
  4. data/lib/amrita2/macro.rb +153 -0
  5. data/lib/amrita2/rails_bridge.rb +172 -26
  6. data/lib/amrita2/template.rb +2634 -234
  7. data/lib/amrita2/testsupport.rb +171 -0
  8. data/lib/amrita2/version.rb +3 -3
  9. data/lib/amrita2.rb +1 -0
  10. data/sample/depot/app/controllers/admin_controller.rb +59 -0
  11. data/sample/depot/app/controllers/application.rb +20 -0
  12. data/sample/depot/app/controllers/info_controller.rb +19 -0
  13. data/sample/depot/app/controllers/login_controller.rb +85 -0
  14. data/sample/depot/app/controllers/store_controller.rb +68 -0
  15. data/sample/depot/app/helpers/admin_helper.rb +7 -0
  16. data/sample/depot/app/helpers/application_helper.rb +10 -0
  17. data/sample/depot/app/helpers/ar_form.rb +169 -0
  18. data/sample/depot/app/helpers/form_tag.rb +24 -0
  19. data/sample/depot/app/helpers/info_helper.rb +7 -0
  20. data/sample/depot/app/helpers/standard_form.rb +73 -0
  21. data/sample/depot/app/helpers/store_helper.rb +14 -0
  22. data/sample/depot/app/models/cart.rb +36 -0
  23. data/sample/depot/app/models/cart_item.rb +26 -0
  24. data/sample/depot/app/models/line_item.rb +34 -0
  25. data/sample/depot/app/models/order.rb +57 -0
  26. data/sample/depot/app/models/product.rb +41 -0
  27. data/sample/depot/app/models/user.rb +83 -0
  28. data/sample/depot/config/boot.rb +49 -0
  29. data/sample/depot/config/environment.rb +83 -0
  30. data/sample/depot/config/environments/development.rb +24 -0
  31. data/sample/depot/config/environments/production.rb +24 -0
  32. data/sample/depot/config/environments/test.rb +24 -0
  33. data/sample/depot/config/routes.rb +10 -0
  34. data/sample/depot/db/migrate/001_create_products.rb +18 -0
  35. data/sample/depot/db/migrate/002_add_price.rb +14 -0
  36. data/sample/depot/db/migrate/003_add_test_data.rb +68 -0
  37. data/sample/depot/db/migrate/004_add_sessions.rb +20 -0
  38. data/sample/depot/db/migrate/005_create_orders.rb +21 -0
  39. data/sample/depot/db/migrate/006_create_line_items.rb +27 -0
  40. data/sample/depot/db/migrate/007_create_users.rb +18 -0
  41. data/sample/depot/db/schema.rb +45 -0
  42. data/sample/depot/public/dispatch.rb +15 -0
  43. data/sample/depot/test/functional/admin_controller_test.rb +54 -0
  44. data/sample/depot/test/functional/info_controller_test.rb +23 -0
  45. data/sample/depot/test/functional/login_controller_test.rb +74 -0
  46. data/sample/depot/test/functional/store_controller_test.rb +57 -0
  47. data/sample/depot/test/integration/dsl_user_stories_test.rb +126 -0
  48. data/sample/depot/test/integration/user_stories_test.rb +70 -0
  49. data/sample/depot/test/performance/order_speed_test.rb +58 -0
  50. data/sample/depot/test/test_helper.rb +16 -0
  51. data/sample/depot/test/unit/cart_test.rb +39 -0
  52. data/sample/depot/test/unit/cart_test1.rb +31 -0
  53. data/sample/depot/test/unit/line_item_test.rb +15 -0
  54. data/sample/depot/test/unit/order_test.rb +15 -0
  55. data/sample/depot/test/unit/product_test.rb +98 -0
  56. data/sample/depot/vendor/plugins/amrita2/init.rb +6 -0
  57. data/sample/hello/hello.rb +22 -0
  58. data/sample/login_engine/app/controllers/application.rb +16 -0
  59. data/sample/login_engine/app/controllers/user_controller.rb +265 -0
  60. data/sample/login_engine/app/helpers/application_helper.rb +3 -0
  61. data/sample/login_engine/app/helpers/form_tag.rb +16 -0
  62. data/sample/login_engine/app/helpers/two_columns.rb +24 -0
  63. data/sample/login_engine/app/helpers/two_columns_form.rb +47 -0
  64. data/sample/login_engine/app/helpers/user_helper.rb +88 -0
  65. data/sample/login_engine/app/models/user.rb +7 -0
  66. data/sample/login_engine/app/models/user_notify.rb +75 -0
  67. data/sample/login_engine/config/boot.rb +45 -0
  68. data/sample/login_engine/config/environment.rb +140 -0
  69. data/sample/login_engine/config/environments/development.rb +21 -0
  70. data/sample/login_engine/config/environments/production.rb +18 -0
  71. data/sample/login_engine/config/environments/test.rb +19 -0
  72. data/sample/login_engine/config/routes.rb +23 -0
  73. data/sample/login_engine/db/migrate/001_create_users.rb +25 -0
  74. data/sample/login_engine/db/schema.rb +25 -0
  75. data/sample/login_engine/lib/config.rb +113 -0
  76. data/sample/login_engine/lib/hpricot_test_extension.rb +80 -0
  77. data/sample/login_engine/lib/login_engine/authenticated_system.rb +113 -0
  78. data/sample/login_engine/lib/login_engine/authenticated_user.rb +155 -0
  79. data/sample/login_engine/lib/login_engine.rb +62 -0
  80. data/sample/login_engine/public/dispatch.rb +10 -0
  81. data/sample/login_engine/test/functional/amrita2_test.rb +267 -0
  82. data/sample/login_engine/test/functional/user_controller_test.rb +544 -0
  83. data/sample/login_engine/test/mocks/mail.rb +14 -0
  84. data/sample/login_engine/test/mocks/time.rb +19 -0
  85. data/sample/login_engine/test/test_helper.rb +31 -0
  86. data/sample/login_engine/test/unit/user_test.rb +116 -0
  87. data/sample/login_engine/vendor/plugins/amrita2/init.rb +6 -0
  88. data/specs/attribute.rb +201 -0
  89. data/specs/datatypes.rb +231 -0
  90. data/specs/dictionary.rb +68 -0
  91. data/specs/erb_cdata.rb +187 -0
  92. data/specs/filters.rb +513 -0
  93. data/specs/gettext/erb_gettext.rb +42 -0
  94. data/specs/gettext/gettext_util.rb +65 -0
  95. data/specs/gettext/static_text.rb +103 -0
  96. data/specs/impl/code_generator.rb +87 -0
  97. data/specs/impl/dynamic_element.rb +92 -0
  98. data/specs/impl/hash_delegator.rb +57 -0
  99. data/specs/impl/parse_opt.rb +34 -0
  100. data/specs/impl/preprocess.rb +823 -0
  101. data/specs/impl/testsupport.rb +89 -0
  102. data/specs/inlineruby.rb +429 -0
  103. data/specs/intro.rb +654 -0
  104. data/specs/loop.rb +203 -0
  105. data/specs/macro.rb +532 -0
  106. data/specs/sample.rb +34 -0
  107. data/specs/sanitize.rb +110 -0
  108. data/specs/template.rb +189 -0
  109. data/specs/trace.rb +97 -0
  110. metadata +138 -19
  111. data/lib/amrita2/core.rb +0 -1897
  112. data/lib/amrita2/rd.rb +0 -314
@@ -0,0 +1,20 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ class AddSessions < ActiveRecord::Migration
7
+ def self.up
8
+ create_table :sessions do |t|
9
+ t.column :session_id, :string
10
+ t.column :data, :text
11
+ t.column :updated_at, :datetime
12
+ end
13
+
14
+ add_index :sessions, :session_id
15
+ end
16
+
17
+ def self.down
18
+ drop_table :sessions
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ class CreateOrders < ActiveRecord::Migration
7
+
8
+ def self.up
9
+ create_table :orders do |t|
10
+ t.column :name, :string
11
+ t.column :address, :text
12
+ t.column :email, :string
13
+ t.column :pay_type, :string, :limit => 10
14
+ end
15
+ end
16
+
17
+
18
+ def self.down
19
+ drop_table :orders
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ class CreateLineItems < ActiveRecord::Migration
7
+ def self.up
8
+ create_table :line_items do |t|
9
+ t.column :product_id, :integer, :null => false
10
+ t.column :order_id, :integer, :null => false
11
+ t.column :quantity, :integer, :null => false
12
+ t.column :total_price, :decimal, :null => false, :precision => 8, :scale => 2
13
+ end
14
+
15
+ execute "alter table line_items
16
+ add constraint fk_line_item_products
17
+ foreign key (product_id) references products(id)"
18
+
19
+ execute "alter table line_items
20
+ add constraint fk_line_item_orders
21
+ foreign key (order_id) references orders(id)"
22
+ end
23
+
24
+ def self.down
25
+ drop_table :line_items
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ class CreateUsers < ActiveRecord::Migration
7
+ def self.up
8
+ create_table :users do |t|
9
+ t.column :name, :string
10
+ t.column :hashed_password, :string
11
+ t.column :salt, :string
12
+ end
13
+ end
14
+
15
+ def self.down
16
+ drop_table :users
17
+ end
18
+ end
@@ -0,0 +1,45 @@
1
+ # This file is autogenerated. Instead of editing this file, please use the
2
+ # migrations feature of ActiveRecord to incrementally modify your database, and
3
+ # then regenerate this schema definition.
4
+
5
+ ActiveRecord::Schema.define(:version => 7) do
6
+
7
+ create_table "line_items", :force => true do |t|
8
+ t.column "product_id", :integer, :null => false
9
+ t.column "order_id", :integer, :null => false
10
+ t.column "quantity", :integer, :null => false
11
+ t.column "total_price", :decimal, :precision => 8, :scale => 2, :null => false
12
+ end
13
+
14
+ add_index "line_items", ["product_id"], :name => "fk_line_item_products"
15
+ add_index "line_items", ["order_id"], :name => "fk_line_item_orders"
16
+
17
+ create_table "orders", :force => true do |t|
18
+ t.column "name", :string
19
+ t.column "address", :text
20
+ t.column "email", :string
21
+ t.column "pay_type", :string, :limit => 10
22
+ end
23
+
24
+ create_table "products", :force => true do |t|
25
+ t.column "title", :string
26
+ t.column "description", :text
27
+ t.column "image_url", :string
28
+ t.column "price", :decimal, :precision => 8, :scale => 2, :default => 0.0
29
+ end
30
+
31
+ create_table "sessions", :force => true do |t|
32
+ t.column "session_id", :string
33
+ t.column "data", :text
34
+ t.column "updated_at", :datetime
35
+ end
36
+
37
+ add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id"
38
+
39
+ create_table "users", :force => true do |t|
40
+ t.column "name", :string
41
+ t.column "hashed_password", :string
42
+ t.column "salt", :string
43
+ end
44
+
45
+ end
@@ -0,0 +1,15 @@
1
+ #!/Users/dave/ruby1.8/bin/ruby
2
+ #---
3
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
4
+ # We make no guarantees that this code is fit for any purpose.
5
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
6
+ #---
7
+
8
+ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
9
+
10
+ # If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
11
+ # "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
12
+ require "dispatcher"
13
+
14
+ ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
15
+ Dispatcher.dispatch
@@ -0,0 +1,54 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ require File.dirname(__FILE__) + '/../test_helper'
7
+ require 'admin_controller'
8
+ require 'amrita2/testsupport'
9
+
10
+ # Re-raise errors caught by the controller.
11
+ class AdminController; def rescue_action(e) raise e end; end
12
+
13
+ class AdminControllerTest < Test::Unit::TestCase
14
+ include Amrita2::RailsTestHelper
15
+ fixtures :products
16
+
17
+ def setup
18
+ User.create(:name=>'u1', :password=>'abc')
19
+ User.create(:name=>'u2', :password=>'efg')
20
+ @controller = AdminController.new
21
+ @request = ActionController::TestRequest.new
22
+ @response = ActionController::TestResponse.new
23
+ end
24
+
25
+ def test_new
26
+ get :new
27
+ session[:user_id] = User.find_by_name('u1').id
28
+ flash[:notice] = 'Please log in'
29
+ compare_result do
30
+ get :new
31
+ @response.body
32
+ end
33
+ end
34
+
35
+ def test_list
36
+ get :new
37
+ session[:user_id] = User.find_by_name('u1').id
38
+ flash[:notice] = 'Please log in'
39
+ compare_result do
40
+ get :list
41
+ @response.body
42
+ end
43
+ end
44
+
45
+ def test_show
46
+ get :new
47
+ session[:user_id] = User.find_by_name('u1').id
48
+ flash[:notice] = 'Please log in'
49
+ compare_result do
50
+ get :show, :id=>1
51
+ @response.body
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,23 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ require File.dirname(__FILE__) + '/../test_helper'
7
+ require 'info_controller'
8
+
9
+ # Re-raise errors caught by the controller.
10
+ class InfoController; def rescue_action(e) raise e end; end
11
+
12
+ class InfoControllerTest < Test::Unit::TestCase
13
+ def setup
14
+ @controller = InfoController.new
15
+ @request = ActionController::TestRequest.new
16
+ @response = ActionController::TestResponse.new
17
+ end
18
+
19
+ # Replace this with your real tests.
20
+ def test_truth
21
+ assert true
22
+ end
23
+ end
@@ -0,0 +1,74 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+
7
+ require File.dirname(__FILE__) + '/../test_helper'
8
+ require 'login_controller'
9
+
10
+ # Re-raise errors caught by the controller.
11
+ class LoginController; def rescue_action(e) raise e end; end
12
+
13
+ class LoginControllerTest < Test::Unit::TestCase
14
+
15
+
16
+ fixtures :users
17
+
18
+
19
+ def setup
20
+ @controller = LoginController.new
21
+ @request = ActionController::TestRequest.new
22
+ @response = ActionController::TestResponse.new
23
+ end
24
+
25
+ # Replace this with your real tests.
26
+ def test_truth
27
+ assert true
28
+ end
29
+
30
+
31
+ if false
32
+
33
+ def test_index
34
+ get :index
35
+ assert_response :success
36
+ end
37
+
38
+ end
39
+
40
+
41
+ def test_index_without_user
42
+ get :index
43
+ assert_redirected_to :action => "login"
44
+ assert_equal "Please log in", flash[:notice]
45
+ end
46
+
47
+
48
+
49
+ def test_index_with_user
50
+ get :index, {}, { :user_id => users(:dave).id }
51
+ assert_response :success
52
+ assert_template "index"
53
+ end
54
+
55
+
56
+
57
+ def test_login
58
+ dave = users(:dave)
59
+ post :login, :name => dave.name, :password => 'secret'
60
+ assert_redirected_to :action => "index"
61
+ assert_equal dave.id, session[:user_id]
62
+ end
63
+
64
+
65
+
66
+ def test_bad_password
67
+ dave = users(:dave)
68
+ post :login, :name => dave.name, :password => 'wrong'
69
+ assert_template "login"
70
+ end
71
+
72
+
73
+ end
74
+
@@ -0,0 +1,57 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ require File.dirname(__FILE__) + '/../test_helper'
7
+ require 'amrita2/testsupport'
8
+ require 'store_controller'
9
+
10
+ # Re-raise errors caught by the controller.
11
+ class StoreController; def rescue_action(e) raise e end; end
12
+
13
+ class StoreControllerTest < Test::Unit::TestCase
14
+ include Amrita2::RailsTestHelper
15
+ fixtures :products
16
+
17
+ def setup
18
+ @controller = StoreController.new
19
+ @request = ActionController::TestRequest.new
20
+ @response = ActionController::TestResponse.new
21
+ end
22
+
23
+ def test_index
24
+ compare_result do
25
+ get :index
26
+ assert_response(:success)
27
+ @response.body
28
+ end
29
+ end
30
+
31
+ def test_post_to_add_to_cart
32
+ get :index
33
+ ruby_id = products(:ruby_book).id
34
+ assert_select "form[action=/store/add_to_cart/#{ruby_id}][method=post]"
35
+
36
+ post :add_to_cart, :id=>ruby_id
37
+
38
+ compare_result do
39
+ get :index
40
+ assert_response(:success)
41
+ @response.body
42
+ end
43
+ end
44
+
45
+ def test_checkout
46
+ ruby_id = products(:ruby_book).id
47
+ get :index
48
+ post :add_to_cart, :id=>ruby_id
49
+
50
+ compare_result do
51
+ get :checkout
52
+ assert_response(:success)
53
+ @response.body
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,126 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ require "#{File.dirname(__FILE__)}/../test_helper"
7
+
8
+ class DslUserStoriesTest < ActionController::IntegrationTest
9
+ fixtures :products
10
+
11
+
12
+
13
+ DAVES_DETAILS = {
14
+ :name => "Dave Thomas",
15
+ :address => "123 The Street",
16
+ :email => "dave@pragprog.com",
17
+ :pay_type => "check"
18
+ }
19
+
20
+
21
+ MIKES_DETAILS = {
22
+ :name => "Mike Clark",
23
+ :address => "345 The Avenue",
24
+ :email => "mike@pragmaticstudio.com",
25
+ :pay_type => "cc"
26
+ }
27
+
28
+
29
+
30
+ def setup
31
+ LineItem.delete_all
32
+ Order.delete_all
33
+ @ruby_book = products(:ruby_book)
34
+ @rails_book = products(:rails_book)
35
+ end
36
+
37
+ # A user goes to the store index page. They select a product,
38
+ # adding it to their cart. They then check out, filling in
39
+ # their details on the checkout form. When they submit,
40
+ # an order is created in the database containing
41
+ # their information, along with a single line item
42
+ # corresponding to the product they added to their cart.
43
+
44
+
45
+ def test_buying_a_product
46
+ dave = regular_user
47
+ dave.get "/store/index"
48
+ dave.is_viewing "index"
49
+ dave.buys_a @ruby_book
50
+ dave.has_a_cart_containing @ruby_book
51
+ dave.checks_out DAVES_DETAILS
52
+ dave.is_viewing "index"
53
+ check_for_order DAVES_DETAILS, @ruby_book
54
+ end
55
+
56
+
57
+
58
+ def test_two_people_buying
59
+ dave = regular_user
60
+ mike = regular_user
61
+ dave.buys_a @ruby_book
62
+ mike.buys_a @rails_book
63
+ dave.has_a_cart_containing @ruby_book
64
+ dave.checks_out DAVES_DETAILS
65
+ mike.has_a_cart_containing @rails_book
66
+ check_for_order DAVES_DETAILS, @ruby_book
67
+ mike.checks_out MIKES_DETAILS
68
+ check_for_order MIKES_DETAILS, @rails_book
69
+ end
70
+
71
+
72
+
73
+ def regular_user
74
+ open_session do |user|
75
+ def user.is_viewing(page)
76
+ assert_response :success
77
+ assert_template page
78
+ end
79
+
80
+ def user.buys_a(product)
81
+ xml_http_request "/store/add_to_cart", :id => product.id
82
+ assert_response :success
83
+ end
84
+
85
+ def user.has_a_cart_containing(*products)
86
+ cart = session[:cart]
87
+ assert_equal products.size, cart.items.size
88
+ for item in cart.items
89
+ assert products.include?(item.product)
90
+ end
91
+ end
92
+
93
+ def user.checks_out(details)
94
+ post "/store/checkout"
95
+ assert_response :success
96
+ assert_template "checkout"
97
+
98
+ post_via_redirect "/store/save_order",
99
+ :order => { :name => details[:name],
100
+ :address => details[:address],
101
+ :email => details[:email],
102
+ :pay_type => details[:pay_type]
103
+ }
104
+ assert_response :success
105
+ assert_template "index"
106
+ assert_equal 0, session[:cart].items.size
107
+ end
108
+ end
109
+ end
110
+
111
+
112
+ def check_for_order(details, *products)
113
+ order = Order.find_by_name(details[:name])
114
+ assert_not_nil order
115
+
116
+ assert_equal details[:name], order.name
117
+ assert_equal details[:address], order.address
118
+ assert_equal details[:email], order.email
119
+ assert_equal details[:pay_type], order.pay_type
120
+
121
+ assert_equal products.size, order.line_items.size
122
+ for line_item in order.line_items
123
+ assert products.include?(line_item.product)
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,70 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ require "#{File.dirname(__FILE__)}/../test_helper"
7
+
8
+ class UserStoriesTest < ActionController::IntegrationTest
9
+ fixtures :products
10
+
11
+ # A user goes to the index page. They select a product, adding it to their
12
+ # cart, and check out, filling in their details on the checkout form. When
13
+ # they submit, an order is created containing their information, along with a
14
+ # single line item corresponding to the product they added to their cart.
15
+
16
+ def test_buying_a_product
17
+
18
+ LineItem.delete_all
19
+ Order.delete_all
20
+ ruby_book = products(:ruby_book)
21
+
22
+
23
+
24
+ get "/store/index"
25
+ assert_response :success
26
+ assert_template "index"
27
+
28
+
29
+
30
+ xml_http_request "/store/add_to_cart", :id => ruby_book.id
31
+ assert_response :success
32
+
33
+ cart = session[:cart]
34
+ assert_equal 1, cart.items.size
35
+ assert_equal ruby_book, cart.items[0].product
36
+
37
+
38
+
39
+ post "/store/checkout"
40
+ assert_response :success
41
+ assert_template "checkout"
42
+
43
+
44
+
45
+ post_via_redirect "/store/save_order",
46
+ :order => { :name => "Dave Thomas",
47
+ :address => "123 The Street",
48
+ :email => "dave@pragprog.com",
49
+ :pay_type => "check" }
50
+ assert_response :success
51
+ assert_template "index"
52
+ assert_equal 0, session[:cart].items.size
53
+
54
+
55
+
56
+ orders = Order.find(:all)
57
+ assert_equal 1, orders.size
58
+ order = orders[0]
59
+
60
+ assert_equal "Dave Thomas", order.name
61
+ assert_equal "123 The Street", order.address
62
+ assert_equal "dave@pragprog.com", order.email
63
+ assert_equal "check", order.pay_type
64
+
65
+ assert_equal 1, order.line_items.size
66
+ line_item = order.line_items[0]
67
+ assert_equal ruby_book, line_item.product
68
+
69
+ end
70
+ end
@@ -0,0 +1,58 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ require File.dirname(__FILE__) + '/../test_helper'
7
+ require 'store_controller'
8
+
9
+ # Re-raise errors caught by the controller.
10
+ class OrderController; def rescue_action(e) raise e end; end
11
+
12
+ class OrderSpeedTest < Test::Unit::TestCase
13
+
14
+ DAVES_DETAILS = {
15
+ :name => "Dave Thomas",
16
+ :address => "123 The Street",
17
+ :email => "dave@pragprog.com",
18
+ :pay_type => "check"
19
+ }
20
+
21
+
22
+ self.fixture_path = File.join(File.dirname(__FILE__), "../fixtures/performance")
23
+ fixtures :products
24
+
25
+
26
+ def setup
27
+ @controller = StoreController.new
28
+ @request = ActionController::TestRequest.new
29
+ @response = ActionController::TestResponse.new
30
+ end
31
+
32
+
33
+
34
+ def test_100_orders
35
+ Order.delete_all
36
+ LineItem.delete_all
37
+
38
+
39
+ @controller.logger.silence do
40
+
41
+ elapsed_time = Benchmark.realtime do
42
+ 100.downto(1) do |prd_id|
43
+ cart = Cart.new
44
+ cart.add_product(Product.find(prd_id))
45
+ post :save_order,
46
+ { :order => DAVES_DETAILS },
47
+ { :cart => cart }
48
+ assert_redirected_to :action => :index
49
+ end
50
+ end
51
+ assert_equal 100, Order.count
52
+ assert elapsed_time < 3.00
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,16 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+
7
+ ENV["RAILS_ENV"] = "test"
8
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
9
+ require 'test_help'
10
+
11
+ class Test::Unit::TestCase
12
+ self.use_transactional_fixtures = true
13
+ self.use_instantiated_fixtures = false
14
+
15
+ # Add more helper methods to be used by all tests here...
16
+ end
@@ -0,0 +1,39 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+
7
+ require File.dirname(__FILE__) + '/../test_helper'
8
+
9
+ class CartTest < Test::Unit::TestCase
10
+
11
+ fixtures :products
12
+
13
+
14
+
15
+ def test_add_unique_products
16
+ cart = Cart.new
17
+ rails_book = products(:rails_book)
18
+ ruby_book = products(:ruby_book)
19
+ cart.add_product rails_book
20
+ cart.add_product ruby_book
21
+ assert_equal 2, cart.items.size
22
+ assert_equal rails_book.price + ruby_book.price, cart.total_price
23
+ end
24
+
25
+
26
+
27
+ def test_add_duplicate_product
28
+ cart = Cart.new
29
+ rails_book = products(:rails_book)
30
+ cart.add_product rails_book
31
+ cart.add_product rails_book
32
+ assert_equal 2*rails_book.price, cart.total_price
33
+ assert_equal 1, cart.items.size
34
+ assert_equal 2, cart.items[0].quantity
35
+ end
36
+
37
+
38
+ end
39
+