встроенное выражение не заменено должным образом в комплексе JSON - PullRequest
0 голосов
/ 16 мая 2018

В тесте каратэ - мы можем заменить встроенное выражение для одного ключа в json. но при попытке заменить в сложном ключе JSON он не работает

Ввод JSON:

    {
    "integration": {
        "serviceData": {
            "integrationService": {
                "name": "#(integrationName)",
                "description": "#(tenantID)",
                "serviceData": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\n  <block type=\"start_block\" id=\"foOIiCF5aZGnie1GzBDB\" deletable=\"false\" x=\"150\" y=\"25\">\n    <field name=\"ORCH_NAME\">Add2NumDocInputs</field>\n    <field name=\"SVC_SIGNATURE\">{\"sig_in\":{\"rec_ref\":\"fld_[#(tenantID)]_stage00.documenttypes:sum2\",\"field_type\":\"recref\",\"node_type\":\"record\",\"field_dim\":\"0\"},\"sig_out\":{\"field_type\":\"record\",\"node_type\":\"record\",\"field_dim\":\"0\"}}</field>\n    <field name=\"AUDIT_SETTINGS\"></field>\n    <statement name=\"ADD_BLOCKS\">\n      <block type=\"service_block_math\" id=\"aUqb0MAozTHQFuHj5rma\">\n        <field name=\"SERVICE\">pub.math:addInts</field>\n        <field name=\"SERVICE_DESC_FIELD\"></field>\n        <field name=\"SERVICE_DETAILS\">{\"service\":\"pub.math:addInts\",\"map\":[{\"sourcePath\":\"/n2;1;0\",\"targetPath\":\"/num2;1;0\"},{\"sourcePath\":\"/n1;1;0\",\"targetPath\":\"/num1;1;0\"}]}</field>\n      </block>\n    </statement>\n  </block>\n</xml>"
            }
        }
    }
}

В приведенном выше json 'tenantID' - это ключ, переданный из контрольного примера. 'tenantID' заменен правильно для ключа 'description' в json. Но он не заменяется на ключ 'serviceData'

Пожалуйста, предложите какое-нибудь решение. Заранее спасибо

1 Ответ

0 голосов
/ 16 мая 2018

РЕДАКТИРОВАТЬ: после публикации очень длинного ответа (см. Конец / вторую часть этого ответа) я понял, что для вас есть очень простое решение, использующее синтаксис каратэ replace:

* def integrationName = 'hello'
* def tenantID = 'world'
* def json =
"""
{
    "integration": {
        "serviceData": {
            "integrationService": {
                "name": "#(integrationName)",
                "description": "#(tenantID)",
                "serviceData": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\n  <block type=\"start_block\" id=\"foOIiCF5aZGnie1GzBDB\" deletable=\"false\" x=\"150\" y=\"25\">\n    <field name=\"ORCH_NAME\">Add2NumDocInputs</field>\n    <field name=\"SVC_SIGNATURE\">{\"sig_in\":{\"rec_ref\":\"fld_[<tenantID>]_stage00.documenttypes:sum2\",\"field_type\":\"recref\",\"node_type\":\"record\",\"field_dim\":\"0\"},\"sig_out\":{\"field_type\":\"record\",\"node_type\":\"record\",\"field_dim\":\"0\"}}</field>\n    <field name=\"AUDIT_SETTINGS\"></field>\n    <statement name=\"ADD_BLOCKS\">\n      <block type=\"service_block_math\" id=\"aUqb0MAozTHQFuHj5rma\">\n        <field name=\"SERVICE\">pub.math:addInts</field>\n        <field name=\"SERVICE_DESC_FIELD\"></field>\n        <field name=\"SERVICE_DETAILS\">{\"service\":\"pub.math:addInts\",\"map\":[{\"sourcePath\":\"/n2;1;0\",\"targetPath\":\"/num2;1;0\"},{\"sourcePath\":\"/n1;1;0\",\"targetPath\":\"/num1;1;0\"}]}</field>\n      </block>\n    </statement>\n  </block>\n</xml>"
            }
        }
    }
}
"""
* replace json.tenantID = tenantID
* match json == 
"""
{
    "integration": {
        "serviceData": {
            "integrationService": {
                "name": "hello",
                "description": "world",
                "serviceData": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\n  <block type=\"start_block\" id=\"foOIiCF5aZGnie1GzBDB\" deletable=\"false\" x=\"150\" y=\"25\">\n    <field name=\"ORCH_NAME\">Add2NumDocInputs</field>\n    <field name=\"SVC_SIGNATURE\">{\"sig_in\":{\"rec_ref\":\"fld_[world]_stage00.documenttypes:sum2\",\"field_type\":\"recref\",\"node_type\":\"record\",\"field_dim\":\"0\"},\"sig_out\":{\"field_type\":\"record\",\"node_type\":\"record\",\"field_dim\":\"0\"}}</field>\n    <field name=\"AUDIT_SETTINGS\"></field>\n    <statement name=\"ADD_BLOCKS\">\n      <block type=\"service_block_math\" id=\"aUqb0MAozTHQFuHj5rma\">\n        <field name=\"SERVICE\">pub.math:addInts</field>\n        <field name=\"SERVICE_DESC_FIELD\"></field>\n        <field name=\"SERVICE_DETAILS\">{\"service\":\"pub.math:addInts\",\"map\":[{\"sourcePath\":\"/n2;1;0\",\"targetPath\":\"/num2;1;0\"},{\"sourcePath\":\"/n1;1;0\",\"targetPath\":\"/num1;1;0\"}]}</field>\n      </block>\n    </statement>\n  </block>\n</xml>"
            }
        }
    }
}
"""

РЕДАКТИРОВАТЬ: это был оригинальный ответ (ниже), оставленный здесь, так как он может быть полезен в качестве ссылки.

Ух ты, я могу сказать, что это ужасная комбинация XML и JSON. У встроенных выражений есть правило, они должны быть строками, которые начинаются с #(

Так что вам нужно разделить ваш поток на что-то вроде этого. Это сложно из-за вашей полезной нагрузки. Не из-за каратэ:)

* def integrationName = 'hello'
* def tenantID = 'world'
* def recRef = 'fld_[' + tenantID + ']_stage00.documenttypes:sum2'
# by the way this is also possible as an embedded expression #('fld_[' + tenantID + ']_stage00.documenttypes:sum2')
* string signature = {"sig_in":{"rec_ref":"#(recRef)","field_type":"recref","node_type":"record","field_dim":"0"},"sig_out":{"field_type":"record","node_type":"record","field_dim":"0"}}
* def xml = 
"""
<xml xmlns="http://www.w3.org/1999/xhtml">
  <block type="start_block" id="foOIiCF5aZGnie1GzBDB" deletable="false" x="150" y="25">
    <field name="ORCH_NAME">Add2NumDocInputs</field>
    <field name="SVC_SIGNATURE">#(signature)</field>
    <field name="AUDIT_SETTINGS"></field>
    <statement name="ADD_BLOCKS">
      <block type="service_block_math" id="aUqb0MAozTHQFuHj5rma">
        <field name="SERVICE">pub.math:addInts</field>
        <field name="SERVICE_DESC_FIELD"></field>
        <field name="SERVICE_DETAILS">{"service":"pub.math:addInts","map":[{"sourcePath":"/n2;1;0","targetPath":"/num2;1;0"},{"sourcePath":"/n1;1;0","targetPath":"/num1;1;0"}]}</field>
      </block>
    </statement>
  </block>
</xml>
"""
* xmlstring xml = xml
* def json = 
"""
{
    "integration": {
        "serviceData": {
            "integrationService": {
                "name": "#(integrationName)",
                "description": "#(tenantID)",
                "serviceData": "#(xml)"
            }
        }
    }
}
"""
* match json ==
"""
{
    "integration": {
        "serviceData": {
            "integrationService": {
                "name": "hello",
                "description": "world",
                "serviceData": "#string"
            }
        }
    }
}
"""
* match json.integration.serviceData.integrationService.serviceData contains '"rec_ref":"fld_[world]_stage00.documenttypes:sum2"'

Пожалуйста, прочтите также документацию по преобразованию типов: https://github.com/intuit/karate#type-conversion

...