diff options
| author | mo khan <mo@mokhan.ca> | 2013-05-19 15:23:42 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2013-05-19 15:23:42 -0600 |
| commit | dd4925e11f9d9f9d6e60888aecc5cadd6e633651 (patch) | |
| tree | a14d07d7b35fd56f15ae22847d691dc91adebdf2 | |
| parent | 9629694a49e1f35a7e4924b9897f8e2bfccbdcbc (diff) | |
return a session cookie after registering
| -rw-r--r-- | lib/commands/registrations/create_command.rb | 5 | ||||
| -rw-r--r-- | lib/web/responses/redirect_response.rb | 57 | ||||
| -rw-r--r-- | spec/specs/commands/registrations/create_command_spec.rb | 3 |
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 |
