Skip to content

Commit

Permalink
Merge pull request #51 from gotjosh/allow-cookies-configuration
Browse files Browse the repository at this point in the history
Allow configuration of Cookies.
  • Loading branch information
jodosha committed Jul 15, 2014
2 parents e13b532 + bf34344 commit 3b1be6f
Show file tree
Hide file tree
Showing 6 changed files with 227 additions and 0 deletions.
4 changes: 4 additions & 0 deletions README.md
Expand Up @@ -420,6 +420,10 @@ module Bookshelf
#
templates 'app/templates'

# Enable or Disable cookies (optional)
# Argument: A [`TrueClass`, `FalseClass`], default to `FalseClass`.
cookies true

# Default format for the requests that don't specify an HTTP_ACCEPT header (optional)
# Argument: A symbol representation of a mime type, default to :html
#
Expand Down
63 changes: 63 additions & 0 deletions lib/lotus/configuration.rb
Expand Up @@ -381,6 +381,69 @@ def assets(directory = nil)
end
end

# Configure cookies
# Enable cookies (disabled by default).
#
# This is part of a DSL, for this reason when this method is called with
# an argument, it will set the corresponding instance variable. When
# called without, it will return the already set value, or the default.
#
# @overload cookies(value)
# Sets the given value.
# @param value [TrueClass, FalseClass]
#
# @overload cookies
# Gets the value.
# @return [TrueClass, FalseClass]
#
# @example Getting the value
# require 'lotus'
#
# module Bookshelf
# class Application < Lotus::Application
# end
# end
#
# Bookshelf::Application.configuration.cookies
# # => false
#
# @example Setting the value
# require 'lotus'
#
# module Bookshelf
# class Application < Lotus::Application
# configure do
# cookies true
# end
# end
# end
#
# Bookshelf::Application.configuration.cookies
# # => true
#
# @example Setting a new value after one is set.
# require 'lotus'
#
# module Bookshelf
# class Application < Lotus::Application
# configure do
# cookies false
# cookies true
# end
# end
# end
#
# Bookshelf::Application.configuration.cookies
# # => true
#
def cookies(value = nil)
if value.nil?
@cookies || false
else
@cookies = value
end
end

# Application load paths
# The application will recursively load all the Ruby files under these paths.
#
Expand Down
2 changes: 2 additions & 0 deletions lib/lotus/loader.rb
Expand Up @@ -3,6 +3,7 @@
require 'lotus/utils/string'
require 'lotus/routes'
require 'lotus/routing/default'
require 'lotus/action/cookies'

module Lotus
# Load an application
Expand Down Expand Up @@ -39,6 +40,7 @@ def load_frameworks!
unless application_module.const_defined?('Controller')
controller = Lotus::Controller.duplicate(application_module) do
default_format config.default_format
modules { include Lotus::Action::Cookies } if config.cookies
end

application_module.const_set('Controller', controller)
Expand Down
35 changes: 35 additions & 0 deletions test/configuration_test.rb
Expand Up @@ -305,6 +305,41 @@ def to_pathname
end
end

describe '#cookies' do
describe "when not previously set" do
it "is false" do
@configuration.cookies.must_equal false
end
end

describe "when set" do
before do
@configuration.cookies true
end

it "returns the configured value" do
@configuration.cookies.must_equal true
end
end

describe "when already set" do
before do
@configuration.cookies true
end

describe "if I set a new value" do
before do
@configuration.cookies false
end

it "returns it" do
@configuration.cookies.must_equal false
end
end
end

end

describe 'assets' do
describe "when not previously set" do
it "is equal to public/ from the root directory" do
Expand Down
59 changes: 59 additions & 0 deletions test/fixtures/cookies/application.rb
@@ -0,0 +1,59 @@
module CookiesApp
class Application < Lotus::Application
configure do
# Activate Cookies
cookies true

routes do
get '/get_cookies', to: 'cookies#get'
get '/set_cookies', to: 'cookies#set'
get '/set_cookies_with_options', to: 'cookies#set_with_options'
get '/del_cookies', to: 'cookies#del'
end
end

load!
end


module Controllers::Cookies
include CookiesApp::Controller

action 'Get' do
def call(params)
self.body = cookies[:foo]
end
end

action 'Set' do
def call(params)
self.body = 'yummy!'
cookies[:foo] = 'nomnomnom!'
end
end

action 'SetWithOptions' do
def call(params)
self.body = 'with options!'
expire_date = Time.parse params[:expires]

cookies[:foo] = {
value: 'nomnomnom!',
domain: 'lotusrocks.com',
path: '/controller',
expires: expire_date,
secure: true,
httponly: true
}
end
end

action 'Del' do
def call(params)
self.body = 'deleted!'
cookies[:delete] = nil
end
end
end

end
64 changes: 64 additions & 0 deletions test/integration/cookies_test.rb
@@ -0,0 +1,64 @@
require 'test_helper'
require 'rack/test'
require 'fixtures/cookies/application'

describe 'Cookies' do
include Rack::Test::Methods

before do
@current_dir = Dir.pwd
Dir.chdir FIXTURES_ROOT.join('cookies')
@app = CookiesApp::Application.new
end

after do
Dir.chdir @current_dir
@current_dir = nil
end

def app
@app
end

def response
last_response
end

def request
last_request
end

it 'sucessfully gets cookies' do
get '/get_cookies', nil, {'HTTP_COOKIE' => 'foo=bar'}

request.cookies.must_equal({ 'foo' => 'bar' })

response.body.must_equal('bar')
response.headers['Set-Cookie'].must_equal('foo=bar')
end

it 'succesfully sets cookies' do
get '/set_cookies'

response.body.must_equal('yummy!')
response.headers['Set-Cookie'].must_equal('foo=nomnomnom%21')
end

it 'sucessfully sets cookies with options' do
next_week = Time.now + 60 * 60 * 24 * 7
get '/set_cookies_with_options', { expires: next_week }

response.body.must_equal('with options!')
response.headers['Set-Cookie'].must_equal("foo=nomnomnom%21; domain=lotusrocks.com; path=/controller; expires=#{next_week.gmtime.rfc2822}; secure; HttpOnly")
end

it 'sucessfully deletes cookies' do
get '/del_cookies', nil, {'HTTP_COOKIE' => 'foo=bar;delete=cookie'}

request.cookies.must_equal({ 'foo' => 'bar', 'delete' => 'cookie' })

response.body.must_equal('deleted!')
response.headers['Set-Cookie'].must_equal("foo=bar\ndelete=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000")
end

end

0 comments on commit 3b1be6f

Please sign in to comment.