@dobbyai/mcp-external 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/__tests__/agent-mail-tools.test.d.ts +8 -0
  2. package/dist/__tests__/agent-mail-tools.test.d.ts.map +1 -0
  3. package/dist/__tests__/agent-mail-tools.test.js +262 -0
  4. package/dist/__tests__/agent-mail-tools.test.js.map +1 -0
  5. package/dist/__tests__/annotations.test.d.ts +8 -0
  6. package/dist/__tests__/annotations.test.d.ts.map +1 -0
  7. package/dist/__tests__/annotations.test.js +108 -0
  8. package/dist/__tests__/annotations.test.js.map +1 -0
  9. package/dist/__tests__/auth.test.d.ts +7 -0
  10. package/dist/__tests__/auth.test.d.ts.map +1 -0
  11. package/dist/__tests__/auth.test.js +116 -0
  12. package/dist/__tests__/auth.test.js.map +1 -0
  13. package/dist/__tests__/integration/protocol.test.d.ts +8 -0
  14. package/dist/__tests__/integration/protocol.test.d.ts.map +1 -0
  15. package/dist/__tests__/integration/protocol.test.js +104 -0
  16. package/dist/__tests__/integration/protocol.test.js.map +1 -0
  17. package/dist/__tests__/mcp-integrations.test.d.ts +8 -0
  18. package/dist/__tests__/mcp-integrations.test.d.ts.map +1 -0
  19. package/dist/__tests__/mcp-integrations.test.js +375 -0
  20. package/dist/__tests__/mcp-integrations.test.js.map +1 -0
  21. package/dist/__tests__/memory-graph-tools.test.d.ts +8 -0
  22. package/dist/__tests__/memory-graph-tools.test.d.ts.map +1 -0
  23. package/dist/__tests__/memory-graph-tools.test.js +265 -0
  24. package/dist/__tests__/memory-graph-tools.test.js.map +1 -0
  25. package/dist/__tests__/schedule-tools.test.d.ts +8 -0
  26. package/dist/__tests__/schedule-tools.test.d.ts.map +1 -0
  27. package/dist/__tests__/schedule-tools.test.js +290 -0
  28. package/dist/__tests__/schedule-tools.test.js.map +1 -0
  29. package/dist/__tests__/tiers.test.d.ts +7 -0
  30. package/dist/__tests__/tiers.test.d.ts.map +1 -0
  31. package/dist/__tests__/tiers.test.js +103 -0
  32. package/dist/__tests__/tiers.test.js.map +1 -0
  33. package/dist/__tests__/tools.test.d.ts +7 -0
  34. package/dist/__tests__/tools.test.d.ts.map +1 -0
  35. package/dist/__tests__/tools.test.js +143 -0
  36. package/dist/__tests__/tools.test.js.map +1 -0
  37. package/dist/__tests__/transport.test.d.ts +7 -0
  38. package/dist/__tests__/transport.test.d.ts.map +1 -0
  39. package/dist/__tests__/transport.test.js +55 -0
  40. package/dist/__tests__/transport.test.js.map +1 -0
  41. package/dist/__tests__/web-eval-tools.test.d.ts +8 -0
  42. package/dist/__tests__/web-eval-tools.test.d.ts.map +1 -0
  43. package/dist/__tests__/web-eval-tools.test.js +252 -0
  44. package/dist/__tests__/web-eval-tools.test.js.map +1 -0
  45. package/dist/__tests__/workflow-tools.test.d.ts +8 -0
  46. package/dist/__tests__/workflow-tools.test.d.ts.map +1 -0
  47. package/dist/__tests__/workflow-tools.test.js +268 -0
  48. package/dist/__tests__/workflow-tools.test.js.map +1 -0
  49. package/dist/auth/oauth-provider.d.ts +34 -0
  50. package/dist/auth/oauth-provider.d.ts.map +1 -0
  51. package/dist/auth/oauth-provider.js +75 -0
  52. package/dist/auth/oauth-provider.js.map +1 -0
  53. package/dist/auth/token-verifier.d.ts +40 -0
  54. package/dist/auth/token-verifier.d.ts.map +1 -0
  55. package/dist/auth/token-verifier.js +138 -0
  56. package/dist/auth/token-verifier.js.map +1 -0
  57. package/dist/http-server.d.ts +35 -0
  58. package/dist/http-server.d.ts.map +1 -0
  59. package/dist/http-server.js +175 -0
  60. package/dist/http-server.js.map +1 -0
  61. package/dist/index.js +131 -36
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/dobby-client.d.ts +50 -20
  64. package/dist/lib/dobby-client.d.ts.map +1 -1
  65. package/dist/lib/dobby-client.js +50 -0
  66. package/dist/lib/dobby-client.js.map +1 -1
  67. package/dist/tools/agent-mail.d.ts +153 -0
  68. package/dist/tools/agent-mail.d.ts.map +1 -0
  69. package/dist/tools/agent-mail.js +340 -0
  70. package/dist/tools/agent-mail.js.map +1 -0
  71. package/dist/tools/approvals.d.ts +24 -0
  72. package/dist/tools/approvals.d.ts.map +1 -1
  73. package/dist/tools/approvals.js +24 -0
  74. package/dist/tools/approvals.js.map +1 -1
  75. package/dist/tools/crew-builder.d.ts +24 -0
  76. package/dist/tools/crew-builder.d.ts.map +1 -1
  77. package/dist/tools/crew-builder.js +24 -0
  78. package/dist/tools/crew-builder.js.map +1 -1
  79. package/dist/tools/crewai.d.ts +24 -0
  80. package/dist/tools/crewai.d.ts.map +1 -1
  81. package/dist/tools/crewai.js +24 -0
  82. package/dist/tools/crewai.js.map +1 -1
  83. package/dist/tools/exa.d.ts +161 -0
  84. package/dist/tools/exa.d.ts.map +1 -0
  85. package/dist/tools/exa.js +228 -0
  86. package/dist/tools/exa.js.map +1 -0
  87. package/dist/tools/github-mcp.d.ts +303 -0
  88. package/dist/tools/github-mcp.d.ts.map +1 -0
  89. package/dist/tools/github-mcp.js +397 -0
  90. package/dist/tools/github-mcp.js.map +1 -0
  91. package/dist/tools/governance.d.ts +129 -0
  92. package/dist/tools/governance.d.ts.map +1 -0
  93. package/dist/tools/governance.js +171 -0
  94. package/dist/tools/governance.js.map +1 -0
  95. package/dist/tools/index.d.ts +3589 -159
  96. package/dist/tools/index.d.ts.map +1 -1
  97. package/dist/tools/index.js +250 -0
  98. package/dist/tools/index.js.map +1 -1
  99. package/dist/tools/jira.d.ts +60 -0
  100. package/dist/tools/jira.d.ts.map +1 -1
  101. package/dist/tools/jira.js +60 -0
  102. package/dist/tools/jira.js.map +1 -1
  103. package/dist/tools/knowledge-base.d.ts +144 -0
  104. package/dist/tools/knowledge-base.d.ts.map +1 -0
  105. package/dist/tools/knowledge-base.js +179 -0
  106. package/dist/tools/knowledge-base.js.map +1 -0
  107. package/dist/tools/mcp-metrics.d.ts +62 -0
  108. package/dist/tools/mcp-metrics.d.ts.map +1 -0
  109. package/dist/tools/mcp-metrics.js +270 -0
  110. package/dist/tools/mcp-metrics.js.map +1 -0
  111. package/dist/tools/mcp-tools.d.ts +12 -0
  112. package/dist/tools/mcp-tools.d.ts.map +1 -1
  113. package/dist/tools/mcp-tools.js +12 -0
  114. package/dist/tools/mcp-tools.js.map +1 -1
  115. package/dist/tools/mem0.d.ts +168 -0
  116. package/dist/tools/mem0.d.ts.map +1 -0
  117. package/dist/tools/mem0.js +255 -0
  118. package/dist/tools/mem0.js.map +1 -0
  119. package/dist/tools/memory-graph.d.ts +197 -0
  120. package/dist/tools/memory-graph.d.ts.map +1 -0
  121. package/dist/tools/memory-graph.js +545 -0
  122. package/dist/tools/memory-graph.js.map +1 -0
  123. package/dist/tools/messages.d.ts +12 -0
  124. package/dist/tools/messages.d.ts.map +1 -1
  125. package/dist/tools/messages.js +12 -0
  126. package/dist/tools/messages.js.map +1 -1
  127. package/dist/tools/moltbook.d.ts +564 -0
  128. package/dist/tools/moltbook.d.ts.map +1 -0
  129. package/dist/tools/moltbook.js +792 -0
  130. package/dist/tools/moltbook.js.map +1 -0
  131. package/dist/tools/ops.d.ts +219 -0
  132. package/dist/tools/ops.d.ts.map +1 -0
  133. package/dist/tools/ops.js +360 -0
  134. package/dist/tools/ops.js.map +1 -0
  135. package/dist/tools/schedules.d.ts +196 -0
  136. package/dist/tools/schedules.d.ts.map +1 -0
  137. package/dist/tools/schedules.js +264 -0
  138. package/dist/tools/schedules.js.map +1 -0
  139. package/dist/tools/services.d.ts +6 -0
  140. package/dist/tools/services.d.ts.map +1 -1
  141. package/dist/tools/services.js +6 -0
  142. package/dist/tools/services.js.map +1 -1
  143. package/dist/tools/tasks.d.ts +45 -0
  144. package/dist/tools/tasks.d.ts.map +1 -1
  145. package/dist/tools/tasks.js +49 -4
  146. package/dist/tools/tasks.js.map +1 -1
  147. package/dist/tools/tiers.d.ts +39 -0
  148. package/dist/tools/tiers.d.ts.map +1 -0
  149. package/dist/tools/tiers.js +138 -0
  150. package/dist/tools/tiers.js.map +1 -0
  151. package/dist/tools/unified-agents.d.ts +62 -0
  152. package/dist/tools/unified-agents.d.ts.map +1 -0
  153. package/dist/tools/unified-agents.js +147 -0
  154. package/dist/tools/unified-agents.js.map +1 -0
  155. package/dist/tools/web-eval.d.ts +172 -0
  156. package/dist/tools/web-eval.d.ts.map +1 -0
  157. package/dist/tools/web-eval.js +347 -0
  158. package/dist/tools/web-eval.js.map +1 -0
  159. package/dist/tools/workflow.d.ts +171 -0
  160. package/dist/tools/workflow.d.ts.map +1 -0
  161. package/dist/tools/workflow.js +518 -0
  162. package/dist/tools/workflow.js.map +1 -0
  163. package/package.json +8 -3
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Tool Tier Filtering Tests
3
+ *
4
+ * Verifies tier definitions and filtering logic.
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { MVP_TOOLS, PRO_TOOLS, TIER_COUNTS, resolveToolTier, filterToolsByTier, } from '../tools/tiers.js';
8
+ import { allTools } from '../tools/index.js';
9
+ describe('Tool Tiers', () => {
10
+ const allToolNames = Object.keys(allTools);
11
+ describe('tier sizes', () => {
12
+ it('MVP tier has 22 tools', () => {
13
+ expect(MVP_TOOLS.length).toBe(22);
14
+ expect(TIER_COUNTS.mvp).toBe(22);
15
+ });
16
+ it('Pro tier has 50 tools', () => {
17
+ expect(PRO_TOOLS.length).toBe(50);
18
+ expect(TIER_COUNTS.pro).toBe(50);
19
+ });
20
+ it('Enterprise tier includes all tools', () => {
21
+ const filtered = filterToolsByTier(allToolNames, 'enterprise');
22
+ expect(filtered.length).toBe(allToolNames.length);
23
+ });
24
+ });
25
+ describe('tier hierarchy', () => {
26
+ it('MVP tools are a subset of Pro tools', () => {
27
+ const proSet = new Set(PRO_TOOLS);
28
+ for (const tool of MVP_TOOLS) {
29
+ expect(proSet.has(tool), `MVP tool "${tool}" not in Pro tier`).toBe(true);
30
+ }
31
+ });
32
+ it('Pro tools are a subset of all tools', () => {
33
+ const allSet = new Set(allToolNames);
34
+ for (const tool of PRO_TOOLS) {
35
+ expect(allSet.has(tool), `Pro tool "${tool}" not in allTools`).toBe(true);
36
+ }
37
+ });
38
+ it('all MVP tool names exist in allTools', () => {
39
+ const allSet = new Set(allToolNames);
40
+ for (const tool of MVP_TOOLS) {
41
+ expect(allSet.has(tool), `MVP tool "${tool}" not in allTools`).toBe(true);
42
+ }
43
+ });
44
+ });
45
+ describe('no duplicates', () => {
46
+ it('MVP has no duplicate tool names', () => {
47
+ expect(new Set(MVP_TOOLS).size).toBe(MVP_TOOLS.length);
48
+ });
49
+ it('Pro has no duplicate tool names', () => {
50
+ expect(new Set(PRO_TOOLS).size).toBe(PRO_TOOLS.length);
51
+ });
52
+ });
53
+ describe('resolveToolTier', () => {
54
+ it('returns mvp with no context', () => {
55
+ expect(resolveToolTier()).toBe('mvp');
56
+ expect(resolveToolTier(undefined)).toBe('mvp');
57
+ });
58
+ it('resolves from plan field', () => {
59
+ expect(resolveToolTier({ plan: 'enterprise' })).toBe('enterprise');
60
+ expect(resolveToolTier({ plan: 'pro' })).toBe('pro');
61
+ expect(resolveToolTier({ plan: 'free' })).toBe('mvp');
62
+ });
63
+ it('resolves from scope string', () => {
64
+ expect(resolveToolTier({ scope: 'mcp:*' })).toBe('enterprise');
65
+ expect(resolveToolTier({ scope: 'mcp:pro' })).toBe('pro');
66
+ expect(resolveToolTier({ scope: 'mcp:read' })).toBe('mvp');
67
+ expect(resolveToolTier({ scope: 'mcp:execute' })).toBe('mvp');
68
+ });
69
+ it('resolves from scopes array', () => {
70
+ expect(resolveToolTier({ scopes: ['mcp:*', 'other'] })).toBe('enterprise');
71
+ expect(resolveToolTier({ scopes: ['mcp:pro'] })).toBe('pro');
72
+ expect(resolveToolTier({ scopes: ['mcp:read'] })).toBe('mvp');
73
+ });
74
+ it('plan takes precedence over scopes', () => {
75
+ expect(resolveToolTier({ plan: 'enterprise', scope: 'mcp:read' })).toBe('enterprise');
76
+ });
77
+ });
78
+ describe('filterToolsByTier', () => {
79
+ it('mvp returns exactly 22 tools', () => {
80
+ const result = filterToolsByTier(allToolNames, 'mvp');
81
+ expect(result.length).toBe(22);
82
+ });
83
+ it('pro returns exactly 50 tools', () => {
84
+ const result = filterToolsByTier(allToolNames, 'pro');
85
+ expect(result.length).toBe(50);
86
+ });
87
+ it('enterprise returns all tools', () => {
88
+ const result = filterToolsByTier(allToolNames, 'enterprise');
89
+ expect(result.length).toBe(allToolNames.length);
90
+ });
91
+ it('preserves order from input', () => {
92
+ const result = filterToolsByTier(allToolNames, 'mvp');
93
+ // All returned tools should be in the same relative order as allToolNames
94
+ let lastIdx = -1;
95
+ for (const name of result) {
96
+ const idx = allToolNames.indexOf(name);
97
+ expect(idx).toBeGreaterThan(lastIdx);
98
+ lastIdx = idx;
99
+ }
100
+ });
101
+ });
102
+ });
103
+ //# sourceMappingURL=tiers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiers.test.js","sourceRoot":"","sources":["../../src/__tests__/tiers.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,SAAS,EAET,WAAW,EACX,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE3C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAC/D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,IAAI,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,IAAI,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,IAAI,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnE,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/D,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1D,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3D,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3E,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7D,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACtD,0EAA0E;YAC1E,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBACrC,OAAO,GAAG,GAAG,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP Tools Index Tests
3
+ *
4
+ * Verifies tool definitions, routing, and MCP response format.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * MCP Tools Index Tests
3
+ *
4
+ * Verifies tool definitions, routing, and MCP response format.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import { allTools, getToolDefinitions, handleToolCall } from '../tools/index.js';
8
+ import { MVP_TOOLS } from '../tools/tiers.js';
9
+ // Mock DobbyClient
10
+ const mockClient = {
11
+ apiUrl: 'http://localhost:3000',
12
+ apiKey: 'test-key',
13
+ tenantId: 'tenant_test',
14
+ get: vi.fn(),
15
+ post: vi.fn(),
16
+ put: vi.fn(),
17
+ patch: vi.fn(),
18
+ delete: vi.fn(),
19
+ };
20
+ const mockContext = {
21
+ client: mockClient,
22
+ userId: 'user_test',
23
+ userName: 'Test User',
24
+ };
25
+ describe('Tools Index', () => {
26
+ beforeEach(() => {
27
+ vi.clearAllMocks();
28
+ });
29
+ describe('allTools', () => {
30
+ it('exports all tools as a flat object', () => {
31
+ expect(typeof allTools).toBe('object');
32
+ expect(Object.keys(allTools).length).toBeGreaterThan(80);
33
+ });
34
+ it('every tool has required MCP fields', () => {
35
+ for (const [name, tool] of Object.entries(allTools)) {
36
+ expect(tool.name, `${name} missing name`).toBe(name);
37
+ expect(typeof tool.description, `${name} missing description`).toBe('string');
38
+ expect(tool.inputSchema, `${name} missing inputSchema`).toBeDefined();
39
+ expect(tool.inputSchema.type, `${name} inputSchema.type not object`).toBe('object');
40
+ }
41
+ });
42
+ it('every tool name is unique', () => {
43
+ const names = Object.keys(allTools);
44
+ expect(new Set(names).size).toBe(names.length);
45
+ });
46
+ it('tool descriptions are non-empty', () => {
47
+ for (const [name, tool] of Object.entries(allTools)) {
48
+ expect(tool.description.length, `${name} has empty description`).toBeGreaterThan(10);
49
+ }
50
+ });
51
+ it('tool inputSchema has properties', () => {
52
+ for (const [name, tool] of Object.entries(allTools)) {
53
+ expect(tool.inputSchema.properties, `${name} missing inputSchema.properties`).toBeDefined();
54
+ }
55
+ });
56
+ });
57
+ describe('getToolDefinitions', () => {
58
+ it('returns tool definitions for enterprise tier (all tools)', () => {
59
+ const defs = getToolDefinitions('enterprise');
60
+ expect(defs.length).toBe(Object.keys(allTools).length);
61
+ });
62
+ it('returns tool definitions for mvp tier (22 tools)', () => {
63
+ const defs = getToolDefinitions('mvp');
64
+ expect(defs.length).toBe(22);
65
+ });
66
+ it('returns tool definitions for pro tier (50 tools)', () => {
67
+ const defs = getToolDefinitions('pro');
68
+ expect(defs.length).toBe(50);
69
+ });
70
+ it('defaults to enterprise when no tier provided', () => {
71
+ const defs = getToolDefinitions();
72
+ expect(defs.length).toBe(Object.keys(allTools).length);
73
+ });
74
+ it('each definition has name, description, inputSchema, annotations', () => {
75
+ const defs = getToolDefinitions('mvp');
76
+ for (const def of defs) {
77
+ expect(def.name).toBeDefined();
78
+ expect(def.description).toBeDefined();
79
+ expect(def.inputSchema).toBeDefined();
80
+ expect(def.annotations).toBeDefined();
81
+ }
82
+ });
83
+ it('mvp definitions only contain mvp tools', () => {
84
+ const defs = getToolDefinitions('mvp');
85
+ const mvpSet = new Set(MVP_TOOLS);
86
+ for (const def of defs) {
87
+ expect(mvpSet.has(def.name), `${def.name} is not an MVP tool`).toBe(true);
88
+ }
89
+ });
90
+ });
91
+ describe('handleToolCall', () => {
92
+ it('returns error for unknown tool', async () => {
93
+ const result = await handleToolCall('nonexistent_tool', {}, mockContext);
94
+ expect(result.isError).toBe(true);
95
+ expect(result.content[0].text).toContain('Unknown tool');
96
+ });
97
+ it('returns denied result when gateway auth fails', async () => {
98
+ const contextWithGateway = {
99
+ ...mockContext,
100
+ gatewayKey: 'gk_test_123',
101
+ gatewayUrl: 'http://localhost:3000',
102
+ };
103
+ // Mock fetch to return auth denied
104
+ global.fetch = vi.fn().mockResolvedValue({
105
+ ok: false,
106
+ json: () => Promise.resolve({ error: 'Insufficient scope' }),
107
+ });
108
+ const result = await handleToolCall('list_tasks', {}, contextWithGateway);
109
+ expect(result.isError).toBe(true);
110
+ expect(result.content[0].text).toContain('denied');
111
+ });
112
+ it('passes through to handler when no gateway configured', async () => {
113
+ // list_tasks should call client.get
114
+ mockClient.get.mockResolvedValue({ tasks: [] });
115
+ const result = await handleToolCall('list_tasks', { status: 'open' }, mockContext);
116
+ // Should not error (gateway auth is skipped)
117
+ expect(result).toBeDefined();
118
+ });
119
+ it('catches handler errors and wraps in MCP error format', async () => {
120
+ mockClient.get.mockRejectedValue(new Error('Network error'));
121
+ const result = await handleToolCall('list_tasks', {}, mockContext);
122
+ expect(result.isError).toBe(true);
123
+ expect(result.content[0].text).toContain('Network error');
124
+ });
125
+ it('handles all tool names in the switch without throwing', () => {
126
+ // Verify every tool name in allTools has a case in the switch
127
+ const toolNames = Object.keys(allTools);
128
+ // This is a structural test — we check that no tool is missed
129
+ // by verifying the tool count matches expectations
130
+ expect(toolNames.length).toBeGreaterThan(80);
131
+ });
132
+ });
133
+ describe('GatewayAuthResult', () => {
134
+ it('allows when no gateway key configured', async () => {
135
+ mockClient.get.mockResolvedValue({ tasks: [] });
136
+ const result = await handleToolCall('list_tasks', {}, mockContext);
137
+ // Should succeed since no gateway auth required
138
+ expect(result).toBeDefined();
139
+ expect(result.isError).toBeUndefined();
140
+ });
141
+ });
142
+ });
143
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP Transport Tests
3
+ *
4
+ * Tests for STDIO and HTTP transport initialization.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=transport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/transport.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * MCP Transport Tests
3
+ *
4
+ * Tests for STDIO and HTTP transport initialization.
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ // We test the HTTP server module's structure and health endpoint behavior
8
+ describe('HTTP Transport', () => {
9
+ it('http-server module exports startHttpServer function', async () => {
10
+ const mod = await import('../http-server.js');
11
+ expect(typeof mod.startHttpServer).toBe('function');
12
+ });
13
+ it('HttpServerConfig interface requires all fields', () => {
14
+ // Structural test — TypeScript enforces this at compile time
15
+ // This test verifies the module is importable
16
+ const config = {
17
+ port: 8080,
18
+ issuerUrl: 'https://dobby-ai.com',
19
+ mcpPublicUrl: 'https://mcp.dobby-ai.com',
20
+ createMcpServer: async () => ({}),
21
+ };
22
+ expect(config.port).toBe(8080);
23
+ });
24
+ });
25
+ describe('STDIO Transport', () => {
26
+ it('index module exports createServer entry point', async () => {
27
+ // Verify the main entry point can be imported
28
+ const mod = await import('../tools/index.js');
29
+ expect(mod.allTools).toBeDefined();
30
+ expect(mod.getToolDefinitions).toBeDefined();
31
+ expect(mod.handleToolCall).toBeDefined();
32
+ });
33
+ });
34
+ describe('Transport Selection', () => {
35
+ it('CLI supports --transport stdio and http options', async () => {
36
+ // Verify the index module references both transport modes
37
+ // This is a structural test
38
+ const indexSource = await import('../index.js').catch(() => null);
39
+ // The module may fail to import in test env (no CLI args),
40
+ // but we verify the transport module itself is valid
41
+ expect(true).toBe(true);
42
+ });
43
+ it('http-server creates Express app with correct routes', async () => {
44
+ // Verify the module structure
45
+ const mod = await import('../http-server.js');
46
+ expect(mod.startHttpServer).toBeDefined();
47
+ });
48
+ it('auth modules are properly structured', async () => {
49
+ const oauth = await import('../auth/oauth-provider.js');
50
+ const verifier = await import('../auth/token-verifier.js');
51
+ expect(oauth.createOAuthProvider).toBeDefined();
52
+ expect(verifier.TokenVerifier).toBeDefined();
53
+ });
54
+ });
55
+ //# sourceMappingURL=transport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../src/__tests__/transport.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAM,MAAM,QAAQ,CAAC;AAElD,0EAA0E;AAE1E,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,6DAA6D;QAC7D,8CAA8C;QAC9C,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,sBAAsB;YACjC,YAAY,EAAE,0BAA0B;YACxC,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAU,CAAA;SACzC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,8CAA8C;QAC9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,0DAA0D;QAC1D,4BAA4B;QAC5B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClE,2DAA2D;QAC3D,qDAAqD;QACrD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,8BAA8B;QAC9B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Web Eval Agent MCP Tools Tests — Phase 3
3
+ *
4
+ * Tests for Playwright test runner config, health checks,
5
+ * API endpoint testing, and coverage reporting.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=web-eval-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-eval-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/web-eval-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Web Eval Agent MCP Tools Tests — Phase 3
3
+ *
4
+ * Tests for Playwright test runner config, health checks,
5
+ * API endpoint testing, and coverage reporting.
6
+ */
7
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
8
+ // Mock global fetch
9
+ const mockFetch = vi.fn();
10
+ vi.stubGlobal('fetch', mockFetch);
11
+ // ============================================
12
+ // Run Tests (Config Builder)
13
+ // ============================================
14
+ describe('WebEval: Run Tests', () => {
15
+ beforeEach(() => {
16
+ vi.resetAllMocks();
17
+ });
18
+ it('returns default Playwright command for all tests', async () => {
19
+ const { handleWebEvalRunTests } = await import('../tools/web-eval.js');
20
+ const result = await handleWebEvalRunTests({}, {});
21
+ const data = JSON.parse(result.content[0].text);
22
+ expect(data.status).toBe('ready');
23
+ expect(data.test_config.command).toContain('npx playwright test');
24
+ expect(data.test_config.command).toContain('--project chromium');
25
+ expect(data.test_config.browser).toBe('chromium');
26
+ expect(data.test_config.spec).toBe('all');
27
+ });
28
+ it('builds command for specific spec file', async () => {
29
+ const { handleWebEvalRunTests } = await import('../tools/web-eval.js');
30
+ const result = await handleWebEvalRunTests({}, {
31
+ spec: 'tasks',
32
+ browser: 'firefox',
33
+ });
34
+ const data = JSON.parse(result.content[0].text);
35
+ expect(data.test_config.command).toContain('web/e2e/tasks.spec.ts');
36
+ expect(data.test_config.command).toContain('--project firefox');
37
+ expect(data.test_config.spec).toBe('tasks');
38
+ });
39
+ it('includes grep filter in command', async () => {
40
+ const { handleWebEvalRunTests } = await import('../tools/web-eval.js');
41
+ const result = await handleWebEvalRunTests({}, {
42
+ grep: 'login',
43
+ });
44
+ const data = JSON.parse(result.content[0].text);
45
+ expect(data.test_config.command).toContain('--grep');
46
+ expect(data.test_config.grep).toBe('login');
47
+ });
48
+ it('includes --headed flag when requested', async () => {
49
+ const { handleWebEvalRunTests } = await import('../tools/web-eval.js');
50
+ const result = await handleWebEvalRunTests({}, {
51
+ headed: true,
52
+ });
53
+ const data = JSON.parse(result.content[0].text);
54
+ expect(data.test_config.command).toContain('--headed');
55
+ expect(data.test_config.headed).toBe(true);
56
+ });
57
+ it('builds command for all browsers', async () => {
58
+ const { handleWebEvalRunTests } = await import('../tools/web-eval.js');
59
+ const result = await handleWebEvalRunTests({}, {
60
+ browser: 'all',
61
+ });
62
+ const data = JSON.parse(result.content[0].text);
63
+ expect(data.test_config.command).not.toContain('--project');
64
+ expect(data.test_config.browser).toBe('all');
65
+ });
66
+ it('includes available specs and browsers', async () => {
67
+ const { handleWebEvalRunTests } = await import('../tools/web-eval.js');
68
+ const result = await handleWebEvalRunTests({}, {});
69
+ const data = JSON.parse(result.content[0].text);
70
+ expect(data.test_config.available_specs).toContain('auth');
71
+ expect(data.test_config.available_specs).toContain('tasks');
72
+ expect(data.test_config.browsers).toContain('chromium');
73
+ expect(data.test_config.browsers).toContain('mobile-safari');
74
+ });
75
+ });
76
+ // ============================================
77
+ // Health Check
78
+ // ============================================
79
+ describe('WebEval: Health Check', () => {
80
+ beforeEach(() => {
81
+ vi.resetAllMocks();
82
+ });
83
+ it('checks default pages and reports healthy', async () => {
84
+ const { handleWebEvalCheckHealth } = await import('../tools/web-eval.js');
85
+ mockFetch.mockResolvedValue({
86
+ ok: true,
87
+ status: 200,
88
+ });
89
+ const result = await handleWebEvalCheckHealth({}, {});
90
+ const data = JSON.parse(result.content[0].text);
91
+ expect(data.overall_status).toBe('healthy');
92
+ expect(data.all_ok).toBe(true);
93
+ expect(data.pages_checked).toBe(3); // /, /auth/signin, /api/health
94
+ expect(data.results).toHaveLength(3);
95
+ expect(data.avg_response_time_ms).toBeGreaterThanOrEqual(0);
96
+ });
97
+ it('reports unhealthy when a page fails', async () => {
98
+ const { handleWebEvalCheckHealth } = await import('../tools/web-eval.js');
99
+ mockFetch
100
+ .mockResolvedValueOnce({ ok: true, status: 200 })
101
+ .mockResolvedValueOnce({ ok: false, status: 500 })
102
+ .mockResolvedValueOnce({ ok: true, status: 200 });
103
+ const result = await handleWebEvalCheckHealth({}, {});
104
+ const data = JSON.parse(result.content[0].text);
105
+ expect(data.overall_status).toBe('unhealthy');
106
+ expect(data.all_ok).toBe(false);
107
+ expect(data.results[1].ok).toBe(false);
108
+ expect(data.results[1].status).toBe(500);
109
+ });
110
+ it('handles connection errors gracefully', async () => {
111
+ const { handleWebEvalCheckHealth } = await import('../tools/web-eval.js');
112
+ mockFetch.mockRejectedValue(new Error('Connection refused'));
113
+ const result = await handleWebEvalCheckHealth({}, {
114
+ pages: ['/'],
115
+ });
116
+ const data = JSON.parse(result.content[0].text);
117
+ expect(data.overall_status).toBe('unhealthy');
118
+ expect(data.results[0].ok).toBe(false);
119
+ expect(data.results[0].error).toContain('Connection refused');
120
+ });
121
+ it('uses custom base_url and pages', async () => {
122
+ const { handleWebEvalCheckHealth } = await import('../tools/web-eval.js');
123
+ mockFetch.mockResolvedValue({ ok: true, status: 200 });
124
+ const result = await handleWebEvalCheckHealth({}, {
125
+ base_url: 'https://staging.dobby-ai.com',
126
+ pages: ['/api/health'],
127
+ });
128
+ const data = JSON.parse(result.content[0].text);
129
+ expect(data.base_url).toBe('https://staging.dobby-ai.com');
130
+ expect(data.pages_checked).toBe(1);
131
+ expect(mockFetch).toHaveBeenCalledWith('https://staging.dobby-ai.com/api/health', expect.any(Object));
132
+ });
133
+ });
134
+ // ============================================
135
+ // Test API Endpoint
136
+ // ============================================
137
+ describe('WebEval: Test API Endpoint', () => {
138
+ beforeEach(() => {
139
+ vi.resetAllMocks();
140
+ });
141
+ it('tests GET endpoint and returns PASS on matching status', async () => {
142
+ const { handleWebEvalTestApiEndpoint } = await import('../tools/web-eval.js');
143
+ mockFetch.mockResolvedValueOnce({
144
+ ok: true,
145
+ status: 200,
146
+ headers: { get: () => 'application/json' },
147
+ json: () => Promise.resolve({ tasks: [] }),
148
+ });
149
+ const result = await handleWebEvalTestApiEndpoint({}, {
150
+ path: '/api/v1/tasks',
151
+ });
152
+ const data = JSON.parse(result.content[0].text);
153
+ expect(data.test_result).toBe('PASS');
154
+ expect(data.response.status).toBe(200);
155
+ expect(data.response.status_match).toBe(true);
156
+ });
157
+ it('returns FAIL when status does not match expected', async () => {
158
+ const { handleWebEvalTestApiEndpoint } = await import('../tools/web-eval.js');
159
+ mockFetch.mockResolvedValueOnce({
160
+ ok: false,
161
+ status: 404,
162
+ headers: { get: () => 'application/json' },
163
+ json: () => Promise.resolve({ error: 'Not found' }),
164
+ });
165
+ const result = await handleWebEvalTestApiEndpoint({}, {
166
+ path: '/api/v1/tasks/nonexistent',
167
+ expected_status: 200,
168
+ });
169
+ const data = JSON.parse(result.content[0].text);
170
+ expect(data.test_result).toBe('FAIL');
171
+ expect(data.response.status).toBe(404);
172
+ expect(data.response.status_match).toBe(false);
173
+ expect(result.isError).toBe(true);
174
+ });
175
+ it('sends POST body correctly', async () => {
176
+ const { handleWebEvalTestApiEndpoint } = await import('../tools/web-eval.js');
177
+ mockFetch.mockResolvedValueOnce({
178
+ ok: true,
179
+ status: 201,
180
+ headers: { get: () => 'application/json' },
181
+ json: () => Promise.resolve({ task_id: 'task_123' }),
182
+ });
183
+ const result = await handleWebEvalTestApiEndpoint({}, {
184
+ method: 'POST',
185
+ path: '/api/v1/tasks',
186
+ body: { title: 'Test task' },
187
+ expected_status: 201,
188
+ });
189
+ const data = JSON.parse(result.content[0].text);
190
+ expect(data.test_result).toBe('PASS');
191
+ expect(data.request.method).toBe('POST');
192
+ });
193
+ it('handles connection errors', async () => {
194
+ const { handleWebEvalTestApiEndpoint } = await import('../tools/web-eval.js');
195
+ mockFetch.mockRejectedValueOnce(new Error('ECONNREFUSED'));
196
+ const result = await handleWebEvalTestApiEndpoint({}, {
197
+ path: '/api/v1/tasks',
198
+ });
199
+ const data = JSON.parse(result.content[0].text);
200
+ expect(data.test_result).toBe('ERROR');
201
+ expect(data.error).toContain('ECONNREFUSED');
202
+ expect(result.isError).toBe(true);
203
+ });
204
+ });
205
+ // ============================================
206
+ // Coverage Report
207
+ // ============================================
208
+ describe('WebEval: Coverage Report', () => {
209
+ it('returns coverage configuration', async () => {
210
+ const { handleWebEvalCoverageReport } = await import('../tools/web-eval.js');
211
+ const result = await handleWebEvalCoverageReport({}, {});
212
+ const data = JSON.parse(result.content[0].text);
213
+ expect(data.status).toBe('config_ready');
214
+ expect(data.commands.unit).toContain('npm run test:coverage');
215
+ expect(data.commands.e2e).toContain('playwright test');
216
+ expect(data.coverage_config.provider).toBe('v8');
217
+ expect(data.test_inventory.e2e_specs).toContain('auth');
218
+ });
219
+ it('applies custom threshold', async () => {
220
+ const { handleWebEvalCoverageReport } = await import('../tools/web-eval.js');
221
+ const result = await handleWebEvalCoverageReport({}, {
222
+ threshold: 80,
223
+ type: 'unit',
224
+ });
225
+ const data = JSON.parse(result.content[0].text);
226
+ expect(data.coverage_type).toBe('unit');
227
+ expect(data.threshold).toBe(80);
228
+ expect(data.coverage_config.thresholds.statements).toBe(80);
229
+ });
230
+ });
231
+ // ============================================
232
+ // Tool Registration
233
+ // ============================================
234
+ describe('WebEval: Tool Registration', () => {
235
+ it('all web eval tools are in allTools', async () => {
236
+ const { allTools } = await import('../tools/index.js');
237
+ expect(allTools.webeval_run_tests).toBeDefined();
238
+ expect(allTools.webeval_check_health).toBeDefined();
239
+ expect(allTools.webeval_test_api_endpoint).toBeDefined();
240
+ expect(allTools.webeval_coverage_report).toBeDefined();
241
+ });
242
+ it('web eval tools have correct schemas', async () => {
243
+ const { webEvalTools } = await import('../tools/web-eval.js');
244
+ for (const [name, tool] of Object.entries(webEvalTools)) {
245
+ expect(tool.name).toBe(name);
246
+ expect(tool.description).toBeTruthy();
247
+ expect(tool.inputSchema.type).toBe('object');
248
+ expect(tool.inputSchema.properties).toBeDefined();
249
+ }
250
+ });
251
+ });
252
+ //# sourceMappingURL=web-eval-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-eval-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/web-eval-tools.test.ts"],"names":[],"mappings":"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"}