Skip to content

Commit fe8f0b9

Browse files
author
Jonas Kellerer
committed
feat: e2e tests for filter by insertions
1 parent 3376cb7 commit fe8f0b9

25 files changed

+513
-218
lines changed

lapis2/src/main/kotlin/org/genspectrum/lapis/OpenApiDocs.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import org.genspectrum.lapis.config.SequenceFilterFields
1111
import org.genspectrum.lapis.controller.AGGREGATED_GROUP_BY_FIELDS_DESCRIPTION
1212
import org.genspectrum.lapis.controller.AGGREGATED_REQUEST_SCHEMA
1313
import org.genspectrum.lapis.controller.AGGREGATED_RESPONSE_SCHEMA
14+
import org.genspectrum.lapis.controller.AMINO_ACID_INSERTIONS_PROPERTY
15+
import org.genspectrum.lapis.controller.AMINO_ACID_INSERTIONS_SCHEMA
1416
import org.genspectrum.lapis.controller.AMINO_ACID_MUTATIONS_PROPERTY
1517
import org.genspectrum.lapis.controller.AMINO_ACID_MUTATIONS_RESPONSE_SCHEMA
1618
import org.genspectrum.lapis.controller.AMINO_ACID_MUTATIONS_SCHEMA
@@ -25,6 +27,8 @@ import org.genspectrum.lapis.controller.LIMIT_DESCRIPTION
2527
import org.genspectrum.lapis.controller.LIMIT_PROPERTY
2628
import org.genspectrum.lapis.controller.LIMIT_SCHEMA
2729
import org.genspectrum.lapis.controller.MIN_PROPORTION_PROPERTY
30+
import org.genspectrum.lapis.controller.NUCLEOTIDE_INSERTIONS_PROPERTY
31+
import org.genspectrum.lapis.controller.NUCLEOTIDE_INSERTIONS_SCHEMA
2832
import org.genspectrum.lapis.controller.NUCLEOTIDE_MUTATIONS_PROPERTY
2933
import org.genspectrum.lapis.controller.NUCLEOTIDE_MUTATIONS_RESPONSE_SCHEMA
3034
import org.genspectrum.lapis.controller.NUCLEOTIDE_MUTATIONS_SCHEMA
@@ -35,7 +39,9 @@ import org.genspectrum.lapis.controller.ORDER_BY_FIELDS_SCHEMA
3539
import org.genspectrum.lapis.controller.ORDER_BY_PROPERTY
3640
import org.genspectrum.lapis.controller.REQUEST_SCHEMA_WITH_MIN_PROPORTION
3741
import org.genspectrum.lapis.controller.SEQUENCE_FILTERS_SCHEMA
42+
import org.genspectrum.lapis.request.AminoAcidInsertion
3843
import org.genspectrum.lapis.request.AminoAcidMutation
44+
import org.genspectrum.lapis.request.NucleotideInsertion
3945
import org.genspectrum.lapis.request.NucleotideMutation
4046
import org.genspectrum.lapis.request.OrderByField
4147
import org.genspectrum.lapis.response.COUNT_PROPERTY
@@ -51,6 +57,8 @@ fun buildOpenApiSchema(sequenceFilterFields: SequenceFilterFields, databaseConfi
5157
val sequenceFilters = requestProperties +
5258
Pair(NUCLEOTIDE_MUTATIONS_PROPERTY, nucleotideMutations()) +
5359
Pair(AMINO_ACID_MUTATIONS_PROPERTY, aminoAcidMutations()) +
60+
Pair(NUCLEOTIDE_INSERTIONS_PROPERTY, nucleotideInsertions()) +
61+
Pair(AMINO_ACID_INSERTIONS_PROPERTY, aminoAcidInsertions()) +
5462
Pair(ORDER_BY_PROPERTY, orderByPostSchema()) +
5563
Pair(LIMIT_PROPERTY, limitSchema()) +
5664
Pair(OFFSET_PROPERTY, offsetSchema()) +
@@ -130,6 +138,8 @@ fun buildOpenApiSchema(sequenceFilterFields: SequenceFilterFields, databaseConfi
130138
),
131139
)
132140
.addSchemas(AMINO_ACID_MUTATIONS_SCHEMA, aminoAcidMutations())
141+
.addSchemas(NUCLEOTIDE_INSERTIONS_SCHEMA, nucleotideInsertions())
142+
.addSchemas(AMINO_ACID_INSERTIONS_SCHEMA, aminoAcidInsertions())
133143
.addSchemas(ORDER_BY_FIELDS_SCHEMA, orderByGetSchema())
134144
.addSchemas(LIMIT_SCHEMA, limitSchema())
135145
.addSchemas(OFFSET_SCHEMA, offsetSchema())
@@ -160,6 +170,8 @@ private fun mapToOpenApiType(type: MetadataType): String = when (type) {
160170
MetadataType.DATE -> "string"
161171
MetadataType.INT -> "integer"
162172
MetadataType.FLOAT -> "number"
173+
MetadataType.NUCLEOTIDE_INSERTION -> "string"
174+
MetadataType.AMINO_ACID_INSERTION -> "string"
163175
}
164176

165177
private fun primitiveSequenceFilterFieldSchemas(sequenceFilterFields: SequenceFilterFields) =
@@ -242,6 +254,35 @@ private fun aminoAcidMutations() =
242254
),
243255
)
244256

257+
private fun nucleotideInsertions() =
258+
Schema<List<NucleotideInsertion>>()
259+
.type("array")
260+
.items(
261+
Schema<String>()
262+
.type("string")
263+
.example("ins_123:ATT")
264+
.description(
265+
"""
266+
|A nucleotide insertion in the format "ins_(\<sequenceName\>:)?\<position\>:\<insertion\>".
267+
|If the sequenceName is not provided, LAPIS will use the default sequence name.
268+
""".trimMargin(),
269+
),
270+
)
271+
272+
private fun aminoAcidInsertions() =
273+
Schema<List<AminoAcidInsertion>>()
274+
.type("array")
275+
.items(
276+
Schema<String>()
277+
.type("string")
278+
.example("ins_ORF1:123:ATT")
279+
.description(
280+
"""
281+
|A amino acid insertion in the format "ins_\<gene\>:\<position\>:\<insertion\>".
282+
""".trimMargin(),
283+
),
284+
)
285+
245286
private fun orderByGetSchema() = Schema<List<String>>()
246287
.type("array")
247288
.items(orderByFieldStringSchema())

lapis2/src/main/kotlin/org/genspectrum/lapis/config/DatabaseConfig.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ enum class MetadataType {
3232

3333
@JsonProperty("float")
3434
FLOAT,
35+
36+
@JsonProperty("insertion")
37+
NUCLEOTIDE_INSERTION,
38+
39+
@JsonProperty("aaInsertion")
40+
AMINO_ACID_INSERTION,
3541
}
3642

3743
data class DatabaseFeature(val name: String)

lapis2/src/main/kotlin/org/genspectrum/lapis/config/SequenceFilterFields.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ private fun mapToSequenceFilterFields(databaseMetadata: DatabaseMetadata) = when
3939
"${databaseMetadata.name}From" to SequenceFilterFieldType.FloatFrom(databaseMetadata.name),
4040
"${databaseMetadata.name}To" to SequenceFilterFieldType.FloatTo(databaseMetadata.name),
4141
)
42+
MetadataType.NUCLEOTIDE_INSERTION -> emptyList()
43+
MetadataType.AMINO_ACID_INSERTION -> emptyList()
4244
}
4345

4446
private fun mapToSequenceFilterFieldsFromFeatures(databaseFeature: DatabaseFeature) = when (databaseFeature.name) {

lapis2/src/main/kotlin/org/genspectrum/lapis/controller/LapisController.kt

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ const val AMINO_ACID_MUTATIONS_RESPONSE_SCHEMA = "AminoAcidMutationsResponse"
4242

4343
const val NUCLEOTIDE_MUTATIONS_SCHEMA = "NucleotideMutations"
4444
const val AMINO_ACID_MUTATIONS_SCHEMA = "AminoAcidMutations"
45+
const val NUCLEOTIDE_INSERTIONS_SCHEMA = "NucleotideInsertions"
46+
const val AMINO_ACID_INSERTIONS_SCHEMA = "AminoAcidInsertions"
47+
4548
const val ORDER_BY_FIELDS_SCHEMA = "OrderByFields"
4649
const val LIMIT_SCHEMA = "Limit"
4750
const val OFFSET_SCHEMA = "Offset"
@@ -102,8 +105,10 @@ class LapisController(
102105
@RequestParam
103106
aminoAcidMutations: List<AminoAcidMutation>?,
104107
@RequestParam
108+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
105109
nucleotideInsertions: List<NucleotideInsertion>?,
106110
@RequestParam
111+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
107112
aminoAcidInsertions: List<AminoAcidInsertion>?,
108113
@Parameter(
109114
schema = Schema(ref = "#/components/schemas/$LIMIT_SCHEMA"),
@@ -188,8 +193,10 @@ class LapisController(
188193
@RequestParam
189194
dataFormat: String? = null,
190195
@RequestParam
196+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
191197
nucleotideInsertions: List<NucleotideInsertion>?,
192198
@RequestParam
199+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
193200
aminoAcidInsertions: List<AminoAcidInsertion>?,
194201
): String {
195202
val request = SequenceFiltersRequestWithFields(
@@ -254,8 +261,10 @@ class LapisController(
254261
@RequestParam
255262
dataFormat: String? = null,
256263
@RequestParam
264+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
257265
nucleotideInsertions: List<NucleotideInsertion>?,
258266
@RequestParam
267+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
259268
aminoAcidInsertions: List<AminoAcidInsertion>?,
260269
): String {
261270
val request = SequenceFiltersRequestWithFields(
@@ -296,7 +305,7 @@ class LapisController(
296305
responses = [ApiResponse(responseCode = "200")],
297306
)
298307
fun postAggregatedAsCsv(
299-
@Parameter(schema = Schema(ref = "#/components/schemas/$DETAILS_REQUEST_SCHEMA"))
308+
@Parameter(schema = Schema(ref = "#/components/schemas/$AGGREGATED_REQUEST_SCHEMA"))
300309
@RequestBody
301310
request: SequenceFiltersRequestWithFields,
302311
): String {
@@ -310,7 +319,7 @@ class LapisController(
310319
responses = [ApiResponse(responseCode = "200")],
311320
)
312321
fun postAggregatedAsTsv(
313-
@Parameter(schema = Schema(ref = "#/components/schemas/$DETAILS_REQUEST_SCHEMA"))
322+
@Parameter(schema = Schema(ref = "#/components/schemas/$AGGREGATED_REQUEST_SCHEMA"))
314323
@RequestBody
315324
request: SequenceFiltersRequestWithFields,
316325
): String {
@@ -365,8 +374,10 @@ class LapisController(
365374
@RequestParam
366375
dataFormat: String? = null,
367376
@RequestParam
377+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
368378
nucleotideInsertions: List<NucleotideInsertion>?,
369379
@RequestParam
380+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
370381
aminoAcidInsertions: List<AminoAcidInsertion>?,
371382
): LapisResponse<List<NucleotideMutationResponse>> {
372383
val mutationProportionsRequest = MutationProportionsRequest(
@@ -427,8 +438,10 @@ class LapisController(
427438
@RequestParam
428439
offset: Int? = null,
429440
@RequestParam
441+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
430442
nucleotideInsertions: List<NucleotideInsertion>?,
431443
@RequestParam
444+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
432445
aminoAcidInsertions: List<AminoAcidInsertion>?,
433446
): String {
434447
val request = MutationProportionsRequest(
@@ -487,8 +500,10 @@ class LapisController(
487500
@RequestParam
488501
offset: Int? = null,
489502
@RequestParam
503+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
490504
nucleotideInsertions: List<NucleotideInsertion>?,
491505
@RequestParam
506+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
492507
aminoAcidInsertions: List<AminoAcidInsertion>?,
493508
): String {
494509
val request = MutationProportionsRequest(
@@ -594,8 +609,10 @@ class LapisController(
594609
@RequestParam
595610
offset: Int? = null,
596611
@RequestParam
612+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
597613
nucleotideInsertions: List<NucleotideInsertion>?,
598614
@RequestParam
615+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
599616
aminoAcidInsertions: List<AminoAcidInsertion>?,
600617
): LapisResponse<List<AminoAcidMutationResponse>> {
601618
val mutationProportionsRequest = MutationProportionsRequest(
@@ -656,8 +673,10 @@ class LapisController(
656673
@RequestParam
657674
offset: Int? = null,
658675
@RequestParam
676+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
659677
nucleotideInsertions: List<NucleotideInsertion>?,
660678
@RequestParam
679+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
661680
aminoAcidInsertions: List<AminoAcidInsertion>?,
662681
): String {
663682
val mutationProportionsRequest = MutationProportionsRequest(
@@ -716,8 +735,10 @@ class LapisController(
716735
@RequestParam
717736
offset: Int? = null,
718737
@RequestParam
738+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
719739
nucleotideInsertions: List<NucleotideInsertion>?,
720740
@RequestParam
741+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
721742
aminoAcidInsertions: List<AminoAcidInsertion>?,
722743
): String {
723744
val mutationProportionsRequest = MutationProportionsRequest(
@@ -842,8 +863,10 @@ class LapisController(
842863
@RequestParam
843864
dataFormat: String? = null,
844865
@RequestParam
866+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
845867
nucleotideInsertions: List<NucleotideInsertion>?,
846868
@RequestParam
869+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
847870
aminoAcidInsertions: List<AminoAcidInsertion>?,
848871
): LapisResponse<List<DetailsData>> {
849872
val request = SequenceFiltersRequestWithFields(
@@ -901,8 +924,10 @@ class LapisController(
901924
@RequestParam
902925
offset: Int? = null,
903926
@RequestParam
927+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
904928
nucleotideInsertions: List<NucleotideInsertion>?,
905929
@RequestParam
930+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
906931
aminoAcidInsertions: List<AminoAcidInsertion>?,
907932
): String {
908933
val request = SequenceFiltersRequestWithFields(
@@ -958,8 +983,10 @@ class LapisController(
958983
@RequestParam
959984
offset: Int? = null,
960985
@RequestParam
986+
@Parameter(schema = Schema(ref = "#/components/schemas/$NUCLEOTIDE_INSERTIONS_SCHEMA"))
961987
nucleotideInsertions: List<NucleotideInsertion>?,
962988
@RequestParam
989+
@Parameter(schema = Schema(ref = "#/components/schemas/$AMINO_ACID_INSERTIONS_SCHEMA"))
963990
aminoAcidInsertions: List<AminoAcidInsertion>?,
964991
): String {
965992
val request = SequenceFiltersRequestWithFields(

lapis2/src/main/kotlin/org/genspectrum/lapis/request/AminoAcidInsertion.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ data class AminoAcidInsertion(val position: Int, val gene: String, val insertion
2525
"Invalid amino acid insertion: $aminoAcidInsertion: Did not find gene",
2626
)
2727

28-
val insertions = matchGroups["insertion"]?.value?.replace("?", ".*")
28+
val insertions = matchGroups["insertions"]?.value?.replace("?", ".*")
2929
?: throw IllegalArgumentException(
3030
"Invalid amino acid insertion: $aminoAcidInsertion: Did not find insertions",
3131
)
@@ -41,7 +41,7 @@ data class AminoAcidInsertion(val position: Int, val gene: String, val insertion
4141

4242
private val AMINO_ACID_INSERTION_REGEX =
4343
Regex(
44-
"""^ins_(?<gene>[a-zA-Z0-9_-]+):(?<position>\d+):(?<insertion>[a-zA-Z0-9?_-]+)?$""",
44+
"""^ins_(?<gene>[a-zA-Z0-9_-]+):(?<position>\d+):(?<insertions>(([a-zA-Z?]|(\.\*))+))$""",
4545
)
4646

4747
@JsonComponent

lapis2/src/main/kotlin/org/genspectrum/lapis/request/NucleotideInsertion.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ data class NucleotideInsertion(val position: Int, val insertions: String, val se
3636

3737
private val NUCLEOTIDE_INSERTION_REGEX =
3838
Regex(
39-
"""^ins_((?<segment>[a-zA-Z0-9_-]+)(?=:):)?(?<position>\d+):(?<insertions>[a-zA-Z0-9?_-]+)?$""",
39+
"""^ins_((?<segment>[a-zA-Z0-9_-]+)(?=:):)?(?<position>\d+):(?<insertions>(([a-zA-Z?]|(\.\*))+))$""",
4040
)
4141

4242
@JsonComponent

lapis2/src/test/kotlin/org/genspectrum/lapis/config/DatabaseConfigTest.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class DatabaseConfigTest {
2626
DatabaseMetadata(name = "region", type = MetadataType.STRING),
2727
DatabaseMetadata(name = "country", type = MetadataType.STRING),
2828
DatabaseMetadata(name = "pangoLineage", type = MetadataType.PANGO_LINEAGE),
29+
DatabaseMetadata(name = "nucInsertion", type = MetadataType.NUCLEOTIDE_INSERTION),
30+
DatabaseMetadata(name = "aaInsertion", type = MetadataType.AMINO_ACID_INSERTION),
2931
),
3032
)
3133
assertThat(
@@ -56,6 +58,8 @@ class DatabaseConfigWithoutFeaturesTest {
5658
DatabaseMetadata(name = "region", type = MetadataType.STRING),
5759
DatabaseMetadata(name = "country", type = MetadataType.STRING),
5860
DatabaseMetadata(name = "pangoLineage", type = MetadataType.PANGO_LINEAGE),
61+
DatabaseMetadata(name = "nucInsertion", type = MetadataType.NUCLEOTIDE_INSERTION),
62+
DatabaseMetadata(name = "aaInsertion", type = MetadataType.AMINO_ACID_INSERTION),
5963
),
6064
)
6165
assertThat(underTest.schema.features, `is`(emptyList()))

0 commit comments

Comments
 (0)