composite_primary_keys 5.0.6 → 5.0.8

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.
@@ -1,3 +1,18 @@
1
+ == 5.0.8 2012-07-01
2
+ * Enabled tests for MS SQL Server (Enderson Maia)
3
+ * Update establish_connection to work with Rails 3.2.6 (Ivan Schneider)
4
+ * Fix typos in rake tasks names in README_tests.rdoc (Ivan Schneider)
5
+ * Fix problem with deleting non-CPK in Rails 3.2.5 (Sammy Larbi)
6
+ * Fixes relationship deletion for HABTM in Rails when it passes :all flag instead of
7
+ an array of IDs. Also adds new tests and test fixtures (Sammy Larbi)
8
+ * Change mysql db creation to execute one statement each time, since in some setups
9
+ it will not run multiple statements (Sammy Larbi)
10
+ * Fix multiple assignments to same column due to duplicate keys in @changed_attributes.
11
+ Includes test fixes (Jan Vlnas)
12
+
13
+ == 5.0.7 2012-06-03
14
+ * Fixed bug where validates_uniqueness failed for 3 or more primary keys. (Charlie Savage)
15
+
1
16
  == 5.0.6 2012-05-20
2
17
  * Fixed bug where setting a belongs_to association to nil would raise an error (Tyler Rick)
3
18
  * Remove special case code for 1 column selects and just choose to use Rails version of the
data/Rakefile CHANGED
@@ -20,7 +20,7 @@ Dir.glob('tasks/**/*.rake').each do |rake_file|
20
20
  end
21
21
 
22
22
  # Set up test tasks for each supported connection adapter
23
- %w(mysql sqlite3 oracle oracle_enhanced postgresql ibm_db).each do |adapter|
23
+ %w(mysql sqlite3 oracle oracle_enhanced postgresql ibm_db sqlserver).each do |adapter|
24
24
  namespace adapter do
25
25
  desc "Run tests using the #{adapter} adapter"
26
26
  task "test" do
@@ -48,7 +48,7 @@ module ActiveRecord
48
48
  #).compile_delete
49
49
 
50
50
  predicate1 = cpk_id_predicate(relation, Array(reflection.foreign_key), Array(owner.id))
51
- predicate2 = cpk_in_predicate(relation, Array(reflection.association_foreign_key), records.map { |x| x.id })
51
+ predicate2 = cpk_in_predicate(relation, Array(reflection.association_foreign_key), records.map { |x| x.id }) unless records == :all
52
52
  stmt = relation.where(predicate1.and(predicate2)).compile_delete
53
53
 
54
54
  owner.connection.delete stmt.to_sql
@@ -8,6 +8,8 @@ module ActiveRecord
8
8
  # We will come back in here with an *individual* attribute when Write#write_attribute looks through the individual attributes comprising this composite key:
9
9
  # [attr_name, value].transpose.map {|name,val| write_attribute(name, val)}
10
10
  else
11
+ attr = attr.to_s
12
+
11
13
  # The attribute already has an unsaved change.
12
14
  if attribute_changed?(attr)
13
15
  old = @changed_attributes[attr]
@@ -5,41 +5,20 @@ module ActiveRecord
5
5
  require "composite_primary_keys/connection_adapters/#{adapter}_adapter.rb"
6
6
  end
7
7
  end
8
-
9
- def self.establish_connection(spec = nil)
10
- case spec
11
- when nil
12
- raise AdapterNotSpecified unless defined?(Rails.env)
13
- establish_connection(Rails.env)
14
- when ConnectionSpecification
15
- self.connection_handler.establish_connection(name, spec)
16
- when Symbol, String
17
- if configuration = configurations[spec.to_s]
18
- establish_connection(configuration)
19
- else
20
- raise AdapterNotSpecified, "#{spec} database is not configured"
21
- end
22
- else
23
- spec = spec.symbolize_keys
24
- unless spec.key?(:adapter) then raise AdapterNotSpecified, "database configuration does not specify adapter" end
25
-
26
- begin
27
- require "active_record/connection_adapters/#{spec[:adapter]}_adapter"
28
- rescue LoadError => e
29
- raise "Please install the #{spec[:adapter]} adapter: `gem install activerecord-#{spec[:adapter]}-adapter` (#{e})"
30
- end
31
-
32
- # CPK
33
- load_cpk_adapter(spec[:adapter])
34
-
35
- adapter_method = "#{spec[:adapter]}_connection"
36
- unless respond_to?(adapter_method)
37
- raise AdapterNotFound, "database configuration specifies nonexistent #{spec[:adapter]} adapter"
38
- end
39
-
40
- remove_connection
41
- establish_connection(ConnectionSpecification.new(spec, adapter_method))
8
+
9
+ def self.establish_connection(spec = ENV["DATABASE_URL"])
10
+ resolver = ConnectionSpecification::Resolver.new spec, configurations
11
+ spec = resolver.spec
12
+
13
+ # CPK
14
+ load_cpk_adapter(spec.config[:adapter])
15
+
16
+ unless respond_to?(spec.adapter_method)
17
+ raise AdapterNotFound, "database configuration specifies nonexistent #{spec.config[:adapter]} adapter"
42
18
  end
19
+
20
+ remove_connection
21
+ connection_handler.establish_connection name, spec
43
22
  end
44
23
 
45
24
  class << self
@@ -21,7 +21,7 @@ module ActiveRecord
21
21
 
22
22
  condition = not_eq_conditions.shift
23
23
  not_eq_conditions.each do |not_eq_condition|
24
- condition = condition.or(not_eq_conditions)
24
+ condition = condition.or(not_eq_condition)
25
25
  end
26
26
  relation = relation.and(condition)
27
27
  end
@@ -2,7 +2,7 @@ module CompositePrimaryKeys
2
2
  module VERSION
3
3
  MAJOR = 5
4
4
  MINOR = 0
5
- TINY = 6
5
+ TINY = 8
6
6
  STRING = [MAJOR, MINOR, TINY].join('.')
7
7
  end
8
8
  end
@@ -22,7 +22,9 @@ namespace :mysql do
22
22
  Rake::Task['mysql:load_connection'].reenable
23
23
  Rake::Task['mysql:load_connection'].invoke
24
24
  #puts %(ActiveRecord::Base.connection.instance_variable_get(:@config)=#{(ActiveRecord::Base.connection.instance_variable_get(:@config)).inspect})
25
- ActiveRecord::Base.connection.execute(sql)
25
+ sql.split(";").each do |statement|
26
+ ActiveRecord::Base.connection.execute(statement) unless statement.strip.length == 0
27
+ end
26
28
  end
27
29
 
28
30
  desc 'Drop the MySQL test database'
@@ -0,0 +1,27 @@
1
+ require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
2
+ require File.join(PROJECT_ROOT, 'test', 'connections', 'connection_spec')
3
+
4
+ namespace :sqlserver do
5
+ desc 'Build the SQL Server test database'
6
+ task :build_database => :load_connection do
7
+ options_str = connection_string
8
+
9
+ schema = File.join(PROJECT_ROOT, 'test', 'fixtures', 'db_definitions', 'sqlserver.sql')
10
+ sh %( sqsh #{options_str} -i #{schema} )
11
+ end
12
+
13
+ desc 'Drop the SQL Server test database'
14
+ task :drop_database => :load_connection do
15
+ options_str = connection_string
16
+
17
+ schema = File.join(PROJECT_ROOT, 'test', 'fixtures', 'db_definitions', 'sqlserver.drop.sql')
18
+ sh %( sqsh #{options_str} -i #{schema} )
19
+ end
20
+
21
+ desc 'Rebuild the SQL Server test database'
22
+ task :rebuild_database => [:drop_database, :build_database]
23
+
24
+ task :load_connection do
25
+ require File.join(PROJECT_ROOT, "test", "connections", "native_sqlserver", "connection")
26
+ end
27
+ end
@@ -28,12 +28,12 @@ To run the tests for one of the adapters follow these steps (using mysql in the
28
28
 
29
29
  * rake -T mysql
30
30
 
31
- rake mysql:build_databases # Build the MySQL test databases
32
- rake mysql:drop_databases # Drop the MySQL test databases
33
- rake mysql:rebuild_databases # Rebuild the MySQL test databases
31
+ rake mysql:build_database # Build the MySQL test databases
32
+ rake mysql:drop_database # Drop the MySQL test databases
33
+ rake mysql:rebuild_database # Rebuild the MySQL test databases
34
34
  rake mysql:test # Run tests using the mysql adapter
35
35
 
36
- * rake mysql:build_databases
36
+ * rake mysql:build_database
37
37
  * rake mysql:test
38
38
 
39
39
  == Running tests individually
@@ -0,0 +1,11 @@
1
+ print "Using native SQL Server\n"
2
+
3
+ require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
4
+
5
+ def connection_string
6
+ "-S #{SPEC['host']} -U #{SPEC['username']} -P\"#{SPEC['password']}\""
7
+ end
8
+
9
+ # Adapter config setup in locals/database_connections.rb
10
+ SPEC = CompositePrimaryKeys::ConnectionSpec['sqlserver']
11
+ ActiveRecord::Base.establish_connection(SPEC)
@@ -184,3 +184,7 @@ create table products_restaurants (
184
184
  store_id int not null
185
185
  );
186
186
 
187
+ create table employees_groups (
188
+ employee_id int not null,
189
+ group_id int not null
190
+ );
@@ -199,3 +199,9 @@ create table products_restaurants (
199
199
  franchise_id number(11) not null,
200
200
  store_id number(11) not null
201
201
  );
202
+
203
+ create table employees_groups (
204
+ employee_id int not null,
205
+ group_id int not null
206
+ );
207
+
@@ -182,4 +182,9 @@ create table products_restaurants (
182
182
  product_id int not null,
183
183
  franchise_id int not null,
184
184
  store_id int not null
185
- );
185
+ );
186
+
187
+ create table employees_groups (
188
+ employee_id int not null,
189
+ group_id int not null
190
+ );
@@ -169,3 +169,9 @@ create table products_restaurants (
169
169
  franchise_id integer not null,
170
170
  store_id integer not null
171
171
  );
172
+
173
+ create table employees_groups (
174
+ employee_id integer not null,
175
+ group_id integer not null
176
+ );
177
+
@@ -0,0 +1,86 @@
1
+ USE [composite_primary_keys_unittest];
2
+ go
3
+
4
+ DROP TABLE reference_types;
5
+ go
6
+
7
+ DROP TABLE reference_codes;
8
+ go
9
+
10
+ DROP TABLE products;
11
+ go
12
+
13
+ DROP TABLE tariffs;
14
+ go
15
+
16
+ DROP TABLE product_tariffs;
17
+ go
18
+
19
+ DROP TABLE suburbs;
20
+ go
21
+
22
+ DROP TABLE streets;
23
+ go
24
+
25
+ DROP TABLE users;
26
+ go
27
+
28
+ DROP TABLE articles;
29
+ go
30
+
31
+ DROP TABLE readings;
32
+ go
33
+
34
+ DROP TABLE groups;
35
+ go
36
+
37
+ DROP TABLE memberships;
38
+ go
39
+
40
+ DROP TABLE membership_statuses;
41
+ go
42
+
43
+ DROP TABLE departments;
44
+ go
45
+
46
+ DROP TABLE employees;
47
+ go
48
+
49
+ DROP TABLE comments;
50
+ go
51
+
52
+ DROP TABLE hacks;
53
+ go
54
+
55
+ DROP TABLE restaurants;
56
+ go
57
+
58
+ DROP TABLE restaurants_suburbs;
59
+ go
60
+
61
+ DROP TABLE dorms;
62
+ go
63
+
64
+ DROP TABLE rooms;
65
+ go
66
+
67
+ DROP TABLE room_attributes;
68
+ go
69
+
70
+ DROP TABLE room_attribute_assignments;
71
+ go
72
+
73
+ DROP TABLE students;
74
+ go
75
+
76
+ DROP TABLE room_assignments;
77
+ go
78
+
79
+ DROP TABLE seats;
80
+ go
81
+
82
+ DROP TABLE capitols;
83
+ go
84
+
85
+ DROP TABLE products_restaurants;
86
+ go
@@ -0,0 +1,210 @@
1
+ USE [composite_primary_keys_unittest];
2
+ go
3
+
4
+ CREATE TABLE reference_types (
5
+ reference_type_id [int] IDENTITY(1000,1) NOT NULL,
6
+ type_label [varchar](50) NULL,
7
+ abbreviation [varchar](50) NULL,
8
+ description [varchar](50) NULL
9
+ );
10
+ go
11
+
12
+ CREATE TABLE reference_codes (
13
+ reference_type_id [int],
14
+ reference_code [int],
15
+ code_label [varchar](50) NULL,
16
+ abbreviation [varchar](50) NULL,
17
+ description [varchar](50) NULL
18
+ );
19
+ go
20
+
21
+ CREATE TABLE products (
22
+ id [int] IDENTITY(1000,1) NOT NULL,
23
+ name [varchar](50) NULL
24
+ );
25
+ go
26
+
27
+ CREATE TABLE tariffs (
28
+ [tariff_id] [int],
29
+ [start_date] [date],
30
+ [amount] [int] NULL
31
+ CONSTRAINT [tariffs_pk] PRIMARY KEY
32
+ ( [tariff_id], [start_date] )
33
+ );
34
+ go
35
+
36
+ CREATE TABLE product_tariffs (
37
+ [product_id] [int],
38
+ [tariff_id] [int],
39
+ [tariff_start_date] [date]
40
+ CONSTRAINT [product_tariffs_pk] PRIMARY KEY
41
+ ( [product_id], [tariff_id], [tariff_start_date] )
42
+ );
43
+ go
44
+
45
+ CREATE TABLE suburbs (
46
+ city_id [int],
47
+ suburb_id [int],
48
+ name varchar(50) not null,
49
+ CONSTRAINT [suburbs_pk] PRIMARY KEY
50
+ ( [city_id], [suburb_id] )
51
+ );
52
+ go
53
+
54
+ CREATE TABLE streets (
55
+ id [int] IDENTITY(1000,1) NOT NULL,
56
+ city_id [int] NOT NULL,
57
+ suburb_id [int] NOT NULL,
58
+ name [varchar](50) NOT NULL
59
+ );
60
+ go
61
+
62
+ CREATE TABLE users (
63
+ id [int] IDENTITY(1000,1) NOT NULL,
64
+ name varchar(50) NOT NULL
65
+ );
66
+ go
67
+
68
+ CREATE TABLE articles (
69
+ id [int] IDENTITY(1000,1) NOT NULL,
70
+ name varchar(50) NOT NULL
71
+ );
72
+ go
73
+
74
+ CREATE TABLE readings (
75
+ id [int] PRIMARY KEY,
76
+ user_id [int] NOT NULL,
77
+ article_id [int] NOT NULL,
78
+ rating [int] NOT NULL
79
+ );
80
+ go
81
+
82
+ CREATE TABLE groups (
83
+ id [int] IDENTITY(1000,1) NOT NULL,
84
+ name [varchar](50) NOT NULL
85
+ );
86
+ go
87
+
88
+ CREATE TABLE memberships (
89
+ user_id [int] NOT NULL,
90
+ group_id [int] NOT NULL
91
+ CONSTRAINT [memberships_pk] PRIMARY KEY
92
+ ( [user_id], [group_id] )
93
+ );
94
+ go
95
+
96
+ CREATE TABLE membership_statuses (
97
+ id [int] IDENTITY(1,1) NOT NULL,
98
+ user_id [int] not null,
99
+ group_id [int] not null,
100
+ status varchar(50) not null
101
+ );
102
+ go
103
+
104
+ CREATE TABLE departments (
105
+ department_id [int] NOT NULL,
106
+ location_id [int] NOT NULL
107
+ CONSTRAINT [departments_pk] PRIMARY KEY
108
+ ( [department_id], [location_id] )
109
+ );
110
+ go
111
+
112
+ CREATE TABLE employees (
113
+ id [int] IDENTITY(1000,1) NOT NULL,
114
+ department_id [int] NULL,
115
+ location_id [int] NULL
116
+ );
117
+ go
118
+
119
+ CREATE TABLE comments (
120
+ id [int] IDENTITY(1000,1) PRIMARY KEY NOT NULL,
121
+ person_id [int] NULL,
122
+ person_type varchar(100) NULL,
123
+ hack_id [int] NULL
124
+ );
125
+ go
126
+
127
+ CREATE TABLE hacks (
128
+ id [int] IDENTITY(1000,1) PRIMARY KEY NOT NULL,
129
+ name [varchar](50) NOT NULL
130
+ );
131
+ go
132
+
133
+ CREATE TABLE restaurants (
134
+ franchise_id [int] NOT NULL,
135
+ store_id [int] NOT NULL,
136
+ name [varchar](100)
137
+ CONSTRAINT [restaurants_pk] PRIMARY KEY CLUSTERED
138
+ ( [franchise_id], [store_id] )
139
+ );
140
+ go
141
+
142
+ CREATE TABLE restaurants_suburbs (
143
+ franchise_id [int] NOT NULL,
144
+ store_id [int] NOT NULL,
145
+ city_id [int] NOT NULL,
146
+ suburb_id [int] NOT NULL
147
+ );
148
+ go
149
+
150
+ CREATE TABLE dorms (
151
+ id [int] IDENTITY(1000,1) PRIMARY KEY NOT NULL
152
+ );
153
+ go
154
+
155
+ CREATE TABLE rooms (
156
+ dorm_id [int] NOT NULL,
157
+ room_id [int] NOT NULL,
158
+ CONSTRAINT [rooms_pk] PRIMARY KEY CLUSTERED
159
+ ( [dorm_id], [room_id] )
160
+ );
161
+ go
162
+
163
+ CREATE TABLE room_attributes (
164
+ id [int] IDENTITY(1000,1) PRIMARY KEY NOT NULL,
165
+ name [varchar](50)
166
+ );
167
+ go
168
+
169
+ CREATE TABLE room_attribute_assignments (
170
+ dorm_id [int] NOT NULL,
171
+ room_id [int] NOT NULL,
172
+ room_attribute_id [int] NOT NULL
173
+ );
174
+ go
175
+
176
+ CREATE TABLE students (
177
+ id [int] IDENTITY(1000,1) PRIMARY KEY NOT NULL
178
+ );
179
+ go
180
+
181
+ CREATE TABLE room_assignments (
182
+ student_id [int] NOT NULL,
183
+ dorm_id [int] NOT NULL,
184
+ room_id [int] NOT NULL
185
+ );
186
+ go
187
+
188
+ CREATE TABLE seats (
189
+ flight_number [int] NOT NULL,
190
+ seat [int] NOT NULL,
191
+ customer [int]
192
+ CONSTRAINT [seats_pk] PRIMARY KEY
193
+ ( [flight_number], [seat] )
194
+ );
195
+ go
196
+
197
+ CREATE TABLE capitols (
198
+ country varchar(450) NOT NULL,
199
+ city varchar(450) NOT NULL
200
+ CONSTRAINT [capitols_pk] PRIMARY KEY
201
+ ( [country], [city] )
202
+ );
203
+ go
204
+
205
+ CREATE TABLE products_restaurants (
206
+ product_id [int] NOT NULL,
207
+ franchise_id [int] NOT NULL,
208
+ store_id [int] NOT NULL
209
+ );
210
+ go
@@ -1,2 +1,5 @@
1
1
  branner:
2
- id: 1
2
+ id: 1
3
+
4
+ toyon:
5
+ id: 2
@@ -1,4 +1,5 @@
1
1
  class Employee < ActiveRecord::Base
2
2
  belongs_to :department, :foreign_key => [:department_id, :location_id]
3
3
  has_many :comments, :as => :person
4
+ has_and_belongs_to_many :groups
4
5
  end
@@ -0,0 +1,15 @@
1
+ assn1:
2
+ employee_id: 1
3
+ group_id: 1
4
+
5
+ assn2:
6
+ employee_id: 1
7
+ group_id: 2
8
+
9
+ assn3:
10
+ employee_id: 2
11
+ group_id: 1
12
+
13
+ assn4:
14
+ employee_id: 2
15
+ group_id: 2
@@ -1,3 +1,7 @@
1
1
  cpk:
2
2
  id: 1
3
- name: Composite Primary Keys
3
+ name: Composite Primary Keys
4
+
5
+ group2:
6
+ id: 2
7
+ name: Grupo Dos
@@ -6,6 +6,6 @@ class Room < ActiveRecord::Base
6
6
  has_many :room_attributes, :through => :room_attribute_assignments
7
7
 
8
8
  def find_custom_room_attributes
9
- room_attributes.find(:all, :conditions => ["room_attributes.name != ?", "keg"])
9
+ room_attributes.find(:all, :conditions => ["room_attributes.name != ?", "type"])
10
10
  end
11
11
  end
@@ -2,6 +2,7 @@ class RoomAssignment < ActiveRecord::Base
2
2
  self.primary_keys = :student_id, :dorm_id, :room_id
3
3
  belongs_to :student
4
4
  belongs_to :room, :foreign_key => [:dorm_id, :room_id], :primary_key => [:dorm_id, :room_id]
5
+ validates_uniqueness_of :student_id
5
6
 
6
7
  before_destroy do |record|
7
8
  puts record
@@ -1,4 +1,4 @@
1
1
  assignment:
2
2
  dorm_id: 1
3
3
  room_id: 1
4
- room_attribute_id: 1
4
+ room_attribute_id: 1
@@ -1,3 +1,3 @@
1
1
  attribute_1:
2
2
  id: 1
3
- name: 'keg'
3
+ name: 'type'
@@ -133,7 +133,7 @@ class TestAssociations < ActiveSupport::TestCase
133
133
  dorm = Dorm.find(:first)
134
134
  assert_equal(2, dorm.rooms.length)
135
135
  assert_equal(1, dorm.rooms.first.room_attributes.length)
136
- assert_equal('keg', dorm.rooms.first.room_attributes.first.name)
136
+ assert_equal('type', dorm.rooms.first.room_attributes.first.name)
137
137
  end
138
138
 
139
139
  def test_associations_with_conditions
@@ -167,13 +167,14 @@ class TestAssociations < ActiveSupport::TestCase
167
167
  room_assignment.room = rooms(:branner_room_2)
168
168
  # This was raising an error before:
169
169
  # TypeError: [:dorm_id, :room_id] is not a symbol
170
- assert_equal({:room_id=>[1, 2]}, room_assignment.changes)
170
+ # changes returns HashWithIndifferentAccess
171
+ assert_equal({"room_id"=>[1, 2]}, room_assignment.changes)
171
172
 
172
173
  steve = employees(:steve)
173
174
  steve.department = departments(:engineering)
174
175
  # It was returning this before:
175
176
  # {"[:department_id, :location_id]"=>[nil, [2, 1]]}
176
- assert_equal({:department_id=>[1, 2]}, steve.changes)
177
+ assert_equal({"department_id"=>[1, 2]}, steve.changes)
177
178
  end
178
179
 
179
180
  def test_composite_belongs_to__setting_to_nil
@@ -237,7 +238,7 @@ class TestAssociations < ActiveSupport::TestCase
237
238
 
238
239
  def test_has_many_through_with_conditions_when_through_association_is_composite
239
240
  room = Room.find(:first)
240
- assert_equal 0, room.room_attributes.find(:all, :conditions => ["room_attributes.name != ?", "keg"]).size
241
+ assert_equal 0, room.room_attributes.find(:all, :conditions => ["room_attributes.name != ?", "type"]).size
241
242
  end
242
243
 
243
244
  def test_has_many_through_on_custom_finder_when_through_association_is_composite_finder_when_through_association_is_not_composite
@@ -88,6 +88,14 @@ class TestDelete < ActiveSupport::TestCase
88
88
  Employee.find(head_id)
89
89
  end
90
90
  end
91
+
92
+ def test_destroy_has_and_belongs_to_many_on_non_cpk
93
+ steve = employees(:steve)
94
+ records_before = ActiveRecord::Base.connection.execute("select * from employees_groups").count
95
+ steve.destroy
96
+ records_after = ActiveRecord::Base.connection.execute("select * from employees_groups").count
97
+ assert_equal records_after, records_before - steve.groups.count
98
+ end
91
99
 
92
100
  # def test_destroy_has_many_delete_all
93
101
  # # In this case the association is a has_many composite key with
@@ -54,7 +54,12 @@ class TestFind < ActiveSupport::TestCase
54
54
  connection = ActiveRecord::Base.connection
55
55
  ref_type_quoted = "#{connection.quote_table_name('reference_codes')}.#{connection.quote_column_name('reference_type_id')}"
56
56
  ref_code_quoted = "#{connection.quote_table_name('reference_codes')}.#{connection.quote_column_name('reference_code')}"
57
- expected = "Couldn't find ReferenceCode with ID=999,999 WHERE #{ref_type_quoted} = 999 AND #{ref_code_quoted} = 999"
57
+
58
+ if current_adapter?(:SQLServerAdapter)
59
+ expected = "Couldn't find ReferenceCode with ID=999,999 WHERE #{ref_type_quoted} = N'999' AND #{ref_code_quoted} = N'999'"
60
+ else
61
+ expected = "Couldn't find ReferenceCode with ID=999,999 WHERE #{ref_type_quoted} = 999 AND #{ref_code_quoted} = 999"
62
+ end
58
63
 
59
64
  assert_equal(with_quoted_identifiers(expected),
60
65
  error.message)
@@ -50,4 +50,13 @@ class TestUpdate < ActiveSupport::TestCase
50
50
  assert_equal({:reference_type_id => 2, :reference_code => 3}, obj.ids_hash)
51
51
  assert_equal([2, 3], obj.id)
52
52
  end
53
+
54
+ def test_update_attribute
55
+ obj = ReferenceType.find(1)
56
+ obj[:abbreviation] = 'a'
57
+ obj['abbreviation'] = 'b'
58
+ assert(obj.save)
59
+ assert(obj.reload)
60
+ assert_equal('b', obj.abbreviation)
61
+ end
53
62
  end
@@ -1,13 +1,13 @@
1
1
  require File.expand_path('../abstract_unit', __FILE__)
2
2
 
3
3
  class TestValidations < ActiveSupport::TestCase
4
- fixtures :seats
4
+ fixtures :students, :dorms, :rooms, :room_assignments
5
5
 
6
6
  def test_uniqueness_validation_persisted
7
- seat = Seat.find([1,1])
8
- assert(seat.valid?)
7
+ room_assignment = RoomAssignment.find([1, 1, 1])
8
+ assert(room_assignment.valid?)
9
9
 
10
- seat.customer = 2
11
- assert(!seat.valid?)
10
+ room_assignment = RoomAssignment.new(:student_id => 1, :dorm_id => 1, :room_id => 2)
11
+ assert(!room_assignment.valid?)
12
12
  end
13
13
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: composite_primary_keys
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.6
4
+ version: 5.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-05-20 00:00:00.000000000 Z
13
+ date: 2012-07-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -78,6 +78,7 @@ files:
78
78
  - tasks/databases/oracle.rake
79
79
  - tasks/databases/postgresql.rake
80
80
  - tasks/databases/sqlite3.rake
81
+ - tasks/databases/sqlserver.rake
81
82
  - tasks/website.rake
82
83
  - test/abstract_unit.rb
83
84
  - test/connections/connection_spec.rb
@@ -89,6 +90,7 @@ files:
89
90
  - test/connections/native_oracle_enhanced/connection.rb
90
91
  - test/connections/native_postgresql/connection.rb
91
92
  - test/connections/native_sqlite3/connection.rb
93
+ - test/connections/native_sqlserver/connection.rb
92
94
  - test/db_test.rb
93
95
  - test/debug.log
94
96
  - test/fixtures/article.rb
@@ -104,12 +106,15 @@ files:
104
106
  - test/fixtures/db_definitions/oracle.sql
105
107
  - test/fixtures/db_definitions/postgresql.sql
106
108
  - test/fixtures/db_definitions/sqlite.sql
109
+ - test/fixtures/db_definitions/sqlserver.drop.sql
110
+ - test/fixtures/db_definitions/sqlserver.sql
107
111
  - test/fixtures/department.rb
108
112
  - test/fixtures/departments.yml
109
113
  - test/fixtures/dorm.rb
110
114
  - test/fixtures/dorms.yml
111
115
  - test/fixtures/employee.rb
112
116
  - test/fixtures/employees.yml
117
+ - test/fixtures/employees_groups.yml
113
118
  - test/fixtures/group.rb
114
119
  - test/fixtures/groups.yml
115
120
  - test/fixtures/hack.rb