@@ -581,74 +581,12 @@ internal class JdbcDatabaseMetaDataTest {
581581 assertTrue(metaData.supportsConvert(Types .INTEGER , Types .VARCHAR ))
582582 }
583583
584- private fun makeTablesCursor (): ICursor {
585- val n = arrayOf(" TABLE_CAT" , " TABLE_SCHEM" , " TABLE_NAME" , " TABLE_TYPE" , " REMARKS" ,
586- " TYPE_CAT" , " TYPE_SCHEM" , " TYPE_NAME" , " SELF_REFERENCING_COL_NAME" , " REF_GENERATION" )
587- return mock {
588- var c = 0
589- whenever(it.moveToNext()) doAnswer { ++ c == 1 }
590- whenever(it.columnCount) doReturn n.size
591- whenever(it.columnNames()) doReturn n
592- whenever(it.columnIndex(any())) doAnswer { inv -> n.indexOf(inv .getArgument<String >(0 )) }
593- whenever(it.getString(any())) doAnswer { inv ->
594- if (n.getOrNull(inv .getArgument<Int >(0 )) == " TABLE_NAME" ) " test_table" else null
595- }
596- whenever(it.isClosed()) doReturn false
597- }
598- }
599-
600- @Suppress(" Detekt.CognitiveComplexMethod" )
601- private fun makePragmaCursor (cols : List <List <Any ?>>): ICursor {
602- val n = arrayOf(" cid" , " name" , " type" , " notnull" , " dflt_value" , " pk" )
603- return mock {
604- var c = 0
605- whenever(it.moveToNext()) doAnswer { ++ c <= cols.size }
606- whenever(it.columnCount) doReturn n.size
607- whenever(it.columnNames()) doReturn n
608- whenever(it.columnIndex(any())) doAnswer { inv -> n.indexOf(inv .getArgument<String >(0 )) }
609- whenever(it.getString(any())) doAnswer { inv ->
610- if (c in 1 .. cols.size) cols[c - 1 ].getOrNull(inv .getArgument<Int >(0 ))?.toString() else null
611- }
612- whenever(it.getInt(any())) doAnswer { inv ->
613- if (c in 1 .. cols.size) cols[c - 1 ].getOrNull(inv .getArgument<Int >(0 )) as ? Int ? : 0 else 0
614- }
615- whenever(it.position()) doAnswer { c - 1 }
616- whenever(it.type(any())) doAnswer { inv ->
617- when (inv .getArgument<Int >(0 )) {
618- 0 , 3 , 5 -> ColumnType .INTEGER
619- 4 -> ColumnType .NULL
620- else -> ColumnType .STRING
621- }
622- }
623- whenever(it.isNull(any())) doAnswer { inv ->
624- if (c in 1 .. cols.size) cols[c - 1 ].getOrNull(inv .getArgument<Int >(0 )) == null else true
625- }
626- whenever(it.isClosed()) doReturn false
627- }
628- }
629-
630- private fun makeEmptyCursor (count : Int , names : Array <String >): ICursor = mock {
631- whenever(it.moveToNext()) doReturn false
632- whenever(it.columnCount) doReturn count
633- whenever(it.columnNames()) doReturn names
634- whenever(it.isClosed()) doReturn false
635- }
636-
637- private val colsResultNames = arrayOf(
638- " TABLE_CAT" , " TABLE_SCHEM" , " TABLE_NAME" , " COLUMN_NAME" , " DATA_TYPE" , " TYPE_NAME" ,
639- " COLUMN_SIZE" , " BUFFER_LENGTH" , " DECIMAL_DIGITS" , " NUM_PREC_RADIX" , " NULLABLE" ,
640- " REMARKS" , " COLUMN_DEF" , " SQL_DATA_TYPE" , " SQL_DATETIME_SUB" , " CHAR_OCTET_LENGTH" ,
641- " ORDINAL_POSITION" , " IS_NULLABLE" , " SCOPE_CATALOG" , " SCOPE_SCHEMA" , " SCOPE_TABLE" ,
642- " SOURCE_DATA_TYPE" , " IS_AUTOINCREMENT" , " IS_GENERATEDCOLUMN" )
643-
644- private val pkNames = arrayOf(
645- " TABLE_CAT" , " TABLE_SCHEM" , " TABLE_NAME" , " COLUMN_NAME" , " KEY_SEQ" , " PK_NAME" )
646584
647585 @Suppress(" Detekt.CognitiveComplexMethod" , " Detekt.LongMethod" )
648586 @Test
649587 fun getColumnsWithVariousColumnTypes () {
650- val tc = makeTablesCursor()
651- val pc = makePragmaCursor(listOf (
588+ val tableCursor = makeTablesCursor()
589+ val pragmaCursor = makePragmaCursor(listOf (
652590 listOf (0 , " int_col" , " INTEGER" , 0 , null , 0 ),
653591 listOf (1 , " text_col" , " TEXT" , 0 , null , 0 ),
654592 listOf (2 , " real_col" , " REAL" , 0 , null , 0 ),
@@ -667,13 +605,13 @@ internal class JdbcDatabaseMetaDataTest {
667605 listOf (15 , " mediumint_col" , " MEDIUMINT" , 0 , null , 0 ),
668606 listOf (16 , " doubleprecision_col" , " DOUBLE PRECISION" , 0 , null , 0 ),
669607 listOf (17 , " character_col" , " CHARACTER" , 0 , null , 0 )))
670- val uc = makeEmptyCursor(24 , colsResultNames)
608+ val unionCursor = makeEmptyCursor(24 , colsResultNames)
671609 whenever(mockDatabase.query(any<String >(), any<Array <Any ?>>())) doAnswer {
672- val s = it.getArgument<String >(0 )
610+ val arg = it.getArgument<String >(0 )
673611 when {
674- s .contains(" sqlite_master" ) && s .contains(" type IN ('table', 'view')" ) -> tc
675- s .startsWith(" PRAGMA table_info" ) -> pc
676- s .contains(" UNION ALL" ) -> uc
612+ arg .contains(" sqlite_master" ) && arg .contains(" type IN ('table', 'view')" ) -> tableCursor
613+ arg .startsWith(" PRAGMA table_info" ) -> pragmaCursor
614+ arg .contains(" UNION ALL" ) -> unionCursor
677615 else -> mockCursor
678616 }
679617 }
@@ -683,15 +621,15 @@ internal class JdbcDatabaseMetaDataTest {
683621 @Suppress(" Detekt.CognitiveComplexMethod" , " Detekt.LongMethod" )
684622 @Test
685623 fun getColumnsWithIntType () {
686- val tc = makeTablesCursor()
687- val pc = makePragmaCursor(listOf (listOf (0 , " int_type_col" , " INT" , 1 , " 42" , 1 )))
688- val uc = makeEmptyCursor(24 , colsResultNames)
624+ val tableCursor = makeTablesCursor()
625+ val pragmaCursor = makePragmaCursor(listOf (listOf (0 , " int_type_col" , " INT" , 1 , " 42" , 1 )))
626+ val unionCursor = makeEmptyCursor(24 , colsResultNames)
689627 whenever(mockDatabase.query(any<String >(), any<Array <Any ?>>())) doAnswer {
690- val s = it.getArgument<String >(0 )
628+ val arg = it.getArgument<String >(0 )
691629 when {
692- s .contains(" sqlite_master" ) && s .contains(" type IN ('table', 'view')" ) -> tc
693- s .startsWith(" PRAGMA table_info" ) -> pc
694- s .contains(" UNION ALL" ) -> uc
630+ arg .contains(" sqlite_master" ) && arg .contains(" type IN ('table', 'view')" ) -> tableCursor
631+ arg .startsWith(" PRAGMA table_info" ) -> pragmaCursor
632+ arg .contains(" UNION ALL" ) -> unionCursor
695633 else -> mockCursor
696634 }
697635 }
@@ -701,18 +639,18 @@ internal class JdbcDatabaseMetaDataTest {
701639 @Suppress(" Detekt.CognitiveComplexMethod" , " Detekt.LongMethod" )
702640 @Test
703641 fun getColumnsWithColumnNamePatternFiltering () {
704- val tc = makeTablesCursor()
705- val pc = makePragmaCursor(listOf (
642+ val tableCursor = makeTablesCursor()
643+ val pragmaCursor = makePragmaCursor(listOf (
706644 listOf (0 , " id" , " INTEGER" , 1 , null , 1 ),
707645 listOf (1 , " name" , " TEXT" , 0 , null , 0 ),
708646 listOf (2 , " email" , " TEXT" , 0 , null , 0 )))
709- val uc = makeEmptyCursor(24 , colsResultNames)
647+ val unionCursor = makeEmptyCursor(24 , colsResultNames)
710648 whenever(mockDatabase.query(any<String >(), any<Array <Any ?>>())) doAnswer {
711- val s = it.getArgument<String >(0 )
649+ val arg = it.getArgument<String >(0 )
712650 when {
713- s .contains(" sqlite_master" ) && s .contains(" type IN ('table', 'view')" ) -> tc
714- s .startsWith(" PRAGMA table_info" ) -> pc
715- s .contains(" UNION ALL" ) || s .contains(" WHERE 1 = 0" ) -> uc
651+ arg .contains(" sqlite_master" ) && arg .contains(" type IN ('table', 'view')" ) -> tableCursor
652+ arg .startsWith(" PRAGMA table_info" ) -> pragmaCursor
653+ arg .contains(" UNION ALL" ) || arg .contains(" WHERE 1 = 0" ) -> unionCursor
716654 else -> mockCursor
717655 }
718656 }
@@ -722,17 +660,17 @@ internal class JdbcDatabaseMetaDataTest {
722660 @Suppress(" Detekt.CognitiveComplexMethod" , " Detekt.LongMethod" )
723661 @Test
724662 fun getColumnsWithNullColumnNamePattern () {
725- val tc = makeTablesCursor()
726- val pc = makePragmaCursor(listOf (
663+ val tableCursor = makeTablesCursor()
664+ val pragmaCursor = makePragmaCursor(listOf (
727665 listOf (0 , " id" , " INTEGER" , 1 , " 0" , 1 ),
728666 listOf (1 , " name" , " TEXT" , 0 , null , 0 )))
729- val uc = makeEmptyCursor(24 , colsResultNames)
667+ val unionCursor = makeEmptyCursor(24 , colsResultNames)
730668 whenever(mockDatabase.query(any<String >(), any<Array <Any ?>>())) doAnswer {
731- val s = it.getArgument<String >(0 )
669+ val arg = it.getArgument<String >(0 )
732670 when {
733- s .contains(" sqlite_master" ) && s .contains(" type IN ('table', 'view')" ) -> tc
734- s .startsWith(" PRAGMA table_info" ) -> pc
735- s .contains(" UNION ALL" ) -> uc
671+ arg .contains(" sqlite_master" ) && arg .contains(" type IN ('table', 'view')" ) -> tableCursor
672+ arg .startsWith(" PRAGMA table_info" ) -> pragmaCursor
673+ arg .contains(" UNION ALL" ) -> unionCursor
736674 else -> mockCursor
737675 }
738676 }
@@ -741,15 +679,15 @@ internal class JdbcDatabaseMetaDataTest {
741679
742680 @Test
743681 fun getColumnsWithEmptyResult () {
744- val tc = makeEmptyCursor(10 , arrayOf(" TABLE_CAT" , " TABLE_SCHEM" , " TABLE_NAME" ,
682+ val tableCursor = makeEmptyCursor(10 , arrayOf(" TABLE_CAT" , " TABLE_SCHEM" , " TABLE_NAME" ,
745683 " TABLE_TYPE" , " REMARKS" , " TYPE_CAT" , " TYPE_SCHEM" , " TYPE_NAME" ,
746684 " SELF_REFERENCING_COL_NAME" , " REF_GENERATION" ))
747- val ec = makeEmptyCursor(24 , colsResultNames)
685+ val emptyCursor = makeEmptyCursor(24 , colsResultNames)
748686 whenever(mockDatabase.query(any<String >(), any<Array <Any ?>>())) doAnswer {
749- val s = it.getArgument<String >(0 )
687+ val arg = it.getArgument<String >(0 )
750688 when {
751- s .contains(" sqlite_master" ) && s .contains(" type IN ('table', 'view')" ) -> tc
752- s .contains(" WHERE 1 = 0" ) -> ec
689+ arg .contains(" sqlite_master" ) && arg .contains(" type IN ('table', 'view')" ) -> tableCursor
690+ arg .contains(" WHERE 1 = 0" ) -> emptyCursor
753691 else -> mockCursor
754692 }
755693 }
@@ -759,16 +697,16 @@ internal class JdbcDatabaseMetaDataTest {
759697 @Suppress(" Detekt.CognitiveComplexMethod" , " Detekt.LongMethod" )
760698 @Test
761699 fun getPrimaryKeysWithMultipleKeys () {
762- val pc = makePragmaCursor(listOf (
700+ val pragmaCursor = makePragmaCursor(listOf (
763701 listOf (0 , " id" , " INTEGER" , 1 , null , 1 ),
764702 listOf (1 , " sub_id" , " INTEGER" , 1 , null , 2 ),
765703 listOf (2 , " name" , " TEXT" , 0 , null , 0 )))
766- val uc = makeEmptyCursor(6 , pkNames)
704+ val unionCursor = makeEmptyCursor(6 , pkNames)
767705 whenever(mockDatabase.query(any<String >(), any<Array <Any ?>>())) doAnswer {
768- val s = it.getArgument<String >(0 )
706+ val arg = it.getArgument<String >(0 )
769707 when {
770- s .startsWith(" PRAGMA table_info" ) -> pc
771- s .contains(" UNION ALL" ) -> uc
708+ arg .startsWith(" PRAGMA table_info" ) -> pragmaCursor
709+ arg .contains(" UNION ALL" ) -> unionCursor
772710 else -> mockCursor
773711 }
774712 }
@@ -778,15 +716,15 @@ internal class JdbcDatabaseMetaDataTest {
778716 @Suppress(" Detekt.CognitiveComplexMethod" , " Detekt.LongMethod" )
779717 @Test
780718 fun getPrimaryKeysWithEmptyResult () {
781- val pc = makePragmaCursor(listOf (
719+ val pragmaCursor = makePragmaCursor(listOf (
782720 listOf (0 , " id" , " INTEGER" , 0 , null , 0 ),
783721 listOf (1 , " name" , " TEXT" , 0 , null , 0 )))
784- val ec = makeEmptyCursor(6 , pkNames)
722+ val emptyCursor = makeEmptyCursor(6 , pkNames)
785723 whenever(mockDatabase.query(any<String >(), any<Array <Any ?>>())) doAnswer {
786- val s = it.getArgument<String >(0 )
724+ val arg = it.getArgument<String >(0 )
787725 when {
788- s .startsWith(" PRAGMA table_info" ) -> pc
789- s .contains(" WHERE 1 = 0" ) -> ec
726+ arg .startsWith(" PRAGMA table_info" ) -> pragmaCursor
727+ arg .contains(" WHERE 1 = 0" ) -> emptyCursor
790728 else -> mockCursor
791729 }
792730 }
@@ -810,8 +748,8 @@ internal class JdbcDatabaseMetaDataTest {
810748 " TABLE_TYPE" , " REMARKS" , " TYPE_CAT" , " TYPE_SCHEM" , " TYPE_NAME" ,
811749 " SELF_REFERENCING_COL_NAME" , " REF_GENERATION" ))
812750 whenever(mockDatabase.query(any<String >(), any<Array <Any ?>>())) doAnswer {
813- val s = it.getArgument<String >(0 )
814- if (s .contains(" sqlite_master" ) && s .contains(" AND name GLOB" )) { cursor } else { mockCursor }
751+ val arg = it.getArgument<String >(0 )
752+ if (arg .contains(" sqlite_master" ) && arg .contains(" AND name GLOB" )) { cursor } else { mockCursor }
815753 }
816754 metaData.getTables(null , null , " test_%" , null ).use { assertNotNull(it) }
817755 }
@@ -834,4 +772,87 @@ internal class JdbcDatabaseMetaDataTest {
834772 whenever(mockDatabase.query(any<String >(), any<Array <Any ?>>())).doReturn(mockCursor)
835773 assertNotNull(metaData.getIndexInfo(null , null , " users" , unique = false , approximate = false ))
836774 }
775+
776+ private fun makeTablesCursor (): ICursor {
777+ val columns = arrayOf(" TABLE_CAT" , " TABLE_SCHEM" , " TABLE_NAME" , " TABLE_TYPE" , " REMARKS" ,
778+ " TYPE_CAT" , " TYPE_SCHEM" , " TYPE_NAME" , " SELF_REFERENCING_COL_NAME" , " REF_GENERATION" )
779+ return mock {
780+ var count = 0
781+ whenever(it.moveToNext()) doAnswer { ++ count == 1 }
782+ whenever(it.columnCount) doReturn columns.size
783+ whenever(it.columnNames()) doReturn columns
784+ whenever(it.columnIndex(any())) doAnswer { invocation ->
785+ columns.indexOf(invocation.getArgument<String >(0 ))
786+ }
787+ whenever(it.getString(any())) doAnswer { invocation ->
788+ if (columns.getOrNull(invocation.getArgument<Int >(0 )) == " TABLE_NAME" ) {
789+ " test_table"
790+ } else {
791+ null
792+ }
793+ }
794+ whenever(it.isClosed()) doReturn false
795+ }
796+ }
797+
798+ @Suppress(" Detekt.CognitiveComplexMethod" )
799+ private fun makePragmaCursor (cols : List <List <Any ?>>): ICursor {
800+ val columns = arrayOf(" cid" , " name" , " type" , " notnull" , " dflt_value" , " pk" )
801+ return mock {
802+ var count = 0
803+ whenever(it.moveToNext()) doAnswer { ++ count <= cols.size }
804+ whenever(it.columnCount) doReturn columns.size
805+ whenever(it.columnNames()) doReturn columns
806+ whenever(it.columnIndex(any())) doAnswer { invocation ->
807+ columns.indexOf(invocation.getArgument<String >(0 ))
808+ }
809+ whenever(it.getString(any())) doAnswer { invocation ->
810+ if (count in 1 .. cols.size) {
811+ cols[count - 1 ].getOrNull(invocation.getArgument<Int >(0 ))?.toString()
812+ } else {
813+ null
814+ }
815+ }
816+ whenever(it.getInt(any())) doAnswer { invocation ->
817+ if (count in 1 .. cols.size) {
818+ cols[count - 1 ].getOrNull(invocation.getArgument<Int >(0 )) as ? Int ? : 0
819+ } else {
820+ 0
821+ }
822+ }
823+ whenever(it.position()) doAnswer { count - 1 }
824+ whenever(it.type(any())) doAnswer { invocation ->
825+ when (invocation.getArgument<Int >(0 )) {
826+ 0 , 3 , 5 -> ColumnType .INTEGER
827+ 4 -> ColumnType .NULL
828+ else -> ColumnType .STRING
829+ }
830+ }
831+ whenever(it.isNull(any())) doAnswer { invocation ->
832+ if (count in 1 .. cols.size) {
833+ cols[count - 1 ].getOrNull(invocation.getArgument<Int >(0 )) == null
834+ } else {
835+ true
836+ }
837+ }
838+ whenever(it.isClosed()) doReturn false
839+ }
840+ }
841+
842+ private fun makeEmptyCursor (count : Int , names : Array <String >): ICursor = mock {
843+ whenever(it.moveToNext()) doReturn false
844+ whenever(it.columnCount) doReturn count
845+ whenever(it.columnNames()) doReturn names
846+ whenever(it.isClosed()) doReturn false
847+ }
848+
849+ private val colsResultNames = arrayOf(
850+ " TABLE_CAT" , " TABLE_SCHEM" , " TABLE_NAME" , " COLUMN_NAME" , " DATA_TYPE" , " TYPE_NAME" ,
851+ " COLUMN_SIZE" , " BUFFER_LENGTH" , " DECIMAL_DIGITS" , " NUM_PREC_RADIX" , " NULLABLE" ,
852+ " REMARKS" , " COLUMN_DEF" , " SQL_DATA_TYPE" , " SQL_DATETIME_SUB" , " CHAR_OCTET_LENGTH" ,
853+ " ORDINAL_POSITION" , " IS_NULLABLE" , " SCOPE_CATALOG" , " SCOPE_SCHEMA" , " SCOPE_TABLE" ,
854+ " SOURCE_DATA_TYPE" , " IS_AUTOINCREMENT" , " IS_GENERATEDCOLUMN" )
855+
856+ private val pkNames = arrayOf(
857+ " TABLE_CAT" , " TABLE_SCHEM" , " TABLE_NAME" , " COLUMN_NAME" , " KEY_SEQ" , " PK_NAME" )
837858}
0 commit comments