Merge remote-tracking branch 'smithsz/2819-db-create-check-already-exists'
diff --git a/src/fabric_db_create.erl b/src/fabric_db_create.erl
index ffbf78a..dc1c0cc 100644
--- a/src/fabric_db_create.erl
+++ b/src/fabric_db_create.erl
@@ -23,14 +23,19 @@
go(DbName, Options) ->
case validate_dbname(DbName, Options) of
ok ->
- {Shards, Doc} = generate_shard_map(DbName, Options),
- case {create_shard_files(Shards), create_shard_db_doc(Doc)} of
- {ok, {ok, Status}} ->
- Status;
- {file_exists, {ok, _}} ->
+ case db_exists(DbName) of
+ true ->
{error, file_exists};
- {_, Error} ->
- Error
+ false ->
+ {Shards, Doc} = generate_shard_map(DbName, Options),
+ case {create_shard_files(Shards), create_shard_db_doc(Doc)} of
+ {ok, {ok, Status}} ->
+ Status;
+ {file_exists, {ok, _}} ->
+ {error, file_exists};
+ {_, Error} ->
+ Error
+ end
end;
Error ->
Error
@@ -155,3 +160,35 @@
{<<"by_range">>, {[{K,lists:sort(V)} || {K,V} <- ByRangeOut]}}
]}}.
+db_exists(DbName) -> is_list(catch mem3:shards(DbName)).
+
+-ifdef(TEST).
+-include_lib("eunit/include/eunit.hrl").
+
+db_exists_for_existing_db_test() ->
+ start_meck_(),
+ Mock = fun(DbName) when is_binary(DbName) ->
+ [#shard{dbname = DbName, range = [0,100]}]
+ end,
+ ok = meck:expect(mem3, shards, Mock),
+ ?assertEqual(db_exists(<<"foobar">>), true),
+ ?assertEqual(meck:validate(mem3), true),
+ stop_meck_().
+
+db_exists_for_missing_db_test() ->
+ start_meck_(),
+ Mock = fun(DbName) ->
+ erlang:error(database_does_not_exist, DbName)
+ end,
+ ok = meck:expect(mem3, shards, Mock),
+ ?assertEqual(db_exists(<<"foobar">>), false),
+ ?assertEqual(meck:validate(mem3), false),
+ stop_meck_().
+
+start_meck_() ->
+ ok = meck:new(mem3).
+
+stop_meck_() ->
+ ok = meck:unload(mem3).
+
+-endif.