Skip to main content
Glama

For Five Coffee MCP Server

by Kong
puppeteer-scraping.test.js4.86 kB
/** * @jest-environment node */ import { ForFiveCoffeeServer } from '../server.js'; describe('Puppeteer Menu Scraping', () => { let server; beforeAll(() => { server = new ForFiveCoffeeServer(); }); describe('Dynamic Content Extraction', () => { it('should find all menu categories using Puppeteer', async () => { server.clearCache(); try { const result = await server.fetchWithPuppeteer(); if (result) { expect(result.categories).toBeDefined(); expect(Array.isArray(result.categories)).toBe(true); // Should find the categories we know exist const expectedCategories = [ 'BEVERAGES', 'COFFEE', 'PASTRIES', 'FOR FIVE COOKIES', 'GRAB N GO', ]; const foundCategories = result.categories.some(cat => expectedCategories.some(expected => cat.includes(expected)) ); expect(foundCategories).toBe(true); console.log('Categories found:', result.categories); } else { console.log('Puppeteer returned null - this is expected if no items found'); } } catch (error) { console.log('Puppeteer error (expected if no items found):', error.message); } }, 180000); it('should handle Puppeteer failures gracefully', async () => { server.clearCache(); // Mock Puppeteer to fail const originalLaunch = server.constructor.prototype.fetchWithPuppeteer; server.fetchWithPuppeteer = async () => { throw new Error('Puppeteer failed'); }; try { // Should fall back to static scraping, which should also fail without fallback await expect(server.fetchMenuData()).rejects.toThrow(); } finally { // Restore original method server.fetchWithPuppeteer = originalLaunch; } }, 30000); }); describe('Menu Data Source Validation', () => { it('should not use fallback menu anymore', async () => { server.clearCache(); try { const result = await server.getFullMenu(); const menuData = JSON.parse(result.content[0].text); // Should not have fallback source expect(menuData.source).not.toBe('fallback_menu'); // If it succeeds, should have real data if (menuData.totalItems > 0) { expect(menuData.source).toMatch(/puppeteer|static_html|api/); } } catch (error) { // This is now expected behavior when scraping fails expect(error.message).toContain('Unable to extract valid menu items'); } }, 180000); it('should require real menu data from website', async () => { server.clearCache(); // The server should now fail if it can't get real data // This test documents that we removed the fallback menu try { const menuData = await server.fetchMenuData(); // If it succeeds, it should be from a real source expect(menuData.source).toMatch(/puppeteer|static_html|api/); expect(menuData.items.length).toBeGreaterThan(0); // Items should not contain JavaScript code const hasJSCode = menuData.items.some( item => item.name.includes('window.') || item.name.includes('LOCATIONS') ); expect(hasJSCode).toBe(false); } catch (error) { // This is acceptable - means we're properly failing when can't get real data expect(error.message).toContain('Unable to extract valid menu items'); console.log('Expected failure when no real menu data available:', error.message); } }, 180000); }); describe('Category Discovery', () => { it('should discover all menu categories from website', async () => { server.clearCache(); try { const result = await server.fetchWithPuppeteer(); if (result && result.categories) { const categories = result.categories; // Should find the main categories expect(categories.length).toBeGreaterThan(3); // Should include food categories (not just beverages) const hasFoodCategories = categories.some( cat => cat.includes('COOKIES') || cat.includes('PASTRIES') || cat.includes('GRAB') ); if (hasFoodCategories) { expect(hasFoodCategories).toBe(true); console.log( '✅ Found food categories:', categories.filter( cat => cat.includes('COOKIES') || cat.includes('PASTRIES') || cat.includes('GRAB') ) ); } else { console.log('⚠️ Food categories not found in:', categories); } } } catch (error) { console.log('Category discovery failed:', error.message); } }, 180000); }); });

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/Kong/menu-mpc'

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