globe-composite_primary_keys 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +203 -0
- data/Manifest.txt +121 -0
- data/README.txt +41 -0
- data/README_DB2.txt +33 -0
- data/Rakefile +30 -0
- data/composite_primary_keys.gemspec +17 -0
- data/lib/adapter_helper/base.rb +63 -0
- data/lib/adapter_helper/mysql.rb +13 -0
- data/lib/adapter_helper/oracle.rb +12 -0
- data/lib/adapter_helper/oracle_enhanced.rb +12 -0
- data/lib/adapter_helper/postgresql.rb +13 -0
- data/lib/adapter_helper/sqlite3.rb +13 -0
- data/lib/composite_primary_keys.rb +63 -0
- data/lib/composite_primary_keys/association_preload.rb +162 -0
- data/lib/composite_primary_keys/associations.rb +159 -0
- data/lib/composite_primary_keys/attribute_methods.rb +84 -0
- data/lib/composite_primary_keys/base.rb +200 -0
- data/lib/composite_primary_keys/composite_arrays.rb +29 -0
- data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +9 -0
- data/lib/composite_primary_keys/connection_adapters/ibm_db_adapter.rb +21 -0
- data/lib/composite_primary_keys/connection_adapters/oracle_adapter.rb +15 -0
- data/lib/composite_primary_keys/connection_adapters/oracle_enhanced_adapter.rb +17 -0
- data/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb +53 -0
- data/lib/composite_primary_keys/connection_adapters/sqlite3_adapter.rb +15 -0
- data/lib/composite_primary_keys/finder_methods.rb +68 -0
- data/lib/composite_primary_keys/fixtures.rb +8 -0
- data/lib/composite_primary_keys/read.rb +25 -0
- data/lib/composite_primary_keys/reflection.rb +39 -0
- data/lib/composite_primary_keys/relation.rb +31 -0
- data/lib/composite_primary_keys/through_association_scope.rb +212 -0
- data/lib/composite_primary_keys/validations/uniqueness.rb +118 -0
- data/lib/composite_primary_keys/version.rb +9 -0
- data/loader.rb +24 -0
- data/local/database_connections.rb.sample +12 -0
- data/local/paths.rb.sample +2 -0
- data/local/tasks.rb.sample +2 -0
- data/scripts/console.rb +48 -0
- data/scripts/txt2html +67 -0
- data/scripts/txt2js +59 -0
- data/tasks/activerecord_selection.rake +43 -0
- data/tasks/databases.rake +12 -0
- data/tasks/databases/mysql.rake +30 -0
- data/tasks/databases/oracle.rake +25 -0
- data/tasks/databases/postgresql.rake +25 -0
- data/tasks/databases/sqlite3.rake +28 -0
- data/tasks/deployment.rake +22 -0
- data/tasks/local_setup.rake +13 -0
- data/tasks/website.rake +18 -0
- data/test/README_tests.txt +67 -0
- data/test/abstract_unit.rb +103 -0
- data/test/connections/native_ibm_db/connection.rb +23 -0
- data/test/connections/native_mysql/connection.rb +13 -0
- data/test/connections/native_oracle/connection.rb +14 -0
- data/test/connections/native_oracle_enhanced/connection.rb +20 -0
- data/test/connections/native_postgresql/connection.rb +8 -0
- data/test/connections/native_sqlite/connection.rb +9 -0
- data/test/fixtures/article.rb +5 -0
- data/test/fixtures/article_group.rb +4 -0
- data/test/fixtures/article_groups.yml +7 -0
- data/test/fixtures/articles.yml +6 -0
- data/test/fixtures/comment.rb +6 -0
- data/test/fixtures/comments.yml +16 -0
- data/test/fixtures/db_definitions/db2-create-tables.sql +113 -0
- data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -0
- data/test/fixtures/db_definitions/mysql.sql +181 -0
- data/test/fixtures/db_definitions/oracle.drop.sql +39 -0
- data/test/fixtures/db_definitions/oracle.sql +188 -0
- data/test/fixtures/db_definitions/postgresql.sql +206 -0
- data/test/fixtures/db_definitions/sqlite.sql +166 -0
- data/test/fixtures/department.rb +5 -0
- data/test/fixtures/departments.yml +3 -0
- data/test/fixtures/dorm.rb +3 -0
- data/test/fixtures/dorms.yml +2 -0
- data/test/fixtures/employee.rb +4 -0
- data/test/fixtures/employees.yml +9 -0
- data/test/fixtures/group.rb +3 -0
- data/test/fixtures/groups.yml +3 -0
- data/test/fixtures/hack.rb +6 -0
- data/test/fixtures/hacks.yml +2 -0
- data/test/fixtures/kitchen_sink.rb +3 -0
- data/test/fixtures/kitchen_sinks.yml +5 -0
- data/test/fixtures/membership.rb +10 -0
- data/test/fixtures/membership_status.rb +3 -0
- data/test/fixtures/membership_statuses.yml +10 -0
- data/test/fixtures/memberships.yml +6 -0
- data/test/fixtures/product.rb +7 -0
- data/test/fixtures/product_tariff.rb +5 -0
- data/test/fixtures/product_tariffs.yml +12 -0
- data/test/fixtures/products.yml +6 -0
- data/test/fixtures/reading.rb +4 -0
- data/test/fixtures/readings.yml +10 -0
- data/test/fixtures/reference_code.rb +7 -0
- data/test/fixtures/reference_codes.yml +28 -0
- data/test/fixtures/reference_type.rb +7 -0
- data/test/fixtures/reference_types.yml +9 -0
- data/test/fixtures/restaurant.rb +6 -0
- data/test/fixtures/restaurants.yml +5 -0
- data/test/fixtures/restaurants_suburbs.yml +11 -0
- data/test/fixtures/room.rb +10 -0
- data/test/fixtures/room_assignment.rb +4 -0
- data/test/fixtures/room_assignments.yml +4 -0
- data/test/fixtures/room_attribute.rb +3 -0
- data/test/fixtures/room_attribute_assignment.rb +5 -0
- data/test/fixtures/room_attribute_assignments.yml +4 -0
- data/test/fixtures/room_attributes.yml +3 -0
- data/test/fixtures/rooms.yml +3 -0
- data/test/fixtures/seat.rb +5 -0
- data/test/fixtures/seats.yml +4 -0
- data/test/fixtures/street.rb +3 -0
- data/test/fixtures/streets.yml +15 -0
- data/test/fixtures/student.rb +4 -0
- data/test/fixtures/students.yml +2 -0
- data/test/fixtures/suburb.rb +6 -0
- data/test/fixtures/suburbs.yml +9 -0
- data/test/fixtures/tariff.rb +6 -0
- data/test/fixtures/tariffs.yml +13 -0
- data/test/fixtures/user.rb +10 -0
- data/test/fixtures/users.yml +6 -0
- data/test/hash_tricks.rb +34 -0
- data/test/plugins/pagination.rb +405 -0
- data/test/plugins/pagination_helper.rb +135 -0
- data/test/test_associations.rb +178 -0
- data/test/test_attribute_methods.rb +22 -0
- data/test/test_attributes.rb +80 -0
- data/test/test_clone.rb +34 -0
- data/test/test_composite_arrays.rb +32 -0
- data/test/test_create.rb +68 -0
- data/test/test_delete.rb +83 -0
- data/test/test_exists.rb +25 -0
- data/test/test_find.rb +73 -0
- data/test/test_ids.rb +90 -0
- data/test/test_miscellaneous.rb +39 -0
- data/test/test_pagination.rb +38 -0
- data/test/test_polymorphic.rb +32 -0
- data/test/test_santiago.rb +27 -0
- data/test/test_suite.rb +19 -0
- data/test/test_tutorial_example.rb +26 -0
- data/test/test_update.rb +40 -0
- data/test/test_validations.rb +11 -0
- data/website/index.html +195 -0
- data/website/index.txt +159 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +126 -0
- data/website/template.js +3 -0
- data/website/template.rhtml +53 -0
- data/website/version-raw.js +3 -0
- data/website/version-raw.txt +2 -0
- data/website/version.js +4 -0
- data/website/version.txt +3 -0
- metadata +339 -0
@@ -0,0 +1,135 @@
|
|
1
|
+
module ActionView
|
2
|
+
module Helpers
|
3
|
+
# Provides methods for linking to ActionController::Pagination objects using a simple generator API. You can optionally
|
4
|
+
# also build your links manually using ActionView::Helpers::AssetHelper#link_to like so:
|
5
|
+
#
|
6
|
+
# <%= link_to "Previous page", { :page => paginator.current.previous } if paginator.current.previous %>
|
7
|
+
# <%= link_to "Next page", { :page => paginator.current.next } if paginator.current.next %>
|
8
|
+
module PaginationHelper
|
9
|
+
unless const_defined?(:DEFAULT_OPTIONS)
|
10
|
+
DEFAULT_OPTIONS = {
|
11
|
+
:name => :page,
|
12
|
+
:window_size => 2,
|
13
|
+
:always_show_anchors => true,
|
14
|
+
:link_to_current_page => false,
|
15
|
+
:params => {}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
# Creates a basic HTML link bar for the given +paginator+. Links will be created
|
20
|
+
# for the next and/or previous page and for a number of other pages around the current
|
21
|
+
# pages position. The +html_options+ hash is passed to +link_to+ when the links are created.
|
22
|
+
#
|
23
|
+
# ==== Options
|
24
|
+
# <tt>:name</tt>:: the routing name for this paginator
|
25
|
+
# (defaults to +page+)
|
26
|
+
# <tt>:prefix</tt>:: prefix for pagination links
|
27
|
+
# (i.e. Older Pages: 1 2 3 4)
|
28
|
+
# <tt>:suffix</tt>:: suffix for pagination links
|
29
|
+
# (i.e. 1 2 3 4 <- Older Pages)
|
30
|
+
# <tt>:window_size</tt>:: the number of pages to show around
|
31
|
+
# the current page (defaults to <tt>2</tt>)
|
32
|
+
# <tt>:always_show_anchors</tt>:: whether or not the first and last
|
33
|
+
# pages should always be shown
|
34
|
+
# (defaults to +true+)
|
35
|
+
# <tt>:link_to_current_page</tt>:: whether or not the current page
|
36
|
+
# should be linked to (defaults to
|
37
|
+
# +false+)
|
38
|
+
# <tt>:params</tt>:: any additional routing parameters
|
39
|
+
# for page URLs
|
40
|
+
#
|
41
|
+
# ==== Examples
|
42
|
+
# # We'll assume we have a paginator setup in @person_pages...
|
43
|
+
#
|
44
|
+
# pagination_links(@person_pages)
|
45
|
+
# # => 1 <a href="/?page=2/">2</a> <a href="/?page=3/">3</a> ... <a href="/?page=10/">10</a>
|
46
|
+
#
|
47
|
+
# pagination_links(@person_pages, :link_to_current_page => true)
|
48
|
+
# # => <a href="/?page=1/">1</a> <a href="/?page=2/">2</a> <a href="/?page=3/">3</a> ... <a href="/?page=10/">10</a>
|
49
|
+
#
|
50
|
+
# pagination_links(@person_pages, :always_show_anchors => false)
|
51
|
+
# # => 1 <a href="/?page=2/">2</a> <a href="/?page=3/">3</a>
|
52
|
+
#
|
53
|
+
# pagination_links(@person_pages, :window_size => 1)
|
54
|
+
# # => 1 <a href="/?page=2/">2</a> ... <a href="/?page=10/">10</a>
|
55
|
+
#
|
56
|
+
# pagination_links(@person_pages, :params => { :viewer => "flash" })
|
57
|
+
# # => 1 <a href="/?page=2&viewer=flash/">2</a> <a href="/?page=3&viewer=flash/">3</a> ...
|
58
|
+
# # <a href="/?page=10&viewer=flash/">10</a>
|
59
|
+
def pagination_links(paginator, options={}, html_options={})
|
60
|
+
name = options[:name] || DEFAULT_OPTIONS[:name]
|
61
|
+
params = (options[:params] || DEFAULT_OPTIONS[:params]).clone
|
62
|
+
|
63
|
+
prefix = options[:prefix] || ''
|
64
|
+
suffix = options[:suffix] || ''
|
65
|
+
|
66
|
+
pagination_links_each(paginator, options, prefix, suffix) do |n|
|
67
|
+
params[name] = n
|
68
|
+
link_to(n.to_s, params, html_options)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Iterate through the pages of a given +paginator+, invoking a
|
73
|
+
# block for each page number that needs to be rendered as a link.
|
74
|
+
#
|
75
|
+
# ==== Options
|
76
|
+
# <tt>:window_size</tt>:: the number of pages to show around
|
77
|
+
# the current page (defaults to +2+)
|
78
|
+
# <tt>:always_show_anchors</tt>:: whether or not the first and last
|
79
|
+
# pages should always be shown
|
80
|
+
# (defaults to +true+)
|
81
|
+
# <tt>:link_to_current_page</tt>:: whether or not the current page
|
82
|
+
# should be linked to (defaults to
|
83
|
+
# +false+)
|
84
|
+
#
|
85
|
+
# ==== Example
|
86
|
+
# # Turn paginated links into an Ajax call
|
87
|
+
# pagination_links_each(paginator, page_options) do |link|
|
88
|
+
# options = { :url => {:action => 'list'}, :update => 'results' }
|
89
|
+
# html_options = { :href => url_for(:action => 'list') }
|
90
|
+
#
|
91
|
+
# link_to_remote(link.to_s, options, html_options)
|
92
|
+
# end
|
93
|
+
def pagination_links_each(paginator, options, prefix = nil, suffix = nil)
|
94
|
+
options = DEFAULT_OPTIONS.merge(options)
|
95
|
+
link_to_current_page = options[:link_to_current_page]
|
96
|
+
always_show_anchors = options[:always_show_anchors]
|
97
|
+
|
98
|
+
current_page = paginator.current_page
|
99
|
+
window_pages = current_page.window(options[:window_size]).pages
|
100
|
+
return if window_pages.length <= 1 unless link_to_current_page
|
101
|
+
|
102
|
+
first, last = paginator.first, paginator.last
|
103
|
+
|
104
|
+
html = ''
|
105
|
+
|
106
|
+
html << prefix if prefix
|
107
|
+
|
108
|
+
if always_show_anchors and not (wp_first = window_pages[0]).first?
|
109
|
+
html << yield(first.number)
|
110
|
+
html << ' ... ' if wp_first.number - first.number > 1
|
111
|
+
html << ' '
|
112
|
+
end
|
113
|
+
|
114
|
+
window_pages.each do |page|
|
115
|
+
if current_page == page && !link_to_current_page
|
116
|
+
html << page.number.to_s
|
117
|
+
else
|
118
|
+
html << yield(page.number)
|
119
|
+
end
|
120
|
+
html << ' '
|
121
|
+
end
|
122
|
+
|
123
|
+
if always_show_anchors and not (wp_last = window_pages[-1]).last?
|
124
|
+
html << ' ... ' if last.number - wp_last.number > 1
|
125
|
+
html << yield(last.number)
|
126
|
+
end
|
127
|
+
|
128
|
+
html << suffix if suffix
|
129
|
+
|
130
|
+
html
|
131
|
+
end
|
132
|
+
|
133
|
+
end # PaginationHelper
|
134
|
+
end # Helpers
|
135
|
+
end # ActionView
|
@@ -0,0 +1,178 @@
|
|
1
|
+
require 'abstract_unit'
|
2
|
+
require 'fixtures/article'
|
3
|
+
require 'fixtures/membership'
|
4
|
+
require 'fixtures/product'
|
5
|
+
require 'fixtures/tariff'
|
6
|
+
require 'fixtures/product_tariff'
|
7
|
+
require 'fixtures/suburb'
|
8
|
+
require 'fixtures/street'
|
9
|
+
require 'fixtures/restaurant'
|
10
|
+
require 'fixtures/dorm'
|
11
|
+
require 'fixtures/room'
|
12
|
+
require 'fixtures/room_attribute'
|
13
|
+
require 'fixtures/room_attribute_assignment'
|
14
|
+
require 'fixtures/student'
|
15
|
+
require 'fixtures/room_assignment'
|
16
|
+
require 'fixtures/user'
|
17
|
+
require 'fixtures/reading'
|
18
|
+
|
19
|
+
class TestAssociations < ActiveSupport::TestCase
|
20
|
+
fixtures :articles, :products, :tariffs, :product_tariffs, :suburbs, :streets, :restaurants, :restaurants_suburbs,
|
21
|
+
:dorms, :rooms, :room_attributes, :room_attribute_assignments, :students, :room_assignments, :users, :readings,
|
22
|
+
:memberships
|
23
|
+
|
24
|
+
def test_has_many_through_with_conditions_when_through_association_is_not_composite
|
25
|
+
user = User.find(:first)
|
26
|
+
assert_equal 1, user.articles.find(:all, :conditions => ["articles.name = ?", "Article One"]).size
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_has_many_through_with_conditions_when_through_association_is_composite
|
30
|
+
room = Room.find(:first)
|
31
|
+
assert_equal 0, room.room_attributes.find(:all, :conditions => ["room_attributes.name != ?", "keg"]).size
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_has_many_through_on_custom_finder_when_through_association_is_composite_finder_when_through_association_is_not_composite
|
35
|
+
user = User.find(:first)
|
36
|
+
assert_equal 1, user.find_custom_articles.size
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_has_many_through_on_custom_finder_when_through_association_is_composite
|
40
|
+
room = Room.find(:first)
|
41
|
+
assert_equal 0, room.find_custom_room_attributes.size
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_count
|
45
|
+
assert_equal 2, Product.count(:include => :product_tariffs)
|
46
|
+
assert_equal 3, Tariff.count(:include => :product_tariffs)
|
47
|
+
assert_equal 2, Tariff.count(:group => :start_date).size
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_products
|
51
|
+
assert_not_nil products(:first_product).product_tariffs
|
52
|
+
assert_equal 2, products(:first_product).product_tariffs.length
|
53
|
+
assert_not_nil products(:first_product).tariffs
|
54
|
+
assert_equal 2, products(:first_product).tariffs.length
|
55
|
+
assert_not_nil products(:first_product).product_tariff
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_product_tariffs
|
59
|
+
assert_not_nil product_tariffs(:first_flat).product
|
60
|
+
assert_not_nil product_tariffs(:first_flat).tariff
|
61
|
+
assert_equal Product, product_tariffs(:first_flat).product.class
|
62
|
+
assert_equal Tariff, product_tariffs(:first_flat).tariff.class
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_tariffs
|
66
|
+
assert_not_nil tariffs(:flat).product_tariffs
|
67
|
+
assert_equal 1, tariffs(:flat).product_tariffs.length
|
68
|
+
assert_not_nil tariffs(:flat).products
|
69
|
+
assert_equal 1, tariffs(:flat).products.length
|
70
|
+
assert_not_nil tariffs(:flat).product_tariff
|
71
|
+
end
|
72
|
+
|
73
|
+
# Its not generating the instances of associated classes from the rows
|
74
|
+
def test_find_includes_products
|
75
|
+
assert @products = Product.find(:all, :include => :product_tariffs)
|
76
|
+
assert_equal 2, @products.length
|
77
|
+
assert_not_nil @products.first.instance_variable_get('@product_tariffs'), '@product_tariffs not set; should be array'
|
78
|
+
assert_equal 3, @products.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length},
|
79
|
+
"Incorrect number of product_tariffs returned"
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_find_includes_tariffs
|
83
|
+
assert @tariffs = Tariff.find(:all, :include => :product_tariffs)
|
84
|
+
assert_equal 3, @tariffs.length
|
85
|
+
assert_not_nil @tariffs.first.instance_variable_get('@product_tariffs'), '@product_tariffs not set; should be array'
|
86
|
+
assert_equal 3, @tariffs.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length},
|
87
|
+
"Incorrect number of product_tariffs returnedturned"
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_find_includes_product
|
91
|
+
assert @product_tariffs = ProductTariff.find(:all, :include => :product)
|
92
|
+
assert_equal 3, @product_tariffs.length
|
93
|
+
assert_not_nil @product_tariffs.first.instance_variable_get('@product'), '@product not set'
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_find_includes_comp_belongs_to_tariff
|
97
|
+
assert @product_tariffs = ProductTariff.find(:all, :include => :tariff)
|
98
|
+
assert_equal 3, @product_tariffs.length
|
99
|
+
assert_not_nil @product_tariffs.first.instance_variable_get('@tariff'), '@tariff not set'
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_find_includes_extended
|
103
|
+
assert @products = Product.find(:all, :include => {:product_tariffs => :tariff})
|
104
|
+
assert_equal 3, @products.inject(0) {|sum, product| sum + product.instance_variable_get('@product_tariffs').length},
|
105
|
+
"Incorrect number of product_tariffs returned"
|
106
|
+
|
107
|
+
assert @tariffs = Tariff.find(:all, :include => {:product_tariffs => :product})
|
108
|
+
assert_equal 3, @tariffs.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length},
|
109
|
+
"Incorrect number of product_tariffs returned"
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_has_many_through
|
113
|
+
@products = Product.find(:all, :include => :tariffs)
|
114
|
+
assert_equal 3, @products.inject(0) {|sum, product| sum + product.instance_variable_get('@tariffs').length},
|
115
|
+
"Incorrect number of tariffs returned"
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_has_many_through_when_not_pre_loaded
|
119
|
+
student = Student.find(:first)
|
120
|
+
rooms = student.rooms
|
121
|
+
assert_equal 1, rooms.size
|
122
|
+
assert_equal 1, rooms.first.dorm_id
|
123
|
+
assert_equal 1, rooms.first.room_id
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_has_many_through_when_through_association_is_composite
|
127
|
+
dorm = Dorm.find(:first)
|
128
|
+
assert_equal 1, dorm.rooms.length
|
129
|
+
assert_equal 1, dorm.rooms.first.room_attributes.length
|
130
|
+
assert_equal 'keg', dorm.rooms.first.room_attributes.first.name
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_associations_with_conditions
|
134
|
+
@suburb = Suburb.find([2, 1])
|
135
|
+
assert_equal 2, @suburb.streets.size
|
136
|
+
|
137
|
+
@suburb = Suburb.find([2, 1])
|
138
|
+
assert_equal 1, @suburb.first_streets.size
|
139
|
+
|
140
|
+
@suburb = Suburb.find([2, 1], :include => :streets)
|
141
|
+
assert_equal 2, @suburb.streets.size
|
142
|
+
|
143
|
+
@suburb = Suburb.find([2, 1], :include => :first_streets)
|
144
|
+
assert_equal 1, @suburb.first_streets.size
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_has_and_belongs_to_many
|
148
|
+
@restaurant = Restaurant.find([1,1])
|
149
|
+
assert_equal 2, @restaurant.suburbs.size
|
150
|
+
|
151
|
+
@restaurant = Restaurant.find([1,1], :include => :suburbs)
|
152
|
+
assert_equal 2, @restaurant.suburbs.size
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_has_many_with_primary_key
|
156
|
+
@membership = Membership.find([1, 1])
|
157
|
+
|
158
|
+
assert_equal 2, @membership.readings.size
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_has_one_with_primary_key
|
162
|
+
@membership = Membership.find([1, 1])
|
163
|
+
|
164
|
+
assert_equal 2, @membership.reading.id
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_joins_has_many_with_primary_key
|
168
|
+
@membership = Membership.find(:first, :joins => :readings, :conditions => { :readings => { :id => 1 } })
|
169
|
+
|
170
|
+
assert_equal [1, 1], @membership.id
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_joins_has_one_with_primary_key
|
174
|
+
@membership = Membership.find(:first, :joins => :reading, :conditions => { :readings => { :id => 2 } })
|
175
|
+
|
176
|
+
assert_equal [1, 1], @membership.id
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'abstract_unit'
|
2
|
+
require 'fixtures/kitchen_sink'
|
3
|
+
require 'fixtures/reference_type'
|
4
|
+
|
5
|
+
class TestAttributeMethods < ActiveSupport::TestCase
|
6
|
+
fixtures :kitchen_sinks, :reference_types
|
7
|
+
|
8
|
+
def test_read_attribute_with_single_key
|
9
|
+
rt = ReferenceType.find(1)
|
10
|
+
assert_equal(1, rt.reference_type_id)
|
11
|
+
assert_equal('NAME_PREFIX', rt.type_label)
|
12
|
+
assert_equal('Name Prefix', rt.abbreviation)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_read_attribute_with_composite_keys
|
16
|
+
sink = KitchenSink.find(1,2)
|
17
|
+
assert_equal(1, sink.id_1)
|
18
|
+
assert_equal(2, sink.id_2)
|
19
|
+
assert_equal(Date.today, sink.a_date.to_date)
|
20
|
+
assert_equal('string', sink.a_string)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'abstract_unit'
|
2
|
+
require 'fixtures/reference_type'
|
3
|
+
require 'fixtures/reference_code'
|
4
|
+
require 'fixtures/product'
|
5
|
+
require 'fixtures/tariff'
|
6
|
+
require 'fixtures/product_tariff'
|
7
|
+
|
8
|
+
class TestAttributes < ActiveSupport::TestCase
|
9
|
+
fixtures :reference_types, :reference_codes, :products, :tariffs, :product_tariffs
|
10
|
+
|
11
|
+
CLASSES = {
|
12
|
+
:single => {
|
13
|
+
:class => ReferenceType,
|
14
|
+
:primary_keys => :reference_type_id,
|
15
|
+
},
|
16
|
+
:dual => {
|
17
|
+
:class => ReferenceCode,
|
18
|
+
:primary_keys => [:reference_type_id, :reference_code],
|
19
|
+
},
|
20
|
+
}
|
21
|
+
|
22
|
+
def setup
|
23
|
+
self.class.classes = CLASSES
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_brackets
|
27
|
+
testing_with do
|
28
|
+
@first.attributes.each_pair do |attr_name, value|
|
29
|
+
assert_equal value, @first[attr_name]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_brackets_primary_key
|
35
|
+
testing_with do
|
36
|
+
assert_equal @first.id, @first[@primary_keys], "[] failing for #{@klass}"
|
37
|
+
assert_equal @first.id, @first[@first.class.primary_key]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_brackets_assignment
|
42
|
+
testing_with do
|
43
|
+
@first.attributes.each_pair do |attr_name, value|
|
44
|
+
@first[attr_name]= !value.nil? ? value * 2 : '1'
|
45
|
+
assert_equal !value.nil? ? value * 2 : '1', @first[attr_name]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_brackets_foreign_key_assignment
|
51
|
+
@flat = Tariff.find(1, Date.today.to_s(:db))
|
52
|
+
@second_free = ProductTariff.find(2,2,Date.today.to_s(:db))
|
53
|
+
@second_free_fk = [:tariff_id, :tariff_start_date]
|
54
|
+
|
55
|
+
@second_free[key = @second_free_fk] = @flat.id
|
56
|
+
compare_indexes('@flat', @flat.class.primary_key, '@second_free', @second_free_fk)
|
57
|
+
assert_equal @flat.id, @second_free[key]
|
58
|
+
|
59
|
+
@second_free[key = @second_free_fk.to_composite_keys] = @flat.id
|
60
|
+
assert_equal @flat.id, @second_free[key]
|
61
|
+
compare_indexes('@flat', @flat.class.primary_key, '@second_free', @second_free_fk)
|
62
|
+
|
63
|
+
@second_free[key = @second_free_fk.to_composite_keys.to_s] = @flat.id
|
64
|
+
assert_equal @flat.id, @second_free[key]
|
65
|
+
compare_indexes('@flat', @flat.class.primary_key, '@second_free', @second_free_fk)
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def compare_indexes(obj_name1, indexes1, obj_name2, indexes2)
|
71
|
+
obj1, obj2 = eval "[#{obj_name1}, #{obj_name2}]"
|
72
|
+
indexes1.length.times do |key_index|
|
73
|
+
assert_equal obj1[indexes1[key_index].to_s],
|
74
|
+
obj2[indexes2[key_index].to_s],
|
75
|
+
"#{obj_name1}[#{indexes1[key_index]}]=#{obj1[indexes1[key_index].to_s].inspect} != " +
|
76
|
+
"#{obj_name2}[#{indexes2[key_index]}]=#{obj2[indexes2[key_index].to_s].inspect}; " +
|
77
|
+
"#{obj_name2} = #{obj2.inspect}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/test/test_clone.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'abstract_unit'
|
2
|
+
require 'fixtures/reference_type'
|
3
|
+
require 'fixtures/reference_code'
|
4
|
+
|
5
|
+
class TestClone < ActiveSupport::TestCase
|
6
|
+
fixtures :reference_types, :reference_codes
|
7
|
+
|
8
|
+
CLASSES = {
|
9
|
+
:single => {
|
10
|
+
:class => ReferenceType,
|
11
|
+
:primary_keys => :reference_type_id,
|
12
|
+
},
|
13
|
+
:dual => {
|
14
|
+
:class => ReferenceCode,
|
15
|
+
:primary_keys => [:reference_type_id, :reference_code],
|
16
|
+
},
|
17
|
+
}
|
18
|
+
|
19
|
+
def setup
|
20
|
+
self.class.classes = CLASSES
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_truth
|
24
|
+
testing_with do
|
25
|
+
clone = @first.clone
|
26
|
+
assert_equal @first.attributes.block(@klass.primary_key), clone.attributes
|
27
|
+
if composite?
|
28
|
+
@klass.primary_key.each {|key| assert_nil clone[key], "Primary key '#{key}' should be nil"}
|
29
|
+
else
|
30
|
+
assert_nil clone[@klass.primary_key], "Sole primary key should be nil"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|