| 1 | package agent |
| 2 | |
| 3 | import ( |
| 4 | "strings" |
| 5 | "testing" |
| 6 | |
| 7 | "reasonix/internal/config" |
| 8 | ) |
| 9 | |
| 10 | // "disabled" and "never registered" have different causes and different fixes. |
| 11 | // Reporting the second as the first sends the user looking for a toggle that |
| 12 | // does not exist — which is exactly what a host-session MCP server used to hit, |
| 13 | // since it connects and lists its tools while the capability runtime has no |
| 14 | // record of it at all. |
| 15 | func TestServerUnavailableReasonSeparatesUnregisteredFromDisabled(t *testing.T) { |
| 16 | r := runtimeWithServers(config.PluginEntry{Name: "enabled-server"}) |
| 17 | r.servers["disabled-server"] = mcpRuntimeServer{ |
| 18 | entry: config.PluginEntry{Name: "disabled-server"}, |
| 19 | enabled: false, |
| 20 | } |
| 21 | frontend := r.NewFrontend(nil, nil) |
| 22 | |
| 23 | if got := frontend.serverUnavailableReason("disabled-server"); !strings.Contains(got, "is disabled in this session") { |
| 24 | t.Errorf("registered-but-disabled server: reason = %q, want it to say disabled", got) |
| 25 | } |
| 26 | if got := frontend.serverUnavailableReason("ghost-server"); !strings.Contains(got, "is not registered in this session") { |
| 27 | t.Errorf("unregistered server: reason = %q, want it to say not registered", got) |
| 28 | } |
| 29 | if !frontend.serverEnabled("enabled-server") { |
| 30 | t.Error("enabled-server should dispatch") |
| 31 | } |
| 32 | if frontend.serverEnabled("disabled-server") || frontend.serverEnabled("ghost-server") { |
| 33 | t.Error("neither a disabled nor an unregistered server may dispatch") |
| 34 | } |
| 35 | } |
| 36 |