Skip to content

Commit 18d3ca4

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

3 files changed

Lines changed: 49 additions & 32 deletions

File tree

.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: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
defmodule Hound.SessionServer do
22
@moduledoc false
33

4+
require Logger
5+
46
use GenServer
57
@name __MODULE__
68

@@ -10,7 +12,7 @@ defmodule Hound.SessionServer do
1012

1113

1214
def session_for_pid(pid, opts) do
13-
current_session_id(pid) ||
15+
{:ok, current_session_id(pid)} ||
1416
change_current_session_for_pid(pid, :default, opts)
1517
end
1618

@@ -58,34 +60,53 @@ defmodule Hound.SessionServer do
5860
{:ok, state}
5961
end
6062

63+
def handle_call({:destroy_sessions, pid}, _from, state) do
64+
destroy_sessions(pid)
65+
{:reply, :ok, state}
66+
end
6167

6268
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
69+
{ref, sessions} = case :ets.lookup(@name, pid) do
70+
[{^pid, ref, _session_id, sessions}] ->
71+
{ref, sessions}
72+
[] ->
73+
{Process.monitor(pid), %{}}
74+
end
75+
76+
77+
case find_existing_session(sessions, session_name) do
78+
{:ok, {session_id, sessions}} ->
79+
Logger.debug("Found exsisting session #{session_name} - #{session_id}")
80+
81+
add_session_to_table(pid, ref, session_id, sessions)
82+
83+
{:reply, {:ok, session_id}, Map.put(state, ref, pid)}
84+
85+
:error ->
86+
{:ok, driver_info} = Hound.driver_info()
87+
88+
case create_session(driver_info, opts) do
89+
{:error, _} = e -> {:reply, e, state}
8190

91+
{:ok, session_id} ->
92+
Logger.debug("Started new session #{session_name} - #{session_id}")
93+
94+
sessions = Map.put(sessions, session_name, session_id)
95+
add_session_to_table(pid, ref, session_id, sessions)
96+
97+
{:reply, {:ok, session_id}, Map.put(state, ref, pid)}
98+
end
99+
end
100+
end
101+
102+
defp add_session_to_table(pid, ref, session_id, sessions) do
82103
:ets.insert(@name, {pid, ref, session_id, sessions})
83-
{:reply, session_id, Map.put(state, ref, pid)}
84104
end
85105

86-
def handle_call({:destroy_sessions, pid}, _from, state) do
87-
destroy_sessions(pid)
88-
{:reply, :ok, state}
106+
defp find_existing_session(sessions, session_name) do
107+
with {:ok, session_id} <- Map.fetch(sessions, session_name) do
108+
{:ok, {session_id, sessions}}
109+
end
89110
end
90111

91112
def handle_info({:DOWN, ref, _, _, _}, state) do
@@ -96,10 +117,7 @@ defmodule Hound.SessionServer do
96117
end
97118

98119
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
120+
Hound.Session.create_session(driver_info[:browser], opts)
103121
end
104122

105123
defp destroy_sessions(pid) do

0 commit comments

Comments
 (0)