import test from "node:test"
import assert from "node:assert/strict"
const loadErrorHandler = () => import(new URL("../../lib/error-handler.ts", import.meta.url).href)
test("getServiceErrorMessage prefers a specific error code over UnknownError", async () => {
const { getServiceErrorMessage } = await loadErrorHandler()
const error = {
name: "UnknownError",
message: "UnknownError",
Error: {
Code: "InvalidBucketName",
Message: "The specified bucket is not valid.",
},
}
assert.equal(getServiceErrorMessage(error), "InvalidBucketName")
})
test("getServiceErrorMessage falls back to a specific nested message when the code is generic", async () => {
const { getServiceErrorMessage } = await loadErrorHandler()
const error = {
name: "UnknownError",
message: "UnknownError",
Error: {
Code: "UnknownError",
Message: "Bucket names cannot contain Chinese characters.",
},
}
assert.equal(getServiceErrorMessage(error), "Bucket names cannot contain Chinese characters.")
})
test("getServiceErrorMessage keeps plain Error messages intact", async () => {
const { getServiceErrorMessage } = await loadErrorHandler()
assert.equal(getServiceErrorMessage(new Error("network timeout")), "network timeout")
})
test("getXmlErrorMessage extracts an error code when the XML has no message", async () => {
const { getXmlErrorMessage } = await loadErrorHandler()
const xml = 'InvalidBucketName'
assert.equal(getXmlErrorMessage(xml), "InvalidBucketName")
})
test("getXmlErrorMessage prefers detailed XML messages over generic error codes", async () => {
const { getXmlErrorMessage } = await loadErrorHandler()
const xml =
'AccessDeniedObject is under COMPLIANCE retention and cannot be deleted until 2026-05-13T00:00:00Z'
assert.equal(
getXmlErrorMessage(xml),
"Object is under COMPLIANCE retention and cannot be deleted until 2026-05-13T00:00:00Z",
)
})