Commit 4393987
Changed files (4)
lib
domain
service
spec
service
lib/domain/stock.rb
@@ -0,0 +1,7 @@
+class Stock
+ attr_reader :name, :symbol, :price
+
+ def initialize(name, symbol, price)
+ @name, @symbol, @price = name, symbol, price
+ end
+end
lib/service/http_gateway.rb
@@ -0,0 +1,9 @@
+require 'net/http'
+
+class HttpGateway
+ def get(uri, params = {})
+ uri = URI(uri)
+ uri.query = URI.encode_www_form(params) if params.keys.any?
+ Net::HTTP.get_response(uri)
+ end
+end
lib/service/stock_service.rb
@@ -0,0 +1,18 @@
+
+class StockService
+ def initialize(http_gateway = HttpGateway.new)
+ @http_gateway = http_gateway
+ end
+
+ #http://download.finance.yahoo.com/d/quotes.csv?s=%40%5EDJI,GOOG&f=nsl1op&e=.csv
+ def fetch(symbol)
+ map_from(@http_gateway.get('http://download.finance.yahoo.com/d/quotes.csv', {s: 'GOOG', f: 'nsl1', e: '.csv'}))
+ end
+
+ private
+
+ def map_from(response)
+ name, symbol, price = response.body.split(',')
+ Stock.new(name, symbol, price.to_f)
+ end
+end
spec/service/stock_service_spec.rb
@@ -0,0 +1,14 @@
+require "spec_helper"
+
+describe StockService do
+ let(:sut) { StockService.new }
+
+ context "when given a known stock symbol" do
+ it "fetches the most recent price for a given stock" do
+ result = sut.fetch("GOOG")
+ result.symbol.should == "\"GOOG\""
+ result.price.should be > 0
+ result.name.should == "\"Google Inc.\""
+ end
+ end
+end