Skip to main content
Glama

Task Trellis MCP

appendObjectLog.test.ts5.27 kB
import { TrellisObject, TrellisObjectPriority, TrellisObjectStatus, TrellisObjectType, } from "../../../models"; import { Repository } from "../../../repositories/Repository"; import { appendObjectLog } from "../appendObjectLog"; describe("appendObjectLog", () => { let mockRepository: jest.Mocked<Repository>; beforeEach(() => { mockRepository = { getObjectById: jest.fn(), getObjects: jest.fn(), saveObject: jest.fn(), deleteObject: jest.fn(), getChildrenOf: jest.fn(), }; jest.clearAllMocks(); }); const mockTrellisObject: TrellisObject = { id: "T-test-task", type: TrellisObjectType.TASK, title: "Test Task", status: TrellisObjectStatus.OPEN, priority: TrellisObjectPriority.MEDIUM, parent: "F-test-feature", prerequisites: [], affectedFiles: new Map(), log: ["Initial log entry", "Second log entry"], schema: "1.0", childrenIds: [], body: "This is a test task", created: "2025-01-15T10:00:00Z", updated: "2025-01-15T10:00:00Z", }; it("should successfully append to object log", async () => { mockRepository.getObjectById.mockResolvedValue(mockTrellisObject); mockRepository.saveObject.mockResolvedValue(); const result = await appendObjectLog( mockRepository, "T-test-task", "New log entry", ); const expectedUpdatedObject = { ...mockTrellisObject, log: ["Initial log entry", "Second log entry", "New log entry"], }; expect(mockRepository.getObjectById).toHaveBeenCalledWith("T-test-task"); expect(mockRepository.saveObject).toHaveBeenCalledWith( expectedUpdatedObject, ); expect(result.content[0].text).toContain( "Successfully appended to object log:", ); expect(result.content[0].text).toContain("T-test-task"); expect(result.content[0].text).toContain("New log entry"); expect(result.content[0].text).toContain('"totalLogEntries": 3'); }); it("should append to empty log", async () => { const objectWithEmptyLog = { ...mockTrellisObject, log: [], }; mockRepository.getObjectById.mockResolvedValue(objectWithEmptyLog); mockRepository.saveObject.mockResolvedValue(); const result = await appendObjectLog( mockRepository, "T-test-task", "First log entry", ); const expectedUpdatedObject = { ...objectWithEmptyLog, log: ["First log entry"], }; expect(mockRepository.saveObject).toHaveBeenCalledWith( expectedUpdatedObject, ); expect(result.content[0].text).toContain('"totalLogEntries": 1'); }); it("should return error when object is not found", async () => { mockRepository.getObjectById.mockResolvedValue(null); const result = await appendObjectLog( mockRepository, "T-nonexistent", "Test content", ); expect(mockRepository.getObjectById).toHaveBeenCalledWith("T-nonexistent"); expect(mockRepository.saveObject).not.toHaveBeenCalled(); expect(result.content[0].text).toBe( "Error: Object with ID 'T-nonexistent' not found", ); }); it("should handle getObjectById errors gracefully", async () => { mockRepository.getObjectById.mockRejectedValue( new Error("Database connection failed"), ); const result = await appendObjectLog( mockRepository, "T-test-task", "Test content", ); expect(result.content[0].text).toBe( "Error appending to object log: Database connection failed", ); }); it("should handle saveObject errors gracefully", async () => { mockRepository.getObjectById.mockResolvedValue(mockTrellisObject); mockRepository.saveObject.mockRejectedValue(new Error("Failed to save")); const result = await appendObjectLog( mockRepository, "T-test-task", "Test content", ); expect(result.content[0].text).toBe( "Error appending to object log: Failed to save", ); }); it("should handle empty contents string", async () => { mockRepository.getObjectById.mockResolvedValue(mockTrellisObject); mockRepository.saveObject.mockResolvedValue(); const result = await appendObjectLog(mockRepository, "T-test-task", ""); const expectedUpdatedObject = { ...mockTrellisObject, log: ["Initial log entry", "Second log entry", ""], }; expect(mockRepository.saveObject).toHaveBeenCalledWith( expectedUpdatedObject, ); expect(result.content[0].text).toContain( "Successfully appended to object log:", ); }); it("should handle multiline contents", async () => { mockRepository.getObjectById.mockResolvedValue(mockTrellisObject); mockRepository.saveObject.mockResolvedValue(); const multilineContent = "Line 1\nLine 2\nLine 3"; const result = await appendObjectLog( mockRepository, "T-test-task", multilineContent, ); const expectedUpdatedObject = { ...mockTrellisObject, log: ["Initial log entry", "Second log entry", multilineContent], }; expect(mockRepository.saveObject).toHaveBeenCalledWith( expectedUpdatedObject, ); expect(result.content[0].text).toContain( "Successfully appended to object log:", ); }); });

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/langadventurellc/task-trellis-mcp'

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