/tst/org/diffkit/diff/sns/tst/TestDBSource.groovy

http://diffkit.googlecode.com/ · Groovy · 175 lines · 130 code · 26 blank · 19 comment · 6 complexity · 80430e103911f0e94bade2665563c295 MD5 · raw file

  1. /**
  2. * Copyright 2010-2011 Joseph Panico
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.diffkit.diff.sns.tst
  17. import java.io.File;
  18. import org.diffkit.db.DKDBColumn
  19. import org.diffkit.db.DKDBConnectionInfo
  20. import org.diffkit.db.DKDatabase
  21. import org.diffkit.db.DKDBFlavor;
  22. import org.diffkit.db.DKDBPrimaryKey;
  23. import org.diffkit.db.DKDBTable
  24. import org.diffkit.db.DKDBH2Loader
  25. import org.diffkit.db.DKDBTableDataAccess;
  26. import org.diffkit.diff.engine.DKColumnModel;
  27. import org.diffkit.diff.engine.DKTableModel;
  28. import org.diffkit.diff.sns.DKDBSource
  29. import org.diffkit.diff.sns.DKTableModelUtil;
  30. import org.diffkit.util.DKResourceUtil
  31. import org.diffkit.util.DKTimeUtil;
  32. import groovy.util.GroovyTestCase;
  33. /**
  34. * @author jpanico
  35. */
  36. public class TestDBSource extends GroovyTestCase {
  37. public void testValidateKeyColumnNames() {
  38. DKDBConnectionInfo connectionInfo = ['test', DKDBFlavor.H2,"mem:test", null, null, 'test', 'test']
  39. println "connectionInfo->$connectionInfo"
  40. DKDatabase database = [connectionInfo]
  41. def connection = database.connection
  42. def dbTable = this.createCustomerMetaTable()
  43. assert database.createTable( dbTable)
  44. shouldFail(RuntimeException) {
  45. DKDBSource source = new DKDBSource(dbTable.tableName, null, database, null, (String[])['maiden_name'], null)
  46. }
  47. assert database.dropTable( dbTable)
  48. }
  49. public void testDescription() {
  50. DKDBConnectionInfo connectionInfo = ['test', DKDBFlavor.H2,"mem:test", null, null, 'test', 'test']
  51. println "connectionInfo->$connectionInfo"
  52. DKDatabase database = [connectionInfo]
  53. def connection = database.connection
  54. def dbTable = this.createCustomerMetaTable()
  55. assert database.createTable( dbTable)
  56. DKDBSource source = new DKDBSource(dbTable.tableName, null, database, null, (String[])['first_name'], null)
  57. println "source->$source"
  58. assert source.description == 'DKDBSource[tableName=CUSTOMER, whereClause=null, keyColumnNames=[first_name], database=DKDBConnectionInfo[test(flavor=H2,database=mem:test,host=null,port=null)]]'
  59. assert database.dropTable( dbTable)
  60. }
  61. public void testToString() {
  62. DKDBConnectionInfo connectionInfo = ['test', DKDBFlavor.H2,"mem:test", null, null, 'test', 'test']
  63. println "connectionInfo->$connectionInfo"
  64. DKDatabase database = [connectionInfo]
  65. def connection = database.connection
  66. def dbTable = this.createCustomerMetaTable()
  67. assert database.createTable( dbTable)
  68. DKDBSource source = new DKDBSource(dbTable.tableName, null, database, null, (String[])['first_name'], null)
  69. println "source->$source"
  70. assert source.toString().startsWith( 'DKDBSource')
  71. assert source.toString().endsWith( '[CUSTOMER,jdbc:h2:mem:test]')
  72. assert database.dropTable( dbTable)
  73. }
  74. public void testKeyColumnNames() {
  75. DKDBConnectionInfo connectionInfo = ['test', DKDBFlavor.H2,"mem:test", null, null, 'test', 'test']
  76. println "connectionInfo->$connectionInfo"
  77. DKDatabase database = [connectionInfo]
  78. def connection = database.connection
  79. def dbTable = this.createCustomerMetaTable()
  80. assert database.createTable( dbTable)
  81. DKDBSource source = new DKDBSource(dbTable.tableName, null, database, null, (String[])['first_name'], null)
  82. def model = source.model
  83. assert model
  84. assert model.key == [0]
  85. assert database.dropTable( dbTable)
  86. }
  87. public void testRead(){
  88. DKDBConnectionInfo connectionInfo = ['test', DKDBFlavor.H2,"mem:test", null, null, 'test', 'test']
  89. println "connectionInfo->$connectionInfo"
  90. DKDatabase database = [connectionInfo]
  91. def connection = database.connection
  92. def dbTable = this.createCustomerMetaTable()
  93. assert database.createTable( dbTable)
  94. DKDBH2Loader loader = [database]
  95. def DKDBTableDataAccess tableDataAccess = [database]
  96. def fetchedTable = tableDataAccess.getTable(dbTable.tableName)
  97. def csvFile = this.getCsvFile()
  98. assert loader.load(dbTable, csvFile)
  99. def tableModel = DKTableModelUtil.createDefaultTableModel(database.flavor,dbTable, null)
  100. assert tableModel
  101. // goof up the model to force a fail
  102. def columns = tableModel.columns
  103. columns[0]= new DKColumnModel(0, 'does_not_exist', DKColumnModel.Type.STRING)
  104. tableModel = new DKTableModel(tableModel.name, columns, tableModel.key)
  105. shouldFail(IllegalArgumentException){
  106. DKDBSource source = new DKDBSource(dbTable.tableName, null, database, tableModel, null, null)
  107. }
  108. tableModel = DKTableModelUtil.createDefaultTableModel(database.flavor,dbTable, null)
  109. DKDBSource source = new DKDBSource(dbTable.tableName, null, database, tableModel, null, null)
  110. source.open(null)
  111. def row = source.nextRow
  112. assert row
  113. println "row->$row"
  114. println "row[6]->${row[6].class}"
  115. assert row[6] == DKTimeUtil.createDate(1956, 11, 12)
  116. assert row[7] == DKTimeUtil.createDate(2004, 4, 23, 14, 25, 10, 487)
  117. assert row == (Object[])['rob','smith', '100 spruce st', 'Phila', 'usa', 50, DKTimeUtil.createDate(1956, 11, 12), DKTimeUtil.createDate(2004, 4, 23, 14, 25, 10, 487)]
  118. row = source.nextRow
  119. assert row == (Object[])['steve','jobs', 'infinite, loop', 'Cupertino', 'usa', 54, DKTimeUtil.createDate(1955, 0, 1), DKTimeUtil.createDate(2004, 4, 23, 14, 25, 10, 487)]
  120. row = source.nextRow
  121. assert !row
  122. row = source.nextRow
  123. assert !row
  124. source.close(null)
  125. shouldFail() { row = source.nextRow }
  126. assert database.dropTable( dbTable)
  127. }
  128. private File getCsvFile(){
  129. def csvFile = DKResourceUtil.findResourceAsFile('org/diffkit/db/tst/customers.csv')
  130. println "csvFile->$csvFile"
  131. assert csvFile
  132. return csvFile
  133. }
  134. private DKDBTable createCustomerMetaTable(){
  135. DKDBColumn column1 = ['FIRST_NAME', 1, 'VARCHAR', 50, true]
  136. DKDBColumn column2 = ['LAST_NAME', 2, 'VARCHAR', 50, true]
  137. DKDBColumn column3 = ['ADDRESS', 3, 'VARCHAR', 50, true]
  138. DKDBColumn column4 = ['CITY', 4, 'VARCHAR', 50, true]
  139. DKDBColumn column5 = ['COUNTRY', 5, 'VARCHAR', 25, true]
  140. DKDBColumn column6 = ['AGE', 6, 'INTEGER', -1, true]
  141. DKDBColumn column7 = ['BIRTH', 7, 'DATE', -1, true]
  142. DKDBColumn column8 = ['NOW', 8, 'TIMESTAMP', -1, true]
  143. DKDBColumn[] columns = [column1, column2, column3, column4, column5, column6, column7, column8]
  144. String[] pkColNames = ['FIRST_NAME', 'LAST_NAME']
  145. DKDBPrimaryKey pk = ['pk_customer', pkColNames]
  146. DKDBTable table = [ null, null, 'CUSTOMER', columns, pk]
  147. return table
  148. }
  149. }