You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PgTap结合逻辑运算符测试Supabase行级策略?

解决PgTap测试OR组合条件的方法

你可以通过以下几种方式实现OR组合条件的测试:

方法1:用check()函数直接验证布尔表达式

PgTap的check()支持直接传入SQL布尔表达式,刚好能用来测试OR组合的约束逻辑:

验证所有可见行的合规性

SELECT check(
  NOT EXISTS (
    SELECT 1 FROM posts
    WHERE (creator != tests.get_supabase_uid('test_owner') ->> 'id') AND (published != true)
  ),
  '所有可见帖子要么属于当前测试用户,要么已发布'
);

验证单条特定帖子的合规性

-- 假设已插入测试帖子,用ID定位目标行
SELECT check(
  (SELECT (creator = tests.get_supabase_uid('test_owner') ->> 'id') OR (published = true) FROM posts WHERE id = 'test-post-uuid'),
  '该测试帖子满足创建者可见或已发布的条件'
);

方法2:用ok()函数对比行数匹配情况

先算出符合OR条件的预期行数,再和当前用户实际能看到的行数对比:

WITH expected_count AS (
  SELECT COUNT(*) AS num
  FROM posts
  WHERE (creator = tests.get_supabase_uid('test_owner') ->> 'id') OR (published = true)
),
actual_count AS (
  SELECT COUNT(*) AS num FROM posts
)
SELECT ok(
  (SELECT num FROM expected_count) = (SELECT num FROM actual_count),
  '当前用户可见的帖子数量与预期符合OR条件的数量一致'
);

方法3:用results_eq()精确对比结果集

如果需要验证可见的具体行完全匹配,可构造预期结果集和实际查询结果对比:

SELECT results_eq(
  'SELECT * FROM posts',
  $$
    SELECT * FROM posts
    WHERE (creator = tests.get_supabase_uid('test_owner') ->> 'id') OR (published = true)
  $$,
  '实际可见的帖子与满足OR条件的帖子完全一致'
);

注意:tests.get_supabase_uid('test_owner')返回JSON对象,用->> 'id'获取字符串类型的UUID,避免类型不匹配问题。

内容的提问来源于stack exchange,提问作者JoJota

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:22:06