Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow configuration of Cookies. #51

Merged
merged 9 commits into from
Jul 15, 2014
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,10 @@ module Bookshelf
#
routes 'config/routes'

# The mapping set (optional) (alternative usage)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is out of scope here, can you please remove it?

# Arguement: A relative path where to find the mapping definition for a database.
mapping 'config/mapping'

# The layout to be used by all the views (optional)
# Argument: A Symbol that indicates the name, default to nil
#
Expand Down
63 changes: 63 additions & 0 deletions lib/lotus/configuration.rb
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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[:big_cookie] = 'nomnomnom!'
end
end

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

cookies[:with_options] = {
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
Original file line number Diff line number Diff line change
@@ -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('big_cookie=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("with_options=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