Skip to content

Commit 8d28c81

Browse files
committed
test: added more tests for jdbc package
1 parent c047fbb commit 8d28c81

File tree

7 files changed

+308
-54
lines changed

7 files changed

+308
-54
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ class RestaurantDemoSpec extends Specification with RestaurantDemoDatabaseFuncti
152152
## Run Tests
153153
```shell
154154
docker rm -f mongodb;
155-
docker run -d --publish 27017:27017 --name mongodb mongocamp/mongodb:latest;
155+
docker run -d --publish 27017:27017 --name mongodb mongocamp/mongodb:latest;
156+
sbt test
156157
```
157158

158159
## Supporters

src/main/scala/dev/mongocamp/driver/mongodb/jdbc/resultSet/MongoDbResultSet.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ class MongoDbResultSet(collectionDao: MongoDAO[Document], data: List[Document],
251251

252252
override def getMetaData: ResultSetMetaData = {
253253
checkClosed()
254-
new MongoDbResultSetMetaData(collectionDao, data)
254+
new MongoDbResultSetMetaData(collectionDao, data, keySet)
255255
}
256256

257257
override def getObject(columnIndex: Int): AnyRef = {

src/main/scala/dev/mongocamp/driver/mongodb/jdbc/resultSet/MongoDbResultSetMetaData.scala

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@ class MongoDbResultSetMetaData extends ResultSetMetaData {
5454

5555
override def getColumnCount: Int = document.size
5656

57+
override def getColumnLabel(column: Int): String = {
58+
val keys: Iterable[String] = if (keySet.nonEmpty) {
59+
keySet
60+
} else {
61+
document.keys
62+
}
63+
keys.toList(column - 1)
64+
}
65+
66+
override def getColumnName(column: Int): String = getColumnLabel(column)
67+
5768
override def isAutoIncrement(column: Int): Boolean = false
5869

5970
override def isCaseSensitive(column: Int): Boolean = true
@@ -68,17 +79,6 @@ class MongoDbResultSetMetaData extends ResultSetMetaData {
6879

6980
override def getColumnDisplaySize(column: Int): Int = Int.MaxValue
7081

71-
override def getColumnLabel(column: Int): String = {
72-
val keys : Iterable[String] =if (keySet.nonEmpty) {
73-
keySet
74-
} else {
75-
document.keys
76-
}
77-
keys.toList(column - 1)
78-
}
79-
80-
override def getColumnName(column: Int): String = getColumnLabel(column)
81-
8282
override def getSchemaName(column: Int): String = collectionDao.databaseName
8383

8484
override def getPrecision(column: Int): Int = 0
@@ -90,7 +90,7 @@ class MongoDbResultSetMetaData extends ResultSetMetaData {
9090
override def getCatalogName(column: Int): String = collectionDao.name
9191

9292
override def getColumnType(column: Int): Int = {
93-
document.values.toList(column - 1) match {
93+
document(getColumnLabel(column)) match {
9494
case _: BsonInt32 => java.sql.Types.INTEGER
9595
case _: BsonInt64 => java.sql.Types.BIGINT
9696
case _: BsonNumber => java.sql.Types.DOUBLE
@@ -136,6 +136,11 @@ class MongoDbResultSetMetaData extends ResultSetMetaData {
136136
override def isWrapperFor(iface: Class[_]): Boolean = false
137137

138138
def getColumnIndex(columnLabel: String): Int = {
139-
document.keys.toList.indexOf(columnLabel)
139+
val keys: List[String] = if (keySet.nonEmpty) {
140+
keySet
141+
} else {
142+
document.keys.toList
143+
}
144+
keys.indexOf(columnLabel) + 1
140145
}
141146
}

src/main/scala/dev/mongocamp/driver/mongodb/jdbc/statement/MongoPreparedStatement.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import dev.mongocamp.driver.mongodb.jdbc.{MongoJdbcCloseable, MongoJdbcConnectio
77
import dev.mongocamp.driver.mongodb.json.JsonConverter
88
import dev.mongocamp.driver.mongodb.sql.MongoSqlQueryHolder
99
import dev.mongocamp.driver.mongodb.{Converter, GenericObservable}
10-
import jdk.graal.compiler.util.json.JsonParser
1110
import org.joda.time.DateTime
1211

1312
import java.io.{InputStream, Reader}
@@ -224,9 +223,9 @@ case class MongoPreparedStatement(connection: MongoJdbcConnection) extends Calla
224223
case t: Time =>
225224
parameters.put(parameterIndex, s"'${t.toInstant.toString}'")
226225
case a: Array[Byte] =>
227-
parameters.put(parameterIndex, a.mkString("[", ",", "]"))
226+
parameters.put(parameterIndex, new JsonConverter().toJson(a))
228227
case a: Iterable[_] =>
229-
parameters.put(parameterIndex, a.mkString("[", ",", "]"))
228+
parameters.put(parameterIndex, new JsonConverter().toJson(a))
230229
case _ =>
231230
parameters.put(parameterIndex, x.toString)
232231
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package dev.mongocamp.driver.mongodb.jdbc
2+
3+
import dev.mongocamp.driver.mongodb.MongoDAO
4+
import dev.mongocamp.driver.mongodb.jdbc.resultSet.MongoDbResultSetMetaData
5+
import dev.mongocamp.driver.mongodb.jdbc.statement.MongoPreparedStatement
6+
import munit.FunSuite
7+
import org.mongodb.scala.Document
8+
9+
import java.sql.ResultSetMetaData
10+
11+
class MongoDbResultSetMetaDataSuite extends BaseJdbcSuite {
12+
13+
var metaData: ResultSetMetaData = _
14+
15+
override def beforeAll(): Unit = {
16+
super.beforeAll()
17+
val preparedStatement2 = MongoPreparedStatement(connection.asInstanceOf[MongoJdbcConnection])
18+
preparedStatement2.executeUpdate("drop table testCollection")
19+
preparedStatement2.executeUpdate("insert into testCollection (intField, stringField, booleanField) values (1, 'test', true)")
20+
preparedStatement2.executeUpdate("insert into testCollection (intField, stringField, booleanField) values (2, 'test2', false)")
21+
metaData = preparedStatement2.executeQuery("select intField, booleanField, stringField from testCollection").getMetaData
22+
}
23+
24+
test("getColumnCount should return the correct column count") {
25+
assertEquals(metaData.getColumnCount, 3)
26+
}
27+
28+
test("getColumnLabel should return the correct column label") {
29+
assertEquals(metaData.getColumnLabel(1), "intField")
30+
assertEquals(metaData.getColumnLabel(2), "booleanField")
31+
assertEquals(metaData.getColumnLabel(3), "stringField")
32+
}
33+
34+
test("getColumnName should return the correct column name") {
35+
assertEquals(metaData.getColumnName(1), "intField")
36+
}
37+
38+
test("isAutoIncrement should return false") {
39+
assert(!metaData.isAutoIncrement(1))
40+
}
41+
42+
test("isCaseSensitive should return true") {
43+
assert(metaData.isCaseSensitive(1))
44+
}
45+
46+
test("isSearchable should return true") {
47+
assert(metaData.isSearchable(1))
48+
}
49+
50+
test("isCurrency should return false") {
51+
assert(!metaData.isCurrency(1))
52+
}
53+
54+
test("isNullable should return columnNullable") {
55+
assertEquals(metaData.isNullable(1), java.sql.ResultSetMetaData.columnNullable)
56+
}
57+
58+
test("isSigned should return false") {
59+
assert(!metaData.isSigned(1))
60+
}
61+
62+
test("getColumnDisplaySize should return Int.MaxValue") {
63+
assertEquals(metaData.getColumnDisplaySize(1), Int.MaxValue)
64+
}
65+
66+
test("getSchemaName should return the database name") {
67+
assertEquals(metaData.getSchemaName(1), "mongocamp-unit-test")
68+
}
69+
70+
test("getPrecision should return 0") {
71+
assertEquals(metaData.getPrecision(1), 0)
72+
}
73+
74+
test("getScale should return 0") {
75+
assertEquals(metaData.getScale(1), 0)
76+
}
77+
78+
test("getTableName should return the collection name") {
79+
assertEquals(metaData.getTableName(1), "testCollection")
80+
}
81+
82+
test("getCatalogName should return the collection name") {
83+
assertEquals(metaData.getCatalogName(1), "testCollection")
84+
}
85+
86+
test("getColumnType should return the correct SQL type") {
87+
assertEquals(metaData.getColumnType(1), java.sql.Types.BIGINT)
88+
assertEquals(metaData.getColumnType(2), java.sql.Types.BOOLEAN)
89+
assertEquals(metaData.getColumnType(3), java.sql.Types.VARCHAR)
90+
}
91+
92+
test("getColumnTypeName should return the correct SQL type name") {
93+
assertEquals(metaData.getColumnTypeName(1), "BIGINT")
94+
assertEquals(metaData.getColumnTypeName(2), "BOOLEAN")
95+
assertEquals(metaData.getColumnTypeName(3), "VARCHAR")
96+
}
97+
98+
test("isReadOnly should return false") {
99+
assert(!metaData.isReadOnly(1))
100+
}
101+
102+
test("isWritable should return true") {
103+
assert(metaData.isWritable(1))
104+
}
105+
106+
test("isDefinitelyWritable should return true") {
107+
assert(metaData.isDefinitelyWritable(1))
108+
}
109+
110+
test("getColumnClassName should return the correct class name") {
111+
assertEquals(metaData.getColumnClassName(1), classOf[java.lang.Long].getName)
112+
assertEquals(metaData.getColumnClassName(2), classOf[java.lang.Boolean].getName)
113+
assertEquals(metaData.getColumnClassName(3), classOf[java.lang.String].getName)
114+
}
115+
116+
test("unwrap should return null") {
117+
assertEquals(metaData.unwrap(classOf[Object]), null)
118+
}
119+
120+
test("isWrapperFor should return false") {
121+
assert(!metaData.isWrapperFor(classOf[Object]))
122+
}
123+
124+
test("getColumnIndex should return the correct index") {
125+
val metaData2 = metaData.asInstanceOf[MongoDbResultSetMetaData]
126+
assertEquals(metaData2.getColumnIndex("intField"), 1)
127+
assertEquals(metaData2.getColumnIndex("booleanField"), 2)
128+
assertEquals(metaData2.getColumnIndex("stringField"), 3)
129+
}
130+
}

src/test/scala/dev/mongocamp/driver/mongodb/jdbc/MongoDbResultSetSuite.scala

Lines changed: 73 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ import org.joda.time.DateTime
66
import org.mongodb.scala.bson.collection.immutable.Document
77
import org.mongodb.scala.model.Updates
88

9-
import java.sql.{Date, ResultSet, SQLFeatureNotSupportedException, Time, Timestamp}
9+
import java.sql.*
1010

1111
class MongoDbResultSetSuite extends BaseJdbcSuite {
12-
12+
1313
def initializeResultSet(): ResultSet = {
14-
super.beforeAll()
1514
val data = List(
1615
Document("id" -> 1, "name" -> "test_name", "active" -> true, "date" -> new DateTime("2021-01-01T00:00:00Z").toDate),
1716
Document("id" -> 2, "name" -> "another_name", "active" -> false)
@@ -52,12 +51,43 @@ class MongoDbResultSetSuite extends BaseJdbcSuite {
5251
assertEquals(resultSet.getInt("id"), 1)
5352
}
5453

54+
test("getByte() should return the correct value") {
55+
val resultSet = initializeResultSet()
56+
resultSet.next()
57+
assertEquals(resultSet.getByte("id"), 1.toByte)
58+
}
59+
60+
test("getBytes() should return the correct value") {
61+
val resultSet = initializeResultSet()
62+
resultSet.next()
63+
assertEquals(resultSet.getByte("id"), 1.toByte)
64+
}
65+
66+
test("getShort() should return the correct value") {
67+
val resultSet = initializeResultSet()
68+
resultSet.next()
69+
assertEquals(resultSet.getShort("id"), 1.toShort)
70+
}
71+
72+
test("getFloat() should return the correct value") {
73+
val resultSet = initializeResultSet()
74+
resultSet.next()
75+
assertEquals(resultSet.getFloat("id"), 1.toFloat)
76+
}
77+
5578
test("getDouble() should return the correct value") {
5679
val resultSet = initializeResultSet()
5780
resultSet.next()
5881
assertEquals(resultSet.getDouble("id"), 1.0)
5982
}
6083

84+
test("getBigDecimal() should return the correct value") {
85+
val resultSet = initializeResultSet()
86+
resultSet.next()
87+
assertEquals(resultSet.getBigDecimal("id"), new java.math.BigDecimal(1))
88+
assertEquals(resultSet.getBigDecimal("id", 1), new java.math.BigDecimal(1).setScale(1))
89+
}
90+
6191
test("getDate() should return the correct value") {
6292
val resultSet = initializeResultSet()
6393
resultSet.next()
@@ -195,7 +225,7 @@ class MongoDbResultSetSuite extends BaseJdbcSuite {
195225

196226
test("findColumn() should return the correct column index") {
197227
val resultSet = initializeResultSet()
198-
assertEquals(resultSet.findColumn("id"), 0)
228+
assertEquals(resultSet.findColumn("id"), 1)
199229
}
200230

201231
test("getWarnings() should return null") {
@@ -227,7 +257,7 @@ class MongoDbResultSetSuite extends BaseJdbcSuite {
227257
val resultSet = initializeResultSet()
228258
assert(!resultSet.isWrapperFor(classOf[MongoDbResultSet]))
229259
}
230-
260+
231261
test("updateNull should update the value to null") {
232262
val resultSet = initializeResultSet()
233263
resultSet.next()
@@ -246,38 +276,52 @@ class MongoDbResultSetSuite extends BaseJdbcSuite {
246276
val resultSet = initializeResultSet()
247277
resultSet.next()
248278
resultSet.updateInt(1, 42)
249-
assert(resultSet.getInt(1) == 42)
279+
assertEquals(resultSet.getInt(1), 42)
280+
}
281+
282+
test("updateFloat should update the value") {
283+
val resultSet = initializeResultSet()
284+
resultSet.next()
285+
resultSet.updateFloat(1, 42.toFloat)
286+
assertEquals(resultSet.getFloat(1), 42.toFloat)
287+
}
288+
289+
test("updateBigDecimal should update the value") {
290+
val resultSet = initializeResultSet()
291+
resultSet.next()
292+
resultSet.updateBigDecimal(1, new java.math.BigDecimal(42))
293+
assertEquals(resultSet.getBigDecimal(1), new java.math.BigDecimal(42))
250294
}
251295

252296
test("updateString should update the value") {
253297
val resultSet = initializeResultSet()
254298
resultSet.next()
255299
resultSet.updateString(2, "updated_name")
256-
assert(resultSet.getString(2) == "updated_name")
300+
assertEquals(resultSet.getString(2), "updated_name")
257301
}
258302

259303
test("updateDate should update the value") {
260304
val resultSet = initializeResultSet()
261305
resultSet.next()
262306
val newDate = new Date(1622505600000L)
263307
resultSet.updateDate(4, newDate)
264-
assert(resultSet.getDate(4) == newDate)
308+
assertEquals(resultSet.getDate(4), newDate)
265309
}
266310

267311
test("updateTime should update the value") {
268312
val resultSet = initializeResultSet()
269313
resultSet.next()
270314
val newTime = new Time(1622505600000L)
271315
resultSet.updateTime(4, newTime)
272-
assert(resultSet.getTime(4) == newTime)
316+
assertEquals(resultSet.getTime(4), newTime)
273317
}
274318

275319
test("updateTimestamp should update the value") {
276320
val resultSet = initializeResultSet()
277321
resultSet.next()
278322
val newTimestamp = new Timestamp(1622505600000L)
279323
resultSet.updateTimestamp(4, newTimestamp)
280-
assert(resultSet.getTimestamp(4) == newTimestamp)
324+
assertEquals(resultSet.getTimestamp(4), newTimestamp)
281325
}
282326

283327
test("updateObject should update the value") {
@@ -304,8 +348,24 @@ class MongoDbResultSetSuite extends BaseJdbcSuite {
304348

305349
test("getConcurrency should throw SQLFeatureNotSupportedException") {
306350
val resultSet = initializeResultSet()
307-
intercept[SQLFeatureNotSupportedException] {
308-
resultSet.getConcurrency
309-
}
351+
intercept[SQLFeatureNotSupportedException] (resultSet.getConcurrency)
352+
intercept[SQLFeatureNotSupportedException] (resultSet.updateAsciiStream(99, null, 1))
353+
intercept[SQLFeatureNotSupportedException] (resultSet.updateAsciiStream("updateAsciiStream", null, 1))
354+
intercept[SQLFeatureNotSupportedException] (resultSet.updateBinaryStream(99, null, 1))
355+
intercept[SQLFeatureNotSupportedException] (resultSet.updateBinaryStream("updateBinaryStream", null, 1))
356+
intercept[SQLFeatureNotSupportedException] (resultSet.updateCharacterStream(99, null, 1))
357+
intercept[SQLFeatureNotSupportedException] (resultSet.updateCharacterStream("updateCharacterStream", null, 1))
358+
310359
}
360+
361+
test("null values for not implemented get methods") {
362+
val resultSet = initializeResultSet()
363+
assertEquals(resultSet.getAsciiStream(1), null)
364+
assertEquals(resultSet.getUnicodeStream(1), null)
365+
assertEquals(resultSet.getBinaryStream(1), null)
366+
assertEquals(resultSet.getAsciiStream("id"), null)
367+
assertEquals(resultSet.getUnicodeStream("id"), null)
368+
assertEquals(resultSet.getBinaryStream("id"), null)
369+
}
370+
311371
}

0 commit comments

Comments
 (0)