| |
| 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; |
| } |
| }); |
| }); |
|
|