active_scaffold 3.3.3 → 3.4.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 (198) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +39 -0
  3. data/README.md +5 -3
  4. data/app/assets/images/active_scaffold/refresh.png +0 -0
  5. data/app/assets/javascripts/jquery/active_scaffold.js +182 -91
  6. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +14 -16
  7. data/app/assets/javascripts/jquery/draggable_lists.js +33 -26
  8. data/app/assets/javascripts/jquery/jquery.editinplace.js +3 -3
  9. data/app/assets/javascripts/prototype/active_scaffold.js +61 -19
  10. data/app/assets/stylesheets/active_scaffold_colors.css.scss +4 -0
  11. data/app/assets/stylesheets/active_scaffold_images.css.scss +3 -0
  12. data/app/assets/stylesheets/active_scaffold_layout.css +23 -2
  13. data/app/views/active_scaffold_overrides/_add_existing_form.html.erb +1 -3
  14. data/app/views/active_scaffold_overrides/_base_form.html.erb +7 -5
  15. data/app/views/active_scaffold_overrides/_field_search.html.erb +1 -2
  16. data/app/views/active_scaffold_overrides/_form.html.erb +6 -4
  17. data/app/views/active_scaffold_overrides/_form_association.html.erb +4 -3
  18. data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +5 -5
  19. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +8 -6
  20. data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +3 -2
  21. data/app/views/active_scaffold_overrides/_list.html.erb +8 -6
  22. data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +1 -4
  23. data/app/views/active_scaffold_overrides/_list_pagination.html.erb +4 -4
  24. data/app/views/active_scaffold_overrides/_list_pagination_links.html.erb +1 -1
  25. data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -3
  26. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +8 -1
  27. data/app/views/active_scaffold_overrides/_search.html.erb +7 -13
  28. data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
  29. data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
  30. data/app/views/active_scaffold_overrides/render_field_inplace.html.erb +1 -1
  31. data/app/views/active_scaffold_overrides/row.js.erb +1 -1
  32. data/config/locales/de.yml +106 -95
  33. data/config/locales/en.yml +108 -97
  34. data/config/locales/es.yml +109 -98
  35. data/config/locales/fr.yml +108 -97
  36. data/config/locales/hu.yml +109 -98
  37. data/config/locales/ja.yml +100 -89
  38. data/config/locales/ru.yml +115 -104
  39. data/lib/active_scaffold.rb +18 -294
  40. data/lib/active_scaffold/actions/common_search.rb +50 -17
  41. data/lib/active_scaffold/actions/core.rb +93 -22
  42. data/lib/active_scaffold/actions/create.rb +15 -6
  43. data/lib/active_scaffold/actions/field_search.rb +68 -60
  44. data/lib/active_scaffold/actions/list.rb +49 -28
  45. data/lib/active_scaffold/actions/nested.rb +14 -6
  46. data/lib/active_scaffold/actions/search.rb +36 -35
  47. data/lib/active_scaffold/actions/show.rb +9 -4
  48. data/lib/active_scaffold/actions/subform.rb +1 -1
  49. data/lib/active_scaffold/actions/update.rb +22 -7
  50. data/lib/active_scaffold/active_record_permissions.rb +125 -118
  51. data/lib/active_scaffold/attribute_params.rb +84 -66
  52. data/lib/active_scaffold/bridges.rb +3 -3
  53. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +10 -5
  54. data/lib/active_scaffold/bridges/cancan.rb +2 -1
  55. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +13 -2
  56. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -6
  57. data/lib/active_scaffold/bridges/chosen/helpers.rb +2 -2
  58. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +45 -29
  59. data/lib/active_scaffold/bridges/date_picker/ext.rb +11 -6
  60. data/lib/active_scaffold/bridges/date_picker/helper.rb +5 -1
  61. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +10 -5
  62. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -1
  63. data/lib/active_scaffold/bridges/file_column/form_ui.rb +12 -11
  64. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +14 -6
  65. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
  66. data/lib/active_scaffold/bridges/record_select/helpers.rb +15 -12
  67. data/lib/active_scaffold/bridges/shared/date_bridge.rb +7 -8
  68. data/lib/active_scaffold/bridges/tiny_mce.rb +5 -3
  69. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +4 -5
  70. data/lib/active_scaffold/config/base.rb +4 -0
  71. data/lib/active_scaffold/config/core.rb +12 -5
  72. data/lib/active_scaffold/config/delete.rb +0 -2
  73. data/lib/active_scaffold/config/field_search.rb +1 -4
  74. data/lib/active_scaffold/config/form.rb +0 -2
  75. data/lib/active_scaffold/config/list.rb +31 -1
  76. data/lib/active_scaffold/config/search.rb +0 -3
  77. data/lib/active_scaffold/config/show.rb +0 -6
  78. data/lib/active_scaffold/config/subform.rb +1 -0
  79. data/lib/active_scaffold/configurable.rb +2 -2
  80. data/lib/active_scaffold/constraints.rb +11 -14
  81. data/lib/active_scaffold/core.rb +277 -0
  82. data/lib/active_scaffold/data_structures/action_columns.rb +18 -2
  83. data/lib/active_scaffold/data_structures/action_link.rb +25 -6
  84. data/lib/active_scaffold/data_structures/action_links.rb +9 -4
  85. data/lib/active_scaffold/data_structures/actions.rb +1 -1
  86. data/lib/active_scaffold/data_structures/column.rb +6 -6
  87. data/lib/active_scaffold/data_structures/columns.rb +2 -2
  88. data/lib/active_scaffold/data_structures/nested_info.rb +5 -1
  89. data/lib/active_scaffold/data_structures/sorting.rb +15 -5
  90. data/lib/active_scaffold/delayed_setup.rb +30 -0
  91. data/lib/active_scaffold/engine.rb +25 -0
  92. data/lib/active_scaffold/extensions/action_view_rendering.rb +1 -1
  93. data/lib/active_scaffold/extensions/left_outer_joins.rb +61 -21
  94. data/lib/active_scaffold/extensions/localize.rb +1 -1
  95. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +13 -8
  96. data/lib/active_scaffold/extensions/paginator_extensions.rb +5 -1
  97. data/lib/active_scaffold/extensions/reverse_associations.rb +1 -0
  98. data/lib/active_scaffold/extensions/routing_mapper.rb +1 -1
  99. data/lib/active_scaffold/extensions/unsaved_record.rb +4 -6
  100. data/lib/active_scaffold/finder.rb +79 -27
  101. data/lib/active_scaffold/helpers/association_helpers.rb +48 -18
  102. data/lib/active_scaffold/helpers/controller_helpers.rb +19 -10
  103. data/lib/active_scaffold/helpers/form_column_helpers.rb +185 -87
  104. data/lib/active_scaffold/helpers/human_condition_helpers.rb +2 -1
  105. data/lib/active_scaffold/helpers/id_helpers.rb +14 -8
  106. data/lib/active_scaffold/helpers/list_column_helpers.rb +65 -56
  107. data/lib/active_scaffold/helpers/pagination_helpers.rb +5 -1
  108. data/lib/active_scaffold/helpers/search_column_helpers.rb +21 -18
  109. data/lib/active_scaffold/helpers/view_helpers.rb +102 -64
  110. data/lib/active_scaffold/responds_to_parent.rb +39 -64
  111. data/lib/active_scaffold/tableless.rb +129 -10
  112. data/lib/active_scaffold/version.rb +2 -2
  113. data/test/bridges/bridge_test.rb +1 -1
  114. data/test/bridges/date_picker_test.rb +2 -2
  115. data/test/bridges/paperclip_test.rb +10 -8
  116. data/test/bridges/tiny_mce_test.rb +2 -2
  117. data/test/company.rb +22 -10
  118. data/test/config/base_test.rb +1 -1
  119. data/test/config/core_test.rb +8 -6
  120. data/test/config/create_test.rb +6 -6
  121. data/test/config/delete_test.rb +4 -4
  122. data/test/config/field_search_test.rb +6 -6
  123. data/test/config/list_test.rb +7 -7
  124. data/test/config/nested_test.rb +8 -7
  125. data/test/config/search_test.rb +7 -7
  126. data/test/config/show_test.rb +5 -5
  127. data/test/config/subform_test.rb +1 -1
  128. data/test/config/update_test.rb +5 -4
  129. data/test/data_structures/action_columns_test.rb +15 -16
  130. data/test/data_structures/action_link_test.rb +10 -10
  131. data/test/data_structures/action_links_test.rb +6 -6
  132. data/test/data_structures/actions_test.rb +4 -4
  133. data/test/data_structures/association_column_test.rb +4 -4
  134. data/test/data_structures/column_test.rb +9 -9
  135. data/test/data_structures/columns_test.rb +7 -7
  136. data/test/data_structures/error_message_test.rb +2 -4
  137. data/test/data_structures/set_test.rb +13 -13
  138. data/test/data_structures/sorting_test.rb +8 -8
  139. data/test/data_structures/standard_column_test.rb +2 -2
  140. data/test/data_structures/validation_reflection_test.rb +8 -8
  141. data/test/data_structures/virtual_column_test.rb +5 -5
  142. data/test/extensions/active_record_test.rb +1 -1
  143. data/test/helpers/form_column_helpers_test.rb +5 -5
  144. data/test/helpers/list_column_helpers_test.rb +2 -1
  145. data/test/helpers/pagination_helpers_test.rb +1 -1
  146. data/test/misc/active_record_permissions_test.rb +23 -4
  147. data/test/misc/attribute_params_test.rb +304 -136
  148. data/test/misc/calculation_test.rb +55 -0
  149. data/test/misc/configurable_test.rb +22 -21
  150. data/test/misc/constraints_test.rb +10 -7
  151. data/test/misc/convert_numbers_format_test.rb +149 -0
  152. data/test/misc/finder_test.rb +17 -13
  153. data/test/misc/lang_test.rb +1 -1
  154. data/test/misc/tableless_test.rb +18 -0
  155. data/test/mock_app/app/controllers/addresses_controller.rb +4 -0
  156. data/test/mock_app/app/controllers/buildings_controller.rb +4 -0
  157. data/test/mock_app/app/controllers/cars_controller.rb +4 -0
  158. data/test/mock_app/app/controllers/contacts_controller.rb +4 -0
  159. data/test/mock_app/app/controllers/floors_controller.rb +6 -0
  160. data/test/mock_app/app/controllers/people_controller.rb +4 -0
  161. data/test/mock_app/app/models/address.rb +3 -0
  162. data/test/mock_app/app/models/building.rb +8 -0
  163. data/test/mock_app/app/models/car.rb +3 -0
  164. data/test/mock_app/app/models/contact.rb +3 -0
  165. data/test/mock_app/app/models/file_model.rb +19 -0
  166. data/test/mock_app/app/models/floor.rb +8 -0
  167. data/test/mock_app/app/models/person.rb +11 -0
  168. data/test/mock_app/config/application.rb +2 -0
  169. data/test/mock_app/config/environments/test.rb +1 -1
  170. data/test/mock_app/config/initializers/secret_token.rb +5 -1
  171. data/test/mock_app/config/routes.rb +1 -1
  172. data/test/mock_app/db/schema.rb +51 -0
  173. data/test/model_stub.rb +3 -3
  174. data/test/test_helper.rb +15 -12
  175. metadata +51 -50
  176. data/lib/active_scaffold/extensions/array.rb +0 -7
  177. data/lib/active_scaffold/extensions/cache_association.rb +0 -16
  178. data/lib/active_scaffold/extensions/usa_state.rb +0 -46
  179. data/lib/active_scaffold_env.rb +0 -13
  180. data/test/extensions/array_test.rb +0 -12
  181. data/test/mock_app/public/blank.html +0 -33
  182. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +0 -2
  183. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  184. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  185. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  186. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  187. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  188. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  189. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  190. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  191. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +0 -2
  192. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +0 -532
  193. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +0 -867
  194. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +0 -117
  195. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +0 -370
  196. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +0 -2
  197. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +0 -35
  198. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +0 -848
@@ -0,0 +1,55 @@
1
+ require 'test_helper'
2
+
3
+ class ClassWithFinder
4
+ include ActiveScaffold::Finder
5
+ def conditions_for_collection; end
6
+ def conditions_from_params; end
7
+ def conditions_from_constraints; end
8
+ def joins_for_collection; end
9
+ def custom_finder_options
10
+ {}
11
+ end
12
+ def beginning_of_chain
13
+ active_scaffold_config.model
14
+ end
15
+ def conditional_get_support?; end
16
+ def params; {}; end
17
+ end
18
+
19
+ class CalculationTest < MiniTest::Test
20
+ def setup
21
+ @buildings = []
22
+ @buildings << Building.create {|b| b.create_owner(:first_name => 'foo')}
23
+ @buildings << Building.create(:name => 'foo bar')
24
+ @buildings << Building.create
25
+
26
+ @klass = ClassWithFinder.new
27
+ @klass.stubs(:active_scaffold_config).returns(mock { stubs(:model).returns(Building) })
28
+ @klass.stubs(:active_scaffold_session_storage).returns({})
29
+ end
30
+
31
+ def teardown
32
+ @buildings.each(&:destroy).map(&:owner).compact.each(&:destroy)
33
+ end
34
+
35
+ def test_calculation_with_conditions
36
+ @klass.expects(:conditions_for_collection).returns(['"buildings"."name" LIKE ? OR "people"."first_name" LIKE ?', '%foo%', '%foo%'])
37
+ @klass.expects(:active_scaffold_references).returns([:owner])
38
+ @klass.active_scaffold_config.expects(:list).returns(mock { stubs(:count_includes).returns(nil) })
39
+
40
+ column = mock { stubs(:field).returns('"buildings"."id"') }
41
+ @klass.active_scaffold_config.expects(:columns).returns(mock { stubs(:"[]").returns(column) })
42
+ query = @klass.send :calculate_query
43
+ assert_equal 2, query.count
44
+ end
45
+
46
+ def test_calculation_without_conditions
47
+ @klass.stubs(:active_scaffold_references).returns([:owner])
48
+ @klass.active_scaffold_config.expects(:list).returns(mock { stubs(:count_includes).returns(nil) })
49
+
50
+ column = mock { stubs(:field).returns('"buildings"."id"') }
51
+ @klass.active_scaffold_config.expects(:columns).returns(mock { stubs(:"[]").returns(column) })
52
+ query = @klass.send :calculate_query
53
+ assert_equal Building.count, query.count
54
+ end
55
+ end
@@ -6,8 +6,15 @@ class ConfigurableClass
6
6
  def self.foo; FOO end
7
7
  end
8
8
 
9
+ class IncludedClass < ConfigurableClass
10
+ include ActiveScaffold::Configurable
11
+ end
12
+
13
+ class ExtendedClass < ConfigurableClass
14
+ extend ActiveScaffold::Configurable
15
+ end
9
16
 
10
- class ConfigurableTest < Test::Unit::TestCase
17
+ class ConfigurableTest < MiniTest::Test
11
18
  ##
12
19
  ## constants and methods for tests to check against
13
20
  ##
@@ -15,19 +22,17 @@ class ConfigurableTest < Test::Unit::TestCase
15
22
  HELLO = 'world'
16
23
 
17
24
  def test_instance_configuration
18
- ConfigurableClass.send :include, ActiveScaffold::Configurable
19
-
20
- configurable_class = ConfigurableClass.new
25
+ configurable_class = IncludedClass.new
21
26
 
22
27
  ##
23
28
  ## sanity checks
24
29
  ##
25
30
  # make sure the configure method is available
26
- assert ConfigurableClass.respond_to?(:configure)
31
+ assert configurable_class.respond_to?(:configure)
27
32
  # make sure real functions still work
28
33
  assert_equal 'bar', configurable_class.foo
29
34
  # make sure other functions still don't work
30
- assert_raise NoMethodError do
35
+ assert_raises NoMethodError do
31
36
  configurable_class.i_do_not_exist
32
37
  end
33
38
 
@@ -52,45 +57,41 @@ class ConfigurableTest < Test::Unit::TestCase
52
57
  end
53
58
 
54
59
  def test_class_configuration
55
- ConfigurableClass.send :extend, ActiveScaffold::Configurable
56
-
57
60
  ##
58
61
  ## sanity checks
59
62
  ##
60
63
  # make sure the configure method is available
61
- assert ConfigurableClass.respond_to?(:configure)
64
+ assert ExtendedClass.respond_to?(:configure)
62
65
  # make sure real functions still work
63
- assert_equal 'bar', ConfigurableClass.foo
66
+ assert_equal 'bar', ExtendedClass.foo
64
67
  # make sure other functions still don't work
65
- assert_raise NoMethodError do
66
- ConfigurableClass.i_do_not_exist
68
+ assert_raises NoMethodError do
69
+ ExtendedClass.i_do_not_exist
67
70
  end
68
71
 
69
72
  ##
70
73
  ## test normal block behaviors
71
74
  ##
72
75
  # functions
73
- assert_equal hello, ConfigurableClass.configure {hello}
76
+ assert_equal hello, ExtendedClass.configure {hello}
74
77
  # variables
75
- assert_equal ConfigurableClass, ConfigurableClass.configure {ConfigurableClass}
78
+ assert_equal ExtendedClass, ExtendedClass.configure {ExtendedClass}
76
79
  # constants
77
- assert_equal ConfigurableTest::HELLO, ConfigurableClass.configure {ConfigurableTest::HELLO}
80
+ assert_equal ConfigurableTest::HELLO, ExtendedClass.configure {ConfigurableTest::HELLO}
78
81
 
79
82
  ##
80
83
  ## test extra "localized" block behavior
81
84
  ##
82
85
  # functions
83
- assert_equal ConfigurableClass.foo, ConfigurableClass.configure {foo}
86
+ assert_equal ExtendedClass.foo, ExtendedClass.configure {foo}
84
87
  # constants - not working
85
- # assert_equal ConfigurableClass.FOO, ConfigurableClass.configure {FOO}
88
+ # assert_equal ExtendedClass.FOO, ExtendedClass.configure {FOO}
86
89
  end
87
90
 
88
91
  def test_arity
89
- ConfigurableClass.send :extend, ActiveScaffold::Configurable
90
-
91
92
  # this is the main style
92
- assert_equal 'foo', ConfigurableClass.configure {'foo'}
93
+ assert_equal 'foo', ExtendedClass.configure {'foo'}
93
94
  # but we want to let people accept the configurable class as the first argument, too
94
- assert_equal 'bar', ConfigurableClass.configure {|a| a.foo}
95
+ assert_equal 'bar', ExtendedClass.configure {|a| a.foo}
95
96
  end
96
97
  end
@@ -3,7 +3,8 @@ require 'test_helper'
3
3
  module ModelStubs
4
4
  class ModelStub < ActiveRecord::Base
5
5
  abstract_class = true
6
- def self.columns; [ActiveRecord::ConnectionAdapters::Column.new('foo', '')] end
6
+ def self.columns; @columns ||= [ColumnMock.new('foo', '')] end
7
+ def self.columns_hash; @hash ||= Hash[@columns.map{|c| [c.name, c]}] end
7
8
  def self.table_name
8
9
  @table_name || to_s.split('::').last.underscore.pluralize
9
10
  end
@@ -83,7 +84,8 @@ end
83
84
  class ConstraintsTestObject
84
85
  # stub out what the mixin expects to find ...
85
86
  def self.before_filter(*args); end
86
- attr_accessor :active_scaffold_includes
87
+ attr_accessor :active_scaffold_preload
88
+ attr_accessor :active_scaffold_references
87
89
  attr_accessor :active_scaffold_habtm_joins
88
90
  attr_accessor :active_scaffold_config
89
91
  attr_accessor :params
@@ -98,13 +100,14 @@ class ConstraintsTestObject
98
100
  attr_accessor :active_scaffold_constraints
99
101
 
100
102
  def initialize
101
- @active_scaffold_includes = []
103
+ @active_scaffold_preload = []
104
+ @active_scaffold_references = []
102
105
  @active_scaffold_habtm_joins = []
103
106
  @params = {}
104
107
  end
105
108
  end
106
109
 
107
- class ConstraintsTest < Test::Unit::TestCase
110
+ class ConstraintsTest < MiniTest::Test
108
111
  def setup
109
112
  @test_object = ConstraintsTestObject.new
110
113
  end
@@ -114,12 +117,12 @@ class ConstraintsTest < Test::Unit::TestCase
114
117
  # has_one (vs belongs_to)
115
118
  assert_constraint_condition({:subscription => 5}, [{'subscriptions.id' => 5}], 'find the user with subscription #5')
116
119
  # habtm (vs habtm)
117
- assert_constraint_condition({:roles => 4}, [{'roles_users.role_id' => 4}], 'find all users with role #4')
120
+ assert_constraint_condition({:roles => 4}, [{'roles.id' => 4}], 'find all users with role #4')
118
121
  # has_one (vs polymorphic)
119
122
  assert_constraint_condition({:address => 11}, [{'addresses.id' => 11}], 'find the user with address #11')
120
123
  # reverse of a has_many :through
121
124
  assert_constraint_condition({:subscription => {:service => 5}}, [{'services.id' => 5}], 'find all users subscribed to service #5')
122
- assert(@test_object.active_scaffold_includes.include?({:subscription => :service}), 'multi-level association include')
125
+ assert(@test_object.active_scaffold_references.include?({:subscription => :service}), 'multi-level association include')
123
126
 
124
127
  @test_object.active_scaffold_config = config_for('subscription')
125
128
  # belongs_to (vs has_one)
@@ -144,7 +147,7 @@ class ConstraintsTest < Test::Unit::TestCase
144
147
  # has_one (vs belongs_to)
145
148
  assert_constraint_condition({:other_subscription => 5}, [{'subscriptions.id' => 5}], 'find the user with subscription #5')
146
149
  # habtm (vs habtm)
147
- assert_constraint_condition({:other_roles => 4}, [{'roles_users.role_id' => 4}], 'find all users with role #4')
150
+ assert_constraint_condition({:other_roles => 4}, [{'roles.id' => 4}], 'find all users with role #4')
148
151
  # has_one (vs polymorphic)
149
152
  assert_constraint_condition({:other_address => 11}, [{'addresses.id' => 11}], 'find the user with address #11')
150
153
  # reverse of a has_many :through
@@ -0,0 +1,149 @@
1
+ require 'test_helper'
2
+
3
+ class NumberModel < ActiveRecord::Base
4
+ include ActiveScaffold::ActiveRecordPermissions::ModelUserAccess::Model
5
+ abstract_class = true
6
+ def self.columns
7
+ @columns ||= [ColumnMock.new('number', '', 'double(10,2)')]
8
+ end
9
+ def self.columns_hash
10
+ @hash ||= Hash[@columns.map{|c| [c.name, c]}]
11
+ end
12
+ end
13
+
14
+ class ConvertNumbersFormatTest < MiniTest::Test
15
+ include ActiveScaffold::AttributeParams
16
+ include ActiveScaffold::Finder
17
+
18
+ def setup
19
+ I18n.backend.store_translations :en, :number => {:format => {
20
+ :delimiter => ',',
21
+ :separator => '.'
22
+ }}
23
+ I18n.backend.store_translations :es, :number => {:format => {
24
+ :delimiter => '.',
25
+ :separator => ','
26
+ }}
27
+ I18n.backend.store_translations :ru, :number => {:currency => {
28
+ :format => {
29
+ :separator => ',',
30
+ :delimiter => ''
31
+ }
32
+ }}
33
+
34
+ @config = config_for('number_model')
35
+ @config.columns[:number].form_ui = nil
36
+ @config.create.columns.set_columns @config.columns
37
+ end
38
+
39
+ def teardown
40
+ I18n.locale = :en
41
+ end
42
+
43
+ def test_english_format_with_decimal_separator_using_english_language
44
+ I18n.locale = :en
45
+ assert_equal 0.1, convert_number('.1')
46
+ assert_equal 0.1, convert_number('.100')
47
+ assert_equal 0.1, convert_number('0.1')
48
+ assert_equal 0.345, convert_number('0.345')
49
+ assert_equal 0.345, convert_number('+0.345')
50
+ assert_equal -0.345, convert_number('-0.345')
51
+ assert_equal 9.345, convert_number('9.345')
52
+ assert_equal 9.1, convert_number('9.1')
53
+ assert_equal 90.1, convert_number('90.1')
54
+ end
55
+
56
+ def test_english_format_with_thousand_delimiter_using_english_language
57
+ I18n.locale = :en
58
+ assert_equal 1000, convert_number('1,000')
59
+ assert_equal 1000, convert_number('+1,000')
60
+ assert_equal -1000, convert_number('-1,000')
61
+ assert_equal 1000000, convert_number('1,000,000')
62
+ end
63
+
64
+ def test_english_format_with_separator_and_delimiter_using_english_language
65
+ I18n.locale = :en
66
+ assert_equal 1234.1, convert_number('1,234.1')
67
+ assert_equal 1234.1, convert_number('1,234.100')
68
+ assert_equal 1234.345, convert_number('+1,234.345')
69
+ assert_equal -1234.345, convert_number('-1,234.345')
70
+ assert_equal 1234000.1, convert_number('1,234,000.100')
71
+ end
72
+
73
+ def test_english_format_with_decimal_separator_using_spanish_language
74
+ I18n.locale = :es
75
+ assert_equal 0.1, convert_number('.1')
76
+ assert_equal 0.1, convert_number('0.1')
77
+ assert_equal 0.12, convert_number('+0.12')
78
+ assert_equal -0.12, convert_number('-0.12')
79
+ assert_equal 9.1, convert_number('9.1')
80
+ assert_equal 90.1, convert_number('90.1')
81
+ end
82
+
83
+ def test_spanish_format_with_decimal_separator_using_spanish_language
84
+ I18n.locale = :es
85
+ assert_equal 0.1, convert_number(',1')
86
+ assert_equal 0.1, convert_number(',100')
87
+ assert_equal 0.1, convert_number('0,1')
88
+ assert_equal 0.345, convert_number('0,345')
89
+ assert_equal 0.345, convert_number('+0,345')
90
+ assert_equal -0.345, convert_number('-0,345')
91
+ assert_equal 9.1, convert_number('9,1')
92
+ assert_equal 90.1, convert_number('90,1')
93
+ assert_equal 9.1, convert_number('9,100')
94
+ end
95
+
96
+ def test_spanish_format_with_thousand_delimiter_using_spanish_language
97
+ I18n.locale = :es
98
+ assert_equal 1000, convert_number('1.000')
99
+ assert_equal 1000, convert_number('+1.000')
100
+ assert_equal -1000, convert_number('-1.000')
101
+ assert_equal 1000000, convert_number('1.000.000')
102
+ end
103
+
104
+ def test_spanish_format_with_separator_and_decimal_using_spanish_language
105
+ I18n.locale = :es
106
+ assert_equal 1230.1, convert_number('1.230,1')
107
+ assert_equal 1230.1, convert_number('1.230,100')
108
+ assert_equal 1234.345, convert_number('+1.234,345')
109
+ assert_equal -1234.345, convert_number('-1.234,345')
110
+ assert_equal 1234000.1, convert_number('1.234.000,100')
111
+ end
112
+
113
+ def test_english_currency_format_with_decimal_separator_using_russian_language
114
+ I18n.locale = :ru
115
+ assert_equal 0.1, convert_number('.1', :currency)
116
+ assert_equal 0.1, convert_number('0.1', :currency)
117
+ assert_equal 0.12, convert_number('+0.12', :currency)
118
+ assert_equal -0.12, convert_number('-0.12', :currency)
119
+ assert_equal 9.1, convert_number('9.1', :currency)
120
+ assert_equal 90.1, convert_number('90.1', :currency)
121
+ end
122
+
123
+ def test_russian_currency_format_with_decimal_separator_using_russian_language
124
+ I18n.locale = :ru
125
+ assert_equal 0.1, convert_number(',1', :currency)
126
+ assert_equal 0.1, convert_number(',100', :currency)
127
+ assert_equal 0.1, convert_number('0,1', :currency)
128
+ assert_equal 0.345, convert_number('0,345', :currency)
129
+ assert_equal 0.345, convert_number('+0,345', :currency)
130
+ assert_equal -0.345, convert_number('-0,345', :currency)
131
+ assert_equal 9.1, convert_number('9,1', :currency)
132
+ assert_equal 90.1, convert_number('90,1', :currency)
133
+ assert_equal 9.1, convert_number('9,100', :currency)
134
+ end
135
+
136
+ def test_english_format_with_decimal_separator_with_no_localized_format
137
+ I18n.locale = :ru
138
+ assert_equal 0.1, convert_number('.1')
139
+ assert_equal 0.1, convert_number('0.1')
140
+ end
141
+
142
+ private
143
+ def convert_number(value, format = nil)
144
+ record = NumberModel.new
145
+ @config.columns[:number].options[:format] = format unless format.nil?
146
+ update_record_from_params(record, @config.create.columns, HashWithIndifferentAccess.new({:number => value}))
147
+ record.number
148
+ end
149
+ end
@@ -12,9 +12,11 @@ class ClassWithFinder
12
12
  def beginning_of_chain
13
13
  active_scaffold_config.model
14
14
  end
15
+ def conditional_get_support?; end
16
+ def params; {}; end
15
17
  end
16
18
 
17
- class FinderTest < Test::Unit::TestCase
19
+ class FinderTest < MiniTest::Test
18
20
  def setup
19
21
  @klass = ClassWithFinder.new
20
22
  @klass.stubs(:active_scaffold_config).returns(mock { stubs(:model).returns(ModelStub) })
@@ -55,10 +57,7 @@ class FinderTest < Test::Unit::TestCase
55
57
  assert_equal collection.sort.reverse, @klass.send(:sort_collection_by_column, collection, column, 'desc')
56
58
 
57
59
  collection = ['a', nil, 'b']
58
- result = nil
59
- assert_nothing_raised do
60
- result = @klass.send(:sort_collection_by_column, collection, column, 'asc')
61
- end
60
+ result = @klass.send(:sort_collection_by_column, collection, column, 'asc')
62
61
  assert_equal [nil, 'a', 'b'], result
63
62
 
64
63
  column.sort_by :method => 'self'
@@ -68,21 +67,21 @@ class FinderTest < Test::Unit::TestCase
68
67
 
69
68
  def test_count_with_group
70
69
  @klass.expects(:custom_finder_options).returns({:group => :a})
71
- ActiveRecord::Relation.any_instance.expects(:count).returns(ActiveSupport::OrderedHash['foo', 5])
72
- ActiveRecord::Relation.any_instance.expects(:limit).with(20).returns(ModelStub.where(nil))
73
- ActiveRecord::Relation.any_instance.expects(:offset).with(0).returns(ModelStub.where(nil))
70
+ relation_class.any_instance.expects(:count).returns({'foo' => 5, 'bar' => 4})
71
+ relation_class.any_instance.expects(:limit).with(20).returns(ModelStub.where(nil))
72
+ relation_class.any_instance.expects(:offset).with(0).returns(ModelStub.where(nil))
74
73
  page = @klass.send :find_page, :per_page => 20, :pagination => true
75
74
  page.items
76
75
 
77
76
  assert_kind_of Integer, page.pager.count
78
- assert_equal 1, page.pager.count
79
- assert_nothing_raised { page.pager.number_of_pages }
77
+ assert_equal 2, page.pager.count
78
+ assert_equal 1, page.pager.number_of_pages
80
79
  end
81
80
 
82
81
  def test_disabled_pagination
83
- ActiveRecord::Relation.any_instance.expects(:count).never
84
- ActiveRecord::Relation.any_instance.expects(:limit).never
85
- ActiveRecord::Relation.any_instance.expects(:offset).never
82
+ relation_class.any_instance.expects(:count).never
83
+ relation_class.any_instance.expects(:limit).never
84
+ relation_class.any_instance.expects(:offset).never
86
85
  ModelStub.expects(:count).never
87
86
  page = @klass.send :find_page, :per_page => 20, :pagination => false
88
87
  page.items
@@ -92,4 +91,9 @@ class FinderTest < Test::Unit::TestCase
92
91
  ModelStub.expects(:count).never
93
92
  page = @klass.send :find_page, :pagination => :infinite
94
93
  end
94
+
95
+ private
96
+ def relation_class
97
+ @klass.active_scaffold_config.model.send(:relation).class
98
+ end
95
99
  end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class LocalizationTest < Test::Unit::TestCase
3
+ class LocalizationTest < MiniTest::Test
4
4
 
5
5
  def test_localization
6
6
  assert_equal "Dutch", as_(:dutch)
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class TablelessTest < MiniTest::Test
4
+ def test_find_all
5
+ assert_equal [], FileModel.all
6
+ end
7
+
8
+ def test_find_by_id
9
+ assert_raises ActiveRecord::RecordNotFound do
10
+ FileModel.find('filename')
11
+ end
12
+ end
13
+
14
+ def test_find_with_association
15
+ assert_equal [], Person.new.files
16
+ end
17
+ end
18
+