diff options
Diffstat (limited to 'src/couch/test/eunit/couch_db_plugin_tests.erl')
-rw-r--r-- | src/couch/test/eunit/couch_db_plugin_tests.erl | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/src/couch/test/eunit/couch_db_plugin_tests.erl b/src/couch/test/eunit/couch_db_plugin_tests.erl new file mode 100644 index 000000000..93551adbc --- /dev/null +++ b/src/couch/test/eunit/couch_db_plugin_tests.erl @@ -0,0 +1,205 @@ +% Licensed under the Apache License, Version 2.0 (the "License"); you may not +% use this file except in compliance with the License. You may obtain a copy of +% the License at +% +% http://www.apache.org/licenses/LICENSE-2.0 +% +% Unless required by applicable law or agreed to in writing, software +% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +% License for the specific language governing permissions and limitations under +% the License. + +-module(couch_db_plugin_tests). + +-export([ + validate_dbname/2, + before_doc_update/3, + after_doc_read/2, + validate_docid/1, + check_is_admin/1, + on_delete/2 +]). + +-export([ %% couch_epi_plugin behaviour + app/0, + providers/0, + services/0, + data_providers/0, + data_subscriptions/0, + processes/0, + notify/3 +]). + +-include_lib("couch/include/couch_eunit.hrl"). +-include_lib("couch/include/couch_db.hrl"). + +%% couch_epi_plugin behaviour + +app() -> test_app. +providers() -> [{couch_db, ?MODULE}]. +services() -> []. +data_providers() -> []. +data_subscriptions() -> []. +processes() -> []. +notify(_, _, _) -> ok. +fake_db() -> test_util:fake_db([]). + +setup() -> + couch_tests:setup([ + couch_epi_dispatch:dispatch(chttpd, ?MODULE) + ]). + +teardown(Ctx) -> + couch_tests:teardown(Ctx). + +validate_dbname({true, _Db}, _) -> {decided, true}; +validate_dbname({false, _Db}, _) -> {decided, false}; +validate_dbname({fail, _Db}, _) -> throw(validate_dbname); +validate_dbname({pass, _Db}, _) -> no_decision. + +before_doc_update({fail, _Doc}, _Db, interactive_edit) -> throw(before_doc_update); +before_doc_update({true, Doc}, Db, interactive_edit) -> [{true, [before_doc_update|Doc]}, Db, interactive_edit]; +before_doc_update({false, Doc}, Db, interactive_edit) -> [{false, Doc}, Db, interactive_edit]. + +after_doc_read({fail, _Doc}, _Db) -> throw(after_doc_read); +after_doc_read({true, Doc}, Db) -> [{true, [after_doc_read|Doc]}, Db]; +after_doc_read({false, Doc}, Db) -> [{false, Doc}, Db]. + +validate_docid({true, _Id}) -> true; +validate_docid({false, _Id}) -> false; +validate_docid({fail, _Id}) -> throw(validate_docid). + +check_is_admin({true, _Db}) -> true; +check_is_admin({false, _Db}) -> false; +check_is_admin({fail, _Db}) -> throw(check_is_admin). + +on_delete(true, _Opts) -> true; +on_delete(false, _Opts) -> false; +on_delete(fail, _Opts) -> throw(on_delete). + +callback_test_() -> + { + "callback tests", + { + setup, fun setup/0, fun teardown/1, + [ + {"validate_dbname_match", fun validate_dbname_match/0}, + {"validate_dbname_no_match", fun validate_dbname_no_match/0}, + {"validate_dbname_throw", fun validate_dbname_throw/0}, + {"validate_dbname_pass", fun validate_dbname_pass/0}, + + {"before_doc_update_match", fun before_doc_update_match/0}, + {"before_doc_update_no_match", fun before_doc_update_no_match/0}, + {"before_doc_update_throw", fun before_doc_update_throw/0}, + + {"after_doc_read_match", fun after_doc_read_match/0}, + {"after_doc_read_no_match", fun after_doc_read_no_match/0}, + {"after_doc_read_throw", fun after_doc_read_throw/0}, + + {"validate_docid_match", fun validate_docid_match/0}, + {"validate_docid_no_match", fun validate_docid_no_match/0}, + {"validate_docid_throw", fun validate_docid_throw/0}, + + {"check_is_admin_match", fun check_is_admin_match/0}, + {"check_is_admin_no_match", fun check_is_admin_no_match/0}, + {"check_is_admin_throw", fun check_is_admin_throw/0}, + + {"on_delete_match", fun on_delete_match/0}, + {"on_delete_no_match", fun on_delete_no_match/0}, + {"on_delete_throw", fun on_delete_throw/0} + ] + } + }. + + +validate_dbname_match() -> + ?assert(couch_db_plugin:validate_dbname( + {true, [db]}, db, fun(_, _) -> pass end)). + +validate_dbname_no_match() -> + ?assertNot(couch_db_plugin:validate_dbname( + {false, [db]}, db, fun(_, _) -> pass end)). + +validate_dbname_throw() -> + ?assertThrow( + validate_dbname, + couch_db_plugin:validate_dbname( + {fail, [db]}, db, fun(_, _) -> pass end)). + +validate_dbname_pass() -> + ?assertEqual(pass, couch_db_plugin:validate_dbname( + {pass, [db]}, db, fun(_, _) -> pass end)). + +before_doc_update_match() -> + ?assertMatch( + {true, [before_doc_update, doc]}, + couch_db_plugin:before_doc_update( + fake_db(), {true, [doc]}, interactive_edit)). + +before_doc_update_no_match() -> + ?assertMatch( + {false, [doc]}, + couch_db_plugin:before_doc_update( + fake_db(), {false, [doc]}, interactive_edit)). + +before_doc_update_throw() -> + ?assertThrow( + before_doc_update, + couch_db_plugin:before_doc_update( + fake_db(), {fail, [doc]}, interactive_edit)). + + +after_doc_read_match() -> + ?assertMatch( + {true, [after_doc_read, doc]}, + couch_db_plugin:after_doc_read(fake_db(), {true, [doc]})). + +after_doc_read_no_match() -> + ?assertMatch( + {false, [doc]}, + couch_db_plugin:after_doc_read(fake_db(), {false, [doc]})). + +after_doc_read_throw() -> + ?assertThrow( + after_doc_read, + couch_db_plugin:after_doc_read(fake_db(), {fail, [doc]})). + + +validate_docid_match() -> + ?assert(couch_db_plugin:validate_docid({true, [doc]})). + +validate_docid_no_match() -> + ?assertNot(couch_db_plugin:validate_docid({false, [doc]})). + +validate_docid_throw() -> + ?assertThrow( + validate_docid, + couch_db_plugin:validate_docid({fail, [doc]})). + + +check_is_admin_match() -> + ?assert(couch_db_plugin:check_is_admin({true, [db]})). + +check_is_admin_no_match() -> + ?assertNot(couch_db_plugin:check_is_admin({false, [db]})). + +check_is_admin_throw() -> + ?assertThrow( + check_is_admin, + couch_db_plugin:check_is_admin({fail, [db]})). + +on_delete_match() -> + ?assertMatch( + [true], + couch_db_plugin:on_delete(true, [])). + +on_delete_no_match() -> + ?assertMatch( + [false], + couch_db_plugin:on_delete(false, [])). + +on_delete_throw() -> + ?assertThrow( + on_delete, + couch_db_plugin:on_delete(fail, [])). |