@@ -26,6 +26,7 @@ import org.bson.codecs.configuration.CodecRegistries
2626import org.bson.codecs.kotlinx.BsonConfiguration
2727import org.bson.codecs.kotlinx.BsonDecoder
2828import org.bson.codecs.kotlinx.BsonEncoder
29+ import org.bson.codecs.kotlinx.BsonNamingStrategy
2930import org.bson.codecs.kotlinx.KotlinSerializerCodec
3031import org.bson.codecs.kotlinx.ObjectIdSerializer
3132import org.bson.types.ObjectId
@@ -133,6 +134,34 @@ internal class KotlinXSerializationTest {
133134 collection.drop()
134135 }
135136
137+ @Test
138+ fun snakeCaseNamingTest () = runBlocking {
139+ @Serializable
140+ data class PaintOrder (
141+ val ManufacturerName : String ,
142+ val QuantityOfCans : Int ,
143+ )
144+
145+ val collection = database.getCollection<PaintOrder >(" orders2" )
146+
147+ // :snippet-start: snake-case-naming
148+ val myCustomCodec = KotlinSerializerCodec .create<PaintOrder >(
149+ bsonConfiguration = BsonConfiguration (bsonNamingStrategy = BsonNamingStrategy .SNAKE_CASE )
150+ )
151+
152+ val registry = CodecRegistries .fromRegistries(
153+ CodecRegistries .fromCodecs(myCustomCodec), collection.codecRegistry
154+ )
155+ // :snippet-end:
156+
157+ val paint = PaintOrder (" Acme" , 10 )
158+ collection.withCodecRegistry(registry).insertOne(paint)
159+ val result = collection.withDocumentClass<Document >().find().first().toJson()
160+ assertTrue(result.contains(" quantity_of_cans" ))
161+ assertFalse(result.contains(" ManufacturerName" ))
162+ collection.drop()
163+ }
164+
136165 // :snippet-start: kserializer
137166 object InstantAsBsonDateTime : KSerializer<Instant> {
138167 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" InstantAsBsonDateTime" , PrimitiveKind .LONG )
0 commit comments