using System.Text;
using System.Threading;
using MCPForUnity.Editor.Services.AssetGen.Http;
using MCPForUnity.Editor.Services.AssetGen.Providers;
using NUnit.Framework;
namespace MCPForUnityTests.Editor.AssetGen
{
///
/// Exercises the Sketchfab marketplace adapter against a .
/// Asserts the "Token" auth scheme and that the download endpoint's gltf.url is parsed into
/// the archive URL the job manager will fetch. The secret is never asserted beyond the scheme.
///
public class SketchfabAdapterTests
{
private static HttpResult Json(string json, int status = 200)
=> new HttpResult
{
Status = status,
IsSuccess = status >= 200 && status < 300,
Text = json,
Body = Encoding.UTF8.GetBytes(json)
};
[Test]
public void Search_GetsSearchEndpoint_WithTokenHeader_ReturnsRawJson()
{
var http = new FakeHttpTransport { Handler = _ => Json("{\"results\":[{\"uid\":\"abc\"}]}") };
var adapter = new SketchfabAdapter();
string raw = adapter.SearchAsync("castle", null, true, null, null, "sfk_secret", http, CancellationToken.None).GetAwaiter().GetResult();
StringAssert.Contains("\"uid\":\"abc\"", raw);
HttpRequestSpec rec = http.RecordedRequests[0];
Assert.AreEqual("GET", rec.Method);
StringAssert.Contains("/v3/search", rec.Url);
StringAssert.Contains("downloadable=true", rec.Url);
StringAssert.Contains("q=castle", rec.Url);
Assert.IsTrue(rec.Headers.ContainsKey("Authorization"));
StringAssert.StartsWith("Token ", rec.Headers["Authorization"]);
}
[Test]
public void Search_ForwardsCategoriesCountCursorAndDownloadableFlag()
{
var http = new FakeHttpTransport { Handler = _ => Json("{\"results\":[],\"cursors\":{\"next\":\"2\"}}") };
var adapter = new SketchfabAdapter();
adapter.SearchAsync("castle", "architecture", false, 12, "2", "sfk_secret", http, CancellationToken.None)
.GetAwaiter().GetResult();
string url = http.RecordedRequests[0].Url;
StringAssert.Contains("categories=architecture", url);
StringAssert.Contains("count=12", url);
StringAssert.Contains("cursor=2", url);
StringAssert.Contains("downloadable=false", url);
}
[Test]
public void ResolveDownloadUrl_ParsesGltfUrl()
{
var http = new FakeHttpTransport
{
Handler = _ => Json("{\"gltf\":{\"url\":\"https://dl.sketchfab.com/models/abc/file.zip?sig=x\"}}")
};
var adapter = new SketchfabAdapter();
string url = adapter.ResolveDownloadUrlAsync("abc", "sfk_secret", http, CancellationToken.None)
.GetAwaiter().GetResult();
Assert.AreEqual("https://dl.sketchfab.com/models/abc/file.zip?sig=x", url);
HttpRequestSpec rec = http.RecordedRequests[0];
StringAssert.Contains("/v3/models/abc/download", rec.Url);
StringAssert.StartsWith("Token ", rec.Headers["Authorization"]);
}
[Test]
public void ResolveDownloadUrl_MissingGltf_Throws()
{
var http = new FakeHttpTransport { Handler = _ => Json("{\"usdz\":{\"url\":\"https://x/y.usdz\"}}") };
var adapter = new SketchfabAdapter();
Assert.Throws(() =>
adapter.ResolveDownloadUrlAsync("abc", "sfk_secret", http, CancellationToken.None).GetAwaiter().GetResult());
}
}
}