Merge remote branch 'cloudant:3080-fix-validate_dbname'

This closes #188

Signed-off-by: ILYA Khlopotov <iilyak@ca.ibm.com>
diff --git a/src/couch_db.erl b/src/couch_db.erl
index 3eff99f..26c6ae7 100644
--- a/src/couch_db.erl
+++ b/src/couch_db.erl
@@ -1519,13 +1519,17 @@
 normalize_dbname(DbName) when is_list(DbName) ->
     normalize_dbname(list_to_binary(DbName));
 normalize_dbname(DbName) when is_binary(DbName) ->
+    mem3:dbname(maybe_remove_extension(DbName)).
+
+maybe_remove_extension(DbName) ->
     case filename:extension(DbName) of
         <<".couch">> ->
-            mem3:dbname(filename:rootname(DbName));
+            filename:rootname(DbName);
         _ ->
-            mem3:dbname(DbName)
+            DbName
     end.
 
+
 -spec dbname_suffix(list() | binary()) -> binary().
 
 dbname_suffix(DbName) ->
@@ -1540,7 +1544,8 @@
         DbName, Normalized, fun validate_dbname_int/2).
 
 validate_dbname_int(DbName, Normalized) when is_binary(DbName) ->
-    case re:run(DbName, ?DBNAME_REGEX, [{capture,none}, dollar_endonly]) of
+    DbNoExt = maybe_remove_extension(DbName),
+    case re:run(DbNoExt, ?DBNAME_REGEX, [{capture,none}, dollar_endonly]) of
         match ->
             ok;
         nomatch ->
@@ -1559,23 +1564,23 @@
 -include_lib("eunit/include/eunit.hrl").
 
 setup() ->
-    ok = meck:new(couch_db_plugin, [passthrough]),
-    ok = meck:expect(couch_db_plugin, validate_dbname, fun(_, _) -> false end),
+    ok = meck:new(couch_epi, [passthrough]),
+    ok = meck:expect(couch_epi, decide, fun(_, _, _, _, _) -> no_decision end),
     ok.
 
 teardown(_) ->
-    (catch meck:unload(couch_db_plugin)).
+    (catch meck:unload(couch_epi)).
 
 validate_dbname_success_test_() ->
     Cases =
-        generate_cases_with_shards("long/co$mplex-/path+/_something")
+        generate_cases_with_shards("long/co$mplex-/path+/something")
         ++ generate_cases_with_shards("something")
         ++ lists:append(
             [generate_cases_with_shards(?b2l(SystemDb))
                 || SystemDb <- ?SYSTEM_DATABASES]),
     {
         foreach, fun setup/0, fun teardown/1,
-        [{test_name(A), fun() -> should_pass_validate_dbname(A) end} || {_, A} <- Cases]
+        [should_pass_validate_dbname(A) || {_, A} <- Cases]
     }.
 
 validate_dbname_fail_test_() ->
@@ -1585,7 +1590,7 @@
        ++ generate_cases_with_shards("long/co$mplex-/path+/some.thing"),
     {
         foreach, fun setup/0, fun teardown/1,
-        [{test_name(A), fun() -> should_fail_validate_dbname(A) end} || {_, A} <- Cases]
+        [should_fail_validate_dbname(A) || {_, A} <- Cases]
     }.
 
 normalize_dbname_test_() ->