diff --git a/package-toolkit/runtime/src/main/kotlin/com/atlan/pkg/serde/cell/CellXformer.kt b/package-toolkit/runtime/src/main/kotlin/com/atlan/pkg/serde/cell/CellXformer.kt index 66174c49b3..7cc503d1eb 100644 --- a/package-toolkit/runtime/src/main/kotlin/com/atlan/pkg/serde/cell/CellXformer.kt +++ b/package-toolkit/runtime/src/main/kotlin/com/atlan/pkg/serde/cell/CellXformer.kt @@ -108,7 +108,7 @@ object CellXformer { } else if (Asset::class.java.isAssignableFrom(type)) { AssetRefXformer.decode(ctx, value, fieldName) } else if (AtlanEnum::class.java.isAssignableFrom(type)) { - EnumXformer.decode(value, type as Class) + EnumXformer.decode(value, type as Class, fieldName) } else if (AtlanStruct::class.java.isAssignableFrom(type)) { StructXformer.decode(ctx.client, value, type as Class) } else if (AtlanTag::class.java.isAssignableFrom(type)) { diff --git a/package-toolkit/runtime/src/main/kotlin/com/atlan/pkg/serde/cell/EnumXformer.kt b/package-toolkit/runtime/src/main/kotlin/com/atlan/pkg/serde/cell/EnumXformer.kt index cbd229a894..6e25e174a9 100644 --- a/package-toolkit/runtime/src/main/kotlin/com/atlan/pkg/serde/cell/EnumXformer.kt +++ b/package-toolkit/runtime/src/main/kotlin/com/atlan/pkg/serde/cell/EnumXformer.kt @@ -12,8 +12,14 @@ object EnumXformer { fun decode( enum: String, enumClass: Class, + fieldName: String, ): AtlanEnum { val method = enumClass.getMethod("fromValue", String::class.java) - return method.invoke(null, enum) as AtlanEnum + val result: Any? = method.invoke(null, enum) + if (result == null) { + throw IllegalArgumentException("$enumClass (in field $fieldName) does not have any matching value for: $enum") + } else { + return result as AtlanEnum + } } } diff --git a/samples/packages/asset-import/src/test/kotlin/com/atlan/pkg/aim/InvalidEnumTest.kt b/samples/packages/asset-import/src/test/kotlin/com/atlan/pkg/aim/InvalidEnumTest.kt new file mode 100644 index 0000000000..cc166fc708 --- /dev/null +++ b/samples/packages/asset-import/src/test/kotlin/com/atlan/pkg/aim/InvalidEnumTest.kt @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: Apache-2.0 + Copyright 2023 Atlan Pte. Ltd. */ +package com.atlan.pkg.aim + +import AssetImportCfg +import com.atlan.model.assets.Connection +import com.atlan.model.assets.Table +import com.atlan.model.enums.AtlanConnectorType +import com.atlan.pkg.PackageTest +import com.atlan.pkg.Utils +import java.nio.file.Paths +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith + +/** + * Test import of an invalid enumerated value. + */ +class InvalidEnumTest : PackageTest("ie") { + override val logger = Utils.getLogger(this.javaClass.name) + + private val table = makeUnique("t1") + + private val testFile = "invalid_enum_value.csv" + + private val files = + listOf( + testFile, + "debug.log", + ) + + private fun prepFile(connectionQN: String) { + // Prepare a copy of the file with unique names for glossaries and tags + val input = Paths.get("src", "test", "resources", testFile).toFile() + val output = Paths.get(testDirectory, testFile).toFile() + input.useLines { lines -> + lines.forEach { line -> + val revised = + line + .replace("{{CONNECTION}}", connectionQN) + .replace("{{TABLE}}", table) + output.appendText("$revised\n") + } + } + } + + override fun setup() { + val snowflakeConnection = Connection.findByName(client, "development", AtlanConnectorType.SNOWFLAKE)?.get(0)!! + prepFile(snowflakeConnection.qualifiedName) + } + + override fun teardown() { + val snowflakeConnection = Connection.findByName(client, "development", AtlanConnectorType.SNOWFLAKE)?.get(0)!! + Table.select(client) + .where(Table.CONNECTION_QUALIFIED_NAME.eq(snowflakeConnection.qualifiedName)) + .where(Table.NAME.eq(table)) + .stream() + .findFirst() + .ifPresent { + Table.purge(client, it.guid) + } + } + + @Test + fun failsWithMeaningfulError() { + val exception = + assertFailsWith { + runCustomPackage( + AssetImportCfg( + assetsFile = Paths.get(testDirectory, testFile).toString(), + assetsUpsertSemantic = "upsert", + assetsFailOnErrors = true, + ), + Importer::main, + ) + } + assertEquals( + """ + class com.atlan.model.enums.CertificateStatus (in field certificateStatus) does not have any matching value for: CERTIFIED + """.trimIndent(), + exception.message, + ) + } + + @Test + fun filesCreated() { + validateFilesExist(files) + } +} diff --git a/samples/packages/asset-import/src/test/resources/invalid_enum_value.csv b/samples/packages/asset-import/src/test/resources/invalid_enum_value.csv new file mode 100644 index 0000000000..587018cce8 --- /dev/null +++ b/samples/packages/asset-import/src/test/resources/invalid_enum_value.csv @@ -0,0 +1,2 @@ +qualifiedName,typeName,name,displayName,description,userDescription,ownerUsers,ownerGroups,certificateStatus,certificateStatusMessage,announcementType,announcementTitle,announcementMessage,assignedTerms,atlanTags,links,readme,starredDetails,connectorType,connectionQualifiedName,databaseQualifiedName,databaseName,schemaQualifiedName,schemaName +{{CONNECTION}}/ANALYTICS/WIDE_WORLD_IMPORTERS/{{TABLE}},Table,{{TABLE}},,,,,,CERTIFIED,,,,,,,,,,snowflake,{{CONNECTION}},{{CONNECTION}}/ANALYTICS,ANALYTICS,{{CONNECTION}}/ANALYTICS/WIDE_WORLD_IMPORTERS,WIDE_WORLD_IMPORTERS