require 'spec_helper'
include Barometer
describe "Yahoo" do
before(:each) do
@accepted_formats = [:zipcode, :weather_id]
#@base_uri = "http://google.com"
end
describe "the class methods" do
it "defines accepted_formats" do
WeatherService::Yahoo.accepted_formats.should == @accepted_formats
end
it "defines get_all" do
WeatherService::Yahoo.respond_to?("fetch").should be_true
end
end
describe "building the current data" do
it "defines the build method" do
WeatherService::Yahoo.respond_to?("build_current").should be_true
end
it "requires Hash input" do
lambda { WeatherService::Yahoo.build_current }.should raise_error(ArgumentError)
lambda { WeatherService::Yahoo.build_current({}) }.should_not raise_error(ArgumentError)
end
it "returns Barometer::CurrentMeasurement object" do
current = WeatherService::Yahoo.build_current({})
current.is_a?(Data::CurrentMeasurement).should be_true
end
end
describe "building the forecast data" do
it "defines the build method" do
WeatherService::Yahoo.respond_to?("build_forecast").should be_true
end
it "requires Hash input" do
lambda { WeatherService::Yahoo.build_forecast }.should raise_error(ArgumentError)
lambda { WeatherService::Yahoo.build_forecast({}) }.should_not raise_error(ArgumentError)
end
it "returns Array object" do
current = WeatherService::Yahoo.build_forecast({})
current.is_a?(Array).should be_true
end
end
describe "building the location data" do
it "defines the build method" do
WeatherService::Yahoo.respond_to?("build_location").should be_true
end
it "requires Hash input" do
lambda { WeatherService::Yahoo.build_location }.should raise_error(ArgumentError)
lambda { WeatherService::Yahoo.build_location({}) }.should_not raise_error(ArgumentError)
end
it "requires Barometer::Geo input" do
geo = Data::Geo.new({})
lambda { WeatherService::Yahoo.build_location({}, {}) }.should raise_error(ArgumentError)
lambda { WeatherService::Yahoo.build_location({}, geo) }.should_not raise_error(ArgumentError)
end
it "returns Barometer::Location object" do
location = WeatherService::Yahoo.build_location({})
location.is_a?(Data::Location).should be_true
end
end
describe "when measuring" do
before(:each) do
@query = Barometer::Query.new("90210")
@measurement = Data::Measurement.new
FakeWeb.register_uri(:get,
"http://weather.yahooapis.com:80/forecastrss?u=c&p=#{CGI.escape(@query.q)}",
:string => File.read(File.join(File.dirname(__FILE__),
'../fixtures/services/yahoo',
'90210.xml')
)
)
end
describe "all" do
it "responds to _measure" do
WeatherService::Yahoo.respond_to?("_measure").should be_true
end
it "requires a Barometer::Measurement object" do
lambda { WeatherService::Yahoo._measure(nil, @query) }.should raise_error(ArgumentError)
lambda { WeatherService::Yahoo._measure("invlaid", @query) }.should raise_error(ArgumentError)
lambda { WeatherService::Yahoo._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
end
it "requires a Barometer::Query query" do
lambda { WeatherService::Yahoo._measure }.should raise_error(ArgumentError)
lambda { WeatherService::Yahoo._measure(@measurement, 1) }.should raise_error(ArgumentError)
lambda { WeatherService::Yahoo._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
end
it "returns a Barometer::Measurement object" do
result = WeatherService::Yahoo._measure(@measurement, @query)
result.is_a?(Data::Measurement).should be_true
result.current.is_a?(Data::CurrentMeasurement).should be_true
result.forecast.is_a?(Array).should be_true
result.source.should == :yahoo
end
end
end
describe "when answering the simple questions," do
before(:each) do
@measurement = Data::Measurement.new
end
describe "currently_wet_by_icon?" do
before(:each) do
@measurement.current = Data::CurrentMeasurement.new
end
it "returns true if matching icon code" do
@measurement.current.icon = "4"
@measurement.current.icon?.should be_true
WeatherService::Yahoo.currently_wet_by_icon?(@measurement.current).should be_true
end
it "returns false if NO matching icon code" do
@measurement.current.icon = "32"
@measurement.current.icon?.should be_true
WeatherService::Yahoo.currently_wet_by_icon?(@measurement.current).should be_false
end
end
describe "forecasted_wet_by_icon?" do
before(:each) do
@measurement.forecast = [Data::ForecastMeasurement.new]
@measurement.forecast.first.date = Date.today
@measurement.forecast.size.should == 1
end
it "returns true if matching icon code" do
@measurement.forecast.first.icon = "4"
@measurement.forecast.first.icon?.should be_true
WeatherService::Yahoo.forecasted_wet_by_icon?(@measurement.forecast.first).should be_true
end
it "returns false if NO matching icon code" do
@measurement.forecast.first.icon = "32"
@measurement.forecast.first.icon?.should be_true
WeatherService::Yahoo.forecasted_wet_by_icon?(@measurement.forecast.first).should be_false
end
end
describe "currently_sunny_by_icon?" do
before(:each) do
@measurement.current = Data::CurrentMeasurement.new
end
it "returns true if matching icon code" do
@measurement.current.icon = "32"
@measurement.current.icon?.should be_true
WeatherService::Yahoo.currently_sunny_by_icon?(@measurement.current).should be_true
end
it "returns false if NO matching icon code" do
@measurement.current.icon = "4"
@measurement.current.icon?.should be_true
WeatherService::Yahoo.currently_sunny_by_icon?(@measurement.current).should be_false
end
end
describe "forecasted_sunny_by_icon?" do
before(:each) do
@measurement.forecast = [Data::ForecastMeasurement.new]
@measurement.forecast.first.date = Date.today
@measurement.forecast.size.should == 1
end
it "returns true if matching icon code" do
@measurement.forecast.first.icon = "32"
@measurement.forecast.first.icon?.should be_true
WeatherService::Yahoo.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_true
end
it "returns false if NO matching icon code" do
@measurement.forecast.first.icon = "4"
@measurement.forecast.first.icon?.should be_true
WeatherService::Yahoo.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_false
end
end
end
describe "overall data correctness" do
before(:each) do
@query = Barometer::Query.new("90210")
@measurement = Data::Measurement.new
FakeWeb.register_uri(:get,
"http://weather.yahooapis.com:80/forecastrss?u=c&p=#{CGI.escape(@query.q)}",
:string => File.read(File.join(File.dirname(__FILE__),
'../fixtures/services/yahoo',
'90210.xml')
)
)
end
# TODO: complete this
it "should correctly build the data" do
result = WeatherService::Yahoo._measure(@measurement, @query)
#sun_rise = Barometer::Zone.merge("6:09 am", "Sun, 26 Apr 2009 10:51 am PDT", "PDT")
#sun_set = Barometer::Zone.merge("7:34 pm", "Sun, 26 Apr 2009 10:51 am PDT", "PDT")
# build current
#@measurement.current.sun.rise.should == sun_rise
#@measurement.current.sun.set.should == sun_set
@measurement.current.sun.rise.to_s.should == "06:09 am"
@measurement.current.sun.set.to_s.should == "07:34 pm"
# builds location
@measurement.location.city.should == "Beverly Hills"
# builds forecasts
@measurement.forecast.size.should == 2
@measurement.forecast[0].condition.should == "Mostly Sunny"
@measurement.forecast[0].icon.should == "34"
@measurement.forecast[0].sun.rise.should == "06:09 am"
@measurement.forecast[0].sun.set.should == "07:34 pm"
@measurement.forecast[1].condition.should == "Cloudy"
@measurement.forecast[1].icon.should == "26"
@measurement.forecast[1].sun.rise.should == "06:09 am"
@measurement.forecast[1].sun.set.should == "07:34 pm"
end
#
#
#
#
# -
# 34.08
# -118.4
# Sun, 26 Apr 2009 10:51 am PDT
#
#
end
end