Skip to main content
Glama
graduation.test.ts5.45 kB
/** * Tests for Graduation Prompt * * @package WP_Navigator_MCP * @since 2.1.0 */ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { generateGraduationPrompts, formatPromptForTerminal, isClipboardAvailable, type GraduationContext, } from './graduation.js'; describe('Graduation Prompt', () => { describe('generateGraduationPrompts', () => { it('generates prompt with site URL hostname', () => { const context: GraduationContext = { siteUrl: 'https://example.com', }; const prompts = generateGraduationPrompts(context); expect(prompts.primary).toContain('example.com'); expect(prompts.primary).toContain('overview'); expect(prompts.primary).toContain('5 most recent posts'); }); it('uses siteName when provided', () => { const context: GraduationContext = { siteUrl: 'https://example.com', siteName: 'My Awesome Blog', }; const prompts = generateGraduationPrompts(context); expect(prompts.primary).toContain('My Awesome Blog'); expect(prompts.primary).not.toContain('example.com'); }); it('generates alternative prompts', () => { const context: GraduationContext = { siteUrl: 'https://example.com', }; const prompts = generateGraduationPrompts(context); expect(prompts.alternatives).toHaveLength(3); expect(prompts.alternatives[0]).toContain('SEO'); expect(prompts.alternatives[1]).toContain('plugins'); expect(prompts.alternatives[2]).toContain('30 days'); }); it('adds pro-only prompt for pro edition', () => { const context: GraduationContext = { siteUrl: 'https://example.com', pluginEdition: 'pro', }; const prompts = generateGraduationPrompts(context); expect(prompts.alternatives).toHaveLength(4); expect(prompts.alternatives[3]).toContain('content performance'); }); it('does not add pro prompt for free edition', () => { const context: GraduationContext = { siteUrl: 'https://example.com', pluginEdition: 'free', }; const prompts = generateGraduationPrompts(context); expect(prompts.alternatives).toHaveLength(3); }); it('handles URLs with paths', () => { const context: GraduationContext = { siteUrl: 'https://example.com/wordpress', }; const prompts = generateGraduationPrompts(context); expect(prompts.primary).toContain('example.com'); }); it('handles localhost URLs', () => { const context: GraduationContext = { siteUrl: 'http://localhost:8080', }; const prompts = generateGraduationPrompts(context); expect(prompts.primary).toContain('localhost'); }); it('handles invalid URLs gracefully', () => { const context: GraduationContext = { siteUrl: 'not-a-valid-url', }; const prompts = generateGraduationPrompts(context); expect(prompts.primary).toContain('not-a-valid-url'); }); }); describe('formatPromptForTerminal', () => { it('returns short text unchanged', () => { const text = 'Short prompt'; const formatted = formatPromptForTerminal(text, 60); expect(formatted).toBe('Short prompt'); }); it('wraps long text at word boundaries', () => { const text = 'This is a very long prompt that should be wrapped across multiple lines for better terminal display'; const formatted = formatPromptForTerminal(text, 30); const lines = formatted.split('\n'); expect(lines.length).toBeGreaterThan(1); lines.forEach((line) => { expect(line.length).toBeLessThanOrEqual(30); }); }); it('handles single long word', () => { const text = 'supercalifragilisticexpialidocious'; const formatted = formatPromptForTerminal(text, 20); // Single word should not be broken expect(formatted).toBe(text); }); it('preserves spaces between words', () => { const text = 'word1 word2 word3'; const formatted = formatPromptForTerminal(text, 100); expect(formatted).toBe('word1 word2 word3'); }); it('uses default width of 60', () => { const text = 'This is a prompt that will be wrapped at the default width of sixty characters'; const formatted = formatPromptForTerminal(text); const lines = formatted.split('\n'); lines.forEach((line) => { expect(line.length).toBeLessThanOrEqual(60); }); }); }); describe('isClipboardAvailable', () => { const originalPlatform = process.platform; afterEach(() => { Object.defineProperty(process, 'platform', { value: originalPlatform }); }); it('returns true for darwin', () => { Object.defineProperty(process, 'platform', { value: 'darwin' }); expect(isClipboardAvailable()).toBe(true); }); it('returns true for linux', () => { Object.defineProperty(process, 'platform', { value: 'linux' }); expect(isClipboardAvailable()).toBe(true); }); it('returns true for win32', () => { Object.defineProperty(process, 'platform', { value: 'win32' }); expect(isClipboardAvailable()).toBe(true); }); it('returns false for unsupported platforms', () => { Object.defineProperty(process, 'platform', { value: 'freebsd' }); expect(isClipboardAvailable()).toBe(false); }); }); });

Latest Blog Posts

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/littlebearapps/wp-navigator-mcp'

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