Re: %test:assertXPath help

Joe Wicentowski <[email protected]>
Newsgroups gmane.text.xml.exist
Message-ID <CAHwerk2hJTodRVvec1o_1KHXkH2uWDBPuaNhbL0R8skX3MuioA@mail.gmail.com>
Hi Bernie,

I've just had a look at the XQSuite source where %assertXPath annotations
are processed (
https://github.com/eXist-db/exist/blob/develop/exist-core/src/main/resources/org/exist/xquery/lib/xqsuite/xqsuite.xql#L944-L992).
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="http://www.w3.org/1999/xhtml">

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

  declare namespace xhtml='http://www.w3.org/1999/xhtml';

... 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 "http://www.w3.org/1999/xhtml".

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://exist-db.org/exist/apps/doc/xqsuite#annotations.

Thanks!
Joe

On Tue, Mar 14, 2023 at 8:52 AM Harris, Bernard T. (GSFC-5870) via
Exist-open <[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="http://exist-db.org/xquery/inspection";
> import module namespace test="http://exist-db.org/xquery/xqsuite"
> at "resource:org/exist/xquery/lib/xqsuite/xqsuite.xql";
>
> declare namespace xhtml = "http://www.w3.org/1999/xhtml";
>
> 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="http://www.w3.org/1999/xhtml" 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="http://www.w3.org/2005/xquery-local-functions"
> 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="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>
>
> 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/exist-open
>

_______________________________________________
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.