swift-sdk/Tests/MCPTests/ResourceTests.swift
2025-02-11 15:22:35 -08:00

138 lines
5.1 KiB
Swift

import Foundation
import Testing
@testable import MCP
@Suite("Resource Tests")
struct ResourceTests {
@Test("Resource initialization with valid parameters")
func testResourceInitialization() throws {
let resource = Resource(
name: "test_resource",
uri: "file://test.txt",
description: "A test resource",
mimeType: "text/plain",
metadata: ["key": "value"]
)
#expect(resource.name == "test_resource")
#expect(resource.uri == "file://test.txt")
#expect(resource.description == "A test resource")
#expect(resource.mimeType == "text/plain")
#expect(resource.metadata?["key"] == "value")
}
@Test("Resource encoding and decoding")
func testResourceEncodingDecoding() throws {
let resource = Resource(
name: "test_resource",
uri: "file://test.txt",
description: "Test resource description",
mimeType: "text/plain",
metadata: ["key1": "value1", "key2": "value2"]
)
let encoder = JSONEncoder()
let decoder = JSONDecoder()
let data = try encoder.encode(resource)
let decoded = try decoder.decode(Resource.self, from: data)
#expect(decoded.name == resource.name)
#expect(decoded.uri == resource.uri)
#expect(decoded.description == resource.description)
#expect(decoded.mimeType == resource.mimeType)
#expect(decoded.metadata == resource.metadata)
}
@Test("Resource.Content text initialization and encoding")
func testResourceContentTextEncoding() throws {
let content = Resource.Content.text(
"Hello, world!", uri: "file://test.txt", mimeType: "text/plain")
let encoder = JSONEncoder()
let decoder = JSONDecoder()
let data = try encoder.encode(content)
let decoded = try decoder.decode(Resource.Content.self, from: data)
#expect(decoded.uri == "file://test.txt")
#expect(decoded.mimeType == "text/plain")
#expect(decoded.text == "Hello, world!")
#expect(decoded.blob == nil)
}
@Test("Resource.Content binary initialization and encoding")
func testResourceContentBinaryEncoding() throws {
let binaryData = "Test binary data".data(using: .utf8)!
let content = Resource.Content.binary(
binaryData, uri: "file://test.bin", mimeType: "application/octet-stream")
let encoder = JSONEncoder()
let decoder = JSONDecoder()
let data = try encoder.encode(content)
let decoded = try decoder.decode(Resource.Content.self, from: data)
#expect(decoded.uri == "file://test.bin")
#expect(decoded.mimeType == "application/octet-stream")
#expect(decoded.text == nil)
#expect(decoded.blob == binaryData.base64EncodedString())
}
@Test("ListResources parameters validation")
func testListResourcesParameters() throws {
let params = ListResources.Parameters(cursor: "next_page")
#expect(params.cursor == "next_page")
let emptyParams = ListResources.Parameters()
#expect(emptyParams.cursor == nil)
}
@Test("ListResources result validation")
func testListResourcesResult() throws {
let resources = [
Resource(name: "resource1", uri: "file://test1.txt"),
Resource(name: "resource2", uri: "file://test2.txt"),
]
let result = ListResources.Result(resources: resources, nextCursor: "next_page")
#expect(result.resources.count == 2)
#expect(result.resources[0].name == "resource1")
#expect(result.resources[1].name == "resource2")
#expect(result.nextCursor == "next_page")
}
@Test("ReadResource parameters validation")
func testReadResourceParameters() throws {
let params = ReadResource.Parameters(uri: "file://test.txt")
#expect(params.uri == "file://test.txt")
}
@Test("ReadResource result validation")
func testReadResourceResult() throws {
let contents = [
Resource.Content.text("Content 1", uri: "file://test1.txt"),
Resource.Content.text("Content 2", uri: "file://test2.txt"),
]
let result = ReadResource.Result(contents: contents)
#expect(result.contents.count == 2)
}
@Test("ResourceSubscribe parameters validation")
func testResourceSubscribeParameters() throws {
let params = ResourceSubscribe.Parameters(uri: "file://test.txt")
#expect(params.uri == "file://test.txt")
}
@Test("ResourceUpdatedNotification parameters validation")
func testResourceUpdatedNotification() throws {
let params = ResourceUpdatedNotification.Parameters(uri: "file://test.txt")
#expect(params.uri == "file://test.txt")
#expect(ResourceUpdatedNotification.name == "notifications/resources/updated")
}
@Test("ResourceListChangedNotification name validation")
func testResourceListChangedNotification() throws {
#expect(ResourceListChangedNotification.name == "notifications/resources/list_changed")
}
}