{"record":{"id":"2c4189999352f737","repo":"karatelabs/karate","slug":"embed-part-role-needs-data-path-or-url","errorCode":null,"errorMessage":"embed(): part '{role}' needs 'data', 'path', or 'url'","messagePattern":"embed\\(\\): part '(.+?)' needs 'data', 'path', or 'url'","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"karate-core/src/main/java/io/karatelabs/core/KarateJsBase.java","lineNumber":547,"sourceCode":"            if (roleObj == null) {\n                throw new RuntimeException(\"embed(): each part needs a 'role'\");\n            }\n            String role = roleObj.toString();\n            String mime = pm.get(\"mime\") != null ? pm.get(\"mime\").toString() : null;\n            Object url = pm.get(\"url\");\n            if (url != null) {\n                parts.add(new StepResult.Part(role, mime, url.toString()));\n                continue;\n            }\n            byte[] bytes;\n            Object dataObj = pm.get(\"data\");\n            Object pathObj = pm.get(\"path\");\n            if (dataObj != null) {\n                bytes = KarateJsUtils.convertToBytes(unwrapJs(dataObj));\n            } else if (pathObj != null) {\n                bytes = readPathBytes(pathObj.toString());\n            } else {\n                throw new RuntimeException(\"embed(): part '\" + role + \"' needs 'data', 'path', or 'url'\");\n            }\n            parts.add(new StepResult.Part(role, mime != null ? mime : KarateJsUtils.detectMimeType(bytes), bytes));\n        }\n        Object meta = map.get(\"meta\");\n        @SuppressWarnings(\"unchecked\")\n        Map<String, Object> metaMap = meta instanceof Map ? (Map<String, Object>) meta : null;\n        return new StepResult.Embed(name, parts, metaMap);\n    }\n\n    /** Read an embed part's {@code path} (this:/classpath:/file:/relative) into bytes. */\n    private byte[] readPathBytes(String path) {\n        try (java.io.InputStream is = getCurrentResource().resolve(path).getStream()) {\n            return is.readAllBytes();\n        } catch (Exception e) {\n            throw new RuntimeException(\"embed(): failed to read part path '\" + path + \"': \" + e.getMessage(), e);\n        }\n    }\n","sourceCodeStart":529,"sourceCodeEnd":565,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-core/src/main/java/io/karatelabs/core/KarateJsBase.java#L529-L565","documentation":"A multipart embed part must provide content via one of 'data' (bytes/string), 'path' (file path), or 'url'. Karate throws this naming the part's role when none of these keys are present, since there is no content to attach to the report.","triggerScenarios":"karate.embed({parts: [{role: 'log', mime: 'text/plain'}]}) — a role-only object with no data/path/url; dynamic parts where the content key was mistyped (e.g. 'bytes' or 'file' instead of data/path).","commonSituations":"Typos in content keys when building embed maps; parts created from templates where the data field failed to resolve; expecting a role-only entry to act as a header/metadata row.","solutions":["Add one of data, path, or url to every part: {role: 'image', path: 'shot.png'}, {role: 'log', data: text}, or {role: 'remote', url: 'https://...'}.","Check for misspelled keys (bytes/file/source are not recognized).","If the content is unavailable, either drop the part or embed a placeholder so the parts array stays valid."],"exampleFix":"// before\nkarate.embed({ parts: [{ role: 'log', mime: 'text/plain' }] });\n\n// after\nkarate.embed({ parts: [{ role: 'log', mime: 'text/plain', data: 'step log text' }] });","handlingStrategy":"validation","validationCode":"if (parts.some(function(p){ return p.data == null && p.path == null && p.url == null; })) { throw new Error('part needs data, path, or url'); }","typeGuard":"function hasContent(p) { return p != null && (p.data != null || p.path != null || p.url != null); }","tryCatchPattern":"try { karate.embed({ parts: parts }); } catch (e) { if (String(e.message).includes(\"needs 'data', 'path', or 'url'\")) { karate.log('embed part has no content: ' + e.message); } throw e; }","preventionTips":["Ensure every part carries data, path, or url","Avoid key typos: bytes/file/source are not valid content keys","Validate parts programmatically before embedding"],"tags":["javascript","validation","embed","reporting","karate"],"backgroundTag":"missing-required-argument","analyzedSha":"a22eb90246d958d15a47bf436693d0121ad2812d","analyzedAt":"2026-09-12T09:01:00.220Z","contentChangedAt":"2026-09-12T09:01:00.220Z","schemaVersion":2},"datasetVersion":"2026-09-16T19:17:19.609Z"}