1
0

plugin-config.spec.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { describe, expect, it } from "vitest"
  2. import { filterPluginsByConfig, createPrePluginChain, type PrePlugin } from "./pipeline"
  3. const mockPlugins: PrePlugin[] = [
  4. { name: "plugin_a", priority: 10, run: async () => ({}) },
  5. { name: "plugin_b", priority: 20, run: async () => ({}) },
  6. { name: "plugin_c", priority: 30, run: async () => ({}) },
  7. ]
  8. describe("filterPluginsByConfig", () => {
  9. it("returns all plugins when no config", () => {
  10. const result = filterPluginsByConfig(mockPlugins)
  11. expect(result).toHaveLength(3)
  12. expect(result.map(p => p.name)).toEqual(["plugin_a", "plugin_b", "plugin_c"])
  13. })
  14. it("filters by enabledPlugins whitelist", () => {
  15. const result = filterPluginsByConfig(mockPlugins, { enabledPlugins: ["plugin_a", "plugin_c"] })
  16. expect(result).toHaveLength(2)
  17. expect(result.map(p => p.name)).toEqual(["plugin_a", "plugin_c"])
  18. })
  19. it("filters by disabledPlugins blacklist", () => {
  20. const result = filterPluginsByConfig(mockPlugins, { disabledPlugins: ["plugin_b"] })
  21. expect(result).toHaveLength(2)
  22. expect(result.map(p => p.name)).toEqual(["plugin_a", "plugin_c"])
  23. })
  24. it("disabledPlugins takes priority over enabledPlugins", () => {
  25. const result = filterPluginsByConfig(mockPlugins, {
  26. enabledPlugins: ["plugin_a", "plugin_b"],
  27. disabledPlugins: ["plugin_b"],
  28. })
  29. expect(result).toHaveLength(1)
  30. expect(result.map(p => p.name)).toEqual(["plugin_a"])
  31. })
  32. it("returns empty when enabledPlugins is empty array", () => {
  33. const result = filterPluginsByConfig(mockPlugins, { enabledPlugins: [] })
  34. expect(result).toHaveLength(0)
  35. })
  36. it("ignores unknown plugin names in enabledPlugins", () => {
  37. const result = filterPluginsByConfig(mockPlugins, { enabledPlugins: ["plugin_a", "unknown"] })
  38. expect(result).toHaveLength(1)
  39. expect(result.map(p => p.name)).toEqual(["plugin_a"])
  40. })
  41. it("ignores unknown plugin names in disabledPlugins", () => {
  42. const result = filterPluginsByConfig(mockPlugins, { disabledPlugins: ["unknown"] })
  43. expect(result).toHaveLength(3)
  44. })
  45. })
  46. describe("PrePluginChain with config", () => {
  47. it("returns executedPlugins list", async () => {
  48. const chain = createPrePluginChain(mockPlugins)
  49. const result = await chain.run({
  50. userMessage: "test",
  51. projectPath: "/test",
  52. agentConfig: {} as any,
  53. })
  54. expect(result.executedPlugins).toEqual(["plugin_a", "plugin_b", "plugin_c"])
  55. })
  56. it("respects enabledPlugins in run", async () => {
  57. const chain = createPrePluginChain(mockPlugins)
  58. const result = await chain.run(
  59. {
  60. userMessage: "test",
  61. projectPath: "/test",
  62. agentConfig: {} as any,
  63. },
  64. { enabledPlugins: ["plugin_a", "plugin_c"] },
  65. )
  66. expect(result.executedPlugins).toEqual(["plugin_a", "plugin_c"])
  67. })
  68. it("respects disabledPlugins in run", async () => {
  69. const chain = createPrePluginChain(mockPlugins)
  70. const result = await chain.run(
  71. {
  72. userMessage: "test",
  73. projectPath: "/test",
  74. agentConfig: {} as any,
  75. },
  76. { disabledPlugins: ["plugin_b"] },
  77. )
  78. expect(result.executedPlugins).toEqual(["plugin_a", "plugin_c"])
  79. })
  80. it("stops early and includes stopped plugin in executedPlugins", async () => {
  81. const stopPlugin: PrePlugin = {
  82. name: "stop_plugin",
  83. priority: 15,
  84. run: async () => ({ shouldStop: true, stopReason: "test_stop" }),
  85. }
  86. const chain = createPrePluginChain([...mockPlugins, stopPlugin])
  87. const result = await chain.run({
  88. userMessage: "test",
  89. projectPath: "/test",
  90. agentConfig: {} as any,
  91. })
  92. expect(result.shouldStop).toBe(true)
  93. expect(result.executedPlugins).toContain("stop_plugin")
  94. expect(result.executedPlugins.length).toBeLessThan(4)
  95. })
  96. })