Skip to main content
Glama

COA Goldfish MCP

by anortham
Fts5DiagnosticTest.csโ€ข5.72 kB
using NUnit.Framework; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Configuration; using Microsoft.EntityFrameworkCore; using Microsoft.Data.Sqlite; using COA.Goldfish.McpServer.Services.Storage; namespace COA.Goldfish.IntegrationTests; [TestFixture] public class Fts5DiagnosticTest { private GoldfishDbContext _context = null!; private string _testWorkspaceId = null!; [SetUp] public async Task SetUp() { _testWorkspaceId = "fts5-test-" + Guid.NewGuid().ToString("N")[..8]; var services = new ServiceCollection(); services.AddLogging(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Warning)); // Add configuration var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary<string, string?> { ["Goldfish:PrimaryWorkspace"] = Path.GetTempPath() }) .Build(); services.AddSingleton<IConfiguration>(configuration); // Use SQLite file database (not in-memory) for FTS5 testing with unique path var uniqueId = Guid.NewGuid().ToString("N")[..8]; var testDbPath = Path.Combine(Path.GetTempPath(), $"fts5test_{uniqueId}_{DateTime.UtcNow.Ticks}.db"); services.AddDbContext<GoldfishDbContext>(options => options.UseSqlite($"Data Source={testDbPath}")); var serviceProvider = services.BuildServiceProvider(); _context = serviceProvider.GetRequiredService<GoldfishDbContext>(); // Initialize database await _context.Database.EnsureCreatedAsync(); } [TearDown] public async Task TearDown() { try { // Try to close connection cleanly first if (_context.Database.GetDbConnection().State == System.Data.ConnectionState.Open) { await _context.Database.GetDbConnection().CloseAsync(); } await _context.Database.EnsureDeletedAsync(); } catch (Exception ex) { // Log but don't fail the test cleanup Console.WriteLine($"Warning: Database cleanup failed: {ex.Message}"); } finally { await _context.DisposeAsync(); } } [Test] public async Task Test_FTS5_Extension_Available() { // Test if FTS5 extension is available - if this completes without exception, FTS5 works await _context.Database.ExecuteSqlRawAsync("CREATE VIRTUAL TABLE test_fts USING fts5(content);"); await _context.Database.ExecuteSqlRawAsync("DROP TABLE test_fts;"); // If we reach here without exception, FTS5 is available Assert.Pass("FTS5 extension is available and working"); } [Test] public async Task Test_Simple_FTS5_Table_Creation() { // Create a simple FTS5 table await _context.Database.ExecuteSqlRawAsync(@" CREATE VIRTUAL TABLE simple_fts USING fts5(id, text); "); // Insert some test data await _context.Database.ExecuteSqlRawAsync(@" INSERT INTO simple_fts(id, text) VALUES ('1', 'Hello world'); "); await _context.Database.ExecuteSqlRawAsync(@" INSERT INTO simple_fts(id, text) VALUES ('2', 'FTS5 search test'); "); // Test MATCH query var results = await _context.Database.SqlQueryRaw<SimpleFtsResult>(@" SELECT id, text FROM simple_fts WHERE simple_fts MATCH 'FTS5'; ").ToListAsync(); Assert.That(results.Count, Is.EqualTo(1)); Assert.That(results[0].Id, Is.EqualTo("2")); Assert.That(results[0].Text, Is.EqualTo("FTS5 search test")); } [Test] public async Task Test_Content_Based_FTS5_Table() { // Use a simpler approach that's less prone to corruption try { // Create a simple standalone FTS5 table (not content-based) await _context.Database.ExecuteSqlRawAsync(@" CREATE VIRTUAL TABLE content_fts USING fts5( id, workspace_id, title, description ); "); // Insert data directly into the FTS5 table await _context.Database.ExecuteSqlRawAsync(@" INSERT INTO content_fts(id, workspace_id, title, description) VALUES ('test1', 'workspace1', 'Test Title', 'This is a test description with FTS5'); "); // Test MATCH query with simpler approach var results = await _context.Database.SqlQueryRaw<ContentFtsResult>(@" SELECT id, workspace_id, title, description FROM content_fts WHERE content_fts MATCH 'FTS5'; ").ToListAsync(); Assert.That(results.Count, Is.EqualTo(1)); Assert.That(results[0].Id, Is.EqualTo("test1")); Assert.That(results[0].Description, Contains.Substring("FTS5")); } catch (Exception ex) { // If FTS5 fails, skip this test rather than failing Assert.Inconclusive($"FTS5 test skipped due to database issue: {ex.Message}"); } } public class SimpleFtsResult { public string Id { get; set; } = string.Empty; public string Text { get; set; } = string.Empty; } public class ContentFtsResult { public string Id { get; set; } = string.Empty; public string WorkspaceId { get; set; } = string.Empty; public string Title { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/anortham/coa-goldfish-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server