@crvouga/mockingbird-service-oura (英语)
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
WIP Oura v2 Collection和OAuth模拟器用于合成可穿戴同步测试.
安装
bun add @crvouga/mockingbird-service-oura
使用量
import { createServer } from "@crvouga/mockingbird-service-oura/server"
// Test setup: a local Oura. Its URL replaces https://api.ouraring.com in the application.
const server = await createServer({ pageSize: 2 })
const baseUrl = server.url
// Application code: the request it sends to Oura.
const response = await fetch(`${baseUrl}/v2/usercollection/workout`, {
headers: { authorization: "Bearer mock_oura_token" },
})
const { data, next_token } = await response.json()
await server.close()
运行 mockingbird-oura serve --port 12128;将该来源注入消费者的API和OAuth配置(该期的提供方策略否则会硬码出厂). 接受测试使用“获取”端口. bun scripts/python-smoke.ts (所需经费) uv此外,还比照当地HTTP对实际请求2.32.5和httpx 0.28.1图书馆进行操作,包括刷新信号和处理错误;它不行使私人消费者来源.
路线和状态
邮政 /oauth/token 接受URL编码授权代码或刷新赠款,Basic或body客户端证书. 种子 clients, (中文(简体) ), codes, (中文(简体) ), grants 有构造器选项或标准状态管理路由。 默认本地客户端是 mock_client 编号 : mock_client_secret; 无记名 mock_oura_token 属于 synthetic-user代码约束客户端,重定向,过期和可选 S256 PKCE 挑战. 刷新令牌旋转一次,保留用户/镜像;时钟控制访问到期.
获取 /oauth/authorize 是连接一个成员的浏览器访问的授权端点( live: cloud.ouraring.com/oauth/authorize) (中文(简体) ). 没有同意页:请求被验证,然后 consents 用户的收藏答案和浏览器重定向(302)到 redirect_uri 与 code 财务报告和审定财务报表 state,或 error, (中文(简体) ), error_description 财务报告和审定财务报表 state中存储该代码 codes 约束客户,授予的范围 redirect_uri 当调用者发送一个(符号交换必须重复)和可选的S256时 code_challenge (交换需要匹配) code_verifier(三); POST /oauth/token 赎一回. scope 省略了授予每一范围; state 是可选的,任何长度不变. redirect_uri 当客户端有一个注册时,可以省略。 不明客户(401) invalid_client),一个缺失 client_id,失踪或未登记 redirect_uri (400个) invalid_request,杰森(英语: {status,error,error_description})在原地回答,而从未重定向。 客户端选择 redirectUris (精确匹配; 省略接受任意绝对 http(s) URI , 所以默认 mock_client 工作性质)和 scopes (允许文档中的 Oura 范围 : email personal daily heartrate workout tag session spo2) (中文(简体) ). 重定向错误 : invalid_request (无) response_type,或一个 code_challenge_method 其他 S256, (中文(简体) ), unsupported_response_type, (中文(简体) ), invalid_scope。 。 。 .
同意控制:行 {id, decision: "approve"|"deny"|"error", userId?, codeTtlSeconds?, error?, errorDescription?} 地点 id 是客户端 id 或 * (每个客户都没有自己的行). 种子与 consents 选项或 POST /__admin/state/consents {"id":"*","value":{"id":"*","decision":"deny"}}无行表示批准 synthetic-user 600秒代码. deny 重定向 access_denied 财务报告和审定财务报表 error 重定向 server_error (与 error编号 :errorDescription),两者均保持不变 state 没有密码 发布代码列于 GET /__admin/state/codes。 。 。 .
获取 /v2/usercollection/personal_info 返回符号用户的个人信息( e)id和种子 age, (中文(简体) ), weight, (中文(简体) ), height, (中文(简体) ), biological_sex, (中文(简体) ), email: 种子a records 与 collection: "personal_info", (中文(简体) ), userId 符号的用户和 data 响应对象(仅假值)。 范围 personal 所需经费(403美元) {detail:"Access forbidden."} 和收藏品一样,401件与收藏品的躯体 一种未知或过期的代币,404件 {detail:"Not Found"} 当用户没有行时. data 以种子返回: email 范围不在每个字段执行。 默认赠款不携带 personal。 。 。 .
获取 /v2/usercollection/{workout,sleep,heartrate,daily_activity,daily_spo2,daily_readiness,daily_sleep} 返回时 {data,next_token}使用心率 start_datetime/end_datetime; 其他使用 start_date/end_date 反对 day。 固定窗口包括两个端点,省略的边框是无约束的。 这些边界/默认选择是确定本地固定语义,而不是经核实的活的边缘大小写等同. 不要为心率样本发明身份证明 固定物保留了每个供应的度量,包括空克. 范围检查使用情况 workout, (中文(简体) ), daily, (中文(简体) ), heartrate, (中文(简体) ), spo2。 。 。 .
种子 records 行数 {key,userId,collection,data}。密钥可以识别存储行,而不是供应商的标识;不同的密钥可以故意携带重复的提供者数据. pageSize 控制决定性的插入顺序页。 消费者在加速度时必须保留相同的收藏/窗口;模拟器的行键光标不绑定或验证查询. 没有承诺的供应商光标格式/顺序 。 设定 tokenTtlSeconds 新发行的代币.
测试控制
标准 /__admin/health, (中文(简体) ), /state, (中文(简体) ), /reset, (中文(简体) ), /requests, (中文(简体) ), /clock,有时间线检查站和断层 /__admin (通过 adminPrefix) (中文(简体) ). 页眉 x-mockingbird-namespace, (中文(简体) ), /__admin/ns/<name> 路径和证书映射分离数据。 期刊中包含元数据,从不包含OAuth体或可穿戴的有效载荷. 预设 : unauthorized, (中文(简体) ), rate_limited, (中文(简体) ), server_error, (中文(简体) ), connection_drop;通例性断层会增加耐久性. 配额和服务器-错误机构是明确的脚本固定装置,而不是活配额模拟. 这个地表没有网点.
甲骨文和测试
合同: oura OpenAPI 1.41 (英语) 财务报告和审定财务报表 OAuth 文档。对合成无效的证书进行现场检查:符号端点返回 HTTP 400 invalid_client, 收集端点 HTTP 401 并附有所记录的细节。 未经现场检查授权的收集数据和刷新数据.
最好的猜测,不是甲骨文验证: 授权终点和 personal_info 未观察到现场,供应商OpenAPI JSON在添加时无法下载(HTTP 404)。 参数、全镜默认值和单注册-URI默认值跟随 Oura 认证页面重定向状态(302) error编号 :error_description编号 :state 更改未知客户端或未注册客户的形状、状态和身体 redirect_uri,则 invalid_scope 允许列表, S256 仅限 PKCE, access_denied编号 :server_error 同意管制和失踪的403 personal 范围是模拟者的选择,而不是被观察到的供应商反应。 这个 personal_info 字段( r)id, (中文(简体) ), age, (中文(简体) ), weight, (中文(简体) ), height, (中文(简体) ), biological_sex, (中文(简体) ), email)来源于Oura v2 API文档和第三方客户端文档;直播响应是否携带 id 未经证实.
bun test 运行接受和每一次操作的自我平衡,包括差分检测. bun run parity 需求 OURA_ACCESS_TOKEN,进行安全、只读的信封检查,从不打印健康数据或证书.
故意不模拟
没有真实的健康数据、账户注册、同意页( consents 行代表用户的回答),设备对接,传感器模拟,硬件SDK,webhooks,订阅生命周期,场外投影,统计计算或完整的供应商度量衡验证. 记录是合成的通过固定装置;部分度量衡可以被有意地播种. 日期边界/默认行为、光标内部和配额机构细节是当地立方,而不是声称供应商边缘情况完全相等。 没有Python运行时间依赖或声称私人消费者自己行使了权利.
API 密码
根运行时间导出 : OuraAPI, (中文(简体) ), OURA_NAMESPACE, (中文(简体) ), COLLECTION_SCOPES, (中文(简体) ), KNOWN_SCOPES, (中文(简体) ), createRuntime, (中文(简体) ), OURA_PRESETS, (中文(简体) ), document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds类型包括: OuraAPIOptions, (中文(简体) ), Grant, (中文(简体) ), OAuthCode, (中文(简体) ), Client, (中文(简体) ), Consent, (中文(简体) ), DataRecord, (中文(简体) ), CollectionName, (中文(简体) ), OuraRuntimeOptions, (中文(简体) ), OuraRuntime, (中文(简体) ), OperationId, (中文(简体) ), SupportedOperationId。 。 。 .
/server 出口 createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT 类型 OuraServerOptions, (中文(简体) ), OuraServer。 。 。 .