如何对文档具有给定权限进行单元测试?
How to unit test that a document has a given permission?
我正在使用 marklogic-unit-test 设置单元测试,我想做的一件事是检查给定文档是否具有特定权限。但是,当我针对一系列权限测试我的权限时,我收到 XDMP-NONMIXEDCOMPLEXCONT
错误。我认为这与权限是复杂对象而不是简单字符串的事实有关,因为这适用于集合。
const test = require("/test/test-helper.xqy");
let p1 = Sequence.from([xdmp.permission("rest-reader", "read", "element")]);
let p2 = Sequence.from([
xdmp.permission("rest-reader", "read", "element"),
xdmp.permission("rest-writer", "update", "element")
]);
test.assertAtLeastOneEqual(p1, p2)
哪个returns:
[javascript] XDMP-NONMIXEDCOMPLEXCONT: fn:data(<sec:permission
xmlns:sec="http://marklogic.com/xdmp/security">
<sec:capability>...</sec:capability>...</sec:permission>)
-- Node has complex type with non-mixed complex content
我能想到的最佳替代方法是显式循环序列并在每个元素上与 fn.deepEqual
进行比较。有没有更好的方法?
test.assertAtLeastOneEqual()
函数需要原子值(item()
签名)。唯一可以处理元素的测试辅助函数是 test.assertEqualXml()
,但它会查找精确匹配。我认为你最好的选择是将权限字符串化。像这样:
const test = require("/test/test-helper.xqy");
let p1 = [xdmp.permission("rest-reader", "read")];
let p2 = [
xdmp.permission("rest-reader", "read"),
xdmp.permission("rest-writer", "update")
];
p1 = Sequence.from(p1.map(p => xdmp.roleName(p.roleId) + ':' + p.capability));
p2 = Sequence.from(p2.map(p => xdmp.roleName(p.roleId) + ':' + p.capability));
test.assertAtLeastOneEqual(p1, p2)
我正在使用 marklogic-unit-test 设置单元测试,我想做的一件事是检查给定文档是否具有特定权限。但是,当我针对一系列权限测试我的权限时,我收到 XDMP-NONMIXEDCOMPLEXCONT
错误。我认为这与权限是复杂对象而不是简单字符串的事实有关,因为这适用于集合。
const test = require("/test/test-helper.xqy");
let p1 = Sequence.from([xdmp.permission("rest-reader", "read", "element")]);
let p2 = Sequence.from([
xdmp.permission("rest-reader", "read", "element"),
xdmp.permission("rest-writer", "update", "element")
]);
test.assertAtLeastOneEqual(p1, p2)
哪个returns:
[javascript] XDMP-NONMIXEDCOMPLEXCONT: fn:data(<sec:permission
xmlns:sec="http://marklogic.com/xdmp/security">
<sec:capability>...</sec:capability>...</sec:permission>)
-- Node has complex type with non-mixed complex content
我能想到的最佳替代方法是显式循环序列并在每个元素上与 fn.deepEqual
进行比较。有没有更好的方法?
test.assertAtLeastOneEqual()
函数需要原子值(item()
签名)。唯一可以处理元素的测试辅助函数是 test.assertEqualXml()
,但它会查找精确匹配。我认为你最好的选择是将权限字符串化。像这样:
const test = require("/test/test-helper.xqy");
let p1 = [xdmp.permission("rest-reader", "read")];
let p2 = [
xdmp.permission("rest-reader", "read"),
xdmp.permission("rest-writer", "update")
];
p1 = Sequence.from(p1.map(p => xdmp.roleName(p.roleId) + ':' + p.capability));
p2 = Sequence.from(p2.map(p => xdmp.roleName(p.roleId) + ':' + p.capability));
test.assertAtLeastOneEqual(p1, p2)