PageRenderTime 85ms CodeModel.GetById 24ms RepoModel.GetById 7ms app.codeStats 0ms

/test/rubeus/extensions/java/sql/test_database_meta_data.rb

http://rubeus.googlecode.com/
Ruby | 257 lines | 225 code | 18 blank | 14 comment | 1 complexity | e012c6f8b8528c54bc6ecdb1d6920ae2 MD5 | raw file
  1. require 'test/unit'
  2. require 'rubygems'
  3. require 'rubeus'
  4. require 'test/rubeus/extensions/java/sql/test_sql_helper'
  5. # Test for lib/rubeus/extensions/java/sql/database_meta_data.rb
  6. class TestDatabaseMetaData < Test::Unit::TestCase
  7. include TestSqlHelper
  8. def setup
  9. setup_connection
  10. @con.statement do |stmt|
  11. drop_table_if_exist("TEST", stmt)
  12. # DDL from http://db.apache.org/derby/docs/dev/ja_JP/ref/rrefsqlj13590.html
  13. # Index from http://db.apache.org/derby/docs/dev/ja_JP/ref/rrefsqlj20937.html
  14. create_table_after_drop(<<-"EOS", stmt)
  15. CREATE TABLE FLIGHTS(
  16. FLIGHT_ID CHAR(6) NOT NULL ,
  17. SEGMENT_NUMBER INTEGER NOT NULL ,
  18. ORIG_AIRPORT CHAR(3),
  19. DEPART_TIME TIME,
  20. DEST_AIRPORT CHAR(3),
  21. ARRIVE_TIME TIME,
  22. MEAL CHAR(1) CONSTRAINT MEAL_CONSTRAINT
  23. CHECK (MEAL IN ('B', 'L', 'D', 'S')),
  24. PRIMARY KEY (FLIGHT_ID, SEGMENT_NUMBER)
  25. );
  26. CREATE TABLE FLTAVAIL(
  27. FLIGHT_ID CHAR(6) NOT NULL,
  28. SEGMENT_NUMBER INT NOT NULL,
  29. FLIGHT_DATE DATE NOT NULL,
  30. ECONOMY_SEATS_TAKEN INT,
  31. BUSINESS_SEATS_TAKEN INT,
  32. FIRSTCLASS_SEATS_TAKEN INT,
  33. CONSTRAINT FLTAVAIL_PK PRIMARY KEY (FLIGHT_ID, SEGMENT_NUMBER),
  34. CONSTRAINT FLTS_FK
  35. FOREIGN KEY (FLIGHT_ID, SEGMENT_NUMBER)
  36. REFERENCES Flights (FLIGHT_ID, SEGMENT_NUMBER)
  37. );
  38. EOS
  39. stmt.execute_update('CREATE INDEX IDX_FLIGHT_01 ON Flights(orig_airport)')
  40. stmt.execute_update('CREATE INDEX IDX_FLIGHT_02 ON Flights(orig_airport, DEPART_TIME desc)')
  41. stmt.execute_update('CREATE INDEX IDX_FLIGHT_03 ON Flights(DEST_AIRPORT, ARRIVE_TIME desc)')
  42. create_table_after_drop(<<-"EOS", stmt)
  43. CREATE TABLE CITIES(
  44. ID INT NOT NULL CONSTRAINT CITIES_PK PRIMARY KEY,
  45. CITY_NAME VARCHAR(50)
  46. );
  47. CREATE TABLE METROPOLITAN(
  48. HOTEL_ID INT NOT NULL CONSTRAINT HOTELS_PK PRIMARY KEY,
  49. HOTEL_NAME VARCHAR(40) NOT NULL,
  50. CITY_ID INT CONSTRAINT METRO_FK REFERENCES CITIES
  51. );
  52. EOS
  53. stmt.execute_update('CREATE UNIQUE INDEX IDX_CITIES_01 ON CITIES(CITY_NAME)')
  54. stmt.execute_update('CREATE UNIQUE INDEX IDX_METROPOLITAN_01 ON METROPOLITAN(CITY_ID, HOTEL_NAME)')
  55. create_table_after_drop(<<-"EOS", stmt)
  56. CREATE TABLE TEST1(
  57. ID INT NOT NULL,
  58. NAME VARCHAR(60)
  59. );
  60. EOS
  61. end
  62. end
  63. def teardown
  64. teardown_connection
  65. end
  66. def test_table_objects
  67. tables = @con.meta_data.tables(:schema => "APP", :name_case => :downcase)
  68. assert_equal 5, tables.length
  69. assert_equal ['cities', 'flights', 'fltavail', 'metropolitan', 'test1'], tables.map{|t|t.name}.sort
  70. assert_not_nil tables['flights']
  71. assert_not_nil tables['fltavail']
  72. assert_not_nil tables['cities']
  73. assert_not_nil tables['metropolitan']
  74. assert_not_nil tables['test1']
  75. rescue => e
  76. puts e.to_s
  77. puts e.backtrace.join("\n ")
  78. raise e
  79. end
  80. def assert_column(table, name, type, size, nullable)
  81. column = table.columns[name]
  82. assert_not_nil column, "column '#{name}' not found"
  83. assert_equal(java.sql.Types.const_get(type.to_s.upcase), column.data_type,
  84. "column '#{name}' type expected #{java.sql.Types.const_get(type.to_s.upcase).inspect} but #{column.data_type.inspect}")
  85. assert_equal(size, column.size,
  86. "column '#{name}' size expected #{size.inspect} but #{column.size.inspect}")
  87. assert_equal(nullable, column.nullable?,
  88. "column '#{name}' nullable expected #{nullable.inspect} but #{column.nullable?.inspect}")
  89. assert_equal(nullable ?
  90. java.sql.DatabaseMetaData.columnNullable :
  91. java.sql.DatabaseMetaData.columnNoNulls, column.nullable)
  92. assert_equal column, table[name]
  93. end
  94. def test_table_object_columns
  95. tables = @con.meta_data.tables(:schema => "APP", :name_case => :downcase)
  96. #
  97. assert_not_nil flights = tables['flights']
  98. assert_equal 7, flights.columns.length
  99. assert_column(flights, 'flight_id', :char, 6, false)
  100. assert_column(flights, 'segment_number', :integer, 10, false)
  101. assert_column(flights, 'orig_airport', :char, 3, true)
  102. assert_column(flights, 'depart_time', :time, 8, true)
  103. assert_column(flights, 'dest_airport', :char, 3, true)
  104. assert_column(flights, 'arrive_time', :time, 8, true)
  105. assert_column(flights, 'meal', :char, 1, true)
  106. #
  107. assert_not_nil fltavail = tables['fltavail']
  108. assert_equal 6, fltavail.columns.length
  109. assert_column(fltavail, 'flight_id', :char, 6, false)
  110. assert_column(fltavail, 'segment_number', :integer, 10, false)
  111. assert_column(fltavail, 'flight_date', :date, 10, false)
  112. assert_column(fltavail, 'economy_seats_taken', :integer, 10, true)
  113. assert_column(fltavail, 'business_seats_taken', :integer, 10, true)
  114. assert_column(fltavail, 'firstclass_seats_taken', :integer, 10, true)
  115. #
  116. assert_not_nil ctiies = tables['cities']
  117. assert_equal 2, ctiies.columns.length
  118. assert_column(ctiies, 'id', :integer, 10, false)
  119. assert_column(ctiies, 'city_name', :varchar, 50, true)
  120. #
  121. assert_not_nil metropolitan = tables['metropolitan']
  122. assert_equal 3, metropolitan.columns.length
  123. assert_column(metropolitan, 'hotel_id', :integer, 10, false)
  124. assert_column(metropolitan, 'hotel_name', :varchar, 40, false)
  125. assert_column(metropolitan, 'city_id', :integer, 10, true)
  126. #
  127. assert_not_nil test1 = tables['test1']
  128. assert_equal 2, test1.columns.length
  129. assert_column(test1, 'id', :integer, 10, false)
  130. assert_column(test1, 'name', :varchar, 60, true)
  131. rescue => e
  132. puts e.to_s
  133. puts e.backtrace.join("\n ")
  134. raise e
  135. end
  136. def assert_pk(table, names)
  137. assert_equal names.length, table.primary_keys.length
  138. assert_equal names, table.pks.map{|k| k.name}
  139. assert_equal names, table.primary_keys.map{|k| k.name}
  140. assert_equal names, table.pk_names
  141. assert_equal names, table.primary_key_names
  142. names.each_with_index do |name, index|
  143. assert_equal name, table.primary_keys[name].name
  144. assert_equal index + 1, table.primary_keys[name].seq
  145. assert_equal table.columns[name], table.primary_key_columns[name]
  146. assert_equal table.columns[name], table.pk_columns[name]
  147. end
  148. case names.length
  149. when 0
  150. assert_equal nil, table.pk
  151. assert_equal nil, table.primary_key
  152. assert_equal nil, table.pk_name
  153. assert_equal nil, table.primary_key_name
  154. assert_equal nil, table.pk_column
  155. assert_equal nil, table.primary_key_column
  156. when 1
  157. assert_equal table.pks.first, table.pk
  158. assert_equal table.pks.first, table.primary_key
  159. assert_equal table.pk_names.first, table.pk_name
  160. assert_equal table.pk_names.first, table.primary_key_name
  161. assert_equal table.pk_columns.first, table.pk_column
  162. assert_equal table.pk_columns.first, table.primary_key_column
  163. else
  164. assert_equal table.pks, table.pk
  165. assert_equal table.pks, table.primary_key
  166. assert_equal table.pk_names, table.pk_name
  167. assert_equal table.pk_names, table.primary_key_name
  168. assert_equal table.pk_columns, table.pk_column
  169. assert_equal table.pk_columns, table.primary_key_column
  170. end
  171. table.columns.each do |column|
  172. if table.pk_names.include?(column.name)
  173. assert_equal true, column.primary_key?, "#{table.name}.#{column.name} shoud be one of pk"
  174. assert_equal true, column.pk?, "#{table.name}.#{column.name} shoud be one of pk"
  175. else
  176. assert_equal false, column.primary_key?, "#{table.name}.#{column.name} shoud not be one of pk"
  177. assert_equal false, column.pk?, "#{table.name}.#{column.name} shoud not be one of pk"
  178. end
  179. end
  180. end
  181. def test_table_objects_pk
  182. tables = @con.meta_data.tables(:schema => "APP", :name_case => :downcase)
  183. assert_pk(tables['flights'], %w(flight_id segment_number))
  184. assert_pk(tables['fltavail'], %w(flight_id segment_number))
  185. assert_pk(tables['cities'], %w(id))
  186. assert_pk(tables['metropolitan'], %w(hotel_id))
  187. assert_pk(tables['test1'], [])
  188. end
  189. def assert_index(table, index_name, key_names, asc_descs)
  190. assert_equal key_names, table.indexes[index_name].keys.map{|k| k.name}
  191. assert_equal asc_descs, table.indexes[index_name].keys.map{|k| k.asc?}
  192. end
  193. def test_table_objects_index
  194. tables = @con.meta_data.tables(:schema => "APP", :name_case => :downcase)
  195. # assert_equal %w(idx_flight_01 idx_flight_02 idx_flight_03), tables['flights'].indexes.map{|idx| idx.name}
  196. # assert_equal 3, tables['flights'].indexes.length
  197. assert_index(tables['flights'], 'idx_flight_01', %w(orig_airport), [true])
  198. assert_index(tables['flights'], 'idx_flight_02', %w(orig_airport depart_time), [true, false])
  199. assert_index(tables['flights'], 'idx_flight_03', %w(dest_airport arrive_time), [true, false])
  200. # assert_equal 0, tables['fltavail'].indexes.length
  201. # assert_equal 1, tables['cities'].indexes.length
  202. assert_index(tables['cities'], 'idx_cities_01', %w(city_name), [true])
  203. # assert_equal 1, tables['metropolitan'].indexes.length
  204. assert_index(tables['metropolitan'], 'idx_metropolitan_01', %w(city_id hotel_name), [true, true])
  205. # assert_equal 0, tables['test1'].indexes.length
  206. end
  207. def assert_fk(fk_name, pktable, pkcolumn_names, fktable, fkcolumn_names)
  208. imported_key = fktable.imported_keys[fk_name]
  209. exported_key = pktable.exported_keys[fk_name]
  210. assert_equal fk_name, imported_key.name
  211. assert_equal fk_name, exported_key.name
  212. assert_equal pktable.name, imported_key.pktable.name
  213. assert_equal fktable.name, imported_key.fktable.name
  214. assert_equal pktable.name, exported_key.pktable.name
  215. assert_equal fktable.name, exported_key.fktable.name
  216. assert_equal pkcolumn_names.length, imported_key.length
  217. assert_equal fkcolumn_names.length, exported_key.length
  218. assert_equal imported_key.length, exported_key.length
  219. pkcolumn_names.each_with_index do |column_name, index|
  220. [imported_key, exported_key].each do |key|
  221. assert_equal pkcolumn_names[index], key.pkcolumn_names[index]
  222. assert_equal pkcolumn_names[index], key.pkcolumns[index].name
  223. assert_equal pktable, key.pkcolumns[index].table
  224. assert_equal fkcolumn_names[index], key.fkcolumn_names[index]
  225. assert_equal fkcolumn_names[index], key.fkcolumns[index].name
  226. assert_equal fktable, key.fkcolumns[index].table
  227. end
  228. end
  229. end
  230. def test_table_objects_imported_keys_and_exported_keys
  231. tables = @con.meta_data.tables(:schema => "APP", :name_case => :downcase)
  232. assert_fk('flts_fk',
  233. tables['flights'], %w(flight_id segment_number),
  234. tables['fltavail'], %w(flight_id segment_number))
  235. assert_fk('metro_fk',
  236. tables['cities'], %w(id),
  237. tables['metropolitan'], %w(city_id))
  238. end
  239. end