assert inline multiline response
the docs at https://blackfire.io/docs/player/index#visiting-a-page-with-visit mention a request notation using a long inline string:
scenario
visit url('/login')
method 'POST'
body
"""
{
"user": "john",
"password": "doe"
}
"""
we tried using the very same notation for asserting the response body, but were not able to get a result without a syntax error within the config file.
could you describe a small example on how to expect body() using a long multiline response body string?
we tried things like
scenario
visit url('/login')
method 'POST'
body
"""
{
"user": "john",
"password": "doe"
}
"""
expect status_code() == 200
expect body
"""
{
"status": "success"
}
"""
and also tried
scenario
visit url('/login')
method 'POST'
body
"""
{
"user": "john",
"password": "doe"
}
"""
expect status_code() == 200
expect body()
"""
{
"status": "success"
}
"""
.. both dont work
it seems
scenario
visit url('/login')
method 'POST'
body
"""
{
"user": "john",
"password": "doe"
}
"""
expect status_code() == 200
expect body() matches
"""
<?xml version="1.0"?>
<response>
<success>true</success>
</response>
"""
does work.. maybe this should be noted in a example somewhere.
my actual use-case is to assert the wohle response against a string 1:1. the player tells me that the repsonse doesnt match, but since in my example I have a much longer string to test against its pretty unclear where the diff is.
DX wise something like a unified diff would be helpfull
for the full picture please see:
name "A build made of scenario"
# Default endpoint
# Can be override with option "--endpoint=http://newendpoint.com"
endpoint "https://example.com"
scenario
name "Scenario Name"
visit url('/my/url/')
method 'POST'
header "Content-Type: text/xml; charset=utf-8"
header "Accept: application/xml"
body
"""
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<uni_request>
<currency>SEK</currency>
<customer>
<business_party_id>30111</business_party_id>
<business_party_type>DEALER</business_party_type>
</customer>
<articles>
<article>
<article_name>8009</article_name>
<quantity_total>30</quantity_total>
<skus>
<sku>
<!-- 8009 - black - S -->
<skuid>102818</skuid>
<quantity>10</quantity>
</sku>
<sku>
<!-- 8009 - brown - M -->
<skuid>102829</skuid>
<quantity>10</quantity>
</sku>
<sku>
<!-- 8009 - cobalt - XL -->
<skuid>102841</skuid>
<quantity>10</quantity>
</sku>
</skus>
</article>
<article>
<article_name>8010</article_name>
<quantity_total>150</quantity_total>
<skus>
<sku>
<!-- 8010 - black-heather - XL -->
<skuid>102941</skuid>
<quantity>50</quantity>
</sku>
<sku>
<!-- 8010 - fern-green - M -->
<skuid>102964</skuid>
<quantity>70</quantity>
</sku>
<sku>
<!-- 8010 - light-yellow - S -->
<skuid>102988</skuid>
<quantity>30</quantity>
</sku>
</skus>
</article>
</articles>
</uni_request>
"""
expect status_code() == 200
expect body() ==
"""
<?xml version="1.0"?>
<response>
<currency>SEK</currency>
<articles>
<article xmlns="">
<article_name xmlns="">8009</article_name>
<quantity_total xmlns="">30</quantity_total>
<skus xmlns="">
<sku xmlns="">
<skuid xmlns="">102818</skuid>
<quantity xmlns="">10</quantity>
<preis xmlns="">57.20</preis>
<preis_eur xmlns="">5.20</preis_eur>
</sku>
<sku xmlns="">
<skuid xmlns="">102829</skuid>
<quantity xmlns="">10</quantity>
<preis xmlns="">57.20</preis>
<preis_eur xmlns="">5.20</preis_eur>
</sku>
<sku xmlns="">
<skuid xmlns="">102841</skuid>
<quantity xmlns="">10</quantity>
<preis xmlns="">57.20</preis>
<preis_eur xmlns="">5.20</preis_eur>
</sku>
</skus>
</article>
<article xmlns="">
<article_name xmlns="">8010</article_name>
<quantity_total xmlns="">150</quantity_total>
<skus xmlns="">
<sku xmlns="">
<skuid xmlns="">102941</skuid>
<quantity xmlns="">50</quantity>
<preis xmlns="">57.20</preis>
<preis_eur xmlns="">5.20</preis_eur>
</sku>
<sku xmlns="">
<skuid xmlns="">102964</skuid>
<quantity xmlns="">70</quantity>
<preis xmlns="">57.20</preis>
<preis_eur xmlns="">5.20</preis_eur>
</sku>
<sku xmlns="">
<skuid xmlns="">102988</skuid>
<quantity xmlns="">30</quantity>
<preis xmlns="">57.20</preis>
<preis_eur xmlns="">5.20</preis_eur>
</sku>
</skus>
</article>
</articles>
<timestamp>1575621303</timestamp>
<success>true</success>
</response>
"""
and the blackfire run results in
tests/rest$ blackfire-player run scenario.bkf --ssl-no-verify --json
Blackfire Player
Scenario "Scenario Name"
Failure on step defined in scenario.bkf at line 10
└ Expectation "body() == '<?xml version="1.0"?>\n<response>\n <currency>SEK</currency>\n <articles>\n <article xmlns="">\n <article_name xmlns="">8009</article_name>\n <quantity_total xmlns="">30</quantity_total>\n <skus xmlns="">\n <sku xmlns="">\n <skuid xmlns="">102818</skuid>\n <quantity xmlns="">10</quantity>\n <preis xmlns="">57.20</preis>\n <preis_eur xmlns="">5.20</preis_eur>\n </sku>\n <sku xmlns="">\n <skuid xmlns="">102829</skuid>\n <quantity xmlns="">10</quantity>\n <preis xmlns="">57.20</preis>\n <preis_eur xmlns="">5.20</preis_eur>\n </sku>\n <sku xmlns="">\n <skuid xmlns="">102841</skuid>\n <quantity xmlns="">10</quantity>\n <preis xmlns="">57.20</preis>\n <preis_eur xmlns="">5.20</preis_eur>\n </sku>\n </skus>\n </article>\n <article xmlns="">\n <article_name xmlns="">8010</article_name>\n <quantity_total xmlns="">150</quantity_total>\n <skus xmlns="">\n <sku xmlns="">\n <skuid xmlns="">102941</skuid>\n <quantity xmlns="">50</quantity>\n <preis xmlns="">57.20</preis>\n <preis_eur xmlns="">5.20</preis_eur>\n </sku>\n <sku xmlns="">\n <skuid xmlns="">102964</skuid>\n <quantity xmlns="">70</quantity>\n <preis xmlns="">57.20</preis>\n <preis_eur xmlns="">5.20</preis_eur>\n </sku>\n <sku xmlns="">\n <skuid xmlns="">102988</skuid>\n <quantity xmlns="">30</quantity>\n <preis xmlns="">57.20</preis>\n <preis_eur xmlns="">5.20</preis_eur>\n </sku>\n </skus>\n </article>\n </articles>\n <timestamp>1575621303</timestamp>\n true\n</response>'" failed.
└ body() = "<?xml version=\"1.0\"?>
<response>
<currency>SEK</currency>
<articles>
<article xmlns=\"\">
<article_name xmlns=\"\">8009</article_name>
<quantity_total xmlns=\"\">30</quantity_total>
<skus xmlns=\"\">
<sku xmlns=\"\">
<skuid xmlns=\"\">102818</skuid>
<quantity xmlns=\"\">10</quantity>
<preis xmlns=\"\">57.20</preis>
<preis_eur xmlns=\"\">5.20</preis_eur>
</sku>
<sku xmlns=\"\">
<skuid xmlns=\"\">102829</skuid>
<quantity xmlns=\"\">10</quantity>
<preis xmlns=\"\">57.20</preis>
<preis_eur xmlns=\"\">5.20</preis_eur>
</sku>
<sku xmlns=\"\">
<skuid xmlns=\"\">102841</skuid>
<quantity xmlns=\"\">10</quantity>
<preis xmlns=\"\">57.20</preis>
<preis_eur xmlns=\"\">5.20</preis_eur>
</sku>
</skus>
</article>
<article xmlns=\"\">
<article_name xmlns=\"\">8010</article_name>
<quantity_total xmlns=\"\">150</quantity_total>
<skus xmlns=\"\">
<sku xmlns=\"\">
<skuid xmlns=\"\">102941</skuid>
<quantity xmlns=\"\">50</quantity>
<preis xmlns=\"\">57.20</preis>
<preis_eur xmlns=\"\">5.20</preis_eur>
</sku>
<sku xmlns=\"\">
<skuid xmlns=\"\">102964</skuid>
<quantity xmlns=\"\">70</quantity>
<preis xmlns=\"\">57.20</preis>
<preis_eur xmlns=\"\">5.20</preis_eur>
</sku>
<sku xmlns=\"\">
<skuid xmlns=\"\">102988</skuid>
<quantity xmlns=\"\">30</quantity>
<preis xmlns=\"\">57.20</preis>
<preis_eur xmlns=\"\">5.20</preis_eur>
</sku>
</skus>
</article>
</articles>
<timestamp>1575623832</timestamp>
true
</response>
"
KO Scenarios 1 - Steps 1 - Failures 1
{
"name": "\"A build made of scenario\"",
"results": [
{
"scenario": "\"Scenario Name\"",
"values": [],
"error": {
"message": "Expectation \"body() == '<?xml version=\"1.0\"?>\\n<response>\\n <currency>SEK</currency>\\n <articles>\\n <article xmlns=\"\">\\n <article_name xmlns=\"\">8009</article_name>\\n <quantity_total xmlns=\"\">30</quantity_total>\\n <skus xmlns=\"\">\\n <sku xmlns=\"\">\\n <skuid xmlns=\"\">102818</skuid>\\n <quantity xmlns=\"\">10</quantity>\\n <preis xmlns=\"\">57.20</preis>\\n <preis_eur xmlns=\"\">5.20</preis_eur>\\n </sku>\\n <sku xmlns=\"\">\\n <skuid xmlns=\"\">102829</skuid>\\n <quantity xmlns=\"\">10</quantity>\\n <preis xmlns=\"\">57.20</preis>\\n <preis_eur xmlns=\"\">5.20</preis_eur>\\n </sku>\\n <sku xmlns=\"\">\\n <skuid xmlns=\"\">102841</skuid>\\n <quantity xmlns=\"\">10</quantity>\\n <preis xmlns=\"\">57.20</preis>\\n <preis_eur xmlns=\"\">5.20</preis_eur>\\n </sku>\\n </skus>\\n </article>\\n <article xmlns=\"\">\\n <article_name xmlns=\"\">8010</article_name>\\n <quantity_total xmlns=\"\">150</quantity_total>\\n <skus xmlns=\"\">\\n <sku xmlns=\"\">\\n <skuid xmlns=\"\">102941</skuid>\\n <quantity xmlns=\"\">50</quantity>\\n <preis xmlns=\"\">57.20</preis>\\n <preis_eur xmlns=\"\">5.20</preis_eur>\\n </sku>\\n <sku xmlns=\"\">\\n <skuid xmlns=\"\">102964</skuid>\\n <quantity xmlns=\"\">70</quantity>\\n <preis xmlns=\"\">57.20</preis>\\n <preis_eur xmlns=\"\">5.20</preis_eur>\\n </sku>\\n <sku xmlns=\"\">\\n <skuid xmlns=\"\">102988</skuid>\\n <quantity xmlns=\"\">30</quantity>\\n <preis xmlns=\"\">57.20</preis>\\n <preis_eur xmlns=\"\">5.20</preis_eur>\\n </sku>\\n </skus>\\n </article>\\n </articles>\\n <timestamp>1575621303</timestamp>\\n true\\n</response>'\" failed.",
"code": 0
}
}
],
"message": "Some expectation failed",
"code": 64,
"success": true,
"input": {
"path": "scenario.bkf",
"content": "name \"A build made of scenario\"\n\n# Default endpoint\n# Can be override with option \"--endpoint=http://newendpoint.com\"\nendpoint \"https://example.com/\"\n\nscenario\n name \"Scenario Name\"\n\n visit url('/uni/post/')\n method 'POST'\n header \"Content-Type: text/xml; charset=utf-8\"\n header \"Accept: application/xml\"\n body\n \"\"\"\n <?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n <uni_request>\n <currency>SEK</currency>\n <customer>\n <business_party_id>30111</business_party_id>\n <business_party_type>DEALER</business_party_type>\n </customer>\n <articles>\n <article>\n <article_name>8009</article_name>\n <quantity_total>30</quantity_total>\n <skus>\n <sku>\n <!-- 8009 - black - S -->\n <skuid>102818</skuid>\n <quantity>10</quantity>\n </sku>\n <sku>\n <!-- 8009 - brown - M -->\n <skuid>102829</skuid>\n <quantity>10</quantity>\n </sku>\n <sku>\n <!-- 8009 - cobalt - XL -->\n <skuid>102841</skuid>\n <quantity>10</quantity>\n </sku>\n </skus>\n </article>\n <article>\n <article_name>8010</article_name>\n <quantity_total>150</quantity_total>\n <skus>\n <sku>\n <!-- 8010 - black-heather - XL -->\n <skuid>102941</skuid>\n <quantity>50</quantity>\n </sku>\n <sku>\n <!-- 8010 - fern-green - M -->\n <skuid>102964</skuid>\n <quantity>70</quantity>\n </sku>\n <sku>\n <!-- 8010 - light-yellow - S -->\n <skuid>102988</skuid>\n <quantity>30</quantity>\n </sku>\n </skus>\n </article>\n </articles>\n </uni_request>\n \"\"\"\n expect status_code() == 200\n expect body() ==\n \"\"\"\n <?xml version=\"1.0\"?>\n <response>\n <currency>SEK</currency>\n <articles>\n <article xmlns=\"\">\n <article_name xmlns=\"\">8009</article_name>\n <quantity_total xmlns=\"\">30</quantity_total>\n <skus xmlns=\"\">\n <sku xmlns=\"\">\n <skuid xmlns=\"\">102818</skuid>\n <quantity xmlns=\"\">10</quantity>\n <preis xmlns=\"\">57.20</preis>\n <preis_eur xmlns=\"\">5.20</preis_eur>\n </sku>\n <sku xmlns=\"\">\n <skuid xmlns=\"\">102829</skuid>\n <quantity xmlns=\"\">10</quantity>\n <preis xmlns=\"\">57.20</preis>\n <preis_eur xmlns=\"\">5.20</preis_eur>\n </sku>\n <sku xmlns=\"\">\n <skuid xmlns=\"\">102841</skuid>\n <quantity xmlns=\"\">10</quantity>\n <preis xmlns=\"\">57.20</preis>\n <preis_eur xmlns=\"\">5.20</preis_eur>\n </sku>\n </skus>\n </article>\n <article xmlns=\"\">\n <article_name xmlns=\"\">8010</article_name>\n <quantity_total xmlns=\"\">150</quantity_total>\n <skus xmlns=\"\">\n <sku xmlns=\"\">\n <skuid xmlns=\"\">102941</skuid>\n <quantity xmlns=\"\">50</quantity>\n <preis xmlns=\"\">57.20</preis>\n <preis_eur xmlns=\"\">5.20</preis_eur>\n </sku>\n <sku xmlns=\"\">\n <skuid xmlns=\"\">102964</skuid>\n <quantity xmlns=\"\">70</quantity>\n <preis xmlns=\"\">57.20</preis>\n <preis_eur xmlns=\"\">5.20</preis_eur>\n </sku>\n <sku xmlns=\"\">\n <skuid xmlns=\"\">102988</skuid>\n <quantity xmlns=\"\">30</quantity>\n <preis xmlns=\"\">57.20</preis>\n <preis_eur xmlns=\"\">5.20</preis_eur>\n </sku>\n </skus>\n </article>\n </articles>\n <timestamp>1575621303</timestamp>\n true\n </response>\n \"\"\"\n"
}
}
it feels pretty hard to tell where the difference between expected and actual response is and also how to properly read the overall output, because of the huge payloads contained.
also it seems there might be a problem regarding escaping newlines and/or escaping of double quotes, maybe also indent spacing. we cannot tell for sure, because we can't figured it out based on our tests or the testoutput.