Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type" : "bugfix",
"description" : "Gracefully handle additional fields in Amazon Q /dev code generation result without throwing errors"
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

package software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util

import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import com.intellij.openapi.project.Project
Expand Down Expand Up @@ -37,6 +38,9 @@ import software.aws.toolkits.telemetry.Result
private val logger = getLogger<FeatureDevClient>()

class FeatureDevService(val proxyClient: FeatureDevClient, val project: Project) {
private val objectMapper = jacksonObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

fun createConversation(): String {
val startTime = System.currentTimeMillis()
var failureReason: String? = null
Expand Down Expand Up @@ -238,7 +242,7 @@ class FeatureDevService(val proxyClient: FeatureDevClient, val project: Project)
val parsedResult: ExportTaskAssistResultArchiveStreamResult
try {
val result = exportResponse.reduce { acc, next -> acc + next } // To map the result it is needed to combine the full byte array
parsedResult = jacksonObjectMapper().readValue(result)
parsedResult = objectMapper.readValue(result)
} catch (e: Exception) {
logger.error(e) { "Failed to parse downloaded code results" }
throw ExportParseException(operation = FeatureDevOperation.ExportTaskAssistArchiveResult.toString(), desc = null, e.cause)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,23 @@ class FeatureDevServiceTest : FeatureDevTestBase() {
}.isExactlyInstanceOf(ExportParseException::class.java)
}

@Test
fun `test exportTaskAssistArchiveResult ignore extra fields in the response`() {
runTest {
val codeGenerationJson = "{" +
"\"code_generation_result\":{\"new_file_contents\":{\"test.ts\":\"contents\"},\"deleted_files\":[],\"references\":[],\"extra_filed\":[]}" +
"}"

whenever(featureDevClient.exportTaskAssistResultArchive(testConversationId)).thenReturn(mutableListOf(codeGenerationJson.toByteArray()))

val actual = featureDevService.exportTaskAssistArchiveResult(testConversationId)
assertThat(actual).isInstanceOf(CodeGenerationStreamResult::class.java)
assertThat(actual.new_file_contents).isEqualTo(mapOf(Pair("test.ts", "contents")))
assertThat(actual.deleted_files).isEqualTo(emptyList<String>())
assertThat(actual.references).isEqualTo(emptyList<CodeReferenceGenerated>())
}
}

@Test
fun `test exportTaskAssistArchiveResult returns correct parsed result`() =
runTest {
Expand Down
Loading