Skip to main content
Glama
wpbakery.test.ts5.78 kB
/** * Tests for WPBakery Builder Adapter (Stub) * * @package WP_Navigator_MCP */ import { describe, it, expect } from 'vitest'; import { WPBakeryAdapter, wpbakeryAdapter } from './wpbakery.js'; import type { PageData } from './types.js'; /** * Create mock page data for testing */ function createPageData(content: string, meta?: Record<string, unknown>): PageData { return { id: 1, slug: 'test-page', title: { rendered: 'Test Page' }, content: { rendered: content, raw: content }, status: 'publish', meta, }; } describe('WPBakeryAdapter', () => { describe('properties', () => { it('should have correct identification', () => { const adapter = new WPBakeryAdapter(); expect(adapter.name).toBe('wpbakery'); expect(adapter.displayName).toBe('WPBakery Page Builder'); expect(adapter.supported).toBe(false); }); it('should have version info', () => { const adapter = new WPBakeryAdapter(); expect(adapter.version.adapter).toBe('0.1.0'); expect(adapter.version.minBuilderVersion).toBe('6.0.0'); }); it('should declare limited capabilities', () => { const adapter = new WPBakeryAdapter(); expect(adapter.capabilities.canExtract).toBe(false); expect(adapter.capabilities.canApply).toBe(false); expect(adapter.capabilities.canDetect).toBe(true); expect(adapter.capabilities.supportedElements).toHaveLength(0); }); }); describe('detect', () => { it('should detect WPBakery content by shortcodes', () => { const content = '[vc_row][vc_column][vc_column_text]Hello[/vc_column_text][/vc_column][/vc_row]'; const page = createPageData(content); const result = wpbakeryAdapter.detect(page); expect(result.detected).toBe(true); expect(result.confidence).toBeGreaterThan(0.5); expect(result.method).toBe('shortcode'); }); it('should detect WPBakery content by meta', () => { const page = createPageData('<div>content</div>', { _wpb_vc_js_status: 'true', }); const result = wpbakeryAdapter.detect(page); expect(result.detected).toBe(true); expect(result.confidence).toBeGreaterThan(0); }); it('should detect WPBakery content by CSS classes', () => { const content = '<div class="vc_row wpb_row">Row content</div>'; const page = createPageData(content); const result = wpbakeryAdapter.detect(page); expect(result.detected).toBe(true); }); it('should detect WPBakery content by data attributes combined with classes', () => { // Data attributes alone don't trigger detection - they add confidence when other markers present const content = '<div class="vc_row" data-vc-full-width="true">Full width content</div>'; const page = createPageData(content); const result = wpbakeryAdapter.detect(page); expect(result.detected).toBe(true); expect(result.details?.hasWPBakeryData).toBe(true); }); it('should detect vc_column shortcode', () => { const content = '[vc_column width="1/2"]content[/vc_column]'; const page = createPageData(content); const result = wpbakeryAdapter.detect(page); expect(result.detected).toBe(true); expect(result.method).toBe('shortcode'); }); it('should not detect non-WPBakery content', () => { const content = '<p>Plain HTML without WPBakery</p>'; const page = createPageData(content); const result = wpbakeryAdapter.detect(page); expect(result.detected).toBe(false); expect(result.confidence).toBe(0); }); it('should not crash on empty content', () => { const page = createPageData(''); const result = wpbakeryAdapter.detect(page); expect(result.detected).toBe(false); expect(result.confidence).toBe(0); }); it('should include helpful message when detected', () => { const content = '[vc_row][/vc_row]'; const page = createPageData(content); const result = wpbakeryAdapter.detect(page); expect(result.details?.message).toContain('coming in v2'); }); }); describe('extractLayout', () => { it('should return not supported result', () => { const content = '[vc_row][vc_column]content[/vc_column][/vc_row]'; const page = createPageData(content); const result = wpbakeryAdapter.extractLayout(page); expect(result.success).toBe(false); expect(result.warnings).toHaveLength(1); expect(result.warnings[0].code).toBe('BUILDER_NOT_SUPPORTED'); expect(result.warnings[0].message).toContain('WPBakery'); expect(result.warnings[0].message).toContain('v2.0'); }); it('should return empty elements array', () => { const content = '[vc_row][/vc_row]'; const page = createPageData(content); const result = wpbakeryAdapter.extractLayout(page); expect(result.data.elements).toHaveLength(0); expect(result.data.source.builder).toBe('wpbakery'); }); }); describe('extractLayoutFromContent', () => { it('should return not supported result', () => { const result = wpbakeryAdapter.extractLayoutFromContent('[vc_row][/vc_row]'); expect(result.success).toBe(false); expect(result.warnings[0].code).toBe('BUILDER_NOT_SUPPORTED'); }); }); describe('applyLayout', () => { it('should return not supported result', () => { const layout = { layout_version: '1.0' as const, source: { builder: 'gutenberg', formatVersion: '1.0' }, elements: [], }; const result = wpbakeryAdapter.applyLayout(layout); expect(result.success).toBe(false); expect(result.data).toBe(''); expect(result.warnings[0].code).toBe('BUILDER_NOT_SUPPORTED'); }); }); });

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