summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2013-05-19 15:23:42 -0600
committermo khan <mo@mokhan.ca>2013-05-19 15:23:42 -0600
commitdd4925e11f9d9f9d6e60888aecc5cadd6e633651 (patch)
treea14d07d7b35fd56f15ae22847d691dc91adebdf2
parent9629694a49e1f35a7e4924b9897f8e2bfccbdcbc (diff)
return a session cookie after registering
-rw-r--r--lib/commands/registrations/create_command.rb5
-rw-r--r--lib/web/responses/redirect_response.rb57
-rw-r--r--spec/specs/commands/registrations/create_command_spec.rb3
3 files changed, 58 insertions, 7 deletions
diff --git a/lib/commands/registrations/create_command.rb b/lib/commands/registrations/create_command.rb
index 04c8242..428e957 100644
--- a/lib/commands/registrations/create_command.rb
+++ b/lib/commands/registrations/create_command.rb
@@ -10,8 +10,9 @@ module Booty
end
def respond_to(request)
- @users.save(map_from(request.payload))
- RedirectResponse.new
+ user = map_from(request.payload)
+ @users.save(user)
+ RedirectResponse.new.add(Cookie.new(Cookies::SESSION, user.id))
end
private
diff --git a/lib/web/responses/redirect_response.rb b/lib/web/responses/redirect_response.rb
index 62e20c2..58ff0c3 100644
--- a/lib/web/responses/redirect_response.rb
+++ b/lib/web/responses/redirect_response.rb
@@ -1,16 +1,65 @@
module Booty
+ module Cookies
+ SESSION=:s
+ end
+ class Cookie
+ attr_reader :name
+
+ def initialize(name, value)
+ @name = name
+ @value = value
+ end
+
+ def prepare(headers)
+ Rack::Utils.set_cookie_header!(headers, @name, @value)
+ end
+
+ def ==(other)
+ @name = other.name
+ end
+ end
+
+ class CookieJar
+ def initialize(cookies = [])
+ @cookies = cookies
+ end
+
+ def add(cookie)
+ @cookies.push(cookie)
+ end
+
+ def add_to(headers)
+ cookies.each do |cookie|
+ cookie.prepare(headers)
+ end
+ end
+
+ def include?(cookie)
+ @cookies.include?(cookie)
+ end
+ end
class RedirectResponse
- attr_reader :location, :status
+ attr_reader :location, :status, :cookie_jar
def initialize(location: '/')
@location = location
@status = 301
+ @cookie_jar = CookieJar.new
+ end
+
+ def add(cookie)
+ cookie_jar.add(cookie)
+ self
end
def run(view_engine)
- headers = {"Location" => @location}
- #Rack::Utils.set_cookie_header!(headers, 'blah', 'huh')
- [@status, headers, []]
+ [@status, cookie_jar.add_to({"Location" => @location}), []]
+ end
+
+ private
+
+ def cookies
+ @cookies || []
end
end
end
diff --git a/spec/specs/commands/registrations/create_command_spec.rb b/spec/specs/commands/registrations/create_command_spec.rb
index acea0f4..6847f74 100644
--- a/spec/specs/commands/registrations/create_command_spec.rb
+++ b/spec/specs/commands/registrations/create_command_spec.rb
@@ -11,6 +11,7 @@ module Booty
let(:user) { fake }
before :each do
+ user.stub(:id).and_return(10)
User.stub(:new).with(:username => 'mo').and_return(user)
request.stub(:payload).and_return({:username => 'mo', :password => 'password'})
end
@@ -31,7 +32,7 @@ module Booty
end
it "should issue a cookie to the browser" do
- p result
+ result.cookie_jar.should include(Cookie.new(Cookies::SESSION, user.id))
end
end
end