Skip to content

Commit

Permalink
better session init errors, simplify tests, check for error condition
Browse files Browse the repository at this point in the history
  • Loading branch information
subvertallchris committed Mar 16, 2015
1 parent 568f141 commit 8353792
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 22 deletions.
37 changes: 23 additions & 14 deletions lib/neo4j/session.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ def initialize(error_msg, error_code, error_status)
end
end

class InitializationError < RuntimeError; end

# Performs a cypher query. See {Neo4j::Core::Query} for more details, but basic usage looks like:
#
Expand Down Expand Up @@ -95,29 +96,21 @@ class << self
# @see also Neo4j::Server::CypherSession#open for :server_db params
# @param db_type the type of database, e.g. :embedded_db, or :server_db
def open(db_type = :server_db, endpoint_url = nil, params = {})
validate_session_num!(db_type)
register(create_session(db_type, endpoint_url, params), params[:name], params[:default])
end

# @private
def register(session, name = nil, default = nil)
if default == true
set_current(session)
elsif default.nil?
set_current(session) unless @@current_session
end
@@all_sessions[name] = session if name
session
end

# @private
def unregister(session)
@@current_session = nil if @@current_session == session
def validate_session_num!(db_type)
return if db_type != :embedded_db || current.nil?
fail InitializationError, "Cannot register #{db_type} session. Multiple sessions only supported for Neo4j Server (:server_db) connections."
end
private :validate_session_num!

# @private
def create_session(db_type, endpoint_url, params = {})
unless @@factories[db_type]
fail "Can't connect to database '#{db_type}', available #{@@factories.keys.join(',')}"
fail InitializationError, "Can't connect to database '#{db_type}', available #{@@factories.keys.join(',')}"
end
@@factories[db_type].call(endpoint_url, params)
end
Expand Down Expand Up @@ -186,6 +179,22 @@ def _notify_listeners(event, data)
_listeners.each { |li| li.call(event, data) }
end

# @private
def register(session, name = nil, default = nil)
if default == true
set_current(session)
elsif default.nil?
set_current(session) unless @@current_session
end
@@all_sessions[name] = session if name
session
end

# @private
def unregister(session)
@@current_session = nil if @@current_session == session
end

def inspect
"Neo4j::Session available: #{@@factories && @@factories.keys}"
end
Expand Down
2 changes: 1 addition & 1 deletion spec/neo4j-core/unit/session_unit_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@

expect { session.query }.to raise_error 'not implemented, abstract'
expect { session._query }.to raise_error 'not implemented'
expect { create_session(:foo) }.to raise_error
expect { Neo4j::Session.open(:foo) }.to raise_error Neo4j::Session::InitializationError
end
end
17 changes: 10 additions & 7 deletions spec/neo4j-server/e2e/cypher_session_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@ def open_session
create_server_session
end

def open_named_session(name, default = nil)
create_named_server_session(name, default)
end

it_behaves_like 'Neo4j::Session'

describe '.open' do
Expand Down Expand Up @@ -57,18 +53,25 @@ def open_named_session(name, default = nil)
it 'does not override the current session when default = false' do
default = open_session
expect(Neo4j::Session.current).to eq(default)
name = :tesr
open_named_session(name)
name = :test
Neo4j::Session.open(:server_db, nil, name: name)
expect(Neo4j::Session.current).to eq(default)
end

it 'makes the new session current when default = true' do
default = open_session
expect(Neo4j::Session.current).to eq(default)
name = :test
test = open_named_session(name, true)
test = Neo4j::Session.open(:server_db, nil, name: name, default: true)
expect(Neo4j::Session.current).to eq(test)
end

context 'when a session is active and Neo4j server is not in use' do
it 'raises an error' do
open_session
expect { Neo4j::Session.open(:foo, nil, name: 'foo') }.to raise_error Neo4j::Session::InitializationError
end
end
end

describe '_query' do
Expand Down

0 comments on commit 8353792

Please sign in to comment.