Fix extension tests on release branches (#20307)

Conrad Irwin and Max created

Co-Authored-By: Max <max@zed.dev>
cc @maxdeviant

Release Notes:

- N/A

---------

Co-authored-by: Max <max@zed.dev>

Change summary

crates/extension_host/Cargo.toml           |  3 +++
crates/extension_host/src/wasm_host/wit.rs | 21 ++++++++++++++-------
crates/extensions_ui/Cargo.toml            |  1 +
3 files changed, 18 insertions(+), 7 deletions(-)

Detailed changes

crates/extension_host/Cargo.toml 🔗

@@ -12,6 +12,9 @@ workspace = true
 path = "src/extension_host.rs"
 doctest = false
 
+[features]
+test-support = []
+
 [dependencies]
 anyhow.workspace = true
 async-compression.workspace = true

crates/extension_host/src/wasm_host/wit.rs 🔗

@@ -80,13 +80,20 @@ impl Extension {
         version: SemanticVersion,
         component: &Component,
     ) -> Result<Self> {
-        // Note: The release channel can be used to stage a new version of the extension API.
-        let allow_latest_version = match release_channel {
-            ReleaseChannel::Dev | ReleaseChannel::Nightly => true,
-            ReleaseChannel::Stable | ReleaseChannel::Preview => false,
-        };
-
-        if allow_latest_version && version >= latest::MIN_VERSION {
+        if version >= latest::MIN_VERSION {
+            // Note: The release channel can be used to stage a new version of the extension API.
+            // We always allow the latest in tests so that the extension tests pass on release branches.
+            let allow_latest_version = match release_channel {
+                ReleaseChannel::Dev | ReleaseChannel::Nightly => true,
+                ReleaseChannel::Stable | ReleaseChannel::Preview => {
+                    cfg!(any(test, feature = "test-support"))
+                }
+            };
+            if !allow_latest_version {
+                Err(anyhow!(
+                    "unreleased versions of the extension API can only be used on development builds of Zed"
+                ))?;
+            }
             let extension =
                 latest::Extension::instantiate_async(store, component, latest::linker())
                     .await

crates/extensions_ui/Cargo.toml 🔗

@@ -52,6 +52,7 @@ async-tar.workspace = true
 ctor.workspace = true
 editor = { workspace = true, features = ["test-support"] }
 env_logger.workspace = true
+extension_host = {workspace = true, features = ["test-support"] }
 fs = { workspace = true, features = ["test-support"] }
 gpui = { workspace = true, features = ["test-support"] }
 http_client.workspace = true