Skip to content

Commit

Permalink
Improved settings and fixed tests (#364)
Browse files Browse the repository at this point in the history
* Fixed session so that it could be tested without previous tests
effecting it's state randomly. Also conforms to best practices.

* resolved logging level settings with instance variables

* added settings to configure with block since it's probably clear than configure.

* added requested test change
  • Loading branch information
elorest committed Nov 7, 2017
1 parent b397c24 commit 8245639
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 89 deletions.
36 changes: 11 additions & 25 deletions spec/amber/amber_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,8 @@ describe Amber do

describe Amber::Server do
describe ".configure" do
it "loads environment settings from test.yml" do
settings = Amber::Server.settings

settings.name.should eq "amber_test_app"
settings.port_reuse.should eq true
settings.redis_url.should eq "#{ENV["REDIS_URL"]? || "redis://localhost:6379"}"
settings.port.should eq 3000
settings.color.should eq true
settings.secret_key_base.should eq "mV6kTmG3k1yVFh-fPYpugSn0wbZveDvrvfQuv88DPF8"
# Sometimes settings get over written by other tests first and this fails
# expected_session = {:key => "amber.session", :store => "signed_cookie", :expires => "0"}
# settings.session.should eq expected_session
expected_secrets = {
description: "Store your test secrets credentials and settings here.",
database: "mysql://root@localhost:3306/amber_test_app_test",
}
settings.secrets.should eq expected_secrets
end

it "overrides enviroment settings" do
Amber::Server.instance.settings = Amber::Settings.new
Amber::Server.configure do |server|
server.name = "Hello World App"
server.port = 8080
Expand All @@ -54,18 +36,22 @@ describe Amber do
end

it "retains environment.yml settings that haven't been overwritten" do
# NOTE: Any changes to settings here remain for all specs run afterwards.
# Added for convenience until settings is change to an instances
# instead of singleton this is still an "a problem".
Amber::Server.instance.settings = Amber::Settings.new
Amber::Server.configure do |server|
server.name = "Hello World App"
server.name = "New name"
server.port = 8080
end

settings = Amber::Server.settings

settings.name.should eq "Hello World App"
settings.port.should eq 8080
settings.name.should_not eq "Hello World App"
settings.port_reuse.should eq true
settings.redis_url.should eq "#{ENV["REDIS_URL"]? || "redis://localhost:6379"}"
settings.color.should eq true
settings.secret_key_base.should eq "mV6kTmG3k1yVFh-fPYpugSn0wbZveDvrvfQuv88DPF8"
expected_session = {:key => "amber.session", :store => :signed_cookie, :expires => 0}
settings.session.should eq expected_session
settings.port.should_not eq 3000
expected_secrets = {
description: "Store your test secrets credentials and settings here.",
database: "mysql://root@localhost:3306/amber_test_app_test",
Expand Down
2 changes: 1 addition & 1 deletion spec/amber/router/session/redis_store_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ require "redis"

# TODO: This test can't run on it's own because it needs the EXPIRES contant which is set elsewhere.
module Amber::Router::Session
REDIS_STORE = Redis.new(url: Settings.redis_url)
REDIS_STORE = Redis.new(url: Amber::Server.redis_url)

describe RedisStore do
describe "#id" do
Expand Down
46 changes: 22 additions & 24 deletions spec/amber/scripts/environment_loader_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,42 @@ describe Amber::Server do
describe "environment" do
it "should load expected output" do
expected = <<-EXP
@@name = "amber_test_app"
@@port_reuse = true
@@process_count = (ENV[%(AMBER_PROCESS_COUNT)]? || 1).to_i
@@log = ::Logger.new(STDOUT)
@@log.level = ::Logger::INFO
@@color = true
@@redis_url = "\#{ENV[%(REDIS_URL)]? || %(redis://localhost:6379)}"
@@port = 3000
@@host = "0.0.0.0"
@@secret_key_base = "mV6kTmG3k1yVFh-fPYpugSn0wbZveDvrvfQuv88DPF8"
@@session = {
@name = "amber_test_app"
@port_reuse = true
@process_count = (ENV[%(AMBER_PROCESS_COUNT)]? || 1).to_i
@log = ::Logger.new(STDOUT).tap{|l| l.level = ::Logger::INFO}
@color = true
@redis_url = "\#{ENV[%(REDIS_URL)]? || %(redis://localhost:6379)}"
@port = 3000
@host = "0.0.0.0"
@secret_key_base = "mV6kTmG3k1yVFh-fPYpugSn0wbZveDvrvfQuv88DPF8"
@session = {
:key => "amber.session",
:store => :signed_cookie,
:expires => 0,
}
class_getter secrets = {"description": "Store your test secrets credentials and settings here.", "database": "mysql://root@localhost:3306/amber_test_app_test"}
getter secrets = {"description": "Store your test secrets credentials and settings here.", "database": "mysql://root@localhost:3306/amber_test_app_test"}
EXP
{{run("../../../src/amber/scripts/environment_loader.cr", "test").stringify}}.should eq expected
end

it "should load default settings when environment file doesn't exist." do
expected = <<-EXP
@@name = "Amber_App"
@@port_reuse = true
@@process_count = 1
@@log = ::Logger.new(STDOUT)
@@log.level = ::Logger::INFO
@@color = true
@@redis_url = "redis://localhost:6379"
@@port = 3000
@@host = "127.0.0.1"
@@session = {:key => "amber.session", :store => :signed_cookie, :expires => 0}
class_getter secrets = {description: "Store your non_existent secrets credentials and settings here."}
@name = "Amber_App"
@port_reuse = true
@process_count = 1
@log = ::Logger.new(STDOUT).tap{|l| l.level = ::Logger::INFO}
@color = true
@redis_url = "redis://localhost:6379"
@port = 3000
@host = "127.0.0.1"
@session = {:key => "amber.session", :store => :signed_cookie, :expires => 0}
getter secrets = {description: "Store your non_existent secrets credentials and settings here."}
EXP
# Removed secret_key_base from default settings since it's different everytime.
{{run("../../../src/amber/scripts/environment_loader.cr", "non_existent").stringify}}.gsub(/@@secret_key_base[^\n]+\n/, "").should eq expected
{{run("../../../src/amber/scripts/environment_loader.cr", "non_existent").stringify}}.gsub(/@secret_key_base[^\n]+\n/, "").should eq expected
end
end
end
21 changes: 21 additions & 0 deletions spec/amber/server/settings_spec.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
require "../../../spec_helper"

describe Amber::Settings do
it "loads environment settings from test.yml" do
settings = Amber::Settings.new

settings.name.should eq "amber_test_app"
settings.port_reuse.should eq true
settings.redis_url.should eq "#{ENV["REDIS_URL"]? || "redis://localhost:6379"}"
settings.port.should eq 3000
settings.color.should eq true
settings.secret_key_base.should eq "mV6kTmG3k1yVFh-fPYpugSn0wbZveDvrvfQuv88DPF8"
expected_session = {:key => "amber.session", :store => :signed_cookie, :expires => 0}
settings.session.should eq expected_session
expected_secrets = {
description: "Store your test secrets credentials and settings here.",
database: "mysql://root@localhost:3306/amber_test_app_test",
}
settings.secrets.should eq expected_secrets
end
end
4 changes: 2 additions & 2 deletions src/amber.cr
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,11 @@ module Amber
end

def colorize(text, color)
text.colorize(color).toggle(Amber::Settings.color).to_s
text.colorize(color).toggle(settings.color).to_s
end

def colorize(text, color, mode)
text.colorize(color).toggle(Amber::Settings.color).mode(mode).to_s
text.colorize(color).toggle(settings.color).mode(mode).to_s
end
end
end
2 changes: 1 addition & 1 deletion src/amber/router/pipe/logger.cr
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module Amber
module Pipe
class Logger < Base
def colorize(text, color)
text.colorize(color).toggle(Amber::Settings.color).to_s
text.colorize(color).toggle(Amber::Server.settings.color).to_s
end

def initialize(io : IO = STDOUT)
Expand Down
32 changes: 16 additions & 16 deletions src/amber/scripts/environment_loader.cr
Original file line number Diff line number Diff line change
Expand Up @@ -34,41 +34,41 @@ str = String.build do |s|
# Most of this logic can be cleaned up by just requiring environment files to contain valid params.
# For now I have this here so that tests can still pass without having to load env files although they should.
# This is a transistion.
s.puts %(@@name = "#{settings["name"]? || "Amber_App"}")
s.puts %(@@port_reuse = #{settings["port_reuse"]? == nil ? true : settings["port_reuse"]})
s.puts %(@@process_count = #{settings["process_count"]? || 1})
s.puts %(@@log = #{settings["log"]? || "::Logger.new(STDOUT)"})
s.puts %(@@log.level = #{settings["log_level"]? || "::Logger::INFO"})
s.puts %(@@color = #{settings["color"]? == nil ? true : settings["color"]})
s.puts %(@@redis_url = "#{settings["redis_url"]? || "redis://localhost:6379"}")
s.puts %(@@port = #{settings["port"]? || 3000})
s.puts %(@@host = "#{settings["host"]? || "127.0.0.1"}")
s.puts %(@@secret_key_base = "#{settings["secret_key_base"]? || SecureRandom.urlsafe_base64(32)}")
s.puts %(@name = "#{settings["name"]? || "Amber_App"}")
s.puts %(@port_reuse = #{settings["port_reuse"]? == nil ? true : settings["port_reuse"]})
s.puts %(@process_count = #{settings["process_count"]? || 1})
s.puts %(@log = #{settings["log"]? || "::Logger.new(STDOUT)"}.tap{|l| l.level = #{settings["log_level"]? || "::Logger::INFO"}})
#s.puts %(@log.level = #{settings["log_level"]? || "::Logger::INFO"})
s.puts %(@color = #{settings["color"]? == nil ? true : settings["color"]})
s.puts %(@redis_url = "#{settings["redis_url"]? || "redis://localhost:6379"}")
s.puts %(@port = #{settings["port"]? || 3000})
s.puts %(@host = "#{settings["host"]? || "127.0.0.1"}")
s.puts %(@secret_key_base = "#{settings["secret_key_base"]? || SecureRandom.urlsafe_base64(32)}")

unless settings["ssl_key_file"]?.to_s.empty?
s.puts %(@@ssl_key_file = "#{settings["ssl_key_file"]?}")
s.puts %(@ssl_key_file = "#{settings["ssl_key_file"]?}")
end

unless settings["ssl_cert_file"]?.to_s.empty?
s.puts %(@@ssl_cert_file = "#{settings["ssl_cert_file"]?}")
s.puts %(@ssl_cert_file = "#{settings["ssl_cert_file"]?}")
end

if settings["session"]? && settings["session"].raw.is_a?(Hash(YAML::Type, YAML::Type))
s.puts <<-SESSION
@@session = {
@session = {
:key => "#{settings["session"]["key"]? ? settings["session"]["key"] : "amber.session"}",
:store => #{settings["session"]["store"]? ? settings["session"]["store"] : ":signed_cookie"},
:expires => #{settings["session"]["expires"]? ? settings["session"]["expires"] : 0},
}
SESSION
else
s.puts %(@@session = {:key => "amber.session", :store => :signed_cookie, :expires => 0})
s.puts %(@session = {:key => "amber.session", :store => :signed_cookie, :expires => 0})
end

if settings["secrets"]? && settings["secrets"].raw.is_a?(Hash(YAML::Type, YAML::Type))
s.puts "class_getter secrets = #{settings["secrets"].inspect.gsub(/(\"[^\"]+\") \=\>/) { "#{$1}:" }}"
s.puts "getter secrets = #{settings["secrets"].inspect.gsub(/(\"[^\"]+\") \=\>/) { "#{$1}:" }}"
else
s.puts %(class_getter secrets = {description: "Store your #{environment} secrets credentials and settings here."})
s.puts %(getter secrets = {description: "Store your #{environment} secrets credentials and settings here."})
end
end

Expand Down
13 changes: 8 additions & 5 deletions src/amber/server/configuration.cr
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
module Amber
module Configuration
macro included
property settings = Settings.new

def self.instance
@@instance ||= new
end


# Configure should probably be deprecated in favor of settings.
def self.configure
with settings yield settings
end

def self.settings
Settings
def self.settings(&block)
with settings yield settings
end

def settings
Settings
def self.settings
instance.settings
end

def self.secret_key_base
Expand Down
30 changes: 15 additions & 15 deletions src/amber/server/settings.cr
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,21 @@ module Amber
class Settings
include Amber::DSL::Server
alias WebSocketAdapter = WebSockets::Adapters::RedisAdapter.class | WebSockets::Adapters::MemoryAdapter.class
class_getter handler = Pipe::Pipeline.new
class_getter router = Router::Router.new
class_property pubsub_adapter : WebSocketAdapter = WebSockets::Adapters::MemoryAdapter
class_property port_reuse : Bool
class_property log : ::Logger
class_property color : Bool = true
class_property process_count : Int32
class_property secret_key_base : String
class_property port : Int32
class_property name : String
class_property host : String
class_property ssl_key_file : String? = nil
class_property ssl_cert_file : String? = nil
class_property redis_url = ""
class_property session : Hash(Symbol, Symbol | String | Int32)
getter handler = Pipe::Pipeline.new
getter router = Router::Router.new
property pubsub_adapter : WebSocketAdapter = WebSockets::Adapters::MemoryAdapter
property port_reuse : Bool
property log : ::Logger
property color : Bool = true
property process_count : Int32
property secret_key_base : String
property port : Int32
property name : String
property host : String
property ssl_key_file : String? = nil
property ssl_cert_file : String? = nil
property redis_url = ""
property session : Hash(Symbol, Symbol | String | Int32)

# Loads environment yml settings from the current AMBER_ENV environment variable
# and defaults to development environment
Expand Down

0 comments on commit 8245639

Please sign in to comment.