| | |
| | const OpenWeather = require('../OpenWeather'); |
| |
|
| | describe('OpenWeather Tool (Integration Test)', () => { |
| | let tool; |
| |
|
| | beforeAll(() => { |
| | tool = new OpenWeather({ override: true }); |
| | console.log('API Key present:', !!process.env.OPENWEATHER_API_KEY); |
| | }); |
| |
|
| | test('current_forecast with a real API key returns current weather', async () => { |
| | |
| | if (!process.env.OPENWEATHER_API_KEY) { |
| | console.warn('Skipping real API test, no OPENWEATHER_API_KEY found.'); |
| | return; |
| | } |
| |
|
| | try { |
| | const result = await tool.call({ |
| | action: 'current_forecast', |
| | city: 'London', |
| | units: 'Celsius', |
| | }); |
| |
|
| | console.log('Raw API response:', result); |
| |
|
| | const parsed = JSON.parse(result); |
| | expect(parsed).toHaveProperty('current'); |
| | expect(typeof parsed.current.temp).toBe('number'); |
| | } catch (error) { |
| | console.error('Test failed with error:', error); |
| | throw error; |
| | } |
| | }); |
| |
|
| | test('timestamp action with real API key returns historical data', async () => { |
| | if (!process.env.OPENWEATHER_API_KEY) { |
| | console.warn('Skipping real API test, no OPENWEATHER_API_KEY found.'); |
| | return; |
| | } |
| |
|
| | try { |
| | |
| | const yesterday = new Date(); |
| | yesterday.setDate(yesterday.getDate() - 1); |
| | const dateStr = yesterday.toISOString().split('T')[0]; |
| |
|
| | const result = await tool.call({ |
| | action: 'timestamp', |
| | city: 'London', |
| | date: dateStr, |
| | units: 'Celsius', |
| | }); |
| |
|
| | console.log('Timestamp API response:', result); |
| |
|
| | const parsed = JSON.parse(result); |
| | expect(parsed).toHaveProperty('data'); |
| | expect(Array.isArray(parsed.data)).toBe(true); |
| | expect(parsed.data[0]).toHaveProperty('temp'); |
| | } catch (error) { |
| | console.error('Timestamp test failed with error:', error); |
| | throw error; |
| | } |
| | }); |
| |
|
| | test('daily_aggregation action with real API key returns aggregated data', async () => { |
| | if (!process.env.OPENWEATHER_API_KEY) { |
| | console.warn('Skipping real API test, no OPENWEATHER_API_KEY found.'); |
| | return; |
| | } |
| |
|
| | try { |
| | |
| | const yesterday = new Date(); |
| | yesterday.setDate(yesterday.getDate() - 1); |
| | const dateStr = yesterday.toISOString().split('T')[0]; |
| |
|
| | const result = await tool.call({ |
| | action: 'daily_aggregation', |
| | city: 'London', |
| | date: dateStr, |
| | units: 'Celsius', |
| | }); |
| |
|
| | console.log('Daily aggregation API response:', result); |
| |
|
| | const parsed = JSON.parse(result); |
| | expect(parsed).toHaveProperty('temperature'); |
| | expect(parsed.temperature).toHaveProperty('morning'); |
| | expect(parsed.temperature).toHaveProperty('afternoon'); |
| | expect(parsed.temperature).toHaveProperty('evening'); |
| | } catch (error) { |
| | console.error('Daily aggregation test failed with error:', error); |
| | throw error; |
| | } |
| | }); |
| |
|
| | test('overview action with real API key returns weather summary', async () => { |
| | if (!process.env.OPENWEATHER_API_KEY) { |
| | console.warn('Skipping real API test, no OPENWEATHER_API_KEY found.'); |
| | return; |
| | } |
| |
|
| | try { |
| | const result = await tool.call({ |
| | action: 'overview', |
| | city: 'London', |
| | units: 'Celsius', |
| | }); |
| |
|
| | console.log('Overview API response:', result); |
| |
|
| | const parsed = JSON.parse(result); |
| | expect(parsed).toHaveProperty('weather_overview'); |
| | expect(typeof parsed.weather_overview).toBe('string'); |
| | expect(parsed.weather_overview.length).toBeGreaterThan(0); |
| | expect(parsed).toHaveProperty('date'); |
| | expect(parsed).toHaveProperty('units'); |
| | expect(parsed.units).toBe('metric'); |
| | } catch (error) { |
| | console.error('Overview test failed with error:', error); |
| | throw error; |
| | } |
| | }); |
| |
|
| | test('different temperature units return correct values', async () => { |
| | if (!process.env.OPENWEATHER_API_KEY) { |
| | console.warn('Skipping real API test, no OPENWEATHER_API_KEY found.'); |
| | return; |
| | } |
| |
|
| | try { |
| | |
| | let result = await tool.call({ |
| | action: 'current_forecast', |
| | city: 'London', |
| | units: 'Celsius', |
| | }); |
| | let parsed = JSON.parse(result); |
| | const celsiusTemp = parsed.current.temp; |
| |
|
| | |
| | result = await tool.call({ |
| | action: 'current_forecast', |
| | city: 'London', |
| | units: 'Kelvin', |
| | }); |
| | parsed = JSON.parse(result); |
| | const kelvinTemp = parsed.current.temp; |
| |
|
| | |
| | result = await tool.call({ |
| | action: 'current_forecast', |
| | city: 'London', |
| | units: 'Fahrenheit', |
| | }); |
| | parsed = JSON.parse(result); |
| | const fahrenheitTemp = parsed.current.temp; |
| |
|
| | |
| | |
| | |
| | const celsiusToKelvin = Math.round(celsiusTemp + 273.15); |
| | const celsiusToFahrenheit = Math.round((celsiusTemp * 9) / 5 + 32); |
| |
|
| | console.log('Temperature comparisons:', { |
| | celsius: celsiusTemp, |
| | kelvin: kelvinTemp, |
| | fahrenheit: fahrenheitTemp, |
| | calculatedKelvin: celsiusToKelvin, |
| | calculatedFahrenheit: celsiusToFahrenheit, |
| | }); |
| |
|
| | |
| | expect(Math.abs(kelvinTemp - celsiusToKelvin)).toBeLessThanOrEqual(1); |
| | expect(Math.abs(fahrenheitTemp - celsiusToFahrenheit)).toBeLessThanOrEqual(1); |
| | } catch (error) { |
| | console.error('Temperature units test failed with error:', error); |
| | throw error; |
| | } |
| | }); |
| |
|
| | test('language parameter returns localized data', async () => { |
| | if (!process.env.OPENWEATHER_API_KEY) { |
| | console.warn('Skipping real API test, no OPENWEATHER_API_KEY found.'); |
| | return; |
| | } |
| |
|
| | try { |
| | |
| | let result = await tool.call({ |
| | action: 'current_forecast', |
| | city: 'Paris', |
| | units: 'Celsius', |
| | lang: 'en', |
| | }); |
| | let parsed = JSON.parse(result); |
| | const englishDescription = parsed.current.weather[0].description; |
| |
|
| | |
| | result = await tool.call({ |
| | action: 'current_forecast', |
| | city: 'Paris', |
| | units: 'Celsius', |
| | lang: 'fr', |
| | }); |
| | parsed = JSON.parse(result); |
| | const frenchDescription = parsed.current.weather[0].description; |
| |
|
| | console.log('Language comparison:', { |
| | english: englishDescription, |
| | french: frenchDescription, |
| | }); |
| |
|
| | |
| | expect(englishDescription).not.toBe(frenchDescription); |
| | } catch (error) { |
| | console.error('Language test failed with error:', error); |
| | throw error; |
| | } |
| | }); |
| | }); |
| |
|