Skip to content

Commit ee150c5

Browse files
committed
feat: make start session return an error tuple instead of raising
1 parent 3be56f4 commit ee150c5

File tree

3 files changed

+43
-32
lines changed

3 files changed

+43
-32
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ erl_crash.dump
55
.DS_Store
66
doc/
77
screenshot-*.png
8+
.elixir_ls

lib/hound/helpers/session.ex

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ defmodule Hound.Helpers.Session do
4444
change_session_to(session_name)
4545
result = apply(func, [])
4646
change_session_to(previous_session_name)
47-
result
47+
result
4848
end
4949

5050

@@ -117,9 +117,7 @@ defmodule Hound.Helpers.Session do
117117

118118
@doc false
119119
def current_session_name do
120-
Hound.SessionServer.current_session_name(self()) ||
121-
raise "could not find a session for process #{inspect self()}"
122-
123-
120+
Hound.SessionServer.current_session_name(self()) ||
121+
raise "could not find a session for process #{inspect self()}"
124122
end
125123
end

lib/hound/session_server.ex

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ defmodule Hound.SessionServer do
1010

1111

1212
def session_for_pid(pid, opts) do
13-
current_session_id(pid) ||
13+
{:ok, current_session_id(pid)} ||
1414
change_current_session_for_pid(pid, :default, opts)
1515
end
1616

@@ -58,34 +58,49 @@ defmodule Hound.SessionServer do
5858
{:ok, state}
5959
end
6060

61+
def handle_call({:destroy_sessions, pid}, _from, state) do
62+
destroy_sessions(pid)
63+
{:reply, :ok, state}
64+
end
6165

6266
def handle_call({:change_session, pid, session_name, opts}, _from, state) do
63-
{:ok, driver_info} = Hound.driver_info
64-
65-
{ref, sessions} =
66-
case :ets.lookup(@name, pid) do
67-
[{^pid, ref, _session_id, sessions}] ->
68-
{ref, sessions}
69-
[] ->
70-
{Process.monitor(pid), %{}}
71-
end
72-
73-
{session_id, sessions} =
74-
case Map.fetch(sessions, session_name) do
75-
{:ok, session_id} ->
76-
{session_id, sessions}
77-
:error ->
78-
session_id = create_session(driver_info, opts)
79-
{session_id, Map.put(sessions, session_name, session_id)}
80-
end
67+
{ref, sessions} = case :ets.lookup(@name, pid) do
68+
[{^pid, ref, _session_id, sessions}] ->
69+
{ref, sessions}
70+
[] ->
71+
{Process.monitor(pid), %{}}
72+
end
73+
74+
75+
case find_existing_session(sessions, session_name) do
76+
{:ok, {session_id, sessions}} ->
77+
add_session_to_table(pid, ref, session_id, sessions)
78+
79+
{:reply, {:ok, session_id}, Map.put(state, ref, pid)}
80+
81+
:error ->
82+
{:ok, driver_info} = Hound.driver_info()
83+
84+
case create_session(driver_info, opts) do
85+
{:error, _} = e -> {:reply, e, state}
8186

87+
{:ok, session_id} ->
88+
sessions = Map.put(sessions, session_name, session_id)
89+
add_session_to_table(pid, ref, session_id, sessions)
90+
91+
{:reply, {:ok, session_id}, Map.put(state, ref, pid)}
92+
end
93+
end
94+
end
95+
96+
defp add_session_to_table(pid, ref, session_id, sessions) do
8297
:ets.insert(@name, {pid, ref, session_id, sessions})
83-
{:reply, session_id, Map.put(state, ref, pid)}
8498
end
8599

86-
def handle_call({:destroy_sessions, pid}, _from, state) do
87-
destroy_sessions(pid)
88-
{:reply, :ok, state}
100+
defp find_existing_session(sessions, session_name) do
101+
with {:ok, session_id} <- Map.fetch(sessions, session_name) do
102+
{:ok, {session_id, sessions}}
103+
end
89104
end
90105

91106
def handle_info({:DOWN, ref, _, _, _}, state) do
@@ -96,10 +111,7 @@ defmodule Hound.SessionServer do
96111
end
97112

98113
defp create_session(driver_info, opts) do
99-
case Hound.Session.create_session(driver_info[:browser], opts) do
100-
{:ok, session_id} -> session_id
101-
{:error, reason} -> raise "could not create a new session: #{reason}, check webdriver is running"
102-
end
114+
Hound.Session.create_session(driver_info[:browser], opts)
103115
end
104116

105117
defp destroy_sessions(pid) do

0 commit comments

Comments
 (0)