From 3fcc71a8111d7915d8ef8aa735428c1cb7ba0573 Mon Sep 17 00:00:00 2001 From: ZoOL Date: Thu, 16 Jul 2026 14:29:13 +0800 Subject: [PATCH 1/3] fix(docs): address endpoint catalog review findings --- .github/msrv/Cargo.lock | 551 +++++++++--------- .../src/baike/lingo/v1/entity/create.rs | 17 +- crates/openlark-docs/src/base/base/mod.rs | 3 +- .../src/base/base/v2/app/role/delete.rs | 145 ----- .../src/base/base/v2/app/role/mod.rs | 2 - .../src/ccm/drive/v1/file/create_folder.rs | 15 +- .../openlark-docs/src/ccm/explorer/v2/mod.rs | 15 +- .../src/ccm/permission/v2/mod.rs | 14 +- .../openlark-docs/src/common/api_endpoints.rs | 62 +- .../src/common/api_endpoints/base.rs | 14 +- .../src/common/api_endpoints/bitable.rs | 110 ++-- .../src/common/api_endpoints/docs.rs | 15 + .../src/common/api_endpoints/docx.rs | 33 +- .../src/common/api_endpoints/drive.rs | 91 ++- .../src/common/api_endpoints/lingo.rs | 30 + .../src/common/api_endpoints/minutes.rs | 35 ++ .../src/common/api_endpoints/sheets.rs | 64 +- .../src/common/api_endpoints/wiki.rs | 57 ++ crates/openlark-docs/src/common/mod.rs | 10 + crates/openlark-docs/src/common/test_utils.rs | 20 + .../src/minutes/minutes/v1/minute/search.rs | 19 +- 21 files changed, 726 insertions(+), 596 deletions(-) delete mode 100644 crates/openlark-docs/src/base/base/v2/app/role/delete.rs create mode 100644 crates/openlark-docs/src/common/test_utils.rs diff --git a/.github/msrv/Cargo.lock b/.github/msrv/Cargo.lock index 0a9ba0186..7dea424a5 100644 --- a/.github/msrv/Cargo.lock +++ b/.github/msrv/Cargo.lock @@ -135,15 +135,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.17.1" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" +checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" dependencies = [ "aws-lc-sys", "zeroize", @@ -151,15 +151,14 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.42.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" +checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" dependencies = [ "cc", "cmake", "dunce", "fs_extra", - "pkg-config", ] [[package]] @@ -185,9 +184,9 @@ checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitflags" -version = "2.13.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "block-buffer" @@ -200,15 +199,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.3" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytes" -version = "1.12.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cast" @@ -218,9 +217,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.67" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ "find-msvc-tools", "jobserver", @@ -240,22 +239,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chacha20" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "rand_core 0.10.1", -] - [[package]] name = "chrono" -version = "0.4.45" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "js-sys", @@ -404,15 +392,6 @@ dependencies = [ "libc", ] -[[package]] -name = "cpufeatures" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" -dependencies = [ - "libc", -] - [[package]] name = "criterion" version = "0.5.1" @@ -451,9 +430,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -470,9 +449,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.22" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -492,9 +471,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.23.0" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -502,10 +481,11 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.23.0" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ + "fnv", "ident_case", "proc-macro2", "quote", @@ -515,9 +495,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.23.0" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", @@ -561,9 +541,9 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.6" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", @@ -590,9 +570,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "either" -version = "1.16.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "encode_unicode" @@ -602,12 +582,11 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "env_filter" -version = "2.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" dependencies = [ "log", - "regex", ] [[package]] @@ -625,9 +604,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.11" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" dependencies = [ "anstream 1.0.0", "anstyle", @@ -772,9 +751,9 @@ checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" -version = "3.0.4" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" @@ -821,24 +800,12 @@ name = "getrandom" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi 5.3.0", - "wasip2", -] - -[[package]] -name = "getrandom" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi 6.0.0", - "rand_core 0.10.1", + "r-efi", + "wasip2", "wasm-bindgen", ] @@ -850,9 +817,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "h2" -version = "0.4.15" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" dependencies = [ "atomic-waker", "bytes", @@ -913,9 +880,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", "itoa", @@ -923,9 +890,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.1.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -933,9 +900,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", @@ -958,15 +925,15 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.4.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "1.10.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -1285,22 +1252,23 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.35" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.4.3", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ "cfg-if", "futures-util", + "once_cell", "wasm-bindgen", ] @@ -1362,9 +1330,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.33" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lru-slab" @@ -1383,9 +1351,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.3" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "mime" @@ -1405,9 +1373,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -1564,7 +1532,7 @@ dependencies = [ "mockall", "once_cell", "openlark-core", - "rand 0.8.7", + "rand 0.8.6", "regex", "rstest", "serde", @@ -1601,7 +1569,7 @@ dependencies = [ "hex", "mockall", "openlark-core", - "rand 0.8.7", + "rand 0.8.6", "regex", "rstest", "serde", @@ -1712,7 +1680,7 @@ dependencies = [ "lark-websocket-protobuf", "num_cpus", "prost 0.13.5", - "rand 0.8.7", + "rand 0.8.6", "regex", "reqwest", "rstest", @@ -1746,7 +1714,7 @@ dependencies = [ "mockall", "once_cell", "openlark-core", - "rand 0.8.7", + "rand 0.8.6", "regex", "rstest", "serde", @@ -1783,7 +1751,7 @@ dependencies = [ "log", "mockall", "openlark-core", - "rand 0.8.7", + "rand 0.8.6", "rstest", "serde", "serde_json", @@ -1834,7 +1802,7 @@ dependencies = [ "mockall", "once_cell", "openlark-core", - "rand 0.8.7", + "rand 0.8.6", "regex", "rstest", "serde", @@ -1863,7 +1831,7 @@ dependencies = [ "mockall", "openlark-auth", "openlark-core", - "rand 0.8.7", + "rand 0.8.6", "rstest", "serde", "serde_json", @@ -1892,7 +1860,7 @@ dependencies = [ "mockall", "once_cell", "openlark-core", - "rand 0.8.7", + "rand 0.8.6", "regex", "rstest", "serde", @@ -1987,12 +1955,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - [[package]] name = "plotters" version = "0.3.7" @@ -2095,7 +2057,7 @@ dependencies = [ "bitflags", "lazy_static", "num-traits", - "rand 0.8.7", + "rand 0.8.6", "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax", @@ -2188,9 +2150,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quinn" -version = "0.11.11" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -2208,16 +2170,15 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.16" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" +checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" dependencies = [ "aws-lc-rs", "bytes", - "getrandom 0.4.3", + "getrandom 0.3.4", "lru-slab", - "rand 0.10.2", - "rand_pcg", + "rand 0.9.4", "ring", "rustc-hash", "rustls", @@ -2231,23 +2192,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.15" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.46" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -2258,17 +2219,11 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - [[package]] name = "rand" -version = "0.8.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -2277,25 +2232,14 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", ] -[[package]] -name = "rand" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" -dependencies = [ - "chacha20", - "getrandom 0.4.3", - "rand_core 0.10.1", -] - [[package]] name = "rand_chacha" version = "0.3.1" @@ -2334,21 +2278,6 @@ dependencies = [ "getrandom 0.3.4", ] -[[package]] -name = "rand_core" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" - -[[package]] -name = "rand_pcg" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" -dependencies = [ - "rand_core 0.10.1", -] - [[package]] name = "rand_xorshift" version = "0.3.0" @@ -2389,9 +2318,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.13.0" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -2401,9 +2330,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.15" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f388202e4b80542a0921078cc23b6333bcf1409c1e3f86404cae4766a6131db" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -2412,9 +2341,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.11" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "relative-path" @@ -2424,9 +2353,9 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.13.4" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" dependencies = [ "base64", "bytes", @@ -2509,9 +2438,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.3" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -2537,9 +2466,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.42" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "aws-lc-rs", "once_cell", @@ -2551,9 +2480,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -2563,9 +2492,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.15.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "web-time", "zeroize", @@ -2612,9 +2541,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.23" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rusty-fork" @@ -2643,6 +2572,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scc" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" +dependencies = [ + "sdd", +] + [[package]] name = "schannel" version = "0.1.29" @@ -2658,6 +2596,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sdd" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" + [[package]] name = "security-framework" version = "3.7.0" @@ -2719,9 +2663,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", @@ -2764,19 +2708,19 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.21.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" dependencies = [ - "serde_core", + "serde", "serde_with_macros", ] [[package]] name = "serde_with_macros" -version = "3.21.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" dependencies = [ "darling", "proc-macro2", @@ -2786,23 +2730,24 @@ dependencies = [ [[package]] name = "serial_test" -version = "3.5.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "699f4197115b8a7e7ff19c9a315a4bd6fffec26cc4626ef45ecaea389e081c6d" +checksum = "911bd979bf1070a3f3aa7b691a3b3e9968f339ceeec89e08c280a8a22207a32f" dependencies = [ "futures-executor", "futures-util", "log", "once_cell", "parking_lot", + "scc", "serial_test_derive", ] [[package]] name = "serial_test_derive" -version = "3.5.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94e153fc76e1c6a068703d6d29c508a0b15c061c4b7e43da59cc097bc342673c" +checksum = "0a7d91949b85b0d2fb687445e448b40d322b6b3e4af6b44a29b21d9a5f33e6d9" dependencies = [ "proc-macro2", "quote", @@ -2811,12 +2756,12 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.7" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures", "digest", ] @@ -2827,7 +2772,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures", "digest", ] @@ -2842,9 +2787,9 @@ dependencies = [ [[package]] name = "shlex" -version = "2.0.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" @@ -2858,9 +2803,9 @@ dependencies = [ [[package]] name = "simd_cesu8" -version = "1.2.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" dependencies = [ "rustc_version", "simdutf8", @@ -2886,15 +2831,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", "windows-sys 0.61.2", @@ -2920,9 +2865,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.119" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -2984,20 +2929,20 @@ checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "test-log" -version = "0.2.21" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9c218384242b5c89b68303ab6f6fc53a312d923f0c14dc6bb860c6aeee40f1" +checksum = "2f46bf474f0a4afebf92f076d54fd5e63423d9438b8c278a3d2ccb0f47f7cdb3" dependencies = [ - "env_logger 0.11.11", + "env_logger 0.11.10", "test-log-macros", "tracing-subscriber", ] [[package]] name = "test-log-core" -version = "0.2.21" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c26ef8b00e4d382e59f6a8ddb3cd790b3a5bb29f21a358a9a69ea2f29f13f27b" +checksum = "37d4d41320b48bc4a211a9021678fcc0c99569b594ea31c93735b8e517102b4c" dependencies = [ "proc-macro2", "quote", @@ -3006,9 +2951,9 @@ dependencies = [ [[package]] name = "test-log-macros" -version = "0.2.21" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "944ad38adcbb71eaa682c56bceeb079e4ca82b4b3edc2a0fde5cb297b77dac8d" +checksum = "9beb9249a81e430dffd42400a49019bcf548444f1968ff23080a625de0d4d320" dependencies = [ "syn", "test-log-core", @@ -3036,9 +2981,9 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.10" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", ] @@ -3065,9 +3010,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.12.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -3169,9 +3114,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.3+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ "indexmap", "serde_core", @@ -3202,9 +3147,9 @@ dependencies = [ [[package]] name = "toml_writer" -version = "1.1.2+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tower" @@ -3223,9 +3168,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.11" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" dependencies = [ "bitflags", "bytes", @@ -3365,7 +3310,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.9.5", + "rand 0.9.4", "rustls", "rustls-pki-types", "sha1", @@ -3374,9 +3319,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.20.1" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "unarray" @@ -3435,14 +3380,12 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.5" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5fab0d6c3c01ae70085a09cb03d4c7a1d6314e2b3e075392783396d724ca0a" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ - "getrandom 0.4.3", - "js-sys", - "serde_core", - "wasm-bindgen", + "getrandom 0.2.17", + "serde", ] [[package]] @@ -3493,18 +3436,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.4+wasi-0.2.12" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -3515,9 +3458,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.76" +version = "0.4.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" dependencies = [ "js-sys", "wasm-bindgen", @@ -3525,9 +3468,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3535,9 +3478,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -3548,9 +3491,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] @@ -3570,9 +3513,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.103" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" dependencies = [ "js-sys", "wasm-bindgen", @@ -3590,9 +3533,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.8" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" dependencies = [ "rustls-pki-types", ] @@ -3671,7 +3614,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3680,7 +3623,16 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", ] [[package]] @@ -3698,14 +3650,31 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -3714,53 +3683,101 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" [[package]] name = "wiremock" @@ -3799,9 +3816,9 @@ checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "yoke" -version = "0.8.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -3822,18 +3839,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.54" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.54" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -3842,9 +3859,9 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] @@ -3863,9 +3880,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.9.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" @@ -3902,6 +3919,6 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.23" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/crates/openlark-docs/src/baike/lingo/v1/entity/create.rs b/crates/openlark-docs/src/baike/lingo/v1/entity/create.rs index a4ce996b3..726efdcbd 100644 --- a/crates/openlark-docs/src/baike/lingo/v1/entity/create.rs +++ b/crates/openlark-docs/src/baike/lingo/v1/entity/create.rs @@ -115,9 +115,10 @@ impl CreateEntityRequest { mod tests { use super::*; use crate::baike::lingo::v1::models::{DisplayStatus, Term, UserIdType}; + use crate::common::test_utils::tenant_test_transport; use serde_json::json; use wiremock::matchers::{header, method, path}; - use wiremock::{Mock, MockServer, ResponseTemplate}; + use wiremock::{Mock, ResponseTemplate}; #[test] fn test_create_lingo_entity_request_builder() { @@ -207,7 +208,7 @@ mod tests { #[tokio::test] async fn create_entity_uses_catalog_request_semantics() { - let server = MockServer::start().await; + let (server, config, option) = tenant_test_transport().await; Mock::given(method("POST")) .and(path("/open-apis/lingo/v1/entities")) .and(header("Authorization", "Bearer test-tenant-token")) @@ -219,12 +220,6 @@ mod tests { .mount(&server) .await; - let config = Config::builder() - .app_id("ci_app_id") - .app_secret("ci_app_secret") - .base_url(server.uri()) - .enable_token_cache(false) - .build(); let body = EntityInput { main_keys: vec![Term { key: "测试词条".to_string(), @@ -240,11 +235,7 @@ mod tests { let response = CreateEntityRequest::new(config, body) .repo_id("repo_123") .user_id_type(UserIdType::OpenId) - .execute_with_options( - RequestOption::builder() - .tenant_access_token("test-tenant-token") - .build(), - ) + .execute_with_options(option) .await .expect("创建词条应成功"); assert!(response.entity.is_none()); diff --git a/crates/openlark-docs/src/base/base/mod.rs b/crates/openlark-docs/src/base/base/mod.rs index 1e29ff6fe..f104ebead 100644 --- a/crates/openlark-docs/src/base/base/mod.rs +++ b/crates/openlark-docs/src/base/base/mod.rs @@ -6,6 +6,5 @@ pub mod v2; // 使用通配符导出所有子模块,避免维护大量重复的导出列表 // v2 模块显式导出 pub use v2::{ - AppRole, Create, CreateReq, CreateResp, Delete, DeleteResp, List, ListReq, ListResp, Update, - UpdateReq, UpdateResp, + AppRole, Create, CreateReq, CreateResp, List, ListReq, ListResp, Update, UpdateReq, UpdateResp, }; diff --git a/crates/openlark-docs/src/base/base/v2/app/role/delete.rs b/crates/openlark-docs/src/base/base/v2/app/role/delete.rs deleted file mode 100644 index 08071b041..000000000 --- a/crates/openlark-docs/src/base/base/v2/app/role/delete.rs +++ /dev/null @@ -1,145 +0,0 @@ -//! 删除自定义角色 -//! -//! docPath: - -use openlark_core::{ - api::{ApiRequest, ApiResponseTrait, ResponseFormat}, - config::Config, - error::SDKResult, - http::Transport, - validate_required, -}; -use serde::{Deserialize, Serialize}; - -use crate::common::api_endpoints::{BaseApiV2, CatalogEndpoint}; -use crate::common::api_utils::*; - -/// 删除自定义角色请求。 -#[derive(Debug, Clone)] -pub struct Delete { - config: Config, - app_token: String, - role_id: String, -} - -impl Delete { - /// 创建新的删除请求。 - pub fn new(config: Config) -> Self { - Self { - config, - app_token: String::new(), - role_id: String::new(), - } - } - - /// 设置应用 token。 - pub fn app_token(mut self, app_token: impl Into) -> Self { - self.app_token = app_token.into(); - self - } - - /// 设置角色 ID。 - pub fn role_id(mut self, role_id: impl Into) -> Self { - self.role_id = role_id.into(); - self - } - - /// 执行请求。 - pub async fn execute(self) -> SDKResult { - self.execute_with_options(openlark_core::req_option::RequestOption::default()) - .await - } - - /// 使用指定请求选项执行请求。 - pub async fn execute_with_options( - self, - option: openlark_core::req_option::RequestOption, - ) -> SDKResult { - validate_required!(self.app_token.trim(), "app_token 不能为空"); - validate_required!(self.role_id.trim(), "role_id 不能为空"); - - let api_endpoint = BaseApiV2::RoleDelete(self.app_token, self.role_id); - - let api_request: ApiRequest = api_endpoint.to_request(); - - let response = Transport::request(api_request, &self.config, Some(option)).await?; - extract_response_data(response, "删除自定义角色") - } -} - -/// 删除自定义角色响应(data 为空对象)。 -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)] -pub struct DeleteResp {} - -impl ApiResponseTrait for DeleteResp { - fn data_format() -> ResponseFormat { - ResponseFormat::Data - } -} - -#[cfg(test)] -mod tests { - use super::*; - use serde_json::json; - use wiremock::MockServer; - use wiremock::matchers::{header, method, path}; - use wiremock::{Mock, ResponseTemplate}; - - /// 端到端:DELETE .../roles/{role_id} → DeleteResp。 - /// 同时断言 method、path、auth(catalog 提供)和响应(#438)。 - #[tokio::test] - async fn test_delete_role_returns_data_on_success() { - let server = MockServer::start().await; - Mock::given(method("DELETE")) - .and(path("/open-apis/base/v2/apps/app001/roles/role001")) - .and(header("Authorization", "Bearer test-tenant-token")) - .respond_with(ResponseTemplate::new(200).set_body_json(json!({ - "code": 0, "msg": "success", "data": {} - }))) - .mount(&server) - .await; - let config = Config::builder() - .app_id("ci_app_id") - .app_secret("ci_app_secret") - .base_url(server.uri()) - .enable_token_cache(false) - .build(); - let option = openlark_core::req_option::RequestOption::builder() - .tenant_access_token("test-tenant-token") - .build(); - Delete::new(config) - .app_token("app001") - .role_id("role001") - .execute_with_options(option) - .await - .expect("删除角色应成功"); - let received = server.received_requests().await.unwrap_or_default(); - assert_eq!(received.len(), 1); - assert_eq!(received[0].method, "DELETE"); - assert_eq!( - received[0].url.path(), - "/open-apis/base/v2/apps/app001/roles/role001" - ); - assert_eq!( - received[0] - .headers - .get("authorization") - .and_then(|h| h.to_str().ok()), - Some("Bearer test-tenant-token") - ); - } - - #[test] - fn test_delete_role_uses_delete_from_catalog_438() { - let ep = BaseApiV2::RoleDelete("app".into(), "role001".into()); - let req: openlark_core::api::ApiRequest = ep.to_request(); - assert_eq!(req.method(), &openlark_core::api::HttpMethod::Delete); - assert_eq!( - req.supported_access_token_types(), - vec![ - openlark_core::constants::AccessTokenType::User, - openlark_core::constants::AccessTokenType::Tenant - ] - ); - } -} diff --git a/crates/openlark-docs/src/base/base/v2/app/role/mod.rs b/crates/openlark-docs/src/base/base/v2/app/role/mod.rs index 3dd64ba4a..c9fb2d5b0 100644 --- a/crates/openlark-docs/src/base/base/v2/app/role/mod.rs +++ b/crates/openlark-docs/src/base/base/v2/app/role/mod.rs @@ -1,9 +1,7 @@ pub mod create; -pub mod delete; pub mod list; pub mod update; pub use create::{Create, CreateReq, CreateResp}; -pub use delete::{Delete, DeleteResp}; pub use list::{List, ListReq, ListResp}; pub use update::{Update, UpdateReq, UpdateResp}; diff --git a/crates/openlark-docs/src/ccm/drive/v1/file/create_folder.rs b/crates/openlark-docs/src/ccm/drive/v1/file/create_folder.rs index 5be5bd569..1d4c8f5c4 100644 --- a/crates/openlark-docs/src/ccm/drive/v1/file/create_folder.rs +++ b/crates/openlark-docs/src/ccm/drive/v1/file/create_folder.rs @@ -184,12 +184,12 @@ mod tests { /// 端到端:使用 catalog 语义,POST /open-apis/drive/v1/files/create_folder ,断言 method/path/auth。 #[tokio::test] async fn test_create_folder_returns_data_on_success_440() { + use crate::common::test_utils::tenant_test_transport; use serde_json::json; - use wiremock::MockServer; use wiremock::matchers::{header, method, path}; use wiremock::{Mock, ResponseTemplate}; - let server = MockServer::start().await; + let (server, config, option) = tenant_test_transport().await; Mock::given(method("POST")) .and(path("/open-apis/drive/v1/files/create_folder")) .and(header("Authorization", "Bearer test-tenant-token")) @@ -201,17 +201,6 @@ mod tests { .mount(&server) .await; - let config = Config::builder() - .app_id("ci_app_id") - .app_secret("ci_app_secret") - .base_url(server.uri()) - .enable_token_cache(false) - .build(); - - let option = openlark_core::req_option::RequestOption::builder() - .tenant_access_token("test-tenant-token") - .build(); - let resp = CreateFolderRequest::new(config, "测试文件夹", "parent_token_001") .execute_with_options(option) .await diff --git a/crates/openlark-docs/src/ccm/explorer/v2/mod.rs b/crates/openlark-docs/src/ccm/explorer/v2/mod.rs index 383e3d4b7..2d5c4e236 100644 --- a/crates/openlark-docs/src/ccm/explorer/v2/mod.rs +++ b/crates/openlark-docs/src/ccm/explorer/v2/mod.rs @@ -449,13 +449,14 @@ pub use models::{ #[cfg(test)] mod tests { use super::*; + use crate::common::test_utils::tenant_test_transport; use serde_json::json; use wiremock::matchers::{header, method, path}; - use wiremock::{Mock, MockServer, ResponseTemplate}; + use wiremock::{Mock, ResponseTemplate}; #[tokio::test] async fn get_root_folder_meta_uses_catalog_request_semantics() { - let server = MockServer::start().await; + let (server, config, option) = tenant_test_transport().await; Mock::given(method("GET")) .and(path("/open-apis/drive/explorer/v2/root_folder/meta")) .and(header("Authorization", "Bearer test-tenant-token")) @@ -476,16 +477,6 @@ mod tests { .mount(&server) .await; - let config = Config::builder() - .app_id("ci_app_id") - .app_secret("ci_app_secret") - .base_url(server.uri()) - .enable_token_cache(false) - .build(); - let option = RequestOption::builder() - .tenant_access_token("test-tenant-token") - .build(); - let response = GetRootFolderMetaRequest::new(config) .execute_with_options(option) .await diff --git a/crates/openlark-docs/src/ccm/permission/v2/mod.rs b/crates/openlark-docs/src/ccm/permission/v2/mod.rs index aed91be81..0315f3f12 100644 --- a/crates/openlark-docs/src/ccm/permission/v2/mod.rs +++ b/crates/openlark-docs/src/ccm/permission/v2/mod.rs @@ -160,13 +160,14 @@ pub use models::{ #[cfg(test)] mod tests { use super::*; + use crate::common::test_utils::tenant_test_transport; use serde_json::json; use wiremock::matchers::{header, method, path}; - use wiremock::{Mock, MockServer, ResponseTemplate}; + use wiremock::{Mock, ResponseTemplate}; #[tokio::test] async fn check_member_permission_uses_catalog_request_semantics() { - let server = MockServer::start().await; + let (server, config, option) = tenant_test_transport().await; Mock::given(method("POST")) .and(path("/open-apis/drive/v1/permission/member/permitted")) .and(header("Authorization", "Bearer test-tenant-token")) @@ -183,15 +184,6 @@ mod tests { .mount(&server) .await; - let config = Config::builder() - .app_id("ci_app_id") - .app_secret("ci_app_secret") - .base_url(server.uri()) - .enable_token_cache(false) - .build(); - let option = RequestOption::builder() - .tenant_access_token("test-tenant-token") - .build(); let params = CheckMemberPermissionParams { obj_token: "doc_token".to_string(), permission: "view".to_string(), diff --git a/crates/openlark-docs/src/common/api_endpoints.rs b/crates/openlark-docs/src/common/api_endpoints.rs index 126b8fb83..da4bc2d30 100644 --- a/crates/openlark-docs/src/common/api_endpoints.rs +++ b/crates/openlark-docs/src/common/api_endpoints.rs @@ -73,6 +73,39 @@ pub trait CatalogEndpoint { } } +#[cfg(test)] +pub(crate) mod test_support { + use super::CatalogEndpoint; + use openlark_core::{ + api::{ApiRequest, HttpMethod}, + constants::AccessTokenType, + }; + + /// 同时锁定 catalog 的 path、method、auth 以及生成的请求语义。 + pub(crate) fn assert_endpoint_semantics( + endpoint: E, + expected_method: HttpMethod, + expected_path: &str, + ) where + E: CatalogEndpoint, + { + assert_eq!(endpoint.to_url(), expected_path); + assert_eq!(endpoint.method(), expected_method); + assert_eq!( + endpoint.supported_access_token_types(), + Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) + ); + + let request: ApiRequest<()> = endpoint.to_request(); + assert_eq!(request.method(), &expected_method); + assert_eq!(request.api_path(), expected_path); + assert_eq!( + request.supported_access_token_types(), + vec![AccessTokenType::User, AccessTokenType::Tenant] + ); + } +} + pub mod base; pub use base::BaseApiV2; @@ -146,9 +179,7 @@ impl CatalogEndpoint for CcmDocApiOld { } } - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) - } + // supported_access_token_types 使用 trait 默认实现(User + Tenant) } /// CCM Docs API Old V1 端点枚举 @@ -188,9 +219,7 @@ impl CatalogEndpoint for CcmDocsApiOld { } } - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) - } + // supported_access_token_types 使用 trait 默认实现(User + Tenant) } pub mod drive; @@ -283,27 +312,6 @@ mod tests { ); } - #[test] - fn test_base_api_v2_role_delete() { - let endpoint = - BaseApiV2::RoleDelete("app_token_123".to_string(), "role_id_456".to_string()); - assert_eq!( - endpoint.to_url(), - "/open-apis/base/v2/apps/app_token_123/roles/role_id_456" - ); - assert_eq!(endpoint.method(), HttpMethod::Delete); - let req: ApiRequest<()> = endpoint.to_request(); - assert_eq!(req.method(), &HttpMethod::Delete); - assert_eq!( - endpoint.supported_access_token_types(), - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) - ); - assert_eq!( - req.supported_access_token_types(), - vec![AccessTokenType::User, AccessTokenType::Tenant] - ); - } - #[test] fn test_base_api_v2_with_special_chars() { let endpoint = BaseApiV2::RoleCreate("app-token_123".to_string()); diff --git a/crates/openlark-docs/src/common/api_endpoints/base.rs b/crates/openlark-docs/src/common/api_endpoints/base.rs index 0ce889560..0346d55fd 100644 --- a/crates/openlark-docs/src/common/api_endpoints/base.rs +++ b/crates/openlark-docs/src/common/api_endpoints/base.rs @@ -4,7 +4,6 @@ use super::CatalogEndpoint; use openlark_core::api::HttpMethod; -use openlark_core::constants::AccessTokenType; /// Base API V2 端点枚举 #[derive(Debug, Clone, PartialEq)] @@ -15,8 +14,6 @@ pub enum BaseApiV2 { RoleUpdate(String, String), /// 列出自定义角色 RoleList(String), - /// 删除自定义角色 - RoleDelete(String, String), } impl BaseApiV2 { @@ -32,9 +29,6 @@ impl BaseApiV2 { BaseApiV2::RoleList(app_token) => { format!("/open-apis/base/v2/apps/{app_token}/roles") } - BaseApiV2::RoleDelete(app_token, role_id) => { - format!("/open-apis/base/v2/apps/{app_token}/roles/{role_id}") - } } } } @@ -50,14 +44,8 @@ impl CatalogEndpoint for BaseApiV2 { BaseApiV2::RoleCreate(_) => HttpMethod::Post, BaseApiV2::RoleUpdate(_, _) => HttpMethod::Put, BaseApiV2::RoleList(_) => HttpMethod::Get, - BaseApiV2::RoleDelete(_, _) => HttpMethod::Delete, } } - fn supported_access_token_types(&self) -> Option> { - // 证明 catalog 统一拥有认证要求(#438 tracer);与 core 默认一致,但显式声明 - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) - } - - // to_request 使用 trait 默认实现,会应用 supported token types + // to_request 和 supported_access_token_types 使用 trait 默认实现 } diff --git a/crates/openlark-docs/src/common/api_endpoints/bitable.rs b/crates/openlark-docs/src/common/api_endpoints/bitable.rs index e37e14d2d..66c006678 100644 --- a/crates/openlark-docs/src/common/api_endpoints/bitable.rs +++ b/crates/openlark-docs/src/common/api_endpoints/bitable.rs @@ -5,7 +5,6 @@ use super::CatalogEndpoint; use openlark_core::api::{ApiRequest, HttpMethod}; -use openlark_core::constants::AccessTokenType; /// Bitable API V1 端点枚举(#424 深化了请求语义:method + path + auth 在此集中)。 #[derive(Debug, Clone, PartialEq)] @@ -408,20 +407,13 @@ impl CatalogEndpoint for BitableApiV1 { } } - /// Bitable 端点的稳定认证要求(#439 迁移)。 - /// 与 Base 一致,显式声明以便语义目录统一拥有认证要求。 - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) - } - - // to_request 使用 trait 默认实现 + // to_request 和 supported_access_token_types 使用 trait 默认实现 } #[cfg(test)] mod tests { use super::*; - use openlark_core::api::{ApiRequest, HttpMethod}; - use openlark_core::constants::AccessTokenType; + use crate::common::api_endpoints::test_support::assert_endpoint_semantics; #[test] fn test_bitable_api_v1_app_create() { @@ -547,51 +539,59 @@ mod tests { // ========== #424 / #439: 端点目录语义测试(method + path + auth) ========== #[test] fn test_bitable_record_endpoints_semantics_424() { - // Create / BatchCreate -> POST - let ep = BitableApiV1::RecordCreate("app".into(), "tbl".into()); - assert_eq!(ep.method(), HttpMethod::Post); - assert!(ep.to_url().contains("/records")); - let req: ApiRequest<()> = ep.to_request(); - assert_eq!(req.method(), &HttpMethod::Post); - - let ep = BitableApiV1::RecordBatchCreate("app".into(), "tbl".into()); - assert_eq!(ep.method(), HttpMethod::Post); - - // Get / List -> GET - let ep = BitableApiV1::RecordGet("app".into(), "tbl".into(), "rec".into()); - assert_eq!(ep.method(), HttpMethod::Get); - let req: ApiRequest<()> = ep.to_request(); - assert_eq!(req.method(), &HttpMethod::Get); - - let ep = BitableApiV1::RecordList("app".into(), "tbl".into()); - assert_eq!(ep.method(), HttpMethod::Get); - - // Update -> PUT , BatchUpdate -> POST - let ep = BitableApiV1::RecordUpdate("app".into(), "tbl".into(), "rec".into()); - assert_eq!(ep.method(), HttpMethod::Put); - - let ep = BitableApiV1::RecordBatchUpdate("app".into(), "tbl".into()); - assert_eq!(ep.method(), HttpMethod::Post); - - // Delete -> DELETE , BatchDelete -> POST - let ep = BitableApiV1::RecordDelete("app".into(), "tbl".into(), "rec".into()); - assert_eq!(ep.method(), HttpMethod::Delete); - let req: ApiRequest<()> = ep.to_request(); - assert_eq!(req.method(), &HttpMethod::Delete); - - let ep = BitableApiV1::RecordBatchDelete("app".into(), "tbl".into()); - assert_eq!(ep.method(), HttpMethod::Post); - - // Search -> POST (body query) - let ep = BitableApiV1::RecordSearch("app".into(), "tbl".into()); - assert_eq!(ep.method(), HttpMethod::Post); - assert!(ep.to_url().contains("/search")); - - // auth: 显式声明在 catalog 中(#439) - let ep = BitableApiV1::RecordCreate("a".into(), "t".into()); - assert_eq!( - ep.supported_access_token_types(), - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) + assert_endpoint_semantics( + BitableApiV1::RecordCreate("app".into(), "tbl".into()), + HttpMethod::Post, + "/open-apis/bitable/v1/apps/app/tables/tbl/records", + ); + assert_endpoint_semantics( + BitableApiV1::RecordGet("app".into(), "tbl".into(), "rec".into()), + HttpMethod::Get, + "/open-apis/bitable/v1/apps/app/tables/tbl/records/rec", + ); + assert_endpoint_semantics( + BitableApiV1::RecordUpdate("app".into(), "tbl".into(), "rec".into()), + HttpMethod::Put, + "/open-apis/bitable/v1/apps/app/tables/tbl/records/rec", + ); + assert_endpoint_semantics( + BitableApiV1::RecordDelete("app".into(), "tbl".into(), "rec".into()), + HttpMethod::Delete, + "/open-apis/bitable/v1/apps/app/tables/tbl/records/rec", + ); + assert_endpoint_semantics( + BitableApiV1::RecordSearch("app".into(), "tbl".into()), + HttpMethod::Post, + "/open-apis/bitable/v1/apps/app/tables/tbl/records/search", + ); + } + + #[test] + fn bitable_catalog_covers_non_record_http_method_classes() { + assert_endpoint_semantics( + BitableApiV1::AppCreate, + HttpMethod::Post, + "/open-apis/bitable/v1/apps", + ); + assert_endpoint_semantics( + BitableApiV1::AppGet("app".into()), + HttpMethod::Get, + "/open-apis/bitable/v1/apps/app", + ); + assert_endpoint_semantics( + BitableApiV1::AppUpdate("app".into()), + HttpMethod::Put, + "/open-apis/bitable/v1/apps/app", + ); + assert_endpoint_semantics( + BitableApiV1::TablePatch("app".into(), "tbl".into()), + HttpMethod::Patch, + "/open-apis/bitable/v1/apps/app/tables/tbl", + ); + assert_endpoint_semantics( + BitableApiV1::TableDelete("app".into(), "tbl".into()), + HttpMethod::Delete, + "/open-apis/bitable/v1/apps/app/tables/tbl", ); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/docs.rs b/crates/openlark-docs/src/common/api_endpoints/docs.rs index 364790bb2..cf3c16b52 100644 --- a/crates/openlark-docs/src/common/api_endpoints/docs.rs +++ b/crates/openlark-docs/src/common/api_endpoints/docs.rs @@ -35,3 +35,18 @@ impl CatalogEndpoint for DocsApiV1 { // supported_access_token_types 使用 trait 默认实现(User + Tenant) } + +#[cfg(test)] +mod tests { + use super::*; + use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + + #[test] + fn docs_catalog_semantics_are_complete() { + assert_endpoint_semantics( + DocsApiV1::ContentGet, + HttpMethod::Get, + "/open-apis/docs/v1/content", + ); + } +} diff --git a/crates/openlark-docs/src/common/api_endpoints/docx.rs b/crates/openlark-docs/src/common/api_endpoints/docx.rs index 1113c5ca8..1e149000b 100644 --- a/crates/openlark-docs/src/common/api_endpoints/docx.rs +++ b/crates/openlark-docs/src/common/api_endpoints/docx.rs @@ -2,7 +2,6 @@ use super::CatalogEndpoint; use openlark_core::api::{ApiRequest, HttpMethod}; -use openlark_core::constants::AccessTokenType; /// Docx API V1 端点枚举 #[derive(Debug, Clone, PartialEq)] @@ -157,7 +156,35 @@ impl CatalogEndpoint for DocxApiV1 { } } - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) + // supported_access_token_types 使用 trait 默认实现(User + Tenant) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + + #[test] + fn docx_catalog_covers_every_http_method_class() { + assert_endpoint_semantics( + DocxApiV1::DocumentGet("doc".into()), + HttpMethod::Get, + "/open-apis/docx/v1/documents/doc", + ); + assert_endpoint_semantics( + DocxApiV1::DocumentCreate, + HttpMethod::Post, + "/open-apis/docx/v1/documents", + ); + assert_endpoint_semantics( + DocxApiV1::DocumentBlockPatch("doc".into(), "block".into()), + HttpMethod::Patch, + "/open-apis/docx/v1/documents/doc/blocks/block", + ); + assert_endpoint_semantics( + DocxApiV1::DocumentBlockChildrenBatchDelete("doc".into(), "block".into()), + HttpMethod::Delete, + "/open-apis/docx/v1/documents/doc/blocks/block/children/batch_delete", + ); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/drive.rs b/crates/openlark-docs/src/common/api_endpoints/drive.rs index 9218407e6..10ea3e206 100644 --- a/crates/openlark-docs/src/common/api_endpoints/drive.rs +++ b/crates/openlark-docs/src/common/api_endpoints/drive.rs @@ -2,7 +2,6 @@ use super::CatalogEndpoint; use openlark_core::api::{ApiRequest, HttpMethod}; -use openlark_core::constants::AccessTokenType; /// CCM Drive Explorer API Old V2 端点枚举 /// 对应 meta.project = ccm_drive_explorer, meta.version = old @@ -76,9 +75,7 @@ impl CatalogEndpoint for CcmDriveExplorerApiOld { } } - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) - } + // supported_access_token_types 使用 trait 默认实现(User + Tenant) } /// CCM Drive Explorer API V1 端点枚举 @@ -171,9 +168,7 @@ impl CatalogEndpoint for CcmDriveExplorerApi { } } - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) - } + // supported_access_token_types 使用 trait 默认实现(User + Tenant) } /// 简单的URL编码函数,用于查询参数编码 @@ -228,9 +223,7 @@ impl CatalogEndpoint for PermissionApi { HttpMethod::Post } - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) - } + // supported_access_token_types 使用 trait 默认实现(User + Tenant) } /// CCM Drive Permission API Old V2 端点枚举 @@ -274,9 +267,7 @@ impl CatalogEndpoint for PermissionApiOld { HttpMethod::Post } - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) - } + // supported_access_token_types 使用 trait 默认实现(User + Tenant) } /// Drive API 端点枚举 @@ -716,7 +707,77 @@ impl CatalogEndpoint for DriveApi { } } - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) + // supported_access_token_types 使用 trait 默认实现(User + Tenant) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + + #[test] + fn drive_catalog_covers_every_family_and_http_method_class() { + assert_endpoint_semantics( + CcmDriveExplorerApiOld::RootFolderMeta, + HttpMethod::Get, + "/open-apis/drive/explorer/v2/root_folder/meta", + ); + assert_endpoint_semantics( + CcmDriveExplorerApiOld::File("folder".into()), + HttpMethod::Post, + "/open-apis/drive/explorer/v2/file/folder", + ); + assert_endpoint_semantics( + CcmDriveExplorerApiOld::FileDocs("doc".into()), + HttpMethod::Delete, + "/open-apis/drive/explorer/v2/file/docs/doc", + ); + + assert_endpoint_semantics( + CcmDriveExplorerApi::RootFolderMeta, + HttpMethod::Get, + "/open-apis/drive/v1/explorer/root_folder/meta", + ); + assert_endpoint_semantics( + CcmDriveExplorerApi::Folder, + HttpMethod::Post, + "/open-apis/drive/v1/explorer/folder", + ); + assert_endpoint_semantics( + PermissionApi::MemberPermitted, + HttpMethod::Post, + "/open-apis/drive/v1/permission/member/permitted", + ); + assert_endpoint_semantics( + PermissionApiOld::MemberPermitted, + HttpMethod::Post, + "/open-apis/drive/v1/permission/member/permitted", + ); + + assert_endpoint_semantics( + DriveApi::ListFiles, + HttpMethod::Get, + "/open-apis/drive/v1/files", + ); + assert_endpoint_semantics( + DriveApi::CreateFolder, + HttpMethod::Post, + "/open-apis/drive/v1/files/create_folder", + ); + assert_endpoint_semantics( + DriveApi::UpdatePermissionMember("token".into(), "member".into()), + HttpMethod::Put, + "/open-apis/drive/v1/permissions/token/members/member", + ); + assert_endpoint_semantics( + DriveApi::UpdatePublicPermission("token".into()), + HttpMethod::Patch, + "/open-apis/drive/v1/permissions/token/public", + ); + assert_endpoint_semantics( + DriveApi::DeleteFile("token".into()), + HttpMethod::Delete, + "/open-apis/drive/v1/files/token", + ); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/lingo.rs b/crates/openlark-docs/src/common/api_endpoints/lingo.rs index 218651773..4455bf918 100644 --- a/crates/openlark-docs/src/common/api_endpoints/lingo.rs +++ b/crates/openlark-docs/src/common/api_endpoints/lingo.rs @@ -143,3 +143,33 @@ impl CatalogEndpoint for LingoApiV1 { // supported_access_token_types 使用 trait 默认实现(User + Tenant) } + +#[cfg(test)] +mod tests { + use super::*; + use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + + #[test] + fn lingo_catalog_covers_every_http_method_class() { + assert_endpoint_semantics( + LingoApiV1::EntityGet("entity".into()), + HttpMethod::Get, + "/open-apis/lingo/v1/entities/entity", + ); + assert_endpoint_semantics( + LingoApiV1::EntityCreate, + HttpMethod::Post, + "/open-apis/lingo/v1/entities", + ); + assert_endpoint_semantics( + LingoApiV1::EntityUpdate("entity".into()), + HttpMethod::Put, + "/open-apis/lingo/v1/entities/entity", + ); + assert_endpoint_semantics( + LingoApiV1::EntityDelete("entity".into()), + HttpMethod::Delete, + "/open-apis/lingo/v1/entities/entity", + ); + } +} diff --git a/crates/openlark-docs/src/common/api_endpoints/minutes.rs b/crates/openlark-docs/src/common/api_endpoints/minutes.rs index 4c9b71d3e..afadacd8e 100644 --- a/crates/openlark-docs/src/common/api_endpoints/minutes.rs +++ b/crates/openlark-docs/src/common/api_endpoints/minutes.rs @@ -104,3 +104,38 @@ impl CatalogEndpoint for MinutesExtraApiV1 { // supported_access_token_types 使用 trait 默认实现(User + Tenant) } + +#[cfg(test)] +mod tests { + use super::*; + use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + + #[test] + fn minutes_catalog_covers_every_http_method_class() { + assert_endpoint_semantics( + MinutesApiV1::Get("minute".into()), + HttpMethod::Get, + "/open-apis/minutes/v1/minutes/minute", + ); + assert_endpoint_semantics( + MinutesApiV1::Subscription, + HttpMethod::Post, + "/open-apis/minutes/v1/minutes/subscription", + ); + } + + #[cfg(feature = "minutes")] + #[test] + fn minutes_extra_catalog_covers_every_http_method_class() { + assert_endpoint_semantics( + MinutesExtraApiV1::Search, + HttpMethod::Post, + "/open-apis/minutes/v1/minutes/search", + ); + assert_endpoint_semantics( + MinutesExtraApiV1::Artifacts("minute".into()), + HttpMethod::Get, + "/open-apis/minutes/v1/minutes/minute/artifacts", + ); + } +} diff --git a/crates/openlark-docs/src/common/api_endpoints/sheets.rs b/crates/openlark-docs/src/common/api_endpoints/sheets.rs index 8e409b7e9..a3b40832b 100644 --- a/crates/openlark-docs/src/common/api_endpoints/sheets.rs +++ b/crates/openlark-docs/src/common/api_endpoints/sheets.rs @@ -2,7 +2,6 @@ use super::CatalogEndpoint; use openlark_core::api::{ApiRequest, HttpMethod}; -use openlark_core::constants::AccessTokenType; /// CCM Sheet API Old V2 端点枚举 /// 对应 meta.project = ccm_sheet, meta.version = old @@ -736,7 +735,66 @@ impl CatalogEndpoint for SheetsApiV3 { } } - fn supported_access_token_types(&self) -> Option> { - Some(vec![AccessTokenType::User, AccessTokenType::Tenant]) + // supported_access_token_types 使用 trait 默认实现(User + Tenant) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + + #[test] + fn sheets_catalog_covers_every_family_and_http_method_class() { + assert_endpoint_semantics( + CcmSheetApiOld::GetSpreadsheet("sheet".into()), + HttpMethod::Get, + "/open-apis/sheets/v3/spreadsheets/sheet", + ); + assert_endpoint_semantics( + CcmSheetApiOld::CreateSpreadsheet, + HttpMethod::Post, + "/open-apis/sheets/v3/spreadsheets", + ); + assert_endpoint_semantics( + CcmSheetApiOld::Values("sheet".into()), + HttpMethod::Put, + "/open-apis/sheets/v2/spreadsheets/sheet/values", + ); + assert_endpoint_semantics( + CcmSheetApiOld::UpdateSpreadsheet("sheet".into()), + HttpMethod::Patch, + "/open-apis/sheets/v3/spreadsheets/sheet", + ); + assert_endpoint_semantics( + CcmSheetApiOld::DimensionRangeDelete("sheet".into()), + HttpMethod::Delete, + "/open-apis/sheets/v2/spreadsheets/sheet/dimension_range", + ); + + assert_endpoint_semantics( + SheetsApiV3::GetSpreadsheet("sheet".into()), + HttpMethod::Get, + "/open-apis/sheets/v3/spreadsheets/sheet", + ); + assert_endpoint_semantics( + SheetsApiV3::CreateSpreadsheet, + HttpMethod::Post, + "/open-apis/sheets/v3/spreadsheets", + ); + assert_endpoint_semantics( + SheetsApiV3::UpdateFilter("sheet".into(), "tab".into()), + HttpMethod::Put, + "/open-apis/sheets/v3/spreadsheets/sheet/sheets/tab/filter", + ); + assert_endpoint_semantics( + SheetsApiV3::PatchSpreadsheet("sheet".into()), + HttpMethod::Patch, + "/open-apis/sheets/v3/spreadsheets/sheet", + ); + assert_endpoint_semantics( + SheetsApiV3::DeleteFilter("sheet".into(), "tab".into()), + HttpMethod::Delete, + "/open-apis/sheets/v3/spreadsheets/sheet/sheets/tab/filter", + ); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/wiki.rs b/crates/openlark-docs/src/common/api_endpoints/wiki.rs index 70b66afb1..7ce62b013 100644 --- a/crates/openlark-docs/src/common/api_endpoints/wiki.rs +++ b/crates/openlark-docs/src/common/api_endpoints/wiki.rs @@ -287,3 +287,60 @@ impl CatalogEndpoint for WikiApi { // supported_access_token_types 使用 trait 默认实现(User + Tenant) } + +#[cfg(test)] +mod tests { + use super::*; + use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + + #[test] + fn wiki_catalog_covers_every_http_method_class() { + assert_endpoint_semantics( + WikiApiV1::NodeSearch, + HttpMethod::Post, + "/open-apis/wiki/v1/nodes/search", + ); + + assert_endpoint_semantics( + WikiApiV2::SpaceGet("space".into()), + HttpMethod::Get, + "/open-apis/wiki/v2/spaces/space", + ); + assert_endpoint_semantics( + WikiApiV2::SpaceCreate, + HttpMethod::Post, + "/open-apis/wiki/v2/spaces", + ); + assert_endpoint_semantics( + WikiApiV2::SpaceSettingUpdate("space".into()), + HttpMethod::Put, + "/open-apis/wiki/v2/spaces/space/setting", + ); + assert_endpoint_semantics( + WikiApiV2::SpaceMemberDelete("space".into(), "member".into()), + HttpMethod::Delete, + "/open-apis/wiki/v2/spaces/space/members/member", + ); + + assert_endpoint_semantics( + WikiApi::GetSpace, + HttpMethod::Get, + "/open-apis/wiki/v2/spaces/get_node", + ); + assert_endpoint_semantics( + WikiApi::CreateSpace, + HttpMethod::Post, + "/open-apis/wiki/v2/spaces", + ); + assert_endpoint_semantics( + WikiApi::UpdateSpaceSetting("space".into()), + HttpMethod::Put, + "/open-apis/wiki/v2/spaces/space/setting", + ); + assert_endpoint_semantics( + WikiApi::DeleteSpaceMember("space".into(), "member".into()), + HttpMethod::Delete, + "/open-apis/wiki/v2/spaces/space/members/member", + ); + } +} diff --git a/crates/openlark-docs/src/common/mod.rs b/crates/openlark-docs/src/common/mod.rs index 8ac0af488..2afb97799 100644 --- a/crates/openlark-docs/src/common/mod.rs +++ b/crates/openlark-docs/src/common/mod.rs @@ -8,6 +8,16 @@ pub mod builders; pub mod chain; /// 文档服务通用请求构建器模块。 pub mod request_builder; +#[cfg(all( + test, + any( + feature = "baike", + feature = "lingo", + feature = "ccm-core", + feature = "minutes" + ) +))] +pub(crate) mod test_utils; /// 重新导出常用 API 端点枚举。 pub use api_endpoints::{BaseApiV2, BitableApiV1, MinutesApiV1, SheetsApiV3}; diff --git a/crates/openlark-docs/src/common/test_utils.rs b/crates/openlark-docs/src/common/test_utils.rs new file mode 100644 index 000000000..11e709023 --- /dev/null +++ b/crates/openlark-docs/src/common/test_utils.rs @@ -0,0 +1,20 @@ +use openlark_core::{config::Config, req_option::RequestOption}; +use wiremock::MockServer; + +pub(crate) const TEST_TENANT_TOKEN: &str = "test-tenant-token"; + +/// 创建使用 tenant token 的 wiremock 测试传输环境。 +pub(crate) async fn tenant_test_transport() -> (MockServer, Config, RequestOption) { + let server = MockServer::start().await; + let config = Config::builder() + .app_id("ci_app_id") + .app_secret("ci_app_secret") + .base_url(server.uri()) + .enable_token_cache(false) + .build(); + let option = RequestOption::builder() + .tenant_access_token(TEST_TENANT_TOKEN) + .build(); + + (server, config, option) +} diff --git a/crates/openlark-docs/src/minutes/minutes/v1/minute/search.rs b/crates/openlark-docs/src/minutes/minutes/v1/minute/search.rs index 2cab194b7..7576d8d4f 100644 --- a/crates/openlark-docs/src/minutes/minutes/v1/minute/search.rs +++ b/crates/openlark-docs/src/minutes/minutes/v1/minute/search.rs @@ -43,9 +43,10 @@ impl MinuteSearchRequest { #[cfg(test)] mod tests { use super::*; + use crate::common::test_utils::tenant_test_transport; use serde_json::json; use wiremock::matchers::{header, method, path}; - use wiremock::{Mock, MockServer, ResponseTemplate}; + use wiremock::{Mock, ResponseTemplate}; #[test] fn builder_initializes() { @@ -55,7 +56,7 @@ mod tests { #[tokio::test] async fn search_uses_catalog_request_semantics() { - let server = MockServer::start().await; + let (server, config, option) = tenant_test_transport().await; Mock::given(method("POST")) .and(path("/open-apis/minutes/v1/minutes/search")) .and(header("Authorization", "Bearer test-tenant-token")) @@ -66,19 +67,7 @@ mod tests { }))) .mount(&server) .await; - let config = Arc::new( - Config::builder() - .app_id("ci_app_id") - .app_secret("ci_app_secret") - .base_url(server.uri()) - .enable_token_cache(false) - .build(), - ); - let option = RequestOption::builder() - .tenant_access_token("test-tenant-token") - .build(); - - let response = MinuteSearchRequest::new(config) + let response = MinuteSearchRequest::new(Arc::new(config)) .execute_with_options(json!({ "query": "周会", "page_size": 20 }), option) .await .expect("搜索妙记应成功"); From 2d8041107f06d1f80e6811979e4d8094a7990a89 Mon Sep 17 00:00:00 2001 From: ZoOL Date: Thu, 16 Jul 2026 14:45:39 +0800 Subject: [PATCH 2/3] test(docs): cover every catalog endpoint semantic --- .github/msrv/Cargo.lock | 20 +++++ Cargo.lock | 20 +++++ crates/openlark-docs/Cargo.toml | 2 + .../openlark-docs/src/common/api_endpoints.rs | 45 +++++++++++ .../src/common/api_endpoints/base.rs | 1 + .../src/common/api_endpoints/bitable.rs | 39 +++------ .../src/common/api_endpoints/docs.rs | 11 +-- .../src/common/api_endpoints/docx.rs | 26 +----- .../src/common/api_endpoints/drive.rs | 81 +++++-------------- .../src/common/api_endpoints/lingo.rs | 26 +----- .../src/common/api_endpoints/minutes.rs | 36 +++------ .../src/common/api_endpoints/sheets.rs | 61 +++----------- ...s__bitable_catalog_semantics_snapshot.snap | 56 +++++++++++++ ...ests__docs_catalog_semantics_snapshot.snap | 5 ++ ...ests__docx_catalog_semantics_snapshot.snap | 23 ++++++ ..._ccm_drive_explorer_catalog_semantics.snap | 12 +++ ..._drive_explorer_old_catalog_semantics.snap | 12 +++ ...drive__tests__drive_catalog_semantics.snap | 72 +++++++++++++++++ ...__tests__permission_catalog_semantics.snap | 7 ++ ...sts__permission_old_catalog_semantics.snap | 7 ++ ...sts__lingo_catalog_semantics_snapshot.snap | 27 +++++++ ...tes__tests__minutes_catalog_semantics.snap | 10 +++ ...ests__minutes_extra_catalog_semantics.snap | 6 ++ ...ests__ccm_sheet_old_catalog_semantics.snap | 74 +++++++++++++++++ ...s__tests__sheets_v3_catalog_semantics.snap | 31 +++++++ ...__wiki__tests__wiki_catalog_semantics.snap | 20 +++++ ...iki__tests__wiki_v1_catalog_semantics.snap | 5 ++ ...iki__tests__wiki_v2_catalog_semantics.snap | 19 +++++ .../src/common/api_endpoints/wiki.rs | 60 ++++---------- ...ests__base_catalog_semantics_snapshot.snap | 7 ++ ...cm_doc_old_catalog_semantics_snapshot.snap | 10 +++ ...m_docs_old_catalog_semantics_snapshot.snap | 6 ++ 32 files changed, 575 insertions(+), 262 deletions(-) create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__bitable__tests__bitable_catalog_semantics_snapshot.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__docs__tests__docs_catalog_semantics_snapshot.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__docx__tests__docx_catalog_semantics_snapshot.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__ccm_drive_explorer_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__ccm_drive_explorer_old_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__drive_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__permission_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__permission_old_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__lingo__tests__lingo_catalog_semantics_snapshot.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__minutes__tests__minutes_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__minutes__tests__minutes_extra_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__sheets__tests__ccm_sheet_old_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__sheets__tests__sheets_v3_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_v1_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_v2_catalog_semantics.snap create mode 100644 crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__base_catalog_semantics_snapshot.snap create mode 100644 crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__ccm_doc_old_catalog_semantics_snapshot.snap create mode 100644 crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__ccm_docs_old_catalog_semantics_snapshot.snap diff --git a/.github/msrv/Cargo.lock b/.github/msrv/Cargo.lock index 7dea424a5..7eb687079 100644 --- a/.github/msrv/Cargo.lock +++ b/.github/msrv/Cargo.lock @@ -1720,6 +1720,8 @@ dependencies = [ "serde", "serde_json", "serde_repr", + "strum", + "strum_macros", "tempfile", "thiserror", "tokio", @@ -2857,6 +2859,24 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "subtle" version = "2.6.1" diff --git a/Cargo.lock b/Cargo.lock index 7dea424a5..7eb687079 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1720,6 +1720,8 @@ dependencies = [ "serde", "serde_json", "serde_repr", + "strum", + "strum_macros", "tempfile", "thiserror", "tokio", @@ -2857,6 +2859,24 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "subtle" version = "2.6.1" diff --git a/crates/openlark-docs/Cargo.toml b/crates/openlark-docs/Cargo.toml index 35bc96499..8dca986e5 100644 --- a/crates/openlark-docs/Cargo.toml +++ b/crates/openlark-docs/Cargo.toml @@ -102,6 +102,8 @@ rstest = { workspace = true } tempfile = { workspace = true } mockall = { workspace = true } insta = { workspace = true } +strum = { workspace = true } +strum_macros = { workspace = true } [[example]] name = "docs_readme_examples" diff --git a/crates/openlark-docs/src/common/api_endpoints.rs b/crates/openlark-docs/src/common/api_endpoints.rs index da4bc2d30..425a6b7cc 100644 --- a/crates/openlark-docs/src/common/api_endpoints.rs +++ b/crates/openlark-docs/src/common/api_endpoints.rs @@ -80,6 +80,8 @@ pub(crate) mod test_support { api::{ApiRequest, HttpMethod}, constants::AccessTokenType, }; + use std::fmt::Debug; + use strum::IntoEnumIterator; /// 同时锁定 catalog 的 path、method、auth 以及生成的请求语义。 pub(crate) fn assert_endpoint_semantics( @@ -104,6 +106,31 @@ pub(crate) mod test_support { vec![AccessTokenType::User, AccessTokenType::Tenant] ); } + + /// 枚举全部 catalog variant,锁定其 method/path/auth 以及生成请求的一致性。 + pub(crate) fn catalog_semantics_snapshot() -> String + where + E: CatalogEndpoint + IntoEnumIterator + Debug, + { + E::iter() + .map(|endpoint| { + let path = endpoint.to_url(); + let method = endpoint.method(); + let auth = endpoint.supported_access_token_types(); + let request: ApiRequest<()> = endpoint.to_request(); + + assert_eq!(request.method(), &method); + assert_eq!(request.api_path(), path); + assert_eq!( + request.supported_access_token_types(), + auth.clone().unwrap_or_default() + ); + + format!("{endpoint:?} | {method:?} | {path} | {auth:?}") + }) + .collect::>() + .join("\n") + } } pub mod base; @@ -121,6 +148,7 @@ pub use docx::DocxApiV1; /// CCM Doc API Old V1 端点枚举 /// 对应 meta.project = ccm_doc, meta.version = old #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum CcmDocApiOld { /// 创建旧版文档 Create, @@ -185,6 +213,7 @@ impl CatalogEndpoint for CcmDocApiOld { /// CCM Docs API Old V1 端点枚举 /// 对应 meta.project = ccm_docs, meta.version = old #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum CcmDocsApiOld { /// 搜索云文档 SearchObject, @@ -246,9 +275,25 @@ pub const LINGO_API_V1: &str = "/open-apis/lingo/v1"; #[cfg(test)] mod tests { use super::*; + use crate::common::api_endpoints::test_support::catalog_semantics_snapshot; use openlark_core::api::{ApiRequest, HttpMethod}; use openlark_core::constants::AccessTokenType; + #[test] + fn base_catalog_semantics_snapshot() { + insta::assert_snapshot!(catalog_semantics_snapshot::()); + } + + #[test] + fn ccm_doc_old_catalog_semantics_snapshot() { + insta::assert_snapshot!(catalog_semantics_snapshot::()); + } + + #[test] + fn ccm_docs_old_catalog_semantics_snapshot() { + insta::assert_snapshot!(catalog_semantics_snapshot::()); + } + // ========== BaseApiV2 Tests ========== #[test] fn test_base_api_v2_role_create() { diff --git a/crates/openlark-docs/src/common/api_endpoints/base.rs b/crates/openlark-docs/src/common/api_endpoints/base.rs index 0346d55fd..d52051696 100644 --- a/crates/openlark-docs/src/common/api_endpoints/base.rs +++ b/crates/openlark-docs/src/common/api_endpoints/base.rs @@ -7,6 +7,7 @@ use openlark_core::api::HttpMethod; /// Base API V2 端点枚举 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum BaseApiV2 { /// 新增自定义角色 RoleCreate(String), diff --git a/crates/openlark-docs/src/common/api_endpoints/bitable.rs b/crates/openlark-docs/src/common/api_endpoints/bitable.rs index 66c006678..88442f1e9 100644 --- a/crates/openlark-docs/src/common/api_endpoints/bitable.rs +++ b/crates/openlark-docs/src/common/api_endpoints/bitable.rs @@ -8,6 +8,7 @@ use openlark_core::api::{ApiRequest, HttpMethod}; /// Bitable API V1 端点枚举(#424 深化了请求语义:method + path + auth 在此集中)。 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum BitableApiV1 { /// App管理相关 AppCreate, @@ -413,7 +414,14 @@ impl CatalogEndpoint for BitableApiV1 { #[cfg(test)] mod tests { use super::*; - use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + use crate::common::api_endpoints::test_support::{ + assert_endpoint_semantics, catalog_semantics_snapshot, + }; + + #[test] + fn bitable_catalog_semantics_snapshot() { + insta::assert_snapshot!(catalog_semantics_snapshot::()); + } #[test] fn test_bitable_api_v1_app_create() { @@ -565,33 +573,4 @@ mod tests { "/open-apis/bitable/v1/apps/app/tables/tbl/records/search", ); } - - #[test] - fn bitable_catalog_covers_non_record_http_method_classes() { - assert_endpoint_semantics( - BitableApiV1::AppCreate, - HttpMethod::Post, - "/open-apis/bitable/v1/apps", - ); - assert_endpoint_semantics( - BitableApiV1::AppGet("app".into()), - HttpMethod::Get, - "/open-apis/bitable/v1/apps/app", - ); - assert_endpoint_semantics( - BitableApiV1::AppUpdate("app".into()), - HttpMethod::Put, - "/open-apis/bitable/v1/apps/app", - ); - assert_endpoint_semantics( - BitableApiV1::TablePatch("app".into(), "tbl".into()), - HttpMethod::Patch, - "/open-apis/bitable/v1/apps/app/tables/tbl", - ); - assert_endpoint_semantics( - BitableApiV1::TableDelete("app".into(), "tbl".into()), - HttpMethod::Delete, - "/open-apis/bitable/v1/apps/app/tables/tbl", - ); - } } diff --git a/crates/openlark-docs/src/common/api_endpoints/docs.rs b/crates/openlark-docs/src/common/api_endpoints/docs.rs index cf3c16b52..ddd849109 100644 --- a/crates/openlark-docs/src/common/api_endpoints/docs.rs +++ b/crates/openlark-docs/src/common/api_endpoints/docs.rs @@ -5,6 +5,7 @@ use openlark_core::api::{ApiRequest, HttpMethod}; /// Docs API V1 端点枚举 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum DocsApiV1 { /// 获取云文档内容 ContentGet, @@ -39,14 +40,10 @@ impl CatalogEndpoint for DocsApiV1 { #[cfg(test)] mod tests { use super::*; - use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + use crate::common::api_endpoints::test_support::catalog_semantics_snapshot; #[test] - fn docs_catalog_semantics_are_complete() { - assert_endpoint_semantics( - DocsApiV1::ContentGet, - HttpMethod::Get, - "/open-apis/docs/v1/content", - ); + fn docs_catalog_semantics_snapshot() { + insta::assert_snapshot!(catalog_semantics_snapshot::()); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/docx.rs b/crates/openlark-docs/src/common/api_endpoints/docx.rs index 1e149000b..09005f972 100644 --- a/crates/openlark-docs/src/common/api_endpoints/docx.rs +++ b/crates/openlark-docs/src/common/api_endpoints/docx.rs @@ -5,6 +5,7 @@ use openlark_core::api::{ApiRequest, HttpMethod}; /// Docx API V1 端点枚举 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum DocxApiV1 { // 群公告相关API (7个) /// 获取群公告基本信息 @@ -162,29 +163,10 @@ impl CatalogEndpoint for DocxApiV1 { #[cfg(test)] mod tests { use super::*; - use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + use crate::common::api_endpoints::test_support::catalog_semantics_snapshot; #[test] - fn docx_catalog_covers_every_http_method_class() { - assert_endpoint_semantics( - DocxApiV1::DocumentGet("doc".into()), - HttpMethod::Get, - "/open-apis/docx/v1/documents/doc", - ); - assert_endpoint_semantics( - DocxApiV1::DocumentCreate, - HttpMethod::Post, - "/open-apis/docx/v1/documents", - ); - assert_endpoint_semantics( - DocxApiV1::DocumentBlockPatch("doc".into(), "block".into()), - HttpMethod::Patch, - "/open-apis/docx/v1/documents/doc/blocks/block", - ); - assert_endpoint_semantics( - DocxApiV1::DocumentBlockChildrenBatchDelete("doc".into(), "block".into()), - HttpMethod::Delete, - "/open-apis/docx/v1/documents/doc/blocks/block/children/batch_delete", - ); + fn docx_catalog_semantics_snapshot() { + insta::assert_snapshot!(catalog_semantics_snapshot::()); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/drive.rs b/crates/openlark-docs/src/common/api_endpoints/drive.rs index 10ea3e206..35e306aec 100644 --- a/crates/openlark-docs/src/common/api_endpoints/drive.rs +++ b/crates/openlark-docs/src/common/api_endpoints/drive.rs @@ -6,6 +6,7 @@ use openlark_core::api::{ApiRequest, HttpMethod}; /// CCM Drive Explorer API Old V2 端点枚举 /// 对应 meta.project = ccm_drive_explorer, meta.version = old #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum CcmDriveExplorerApiOld { /// 获取我的空间(根文件夹)元数据 RootFolderMeta, @@ -81,6 +82,7 @@ impl CatalogEndpoint for CcmDriveExplorerApiOld { /// CCM Drive Explorer API V1 端点枚举 /// 对应 meta.project = ccm_drive_explorer, meta.version = v1 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum CcmDriveExplorerApi { /// 获取根目录元数据 RootFolderMeta, @@ -185,6 +187,7 @@ fn simple_url_encode(input: &str) -> String { /// CCM Drive Permission API V1 端点枚举 /// 对应 meta.project = permission, meta.version = v1 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum PermissionApi { /// 判断协作者是否有某权限 MemberPermitted, @@ -229,6 +232,7 @@ impl CatalogEndpoint for PermissionApi { /// CCM Drive Permission API Old V2 端点枚举 /// 对应 meta.project = permission, meta.version = old #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum PermissionApiOld { /// 判断协作者是否有某权限 MemberPermitted, @@ -272,6 +276,7 @@ impl CatalogEndpoint for PermissionApiOld { /// Drive API 端点枚举 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum DriveApi { // V1 APIs - 文件操作 /// 获取文件夹中的文件清单 @@ -713,71 +718,29 @@ impl CatalogEndpoint for DriveApi { #[cfg(test)] mod tests { use super::*; - use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + use crate::common::api_endpoints::test_support::catalog_semantics_snapshot; #[test] - fn drive_catalog_covers_every_family_and_http_method_class() { - assert_endpoint_semantics( - CcmDriveExplorerApiOld::RootFolderMeta, - HttpMethod::Get, - "/open-apis/drive/explorer/v2/root_folder/meta", + fn drive_catalog_semantics_snapshots() { + insta::assert_snapshot!( + "ccm_drive_explorer_old_catalog_semantics", + catalog_semantics_snapshot::() ); - assert_endpoint_semantics( - CcmDriveExplorerApiOld::File("folder".into()), - HttpMethod::Post, - "/open-apis/drive/explorer/v2/file/folder", + insta::assert_snapshot!( + "ccm_drive_explorer_catalog_semantics", + catalog_semantics_snapshot::() ); - assert_endpoint_semantics( - CcmDriveExplorerApiOld::FileDocs("doc".into()), - HttpMethod::Delete, - "/open-apis/drive/explorer/v2/file/docs/doc", + insta::assert_snapshot!( + "permission_catalog_semantics", + catalog_semantics_snapshot::() ); - - assert_endpoint_semantics( - CcmDriveExplorerApi::RootFolderMeta, - HttpMethod::Get, - "/open-apis/drive/v1/explorer/root_folder/meta", - ); - assert_endpoint_semantics( - CcmDriveExplorerApi::Folder, - HttpMethod::Post, - "/open-apis/drive/v1/explorer/folder", - ); - assert_endpoint_semantics( - PermissionApi::MemberPermitted, - HttpMethod::Post, - "/open-apis/drive/v1/permission/member/permitted", - ); - assert_endpoint_semantics( - PermissionApiOld::MemberPermitted, - HttpMethod::Post, - "/open-apis/drive/v1/permission/member/permitted", - ); - - assert_endpoint_semantics( - DriveApi::ListFiles, - HttpMethod::Get, - "/open-apis/drive/v1/files", - ); - assert_endpoint_semantics( - DriveApi::CreateFolder, - HttpMethod::Post, - "/open-apis/drive/v1/files/create_folder", - ); - assert_endpoint_semantics( - DriveApi::UpdatePermissionMember("token".into(), "member".into()), - HttpMethod::Put, - "/open-apis/drive/v1/permissions/token/members/member", - ); - assert_endpoint_semantics( - DriveApi::UpdatePublicPermission("token".into()), - HttpMethod::Patch, - "/open-apis/drive/v1/permissions/token/public", + insta::assert_snapshot!( + "permission_old_catalog_semantics", + catalog_semantics_snapshot::() ); - assert_endpoint_semantics( - DriveApi::DeleteFile("token".into()), - HttpMethod::Delete, - "/open-apis/drive/v1/files/token", + insta::assert_snapshot!( + "drive_catalog_semantics", + catalog_semantics_snapshot::() ); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/lingo.rs b/crates/openlark-docs/src/common/api_endpoints/lingo.rs index 4455bf918..59f0377ce 100644 --- a/crates/openlark-docs/src/common/api_endpoints/lingo.rs +++ b/crates/openlark-docs/src/common/api_endpoints/lingo.rs @@ -5,6 +5,7 @@ use openlark_core::api::{ApiRequest, HttpMethod}; /// Lingo语言服务 API v1 端点 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum LingoApiV1 { /// 草稿管理 DraftCreate, @@ -147,29 +148,10 @@ impl CatalogEndpoint for LingoApiV1 { #[cfg(test)] mod tests { use super::*; - use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + use crate::common::api_endpoints::test_support::catalog_semantics_snapshot; #[test] - fn lingo_catalog_covers_every_http_method_class() { - assert_endpoint_semantics( - LingoApiV1::EntityGet("entity".into()), - HttpMethod::Get, - "/open-apis/lingo/v1/entities/entity", - ); - assert_endpoint_semantics( - LingoApiV1::EntityCreate, - HttpMethod::Post, - "/open-apis/lingo/v1/entities", - ); - assert_endpoint_semantics( - LingoApiV1::EntityUpdate("entity".into()), - HttpMethod::Put, - "/open-apis/lingo/v1/entities/entity", - ); - assert_endpoint_semantics( - LingoApiV1::EntityDelete("entity".into()), - HttpMethod::Delete, - "/open-apis/lingo/v1/entities/entity", - ); + fn lingo_catalog_semantics_snapshot() { + insta::assert_snapshot!(catalog_semantics_snapshot::()); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/minutes.rs b/crates/openlark-docs/src/common/api_endpoints/minutes.rs index afadacd8e..95f2aefcf 100644 --- a/crates/openlark-docs/src/common/api_endpoints/minutes.rs +++ b/crates/openlark-docs/src/common/api_endpoints/minutes.rs @@ -5,6 +5,7 @@ use openlark_core::api::{ApiRequest, HttpMethod}; /// Minutes API V1 端点枚举 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum MinutesApiV1 { /// 获取妙记信息 Get(String), @@ -68,6 +69,7 @@ impl CatalogEndpoint for MinutesApiV1 { /// 不扩展公开 `MinutesApiV1` 的补充端点,避免破坏下游穷举匹配。 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] #[cfg(feature = "minutes")] pub(crate) enum MinutesExtraApiV1 { /// 搜索妙记。 @@ -108,34 +110,18 @@ impl CatalogEndpoint for MinutesExtraApiV1 { #[cfg(test)] mod tests { use super::*; - use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + use crate::common::api_endpoints::test_support::catalog_semantics_snapshot; #[test] - fn minutes_catalog_covers_every_http_method_class() { - assert_endpoint_semantics( - MinutesApiV1::Get("minute".into()), - HttpMethod::Get, - "/open-apis/minutes/v1/minutes/minute", + fn minutes_catalog_semantics_snapshots() { + insta::assert_snapshot!( + "minutes_catalog_semantics", + catalog_semantics_snapshot::() ); - assert_endpoint_semantics( - MinutesApiV1::Subscription, - HttpMethod::Post, - "/open-apis/minutes/v1/minutes/subscription", - ); - } - - #[cfg(feature = "minutes")] - #[test] - fn minutes_extra_catalog_covers_every_http_method_class() { - assert_endpoint_semantics( - MinutesExtraApiV1::Search, - HttpMethod::Post, - "/open-apis/minutes/v1/minutes/search", - ); - assert_endpoint_semantics( - MinutesExtraApiV1::Artifacts("minute".into()), - HttpMethod::Get, - "/open-apis/minutes/v1/minutes/minute/artifacts", + #[cfg(feature = "minutes")] + insta::assert_snapshot!( + "minutes_extra_catalog_semantics", + catalog_semantics_snapshot::() ); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/sheets.rs b/crates/openlark-docs/src/common/api_endpoints/sheets.rs index a3b40832b..6bf14d0bb 100644 --- a/crates/openlark-docs/src/common/api_endpoints/sheets.rs +++ b/crates/openlark-docs/src/common/api_endpoints/sheets.rs @@ -6,6 +6,7 @@ use openlark_core::api::{ApiRequest, HttpMethod}; /// CCM Sheet API Old V2 端点枚举 /// 对应 meta.project = ccm_sheet, meta.version = old #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum CcmSheetApiOld { /// 操作工作表 (第一个) OperateSheets(String), // spreadsheet_token @@ -517,6 +518,7 @@ impl CatalogEndpoint for CcmSheetApiOld { /// Sheets API v3 端点枚举 /// 对应 meta.project = sheets, meta.version = v3 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum SheetsApiV3 { // ===================== // spreadsheet @@ -741,60 +743,17 @@ impl CatalogEndpoint for SheetsApiV3 { #[cfg(test)] mod tests { use super::*; - use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + use crate::common::api_endpoints::test_support::catalog_semantics_snapshot; #[test] - fn sheets_catalog_covers_every_family_and_http_method_class() { - assert_endpoint_semantics( - CcmSheetApiOld::GetSpreadsheet("sheet".into()), - HttpMethod::Get, - "/open-apis/sheets/v3/spreadsheets/sheet", + fn sheets_catalog_semantics_snapshots() { + insta::assert_snapshot!( + "ccm_sheet_old_catalog_semantics", + catalog_semantics_snapshot::() ); - assert_endpoint_semantics( - CcmSheetApiOld::CreateSpreadsheet, - HttpMethod::Post, - "/open-apis/sheets/v3/spreadsheets", - ); - assert_endpoint_semantics( - CcmSheetApiOld::Values("sheet".into()), - HttpMethod::Put, - "/open-apis/sheets/v2/spreadsheets/sheet/values", - ); - assert_endpoint_semantics( - CcmSheetApiOld::UpdateSpreadsheet("sheet".into()), - HttpMethod::Patch, - "/open-apis/sheets/v3/spreadsheets/sheet", - ); - assert_endpoint_semantics( - CcmSheetApiOld::DimensionRangeDelete("sheet".into()), - HttpMethod::Delete, - "/open-apis/sheets/v2/spreadsheets/sheet/dimension_range", - ); - - assert_endpoint_semantics( - SheetsApiV3::GetSpreadsheet("sheet".into()), - HttpMethod::Get, - "/open-apis/sheets/v3/spreadsheets/sheet", - ); - assert_endpoint_semantics( - SheetsApiV3::CreateSpreadsheet, - HttpMethod::Post, - "/open-apis/sheets/v3/spreadsheets", - ); - assert_endpoint_semantics( - SheetsApiV3::UpdateFilter("sheet".into(), "tab".into()), - HttpMethod::Put, - "/open-apis/sheets/v3/spreadsheets/sheet/sheets/tab/filter", - ); - assert_endpoint_semantics( - SheetsApiV3::PatchSpreadsheet("sheet".into()), - HttpMethod::Patch, - "/open-apis/sheets/v3/spreadsheets/sheet", - ); - assert_endpoint_semantics( - SheetsApiV3::DeleteFilter("sheet".into(), "tab".into()), - HttpMethod::Delete, - "/open-apis/sheets/v3/spreadsheets/sheet/sheets/tab/filter", + insta::assert_snapshot!( + "sheets_v3_catalog_semantics", + catalog_semantics_snapshot::() ); } } diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__bitable__tests__bitable_catalog_semantics_snapshot.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__bitable__tests__bitable_catalog_semantics_snapshot.snap new file mode 100644 index 000000000..5c4d60b20 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__bitable__tests__bitable_catalog_semantics_snapshot.snap @@ -0,0 +1,56 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/bitable.rs +expression: "catalog_semantics_snapshot::()" +--- +AppCreate | Post | /open-apis/bitable/v1/apps | Some([User, Tenant]) +AppCopy("") | Post | /open-apis/bitable/v1/apps//copy | Some([User, Tenant]) +AppGet("") | Get | /open-apis/bitable/v1/apps/ | Some([User, Tenant]) +AppUpdate("") | Put | /open-apis/bitable/v1/apps/ | Some([User, Tenant]) +DashboardList("") | Get | /open-apis/bitable/v1/apps//dashboards | Some([User, Tenant]) +DashboardCopy("", "") | Post | /open-apis/bitable/v1/apps//dashboards//copy | Some([User, Tenant]) +BlockWorkflowList("") | Get | /open-apis/bitable/v1/apps//block_workflows | Some([User, Tenant]) +WorkflowList("") | Get | /open-apis/bitable/v1/apps//workflows | Some([User, Tenant]) +WorkflowUpdate("", "") | Put | /open-apis/bitable/v1/apps//workflows/ | Some([User, Tenant]) +TableCreate("") | Post | /open-apis/bitable/v1/apps//tables | Some([User, Tenant]) +TableBatchCreate("") | Post | /open-apis/bitable/v1/apps//tables/batch_create | Some([User, Tenant]) +TableUpdate("", "") | Put | /open-apis/bitable/v1/apps//tables/ | Some([User, Tenant]) +TableDelete("", "") | Delete | /open-apis/bitable/v1/apps//tables/ | Some([User, Tenant]) +TableBatchDelete("") | Post | /open-apis/bitable/v1/apps//tables/batch_delete | Some([User, Tenant]) +TableGet("", "") | Get | /open-apis/bitable/v1/apps//tables/ | Some([User, Tenant]) +TableList("") | Get | /open-apis/bitable/v1/apps//tables | Some([User, Tenant]) +TablePatch("", "") | Patch | /open-apis/bitable/v1/apps//tables/ | Some([User, Tenant]) +FieldCreate("", "") | Post | /open-apis/bitable/v1/apps//tables//fields | Some([User, Tenant]) +FieldGroupCreate("", "") | Post | /open-apis/bitable/v1/apps//tables//field_groups | Some([User, Tenant]) +FieldUpdate("", "", "") | Put | /open-apis/bitable/v1/apps//tables//fields/ | Some([User, Tenant]) +FieldDelete("", "", "") | Delete | /open-apis/bitable/v1/apps//tables//fields/ | Some([User, Tenant]) +FieldList("", "") | Get | /open-apis/bitable/v1/apps//tables//fields | Some([User, Tenant]) +ViewCreate("", "") | Post | /open-apis/bitable/v1/apps//tables//views | Some([User, Tenant]) +ViewUpdate("", "", "") | Put | /open-apis/bitable/v1/apps//tables//views/ | Some([User, Tenant]) +ViewDelete("", "", "") | Delete | /open-apis/bitable/v1/apps//tables//views/ | Some([User, Tenant]) +ViewGet("", "", "") | Get | /open-apis/bitable/v1/apps//tables//views/ | Some([User, Tenant]) +ViewList("", "") | Get | /open-apis/bitable/v1/apps//tables//views | Some([User, Tenant]) +ViewPatch("", "", "") | Patch | /open-apis/bitable/v1/apps//tables//views/ | Some([User, Tenant]) +RecordCreate("", "") | Post | /open-apis/bitable/v1/apps//tables//records | Some([User, Tenant]) +RecordBatchCreate("", "") | Post | /open-apis/bitable/v1/apps//tables//records/batch_create | Some([User, Tenant]) +RecordGet("", "", "") | Get | /open-apis/bitable/v1/apps//tables//records/ | Some([User, Tenant]) +RecordBatchGet("", "") | Post | /open-apis/bitable/v1/apps//tables//records/batch_get | Some([User, Tenant]) +RecordUpdate("", "", "") | Put | /open-apis/bitable/v1/apps//tables//records/ | Some([User, Tenant]) +RecordBatchUpdate("", "") | Post | /open-apis/bitable/v1/apps//tables//records/batch_update | Some([User, Tenant]) +RecordDelete("", "", "") | Delete | /open-apis/bitable/v1/apps//tables//records/ | Some([User, Tenant]) +RecordBatchDelete("", "") | Post | /open-apis/bitable/v1/apps//tables//records/batch_delete | Some([User, Tenant]) +RecordList("", "") | Get | /open-apis/bitable/v1/apps//tables//records | Some([User, Tenant]) +RecordSearch("", "") | Post | /open-apis/bitable/v1/apps//tables//records/search | Some([User, Tenant]) +FormGet("", "", "") | Get | /open-apis/bitable/v1/apps//tables//forms/ | Some([User, Tenant]) +FormPatch("", "", "") | Patch | /open-apis/bitable/v1/apps//tables//forms/ | Some([User, Tenant]) +FormUpgrade("", "", "") | Post | /open-apis/bitable/v1/apps//tables//forms//upgrade | Some([User, Tenant]) +FormFieldList("", "", "") | Get | /open-apis/bitable/v1/apps//tables//forms//fields | Some([User, Tenant]) +FormFieldPatch("", "", "", "") | Patch | /open-apis/bitable/v1/apps//tables//forms//fields/ | Some([User, Tenant]) +RoleCreate("") | Post | /open-apis/bitable/v1/apps//roles | Some([User, Tenant]) +RoleUpdate("", "") | Put | /open-apis/bitable/v1/apps//roles/ | Some([User, Tenant]) +RoleDelete("", "") | Delete | /open-apis/bitable/v1/apps//roles/ | Some([User, Tenant]) +RoleList("") | Get | /open-apis/bitable/v1/apps//roles | Some([User, Tenant]) +RoleMemberCreate("", "") | Post | /open-apis/bitable/v1/apps//roles//members | Some([User, Tenant]) +RoleMemberBatchCreate("", "") | Post | /open-apis/bitable/v1/apps//roles//members/batch_create | Some([User, Tenant]) +RoleMemberDelete("", "", "") | Delete | /open-apis/bitable/v1/apps//roles//members/ | Some([User, Tenant]) +RoleMemberBatchDelete("", "") | Post | /open-apis/bitable/v1/apps//roles//members/batch_delete | Some([User, Tenant]) +RoleMemberList("", "") | Get | /open-apis/bitable/v1/apps//roles//members | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__docs__tests__docs_catalog_semantics_snapshot.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__docs__tests__docs_catalog_semantics_snapshot.snap new file mode 100644 index 000000000..16d47fe69 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__docs__tests__docs_catalog_semantics_snapshot.snap @@ -0,0 +1,5 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/docs.rs +expression: "catalog_semantics_snapshot::()" +--- +ContentGet | Get | /open-apis/docs/v1/content | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__docx__tests__docx_catalog_semantics_snapshot.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__docx__tests__docx_catalog_semantics_snapshot.snap new file mode 100644 index 000000000..31ee6298f --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__docx__tests__docx_catalog_semantics_snapshot.snap @@ -0,0 +1,23 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/docx.rs +expression: "catalog_semantics_snapshot::()" +--- +ChatAnnouncementGet("") | Get | /open-apis/docx/v1/chats//announcement | Some([User, Tenant]) +ChatAnnouncementBlockList("") | Get | /open-apis/docx/v1/chats//announcement/blocks | Some([User, Tenant]) +ChatAnnouncementBlockChildrenCreate("", "") | Post | /open-apis/docx/v1/chats//announcement/blocks//children | Some([User, Tenant]) +ChatAnnouncementBlockBatchUpdate("") | Patch | /open-apis/docx/v1/chats//announcement/blocks/batch_update | Some([User, Tenant]) +ChatAnnouncementBlockGet("", "") | Get | /open-apis/docx/v1/chats//announcement/blocks/ | Some([User, Tenant]) +ChatAnnouncementBlockChildrenGet("", "") | Get | /open-apis/docx/v1/chats//announcement/blocks//children | Some([User, Tenant]) +ChatAnnouncementBlockChildrenBatchDelete("", "") | Delete | /open-apis/docx/v1/chats//announcement/blocks//children/batch_delete | Some([User, Tenant]) +DocumentCreate | Post | /open-apis/docx/v1/documents | Some([User, Tenant]) +DocumentGet("") | Get | /open-apis/docx/v1/documents/ | Some([User, Tenant]) +DocumentRawContent("") | Get | /open-apis/docx/v1/documents//raw_content | Some([User, Tenant]) +DocumentBlockList("") | Get | /open-apis/docx/v1/documents//blocks | Some([User, Tenant]) +DocumentBlockChildrenCreate("", "") | Post | /open-apis/docx/v1/documents//blocks//children | Some([User, Tenant]) +DocumentBlockDescendantCreate("", "") | Post | /open-apis/docx/v1/documents//blocks//descendant | Some([User, Tenant]) +DocumentBlockPatch("", "") | Patch | /open-apis/docx/v1/documents//blocks/ | Some([User, Tenant]) +DocumentBlockGet("", "") | Get | /open-apis/docx/v1/documents//blocks/ | Some([User, Tenant]) +DocumentBlockBatchUpdate("") | Patch | /open-apis/docx/v1/documents//blocks/batch_update | Some([User, Tenant]) +DocumentBlockChildrenGet("", "") | Get | /open-apis/docx/v1/documents//blocks//children | Some([User, Tenant]) +DocumentBlockChildrenBatchDelete("", "") | Delete | /open-apis/docx/v1/documents//blocks//children/batch_delete | Some([User, Tenant]) +DocumentConvert | Post | /open-apis/docx/documents/blocks/convert | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__ccm_drive_explorer_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__ccm_drive_explorer_catalog_semantics.snap new file mode 100644 index 000000000..ba721f154 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__ccm_drive_explorer_catalog_semantics.snap @@ -0,0 +1,12 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/drive.rs +expression: "catalog_semantics_snapshot::()" +--- +RootFolderMeta | Get | /open-apis/drive/v1/explorer/root_folder/meta | Some([User, Tenant]) +FolderMeta("") | Get | /open-apis/drive/v1/explorer/folder//meta | Some([User, Tenant]) +File("") | Get | /open-apis/drive/v1/explorer/file/ | Some([User, Tenant]) +FileCopy("") | Post | /open-apis/drive/v1/explorer/file/copy/files/ | Some([User, Tenant]) +FileDocs("") | Get | /open-apis/drive/v1/explorer/file/docs/ | Some([User, Tenant]) +FileSpreadsheets("") | Get | /open-apis/drive/v1/explorer/file/spreadsheets/ | Some([User, Tenant]) +FolderChildren("") | Get | /open-apis/drive/v1/explorer/folder//children | Some([User, Tenant]) +Folder | Post | /open-apis/drive/v1/explorer/folder | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__ccm_drive_explorer_old_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__ccm_drive_explorer_old_catalog_semantics.snap new file mode 100644 index 000000000..772eab1f8 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__ccm_drive_explorer_old_catalog_semantics.snap @@ -0,0 +1,12 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/drive.rs +expression: "catalog_semantics_snapshot::()" +--- +RootFolderMeta | Get | /open-apis/drive/explorer/v2/root_folder/meta | Some([User, Tenant]) +FolderMeta("") | Get | /open-apis/drive/explorer/v2/folder//meta | Some([User, Tenant]) +File("") | Post | /open-apis/drive/explorer/v2/file/ | Some([User, Tenant]) +FileSpreadsheets("") | Delete | /open-apis/drive/explorer/v2/file/spreadsheets/ | Some([User, Tenant]) +FileCopy("") | Post | /open-apis/drive/explorer/v2/file/copy/files/ | Some([User, Tenant]) +FileDocs("") | Delete | /open-apis/drive/explorer/v2/file/docs/ | Some([User, Tenant]) +FolderChildren("") | Get | /open-apis/drive/explorer/v2/folder//children | Some([User, Tenant]) +Folder("") | Post | /open-apis/drive/explorer/v2/folder/ | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__drive_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__drive_catalog_semantics.snap new file mode 100644 index 000000000..32168f8f7 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__drive_catalog_semantics.snap @@ -0,0 +1,72 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/drive.rs +expression: "catalog_semantics_snapshot::()" +--- +ListFiles | Get | /open-apis/drive/v1/files | Some([User, Tenant]) +CreateFolder | Post | /open-apis/drive/v1/files/create_folder | Some([User, Tenant]) +TaskCheck | Get | /open-apis/drive/v1/files/task_check | Some([User, Tenant]) +BatchQueryMetas | Post | /open-apis/drive/v1/metas/batch_query | Some([User, Tenant]) +GetFileStatistics("") | Get | /open-apis/drive/v1/files//statistics | Some([User, Tenant]) +ListFileViewRecords("") | Get | /open-apis/drive/v1/files//view_records | Some([User, Tenant]) +CopyFile("") | Post | /open-apis/drive/v1/files//copy | Some([User, Tenant]) +MoveFile("") | Post | /open-apis/drive/v1/files//move | Some([User, Tenant]) +DeleteFile("") | Delete | /open-apis/drive/v1/files/ | Some([User, Tenant]) +CreateShortcut | Post | /open-apis/drive/v1/files/create_shortcut | Some([User, Tenant]) +UploadFile | Post | /open-apis/drive/v1/files/upload_all | Some([User, Tenant]) +UploadPrepare | Post | /open-apis/drive/v1/files/upload_prepare | Some([User, Tenant]) +UploadPart | Post | /open-apis/drive/v1/files/upload_part | Some([User, Tenant]) +UploadFinish | Post | /open-apis/drive/v1/files/upload_finish | Some([User, Tenant]) +DownloadFile("") | Get | /open-apis/drive/v1/files//download | Some([User, Tenant]) +CreateImportTask | Post | /open-apis/drive/v1/import_tasks | Some([User, Tenant]) +GetImportTask("") | Get | /open-apis/drive/v1/import_tasks/ | Some([User, Tenant]) +CreateExportTask | Post | /open-apis/drive/v1/export_tasks | Some([User, Tenant]) +GetExportTask("") | Get | /open-apis/drive/v1/export_tasks/ | Some([User, Tenant]) +DownloadExportFile("") | Get | /open-apis/drive/v1/export_tasks/file//download | Some([User, Tenant]) +UploadMedia | Post | /open-apis/drive/v1/medias/upload_all | Some([User, Tenant]) +UploadMediaPrepare | Post | /open-apis/drive/v1/medias/upload_prepare | Some([User, Tenant]) +UploadMediaPart | Post | /open-apis/drive/v1/medias/upload_part | Some([User, Tenant]) +UploadMediaFinish | Post | /open-apis/drive/v1/medias/upload_finish | Some([User, Tenant]) +DownloadMedia("") | Get | /open-apis/drive/v1/medias//download | Some([User, Tenant]) +GetMediaTempDownloadUrls | Get | /open-apis/drive/v1/medias/batch_get_tmp_download_url | Some([User, Tenant]) +CreateFileVersion("") | Post | /open-apis/drive/v1/files//versions | Some([User, Tenant]) +ListFileVersions("") | Get | /open-apis/drive/v1/files//versions | Some([User, Tenant]) +GetFileVersion("", "") | Get | /open-apis/drive/v1/files//versions/ | Some([User, Tenant]) +DeleteFileVersion("", "") | Delete | /open-apis/drive/v1/files//versions/ | Some([User, Tenant]) +SubscribeFile("") | Post | /open-apis/drive/v1/files//subscribe | Some([User, Tenant]) +GetFileSubscribe("") | Get | /open-apis/drive/v1/files//get_subscribe | Some([User, Tenant]) +DeleteFileSubscribe("") | Delete | /open-apis/drive/v1/files//delete_subscribe | Some([User, Tenant]) +CreatePermissionMember("") | Post | /open-apis/drive/v1/permissions//members | Some([User, Tenant]) +BatchCreatePermissionMember("") | Post | /open-apis/drive/v1/permissions//members/batch_create | Some([User, Tenant]) +UpdatePermissionMember("", "") | Put | /open-apis/drive/v1/permissions//members/ | Some([User, Tenant]) +ListPermissionMembers("") | Get | /open-apis/drive/v1/permissions//members | Some([User, Tenant]) +DeletePermissionMember("", "") | Delete | /open-apis/drive/v1/permissions//members/ | Some([User, Tenant]) +TransferOwner("") | Post | /open-apis/drive/v1/permissions//members/transfer_owner | Some([User, Tenant]) +AuthPermissionMember("") | Get | /open-apis/drive/v1/permissions//members/auth | Some([User, Tenant]) +UpdatePublicPermission("") | Patch | /open-apis/drive/v1/permissions//public | Some([User, Tenant]) +GetPublicPermission("") | Get | /open-apis/drive/v1/permissions//public | Some([User, Tenant]) +CreatePublicPassword("") | Post | /open-apis/drive/v1/permissions//public/password | Some([User, Tenant]) +UpdatePublicPassword("") | Put | /open-apis/drive/v1/permissions//public/password | Some([User, Tenant]) +DeletePublicPassword("") | Delete | /open-apis/drive/v1/permissions//public/password | Some([User, Tenant]) +ListFileComments("") | Get | /open-apis/drive/v1/files//comments | Some([User, Tenant]) +BatchQueryComments("") | Post | /open-apis/drive/v1/files//comments/batch_query | Some([User, Tenant]) +PatchComment("", "") | Patch | /open-apis/drive/v1/files//comments/ | Some([User, Tenant]) +CreateComment("") | Post | /open-apis/drive/v1/files//comments | Some([User, Tenant]) +GetComment("", "") | Get | /open-apis/drive/v1/files//comments/ | Some([User, Tenant]) +ListCommentReplies("", "") | Get | /open-apis/drive/v1/files//comments//replies | Some([User, Tenant]) +CreateCommentReply("", "") | Post | /open-apis/drive/v1/files//comments//replies | Some([User, Tenant]) +UpdateCommentReply("", "", "") | Put | /open-apis/drive/v1/files//comments//replies/ | Some([User, Tenant]) +DeleteCommentReply("", "", "") | Delete | /open-apis/drive/v1/files//comments//replies/ | Some([User, Tenant]) +UserSubscription | Post | /open-apis/drive/v1/user/subscription | Some([User, Tenant]) +UserRemoveSubscription | Delete | /open-apis/drive/v1/user/remove_subscription | Some([User, Tenant]) +UserSubscriptionStatus | Get | /open-apis/drive/v1/user/subscription_status | Some([User, Tenant]) +GetFileSubscription("", "") | Get | /open-apis/drive/v1/files//subscriptions/ | Some([User, Tenant]) +CreateFileSubscription("") | Post | /open-apis/drive/v1/files//subscriptions | Some([User, Tenant]) +UpdateFileSubscription("", "") | Patch | /open-apis/drive/v1/files//subscriptions/ | Some([User, Tenant]) +ListFileLikes("") | Get | /open-apis/drive/v2/files//likes | Some([User, Tenant]) +GetPublicPermissionV2("") | Get | /open-apis/drive/v2/permissions//public | Some([User, Tenant]) +UpdatePublicPermissionV2("") | Patch | /open-apis/drive/v2/permissions//public | Some([User, Tenant]) +UpdateCommentReaction("") | Post | /open-apis/drive/v2/files//comments/reaction | Some([User, Tenant]) +MediaUploadTasks | Post | /open-apis/drive/v1/medias/upload_tasks | Some([User, Tenant]) +MediaUploadTask("") | Get | /open-apis/drive/v1/medias/upload_tasks/ | Some([User, Tenant]) +CreateMediaShareLink("") | Post | /open-apis/drive/v1/medias//share_link | Some([User, Tenant]) +GetPublicPassword("") | Get | /open-apis/drive/v1/publics//password | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__permission_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__permission_catalog_semantics.snap new file mode 100644 index 000000000..40f0e81b1 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__permission_catalog_semantics.snap @@ -0,0 +1,7 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/drive.rs +expression: "catalog_semantics_snapshot::()" +--- +MemberPermitted | Post | /open-apis/drive/v1/permission/member/permitted | Some([User, Tenant]) +MemberTransfer | Post | /open-apis/drive/v1/permission/member/transfer | Some([User, Tenant]) +Public | Post | /open-apis/drive/v1/permission/v2/public/ | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__permission_old_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__permission_old_catalog_semantics.snap new file mode 100644 index 000000000..102c39d13 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__drive__tests__permission_old_catalog_semantics.snap @@ -0,0 +1,7 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/drive.rs +expression: "catalog_semantics_snapshot::()" +--- +MemberPermitted | Post | /open-apis/drive/v1/permission/member/permitted | Some([User, Tenant]) +MemberTransfer | Post | /open-apis/drive/v1/permission/member/transfer | Some([User, Tenant]) +Public | Post | /open-apis/drive/v1/permission/v2/public/ | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__lingo__tests__lingo_catalog_semantics_snapshot.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__lingo__tests__lingo_catalog_semantics_snapshot.snap new file mode 100644 index 000000000..4a5a3d7f0 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__lingo__tests__lingo_catalog_semantics_snapshot.snap @@ -0,0 +1,27 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/lingo.rs +expression: "catalog_semantics_snapshot::()" +--- +DraftCreate | Post | /open-apis/lingo/v1/drafts | Some([User, Tenant]) +DraftUpdate("") | Put | /open-apis/lingo/v1/drafts/ | Some([User, Tenant]) +EntityCreate | Post | /open-apis/lingo/v1/entities | Some([User, Tenant]) +EntityUpdate("") | Put | /open-apis/lingo/v1/entities/ | Some([User, Tenant]) +EntityDelete("") | Delete | /open-apis/lingo/v1/entities/ | Some([User, Tenant]) +EntityGet("") | Get | /open-apis/lingo/v1/entities/ | Some([User, Tenant]) +EntityList | Get | /open-apis/lingo/v1/entities | Some([User, Tenant]) +EntityMatch | Post | /open-apis/baike/v1/entities/match | Some([User, Tenant]) +EntitySearch | Post | /open-apis/lingo/v1/entities/search | Some([User, Tenant]) +EntityHighlight | Post | /open-apis/lingo/v1/entities/highlight | Some([User, Tenant]) +EntityBatchGet | Post | /open-apis/lingo/v1/entities:batchGet | Some([User, Tenant]) +EntityBatchUpdate | Post | /open-apis/lingo/v1/entities:batchUpdate | Some([User, Tenant]) +EntitySearchRecommend | Post | /open-apis/lingo/v1/entities:searchRecommend | Some([User, Tenant]) +EntityExtract | Post | /open-apis/baike/v1/entities/extract | Some([User, Tenant]) +EntityHistoryGet("") | Get | /open-apis/lingo/v1/entities//history | Some([User, Tenant]) +EntityHistoryList | Get | /open-apis/lingo/v1/entityHistory | Some([User, Tenant]) +ClassificationList | Get | /open-apis/lingo/v1/classifications | Some([User, Tenant]) +RepoList | Get | /open-apis/lingo/v1/repos | Some([User, Tenant]) +FileUpload | Post | /open-apis/lingo/v1/files/upload | Some([User, Tenant]) +FileDownload("") | Get | /open-apis/lingo/v1/files//download | Some([User, Tenant]) +GenerateSummary | Post | /open-apis/lingo/v1/text:generateSummary | Some([User, Tenant]) +ExtractKeywords | Post | /open-apis/lingo/v1/text:extractKeywords | Some([User, Tenant]) +TranslateText | Post | /open-apis/lingo/v1/text:translate | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__minutes__tests__minutes_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__minutes__tests__minutes_catalog_semantics.snap new file mode 100644 index 000000000..9e7029299 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__minutes__tests__minutes_catalog_semantics.snap @@ -0,0 +1,10 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/minutes.rs +expression: "catalog_semantics_snapshot::()" +--- +Get("") | Get | /open-apis/minutes/v1/minutes/ | Some([User, Tenant]) +Subscription | Post | /open-apis/minutes/v1/minutes/subscription | Some([User, Tenant]) +Unsubscription | Post | /open-apis/minutes/v1/minutes/unsubscription | Some([User, Tenant]) +MediaGet("") | Get | /open-apis/minutes/v1/minutes//media | Some([User, Tenant]) +TranscriptGet("") | Get | /open-apis/minutes/v1/minutes//transcript | Some([User, Tenant]) +StatisticsGet("") | Get | /open-apis/minutes/v1/minutes//statistics | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__minutes__tests__minutes_extra_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__minutes__tests__minutes_extra_catalog_semantics.snap new file mode 100644 index 000000000..8e11da8a3 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__minutes__tests__minutes_extra_catalog_semantics.snap @@ -0,0 +1,6 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/minutes.rs +expression: "catalog_semantics_snapshot::()" +--- +Search | Post | /open-apis/minutes/v1/minutes/search | Some([User, Tenant]) +Artifacts("") | Get | /open-apis/minutes/v1/minutes//artifacts | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__sheets__tests__ccm_sheet_old_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__sheets__tests__ccm_sheet_old_catalog_semantics.snap new file mode 100644 index 000000000..630bd0976 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__sheets__tests__ccm_sheet_old_catalog_semantics.snap @@ -0,0 +1,74 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/sheets.rs +expression: "catalog_semantics_snapshot::()" +--- +OperateSheets("") | Post | /open-apis/sheets/v2/spreadsheets//sheets_batch_update | Some([User, Tenant]) +UpdateSheetProperties("") | Post | /open-apis/sheets/v2/spreadsheets//sheets_batch_update | Some([User, Tenant]) +DimensionRange("") | Post | /open-apis/sheets/v2/spreadsheets//dimension_range | Some([User, Tenant]) +InsertDimensionRange("") | Post | /open-apis/sheets/v2/spreadsheets//insert_dimension_range | Some([User, Tenant]) +DimensionRangeUpdate("") | Put | /open-apis/sheets/v2/spreadsheets//dimension_range | Some([User, Tenant]) +DimensionRangeDelete("") | Delete | /open-apis/sheets/v2/spreadsheets//dimension_range | Some([User, Tenant]) +MergeCells("") | Post | /open-apis/sheets/v2/spreadsheets//merge_cells | Some([User, Tenant]) +UnmergeCells("") | Post | /open-apis/sheets/v2/spreadsheets//unmerge_cells | Some([User, Tenant]) +Style("") | Post | /open-apis/sheets/v2/spreadsheets//style | Some([User, Tenant]) +StylesBatchUpdate("") | Post | /open-apis/sheets/v2/spreadsheets//styles_batch_update | Some([User, Tenant]) +ValuesPrepend("") | Post | /open-apis/sheets/v2/spreadsheets//values_prepend | Some([User, Tenant]) +ValuesAppend("") | Post | /open-apis/sheets/v2/spreadsheets//values_append | Some([User, Tenant]) +ValuesImage("") | Post | /open-apis/sheets/v2/spreadsheets//values_image | Some([User, Tenant]) +ValuesRange("", "") | Get | /open-apis/sheets/v2/spreadsheets//values/ | Some([User, Tenant]) +ValuesBatchGet("") | Get | /open-apis/sheets/v2/spreadsheets//values_batch_get | Some([User, Tenant]) +Values("") | Put | /open-apis/sheets/v2/spreadsheets//values | Some([User, Tenant]) +ValuesBatchUpdate("") | Post | /open-apis/sheets/v2/spreadsheets//values_batch_update | Some([User, Tenant]) +ProtectedDimension("") | Post | /open-apis/sheets/v2/spreadsheets//protected_dimension | Some([User, Tenant]) +ProtectedRangeBatchUpdate("") | Post | /open-apis/sheets/v2/spreadsheets//protected_range_batch_update | Some([User, Tenant]) +ProtectedRangeBatchGet("") | Get | /open-apis/sheets/v2/spreadsheets//protected_range_batch_get | Some([User, Tenant]) +ProtectedRangeBatchDel("") | Post | /open-apis/sheets/v2/spreadsheets//protected_range_batch_del | Some([User, Tenant]) +Metainfo("") | Get | /open-apis/sheets/v2/spreadsheets//metainfo | Some([User, Tenant]) +Properties("") | Put | /open-apis/sheets/v2/spreadsheets//properties | Some([User, Tenant]) +Import | Post | /open-apis/sheets/v2/import | Some([User, Tenant]) +ImportResult | Get | /open-apis/sheets/v2/import/result | Some([User, Tenant]) +ConditionFormats("") | Get | /open-apis/sheets/v2/spreadsheets//condition_formats | Some([User, Tenant]) +ConditionFormatsBatchCreate("") | Post | /open-apis/sheets/v2/spreadsheets//condition_formats/batch_create | Some([User, Tenant]) +ConditionFormatsBatchDelete("") | Post | /open-apis/sheets/v2/spreadsheets//condition_formats/batch_delete | Some([User, Tenant]) +ConditionFormatsBatchUpdate("") | Post | /open-apis/sheets/v2/spreadsheets//condition_formats/batch_update | Some([User, Tenant]) +DataValidation("") | Get | /open-apis/sheets/v2/spreadsheets//dataValidation | Some([User, Tenant]) +DataValidationCreate("") | Post | /open-apis/sheets/v2/spreadsheets//dataValidation | Some([User, Tenant]) +DataValidationUpdate("", "") | Put | /open-apis/sheets/v2/spreadsheets//dataValidation/ | Some([User, Tenant]) +DataValidationDelete("") | Delete | /open-apis/sheets/v2/spreadsheets//dataValidation | Some([User, Tenant]) +ReadSingleRange("", "") | Get | /open-apis/sheets/v2/spreadsheets//values/ | Some([User, Tenant]) +ReadMultipleRanges("") | Get | /open-apis/sheets/v2/spreadsheets//values_batch_get | Some([User, Tenant]) +WriteSingleRange("") | Put | /open-apis/sheets/v2/spreadsheets//values | Some([User, Tenant]) +BatchWriteRanges("") | Post | /open-apis/sheets/v2/spreadsheets//values_batch_update | Some([User, Tenant]) +AppendValues("") | Post | /open-apis/sheets/v2/spreadsheets//values_append | Some([User, Tenant]) +InsertValues("") | Post | /open-apis/sheets/v2/spreadsheets//values_prepend | Some([User, Tenant]) +GetSpreadsheet("") | Get | /open-apis/sheets/v3/spreadsheets/ | Some([User, Tenant]) +CreateSpreadsheet | Post | /open-apis/sheets/v3/spreadsheets | Some([User, Tenant]) +UpdateSpreadsheet("") | Patch | /open-apis/sheets/v3/spreadsheets/ | Some([User, Tenant]) +AddSheet("") | Post | /open-apis/sheets/v2/spreadsheets//sheets_batch_update | Some([User, Tenant]) +GetSheet("", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets/ | Some([User, Tenant]) +UpdateSheet("") | Post | /open-apis/sheets/v2/spreadsheets//sheets_batch_update | Some([User, Tenant]) +DeleteSheet("") | Post | /open-apis/sheets/v2/spreadsheets//sheets_batch_update | Some([User, Tenant]) +CreateFilter("") | Post | /open-apis/sheets/v3/spreadsheets//filterViews | Some([User, Tenant]) +GetFilter("") | Post | /open-apis/sheets/v3/spreadsheets//filterViews/query | Some([User, Tenant]) +UpdateFilter("") | Post | /open-apis/sheets/v3/spreadsheets//filterViews | Some([User, Tenant]) +DeleteFilter("") | Post | /open-apis/sheets/v3/spreadsheets//filterViews | Some([User, Tenant]) +CreateFilterView("", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//filter_views | Some([User, Tenant]) +UpdateFilterView("", "", "") | Patch | /open-apis/sheets/v3/spreadsheets//sheets//filter_views/ | Some([User, Tenant]) +QueryFilterViews("", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//filter_views/query | Some([User, Tenant]) +GetFilterView("", "", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//filter_views/ | Some([User, Tenant]) +DeleteFilterView("", "", "") | Delete | /open-apis/sheets/v3/spreadsheets//sheets//filter_views/ | Some([User, Tenant]) +CreateFilterCondition("", "", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions | Some([User, Tenant]) +UpdateFilterCondition("", "", "", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions/ | Some([User, Tenant]) +QueryFilterConditions("", "", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions/query | Some([User, Tenant]) +GetFilterCondition("", "", "", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions/ | Some([User, Tenant]) +DeleteFilterCondition("", "", "", "") | Delete | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions/ | Some([User, Tenant]) +CreateFloatImage("", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//float_images | Some([User, Tenant]) +UpdateFloatImage("", "", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//float_images/ | Some([User, Tenant]) +GetFloatImage("", "", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//float_images/ | Some([User, Tenant]) +QueryFloatImages("", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//float_images/query | Some([User, Tenant]) +DeleteFloatImage("", "", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//float_images/ | Some([User, Tenant]) +DeleteRange("") | Post | /open-apis/sheets/v3/spreadsheets//dimensionRange/delete | Some([User, Tenant]) +InsertDimension("") | Post | /open-apis/sheets/v3/spreadsheets//dimensionRange/insert | Some([User, Tenant]) +MoveDimension("") | Post | /open-apis/sheets/v3/spreadsheets//dimensionRange/move | Some([User, Tenant]) +ReplaceRange("") | Post | /open-apis/sheets/v3/spreadsheets//values/batchReplace | Some([User, Tenant]) +FindReplace("") | Post | /open-apis/sheets/v3/spreadsheets//values/batchFindReplace | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__sheets__tests__sheets_v3_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__sheets__tests__sheets_v3_catalog_semantics.snap new file mode 100644 index 000000000..9a41461f8 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__sheets__tests__sheets_v3_catalog_semantics.snap @@ -0,0 +1,31 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/sheets.rs +expression: "catalog_semantics_snapshot::()" +--- +CreateSpreadsheet | Post | /open-apis/sheets/v3/spreadsheets | Some([User, Tenant]) +GetSpreadsheet("") | Get | /open-apis/sheets/v3/spreadsheets/ | Some([User, Tenant]) +PatchSpreadsheet("") | Patch | /open-apis/sheets/v3/spreadsheets/ | Some([User, Tenant]) +QuerySheets("") | Get | /open-apis/sheets/v3/spreadsheets//sheets/query | Some([User, Tenant]) +GetSheet("", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets/ | Some([User, Tenant]) +MoveDimension("", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//move_dimension | Some([User, Tenant]) +FindCells("", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//find | Some([User, Tenant]) +ReplaceCells("", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//replace | Some([User, Tenant]) +CreateFilter("", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//filter | Some([User, Tenant]) +UpdateFilter("", "") | Put | /open-apis/sheets/v3/spreadsheets//sheets//filter | Some([User, Tenant]) +GetFilter("", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//filter | Some([User, Tenant]) +DeleteFilter("", "") | Delete | /open-apis/sheets/v3/spreadsheets//sheets//filter | Some([User, Tenant]) +CreateFilterView("", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//filter_views | Some([User, Tenant]) +QueryFilterViews("", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//filter_views/query | Some([User, Tenant]) +GetFilterView("", "", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//filter_views/ | Some([User, Tenant]) +PatchFilterView("", "", "") | Patch | /open-apis/sheets/v3/spreadsheets//sheets//filter_views/ | Some([User, Tenant]) +DeleteFilterView("", "", "") | Delete | /open-apis/sheets/v3/spreadsheets//sheets//filter_views/ | Some([User, Tenant]) +CreateFilterCondition("", "", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions | Some([User, Tenant]) +QueryFilterConditions("", "", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions/query | Some([User, Tenant]) +GetFilterCondition("", "", "", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions/ | Some([User, Tenant]) +UpdateFilterCondition("", "", "", "") | Put | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions/ | Some([User, Tenant]) +DeleteFilterCondition("", "", "", "") | Delete | /open-apis/sheets/v3/spreadsheets//sheets//filter_views//conditions/ | Some([User, Tenant]) +CreateFloatImage("", "") | Post | /open-apis/sheets/v3/spreadsheets//sheets//float_images | Some([User, Tenant]) +QueryFloatImages("", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//float_images/query | Some([User, Tenant]) +GetFloatImage("", "", "") | Get | /open-apis/sheets/v3/spreadsheets//sheets//float_images/ | Some([User, Tenant]) +PatchFloatImage("", "", "") | Patch | /open-apis/sheets/v3/spreadsheets//sheets//float_images/ | Some([User, Tenant]) +DeleteFloatImage("", "", "") | Delete | /open-apis/sheets/v3/spreadsheets//sheets//float_images/ | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_catalog_semantics.snap new file mode 100644 index 000000000..397ffb23c --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_catalog_semantics.snap @@ -0,0 +1,20 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/wiki.rs +expression: "catalog_semantics_snapshot::()" +--- +ListSpaces | Get | /open-apis/wiki/v2/spaces | Some([User, Tenant]) +GetSpace | Get | /open-apis/wiki/v2/spaces/get_node | Some([User, Tenant]) +CreateSpace | Post | /open-apis/wiki/v2/spaces | Some([User, Tenant]) +ListSpaceMembers("") | Get | /open-apis/wiki/v2/spaces//members | Some([User, Tenant]) +CreateSpaceMember("") | Post | /open-apis/wiki/v2/spaces//members | Some([User, Tenant]) +DeleteSpaceMember("", "") | Delete | /open-apis/wiki/v2/spaces//members/ | Some([User, Tenant]) +UpdateSpaceSetting("") | Put | /open-apis/wiki/v2/spaces//setting | Some([User, Tenant]) +CreateSpaceNode("") | Post | /open-apis/wiki/v2/spaces//nodes | Some([User, Tenant]) +GetSpaceNode | Get | /open-apis/wiki/v2/spaces/get_node | Some([User, Tenant]) +ListSpaceNodes | Get | /open-apis/wiki/v2/space.node/list | Some([User, Tenant]) +MoveSpaceNode("", "") | Post | /open-apis/wiki/v2/spaces//nodes//move | Some([User, Tenant]) +UpdateSpaceNodeTitle("", "") | Post | /open-apis/wiki/v2/spaces//nodes//update_title | Some([User, Tenant]) +CopySpaceNode("", "") | Post | /open-apis/wiki/v2/spaces//nodes//copy | Some([User, Tenant]) +MoveDocsToWiki("") | Post | /open-apis/wiki/v2/spaces//nodes/move_docs_to_wiki | Some([User, Tenant]) +GetTask("") | Get | /open-apis/wiki/v2/tasks/ | Some([User, Tenant]) +SearchNodes | Post | /open-apis/wiki/v1/nodes/search | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_v1_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_v1_catalog_semantics.snap new file mode 100644 index 000000000..22584da0f --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_v1_catalog_semantics.snap @@ -0,0 +1,5 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/wiki.rs +expression: "catalog_semantics_snapshot::()" +--- +NodeSearch | Post | /open-apis/wiki/v1/nodes/search | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_v2_catalog_semantics.snap b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_v2_catalog_semantics.snap new file mode 100644 index 000000000..0e1850b46 --- /dev/null +++ b/crates/openlark-docs/src/common/api_endpoints/snapshots/openlark_docs__common__api_endpoints__wiki__tests__wiki_v2_catalog_semantics.snap @@ -0,0 +1,19 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints/wiki.rs +expression: "catalog_semantics_snapshot::()" +--- +SpaceList | Get | /open-apis/wiki/v2/spaces | Some([User, Tenant]) +SpaceGet("") | Get | /open-apis/wiki/v2/spaces/ | Some([User, Tenant]) +SpaceCreate | Post | /open-apis/wiki/v2/spaces | Some([User, Tenant]) +SpaceSettingUpdate("") | Put | /open-apis/wiki/v2/spaces//setting | Some([User, Tenant]) +SpaceGetNode | Get | /open-apis/wiki/v2/spaces/get_node | Some([User, Tenant]) +SpaceNodeList("") | Get | /open-apis/wiki/v2/spaces//nodes | Some([User, Tenant]) +SpaceNodeCreate("") | Post | /open-apis/wiki/v2/spaces//nodes | Some([User, Tenant]) +SpaceMemberList("") | Get | /open-apis/wiki/v2/spaces//members | Some([User, Tenant]) +SpaceMemberCreate("") | Post | /open-apis/wiki/v2/spaces//members | Some([User, Tenant]) +SpaceMemberDelete("", "") | Delete | /open-apis/wiki/v2/spaces//members/ | Some([User, Tenant]) +SpaceNodeMove("", "") | Post | /open-apis/wiki/v2/spaces//nodes//move | Some([User, Tenant]) +SpaceNodeUpdateTitle("", "") | Post | /open-apis/wiki/v2/spaces//nodes//update_title | Some([User, Tenant]) +SpaceNodeCopy("", "") | Post | /open-apis/wiki/v2/spaces//nodes//copy | Some([User, Tenant]) +SpaceNodeMoveDocsToWiki("") | Post | /open-apis/wiki/v2/spaces//nodes/move_docs_to_wiki | Some([User, Tenant]) +TaskGet("") | Get | /open-apis/wiki/v2/tasks/ | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/api_endpoints/wiki.rs b/crates/openlark-docs/src/common/api_endpoints/wiki.rs index 7ce62b013..d29a2a839 100644 --- a/crates/openlark-docs/src/common/api_endpoints/wiki.rs +++ b/crates/openlark-docs/src/common/api_endpoints/wiki.rs @@ -5,6 +5,7 @@ use openlark_core::api::{ApiRequest, HttpMethod}; /// Wiki API V1 端点枚举 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum WikiApiV1 { /// 搜索Wiki NodeSearch, @@ -38,6 +39,7 @@ impl CatalogEndpoint for WikiApiV1 { /// Wiki API V2 端点枚举 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum WikiApiV2 { /// 获取知识空间列表 SpaceList, @@ -153,6 +155,7 @@ impl CatalogEndpoint for WikiApiV2 { /// Wiki API 端点枚举 #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum WikiApi { // Space APIs /// 获取知识空间列表 @@ -291,56 +294,21 @@ impl CatalogEndpoint for WikiApi { #[cfg(test)] mod tests { use super::*; - use crate::common::api_endpoints::test_support::assert_endpoint_semantics; + use crate::common::api_endpoints::test_support::catalog_semantics_snapshot; #[test] - fn wiki_catalog_covers_every_http_method_class() { - assert_endpoint_semantics( - WikiApiV1::NodeSearch, - HttpMethod::Post, - "/open-apis/wiki/v1/nodes/search", + fn wiki_catalog_semantics_snapshots() { + insta::assert_snapshot!( + "wiki_v1_catalog_semantics", + catalog_semantics_snapshot::() ); - - assert_endpoint_semantics( - WikiApiV2::SpaceGet("space".into()), - HttpMethod::Get, - "/open-apis/wiki/v2/spaces/space", - ); - assert_endpoint_semantics( - WikiApiV2::SpaceCreate, - HttpMethod::Post, - "/open-apis/wiki/v2/spaces", - ); - assert_endpoint_semantics( - WikiApiV2::SpaceSettingUpdate("space".into()), - HttpMethod::Put, - "/open-apis/wiki/v2/spaces/space/setting", - ); - assert_endpoint_semantics( - WikiApiV2::SpaceMemberDelete("space".into(), "member".into()), - HttpMethod::Delete, - "/open-apis/wiki/v2/spaces/space/members/member", - ); - - assert_endpoint_semantics( - WikiApi::GetSpace, - HttpMethod::Get, - "/open-apis/wiki/v2/spaces/get_node", - ); - assert_endpoint_semantics( - WikiApi::CreateSpace, - HttpMethod::Post, - "/open-apis/wiki/v2/spaces", - ); - assert_endpoint_semantics( - WikiApi::UpdateSpaceSetting("space".into()), - HttpMethod::Put, - "/open-apis/wiki/v2/spaces/space/setting", + insta::assert_snapshot!( + "wiki_v2_catalog_semantics", + catalog_semantics_snapshot::() ); - assert_endpoint_semantics( - WikiApi::DeleteSpaceMember("space".into(), "member".into()), - HttpMethod::Delete, - "/open-apis/wiki/v2/spaces/space/members/member", + insta::assert_snapshot!( + "wiki_catalog_semantics", + catalog_semantics_snapshot::() ); } } diff --git a/crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__base_catalog_semantics_snapshot.snap b/crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__base_catalog_semantics_snapshot.snap new file mode 100644 index 000000000..7577166b1 --- /dev/null +++ b/crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__base_catalog_semantics_snapshot.snap @@ -0,0 +1,7 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints.rs +expression: "catalog_semantics_snapshot::()" +--- +RoleCreate("") | Post | /open-apis/base/v2/apps//roles | Some([User, Tenant]) +RoleUpdate("", "") | Put | /open-apis/base/v2/apps//roles/ | Some([User, Tenant]) +RoleList("") | Get | /open-apis/base/v2/apps//roles | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__ccm_doc_old_catalog_semantics_snapshot.snap b/crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__ccm_doc_old_catalog_semantics_snapshot.snap new file mode 100644 index 000000000..0fd745150 --- /dev/null +++ b/crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__ccm_doc_old_catalog_semantics_snapshot.snap @@ -0,0 +1,10 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints.rs +expression: "catalog_semantics_snapshot::()" +--- +Create | Post | /open-apis/doc/v2/create | Some([User, Tenant]) +Meta("") | Get | /open-apis/doc/v2/meta/ | Some([User, Tenant]) +SheetMeta("") | Get | /open-apis/doc/v2//sheet_meta | Some([User, Tenant]) +RawContent("") | Get | /open-apis/doc/v2//raw_content | Some([User, Tenant]) +Content("") | Get | /open-apis/doc/v2//content | Some([User, Tenant]) +BatchUpdate("") | Post | /open-apis/doc/v2//batch_update | Some([User, Tenant]) diff --git a/crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__ccm_docs_old_catalog_semantics_snapshot.snap b/crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__ccm_docs_old_catalog_semantics_snapshot.snap new file mode 100644 index 000000000..9da44625d --- /dev/null +++ b/crates/openlark-docs/src/common/snapshots/openlark_docs__common__api_endpoints__tests__ccm_docs_old_catalog_semantics_snapshot.snap @@ -0,0 +1,6 @@ +--- +source: crates/openlark-docs/src/common/api_endpoints.rs +expression: "catalog_semantics_snapshot::()" +--- +SearchObject | Post | /open-apis/suite/docs-api/search/object | Some([User, Tenant]) +Meta | Get | /open-apis/suite/docs-api/meta | Some([User, Tenant]) From 0a8d45dcb71379a5b8d887a09cabf03cef0ca98e Mon Sep 17 00:00:00 2001 From: ZoOL Date: Thu, 16 Jul 2026 15:30:16 +0800 Subject: [PATCH 3/3] fix(ci): update mod reachability allowlist for shared test_utils --- tools/mod_reachability_allowlist.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/mod_reachability_allowlist.txt b/tools/mod_reachability_allowlist.txt index 093a909b4..e978c226c 100644 --- a/tools/mod_reachability_allowlist.txt +++ b/tools/mod_reachability_allowlist.txt @@ -2,4 +2,6 @@ # 由 `python3 tools/check_mod_reachability.py --update-allowlist` 生成。 # CI 只对【新增】孤儿失败;各 crate 修复死代码后从此文件删除对应行, # 再跑 --update-allowlist 或直接编辑收敛。 -# 当前存量孤儿:0 个 +# 当前存量孤儿:1 个 + +openlark-docs: crates/openlark-docs/src/common/test_utils.rs