Re: [EXTERNAL] Re: %test:assertXPath help

"Harris, Bernard T. \(GSFC-5870\) via Exist-open" <[email protected]>
Newsgroups gmane.text.xml.exist
Message-ID <[email protected]>
That's what I originally tried.  I changed the code back and get

<testsuites>
    <testsuite package="http://www.w3.org/2005/xquery-local-functions" timestamp="2023-03-14T13:50:22.852-04:00" tests="1" failures="1" errors="0" pending="0" time="PT0.003S">
        <testcase name="errorHtml" class="local:errorHtml">
            <failure message="assertXPath failed." type="failure-error-code-1">$result//html</failure>
            <output>
                <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
                    <head>
                        <title>Bad Request</title>
                    </head>
                    <body>
                        <p class="ErrorMessage">
                            <b>Message: </b>Bad Request</p>
                        <p class="ErrorDescription">
                            <b>Description: </b>Invalid ResourceID</p>
                    </body>
                </html>
            </output>
        </testcase>
    </testsuite>
</testsuites>

Do you have any other ideas?  Thanks.

Bernie

From: Joe Wicentowski <[email protected]>
Date: Tuesday, March 14, 2023 at 1:00 PM
To: "Harris, Bernard T. (GSFC-5870)" <[email protected]>
Cc: "[email protected]" <[email protected]>
Subject: [EXTERNAL] Re: [Exist-open] %test:assertXPath help

Hi Bernie,

I've just had a look at the XQSuite source where %assertXPath annotations are processed (https://gcc02.safelinks.protection.outlook.com/?url=https://github.com/eXist-db/exist/blob/develop/exist-core/src/main/resources/org/exist/xquery/lib/xqsuite/xqsuite.xql#L944-L992&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514332470|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=ITdkPxaexxeE3xqBqSVGuOC2OmKOFq6RjMeRgmvoAFQ=&reserved=0). It appears to me that XQSuite dynamically constructs namespace declarations based on the in-scope namespaces in the return value of the function. 

So if your function's return value contained an HTML element with namespace prefix bindings, like:

  <html:html xmlns:html="https://gcc02.safelinks.protection.outlook.com/?url=http://www.w3.org/1999/xhtml&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=oZctXzxHQ3W+XkWhuDkn/cligiXBNykhy67+BD7R+3k=&reserved=0">

... XQSuite would dynamically create the following namespace declaration:

  declare namespace xhtml='https://gcc02.safelinks.protection.outlook.com/?url=http://www.w3.org/1999/xhtml&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=oZctXzxHQ3W+XkWhuDkn/cligiXBNykhy67+BD7R+3k=&reserved=0';

... which would be prepended to your %assertXPath annotation and evaluated. 

Since your function's return value doesn't associate <html> with any namespace prefix - only a namespace URI - then you should construct your %assertXPath annotations with the expectation that elements have a default namespace of "https://gcc02.safelinks.protection.outlook.com/?url=http://www.w3.org/1999/xhtml&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=oZctXzxHQ3W+XkWhuDkn/cligiXBNykhy67+BD7R+3k=&reserved=0". 

Thus I would suggest that you try modifying your %assertXPath annotations to be:

  %test:assertXPath("$result//html")
  %test:assertXPath("$result//html/head[title = 'Bad Request']")
  %test:assertXPath("$result/html/body/p[@class = 'ErrorMessage']")

I haven't tested this myself, so if you give this a try, could you let us know the result?

If we confirm that my hunch is correct, then we could supply some additional hints in the documentation for this annotation at https://gcc02.safelinks.protection.outlook.com/?url=https://exist-db.org/exist/apps/doc/xqsuite#annotations&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=RT7os5HKMQtvqb0XmDSSrYDlRFsSnaGS4fXMOE9ISxY=&reserved=0.

Thanks!
Joe

On Tue, Mar 14, 2023 at 8:52 AM Harris, Bernard T. (GSFC-5870) via Exist-open <mailto:[email protected]> wrote:
No matter what I do, I cannot get a useful (more than "$result") %:assertXPath to work in this case

xquery version "3.1";

import module namespace inspect="https://gcc02.safelinks.protection.outlook.com/?url=http://exist-db.org/xquery/inspection&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=KNfQpepOm8OabDBKGh9SuD+fNhm5Wq5ZQ0qhRz8e66s=&reserved=0";
import module namespace test="https://gcc02.safelinks.protection.outlook.com/?url=http://exist-db.org/xquery/xqsuite&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=taWxbBzutRB6d2qCdeLsokylN0mmLUa41U0NXa4vquM=&reserved=0" 
at "resource:org/exist/xquery/lib/xqsuite/xqsuite.xql";

declare namespace xhtml = "https://gcc02.safelinks.protection.outlook.com/?url=http://www.w3.org/1999/xhtml&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=oZctXzxHQ3W+XkWhuDkn/cligiXBNykhy67+BD7R+3k=&reserved=0";

declare
    %test:arg("error", "Bad Request")
    %test:arg("description", "Invalid ResourceID")
    %test:arg("extraHtml")
        %test:assertXPath("$result//*:html")
    (: 
        %test:assertXPath("$result//*:html/*:head[*:title = 'Bad Request']")
        %test:assertXPath("$result/xhtml:html/xhtml:body/xhtml:p[@class = 'ErrorMessage']")
    :)
function local:errorHtml(
    $error as xs:string,
    $description as xs:string,
    $extraHtml as node()?)
as node()
{
    let $result := 
        <html xmlns="https://gcc02.safelinks.protection.outlook.com/?url=http://www.w3.org/1999/xhtml&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=oZctXzxHQ3W+XkWhuDkn/cligiXBNykhy67+BD7R+3k=&reserved=0" lang="en" xml:lang="en">
            <head>
                <title>{$error}</title>
            </head>
            <body>
                <p class='ErrorMessage'><b>Message: </b>{$error}</p>
                <p class='ErrorDescription'><b>Description: </b>{$description}</p>
                {$extraHtml}
            </body>
        </html>
    return
        $result
};

let $f := local:errorHtml#3
return
    test:suite($f)


It always results in 

<testsuites>
    <testsuite package="https://gcc02.safelinks.protection.outlook.com/?url=http://www.w3.org/2005/xquery-local-functions&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=zD6rei5wcfZb3pRb8s3DxkscfQGDmo0rwIJgyuftpz8=&reserved=0" timestamp="2023-03-14T08:28:16.065-04:00" tests="1" failures="1" errors="0" pending="0" time="PT0.002S">
        <testcase name="errorHtml" class="local:errorHtml">
            <failure message="assertXPath failed." type="failure-error-code-1">$result//*:html</failure>
            <output>
                <html xmlns="https://gcc02.safelinks.protection.outlook.com/?url=http://www.w3.org/1999/xhtml&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=oZctXzxHQ3W+XkWhuDkn/cligiXBNykhy67+BD7R+3k=&reserved=0" lang="en" xml:lang="en">
                    <head>
                        <title>Bad Request</title>
                    </head>
                    <body>
                        <p class="ErrorMessage">
                            <b>Message: </b>Bad Request</p>
                        <p class="ErrorDescription">
                            <b>Description: </b>Invalid ResourceID</p>
                    </body>
                </html>
            </output>
        </testcase>
    </testsuite>
</testsuites>

Or

        <testcase name="errorHtml" class="spasexq:errorHtml">
            <error type="err:XPST0081" message="It is a static error if a QName used in an expression contains a namespace prefix that cannot be expanded into a namespace URI by using the statically known namespaces. Error while evaluating expression: $result//xhtml:html. No namespace defined for prefix xhtml:html"/>
        </testcase>

If I use the xhtml namespace in the assertXPath annotation.  I found someone report a similar problem on stackoverflow in 2016 but it is not clear to me how it was resolved.  This is on exist-db 6.2.0 and Java 11.  Does anyone know what I am doing wrong?  Thanks.

Bernie Harris




_______________________________________________
Exist-open mailing list
mailto:[email protected]
https://gcc02.safelinks.protection.outlook.com/?url=https://lists.sourceforge.net/lists/listinfo/exist-open&data=05|01|[email protected]|63bac86b07ad49cf2d0608db24ada9aa|7005d45845be48ae8140d43da96dd17b|0|0|638144100514488671|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0=|3000|||&sdata=QC1qUFB+nnxtZiDTjM7K29YVMsXgWKuRamKCZ2tbhVA=&reserved=0


_______________________________________________
Exist-open mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/exist-open
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.