Skip to content

Commit 28f66d3

Browse files
author
Roman Janusz
committed
making GenCodecs for BsonValue safe for non-BSON Input/Outputs
1 parent ce2f738 commit 28f66d3

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

commons-mongo/jvm/src/main/scala/com/avsystem/commons/mongo/BsonGenCodecs.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ object BsonGenCodecs {
5050
implicit val bsonValueCodec: GenCodec[BsonValue] = GenCodec.create(
5151
i => i.readCustom(BsonValueMarker).getOrElse {
5252
val reader = new BsonBinaryReader(ByteBuffer.wrap(i.readSimple().readBinary()))
53-
BsonValueUtils.decode(reader)
53+
BsonValueUtils.decode(reader).asDocument().get("v")
5454
},
5555
(o, bv) => if (!o.writeCustom(BsonValueMarker, bv)) {
5656
val buffer = new BasicOutputBuffer()
5757
val writer = new BsonBinaryWriter(buffer)
58-
BsonValueUtils.encode(writer, bv)
58+
BsonValueUtils.encode(writer, new BsonDocument("v", bv))
5959
writer.flush()
6060
writer.close()
6161
o.writeSimple().writeBinary(buffer.toByteArray)

commons-mongo/jvm/src/test/scala/com/avsystem/commons/mongo/BsonValueCodecsTest.scala

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.avsystem.commons
22
package mongo
33

4+
import com.avsystem.commons.serialization.json.{JsonStringInput, JsonStringOutput}
45
import com.avsystem.commons.serialization.{GenCodec, HasGenCodecWithDeps}
6+
import org.bson._
57
import org.bson.json.JsonReader
68
import org.bson.types.{Decimal128, ObjectId}
7-
import org.bson._
9+
import org.scalactic.source.Position
810
import org.scalatest.funsuite.AnyFunSuite
911

1012
case class AllTypesInABag(
@@ -23,7 +25,7 @@ case class AllTypesInABag(
2325
)
2426
object AllTypesInABag extends HasGenCodecWithDeps[BsonGenCodecs.type, AllTypesInABag]
2527

26-
class BsonValueCodecsTest extends AnyFunSuite {
28+
class BsonValueCodecsTest extends AnyFunSuite with BsonGenCodecs {
2729
test("codec roundtrip") {
2830
val doc = new BsonDocument(JList(
2931
new BsonElement("someInt64", new BsonInt64(64)),
@@ -69,8 +71,6 @@ class BsonValueCodecsTest extends AnyFunSuite {
6971
}
7072

7173
test("null handling") {
72-
import BsonGenCodecs.bsonDocumentCodec
73-
7474
val reader = new JsonReader("""{"key": null}""")
7575
val input = new BsonReaderInput(reader)
7676
val document = GenCodec.read[BsonDocument](input)
@@ -83,11 +83,22 @@ class BsonValueCodecsTest extends AnyFunSuite {
8383
}
8484

8585
test("null in doc in array") {
86-
import BsonGenCodecs.bsonArrayCodec
87-
8886
val reader = new JsonReader("""[{"key": null}]""")
8987
val input = new BsonReaderInput(reader)
9088
val array = GenCodec.read[BsonArray](input)
9189
assert(array === new BsonArray(JList(new BsonDocument("key", BsonNull.VALUE))))
9290
}
91+
92+
def testJsonRoundtrip[T: GenCodec](value: T)(implicit pos: Position): Unit = {
93+
val json = JsonStringOutput.write(value)
94+
val readValue = JsonStringInput.read[T](json)
95+
assert(value == readValue)
96+
}
97+
98+
test("JSON string roundtrip for BsonValue") {
99+
testJsonRoundtrip(new BsonBoolean(true))
100+
testJsonRoundtrip(new BsonInt32(42))
101+
testJsonRoundtrip(new BsonInt64(42))
102+
testJsonRoundtrip(new BsonDocument("v", new BsonInt32(42)))
103+
}
93104
}

0 commit comments

Comments
 (0)