This is an automated email from the ASF dual-hosted git repository.

jan pushed a commit to branch access
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/access by this push:
     new dd94d4c  test(access): add some basic tests for access
dd94d4c is described below

commit dd94d4cd67dcd020e55ee0a10ee008daa1ca0f8d
Author: Alex Feyerke <[email protected]>
AuthorDate: Fri Jul 19 16:02:39 2019 +0200

    test(access): add some basic tests for access
---
 src/couch/test/couchdb_access_tests.erl | 104 ++++++++++++++++++++++++++++++--
 1 file changed, 99 insertions(+), 5 deletions(-)

diff --git a/src/couch/test/couchdb_access_tests.erl 
b/src/couch/test/couchdb_access_tests.erl
index 83bc613..4a27a25 100644
--- a/src/couch/test/couchdb_access_tests.erl
+++ b/src/couch/test/couchdb_access_tests.erl
@@ -27,6 +27,11 @@ setup(PortType) ->
     XUrl = make_url("x", Addr, PortType),
     YUrl = make_url("y", Addr, PortType),
 
+    % cleanup and setup
+    {ok, _, _, _} = test_request:delete(AdminUrl ++ "/_users"),
+    {ok, _, _, _} = test_request:delete(AdminUrl ++ "/db?q=1"),
+    {ok, _, _, _} = test_request:put(AdminUrl ++ "/db?access=true", ""),
+
     % create users
     UserDbUrl = AdminUrl ++ "/_users",
     {ok, 201, _, _} = test_request:put(UserDbUrl, ""),
@@ -39,9 +44,6 @@ setup(PortType) ->
     UserYBody = "{ \"name\":\"y\", \"roles\": [], \"password\":\"y\", 
\"type\": \"user\" }",
     {ok, 201, _, _} = test_request:put(UserYUrl, UserYBody),
 
-    {ok, _, _, _} = test_request:delete(AdminUrl ++ "/db"),
-    {ok, _, _, _} = test_request:put(AdminUrl ++ "/db?access=true", ""),
-
     {AdminUrl, XUrl, YUrl}.
 
 teardown(_, _) ->
@@ -50,10 +52,22 @@ teardown(_, _) ->
 
 access_test_() ->
     Tests = [
-        fun should_let_admin_create_doc_with_access/2
+        fun should_let_admin_create_doc_with_access/2,
+        fun should_let_user_create_doc_for_themselves/2,
+        fun should_not_let_user_create_doc_for_someone_else/2,
+        fun should_let_admin_read_doc_with_access/2
+        fun user_with_access_can_read_doc/2,
+        fun user_without_access_can_not_read_doc/2,
+        fun should_let_admin_delete_doc_with_access/2,
+        fun should_let_user_delete_doc_for_themselves/2,
+        fun should_not_let_user_delete_doc_for_someone_else/2,
+        fun should_let_admin_fetch_all_docs/2,
+        fun should_let_user_fetch_their_own_all_docs/2,
+        fun should_let_admin_fetch_changes/2,
+        fun should_let_user_fetch_their_own_changes/2
     ],
     {
-        "Auth tests",
+        "Access tests",
         {
             setup,
             fun() -> test_util:start_couch([chttpd]) end, fun 
test_util:stop_couch/1,
@@ -69,10 +83,90 @@ make_test_cases(Mod, Funs) ->
         {foreachx, fun setup/1, fun teardown/2, [{Mod, Fun} || Fun <- Funs]}
     }.
 
+% Doc creation
 should_let_admin_create_doc_with_access(_PortType, {AdminUrl, XUrl, YUrl}) ->
     {ok, Code, _, _} = test_request:put(AdminUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
     ?_assertEqual(201, Code).
 
+should_let_user_create_doc_for_themselves(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    {ok, Code, _, _} = test_request:put(XUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    ?_assertEqual(201, Code).
+
+should_not_let_user_create_doc_for_someone_else(_PortType, {AdminUrl, XUrl, 
YUrl}) ->
+    {ok, Code, _, _} = test_request:put(YUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    ?_assertEqual(401, Code).
+
+% Doc reads
+should_let_admin_read_doc_with_access(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    {ok, 201, _, _} = test_request:put(XUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, Code, _, _} = test_request:get(AdminUrl ++ "/db/a"),
+    ?_assertEqual(200, Code).
+
+user_with_access_can_read_doc(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, Code, _, _} = test_request:get(XUrl ++ "/db/a"),
+    ?_assertEqual(200, Code).
+
+user_without_access_can_not_read_doc(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, Code, _, _} = test_request:get(YUrl ++ "/db/a"),
+    ?_assertEqual(401, Code).
+
+% Doc deletes
+should_let_admin_delete_doc_with_access(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    {ok, 201, _, _} = test_request:put(XUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, Code, _, _} = test_request:delete(AdminUrl ++ 
"/db/a?rev=1-967a00dff5e02add41819138abb3284d"),
+    ?_assertEqual(200, Code).
+
+should_let_user_delete_doc_for_themselves(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    {ok, 201, _, _} = test_request:put(XUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, Code, _, _} = test_request:delete(XUrl ++ 
"/db/a?rev=1-967a00dff5e02add41819138abb3284d"),
+    ?_assertEqual(200, Code).
+
+should_not_let_user_delete_doc_for_someone_else(_PortType, {AdminUrl, XUrl, 
YUrl}) ->
+    {ok, 201, _, _} = test_request:put(XUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, Code, _, _} = test_request:delete(YUrl ++ 
"/db/a?rev=1-967a00dff5e02add41819138abb3284d"),
+    ?_assertEqual(401, Code).
+
+% _all_docs with include_docs
+should_let_admin_fetch_all_docs(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    Admin_Fetch_Docs_Body = 
<<"{\"total_rows\":4,\"offset\":0,\"rows\":[\r\n{\"id\":\"a\",\"key\":\"a\",\"value\":{\"rev\":\"1-967a00dff5e02add41819138abb3284d\"},\"doc\":{\"_id\":\"a\",\"_rev\":\"1-967a00dff5e02add41819138abb3284d\",\"_access\":{}}},\r\n{\"id\":\"b\",\"key\":\"b\",\"value\":{\"rev\":\"1-967a00dff5e02add41819138abb3284d\"},\"doc\":{\"_id\":\"b\",\"_rev\":\"1-967a00dff5e02add41819138abb3284d\",\"_access\":{}}},\r\n{\"id\":\"c\",\"key\":\"c\",\"value\":{\"rev\":\"1-967a00d
 [...]
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/b", 
"{\"b\":2,\"_access\":[\"x\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/c", 
"{\"c\":3,\"_access\":[\"y\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/d", 
"{\"d\":4,\"_access\":[\"y\"]}"),
+    {ok, 200, _, Body} = test_request:get(AdminUrl ++ 
"/db/_all_docs?include_docs=true"),
+    ?_assertEqual(Admin_Fetch_Docs_Body, Body).
+
+should_let_user_fetch_their_own_all_docs(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    Admin_Fetch_Docs_Body = 
<<"{\"total_rows\":2,\"offset\":0,\"rows\":[\r\n{\"id\":\"a\",\"key\":\"a\",\"value\":{\"rev\":\"1-967a00dff5e02add41819138abb3284d\"},\"doc\":{\"_id\":\"a\",\"_rev\":\"1-967a00dff5e02add41819138abb3284d\",\"_access\":{}}},\r\n{\"id\":\"b\",\"key\":\"b\",\"value\":{\"rev\":\"1-967a00dff5e02add41819138abb3284d\"},\"doc\":{\"_id\":\"b\",\"_rev\":\"1-967a00dff5e02add41819138abb3284d\",\"_access\":{}}}]}\n">>,
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, 201, _, _} = test_request:put(XUrl ++ "/db/b", 
"{\"b\":2,\"_access\":[\"x\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/c", 
"{\"c\":3,\"_access\":[\"y\"]}"),
+    {ok, 201, _, _} = test_request:put(YUrl ++ "/db/d", 
"{\"d\":4,\"_access\":[\"y\"]}"),
+    {ok, 200, _, Body} = test_request:get(XUrl ++ 
"/db/_all_docs?include_docs=true"),
+    ?_assertEqual(Admin_Fetch_Docs_Body, Body).
+% _changes
+should_let_admin_fetch_changes(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/b", 
"{\"b\":2,\"_access\":[\"x\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/c", 
"{\"c\":3,\"_access\":[\"y\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/d", 
"{\"d\":4,\"_access\":[\"y\"]}"),
+    {ok, 200, _, Body} = test_request:get(AdminUrl ++ "/db/_changes"),
+    {Json} = jiffy:decode(Body),
+    AmountOfDocs = length(proplists:get_value(<<"results">>, Json)),
+    ?_assertEqual(4, AmountOfDocs).
+
+should_let_user_fetch_their_own_changes(_PortType, {AdminUrl, XUrl, YUrl}) ->
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/a", 
"{\"a\":1,\"_access\":[\"x\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/b", 
"{\"b\":2,\"_access\":[\"x\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/c", 
"{\"c\":3,\"_access\":[\"y\"]}"),
+    {ok, 201, _, _} = test_request:put(AdminUrl ++ "/db/d", 
"{\"d\":4,\"_access\":[\"y\"]}"),
+    {ok, 200, _, Body} = test_request:get(XUrl ++ "/db/_changes"),
+    {Json} = jiffy:decode(Body),
+    AmountOfDocs = length(proplists:get_value(<<"results">>, Json)),
+    ?_assertEqual(2, AmountOfDocs).
+
 %% ------------------------------------------------------------------
 %% Internal Function Definitions
 %% ------------------------------------------------------------------

Reply via email to