From 431873eb615494f5aa9cfe1d6545ad09b38c5399 Mon Sep 17 00:00:00 2001 From: Edwin Kempin Date: Wed, 20 Mar 2013 15:17:54 +0100 Subject: [PATCH] Support to retrieve an account via REST Change-Id: I498c9b236070621654577165d2460cd543af6fbc Signed-off-by: Edwin Kempin --- Documentation/rest-api-accounts.txt | 27 ++++++ .../rest/account/AccountAssert.java | 29 ++++++ .../rest/{group => account}/AccountInfo.java | 2 +- .../acceptance/rest/account/GetAccountIT.java | 88 +++++++++++++++++++ .../rest/group/AddRemoveGroupMembersIT.java | 8 +- .../rest/group/ListGroupMembersIT.java | 1 + .../gerrit/server/account/GetAccount.java | 24 +++++ .../google/gerrit/server/account/Module.java | 1 + 8 files changed, 173 insertions(+), 7 deletions(-) create mode 100644 gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java rename gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/{group => account}/AccountInfo.java (93%) create mode 100644 gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java create mode 100644 gerrit-server/src/main/java/com/google/gerrit/server/account/GetAccount.java diff --git a/Documentation/rest-api-accounts.txt b/Documentation/rest-api-accounts.txt index 277c1d92bc..9324e4601c 100644 --- a/Documentation/rest-api-accounts.txt +++ b/Documentation/rest-api-accounts.txt @@ -8,6 +8,33 @@ link:rest-api.html[REST API]. Endpoints --------- +[[get-account]] +Get Account +~~~~~~~~~~~ +[verse] +'GET /accounts/link:#account-id[\{account-id\}]' + +Returns an account as an link:#account-info[AccountInfo] entity. + +.Request +---- + GET /accounts/self HTTP/1.0 +---- + +.Response +---- + HTTP/1.1 200 OK + Content-Disposition: attachment + Content-Type: application/json;charset=UTF-8 + + )]}' + { + "_account_id": 1000096, + "name": "John Doe", + "email": "john.doe@example.com" + } +---- + [[list-account-capabilities]] List Account Capabilities ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java new file mode 100644 index 0000000000..fb2666968d --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java @@ -0,0 +1,29 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// 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. + +package com.google.gerrit.acceptance.rest.account; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import com.google.gerrit.acceptance.TestAccount; + +public class AccountAssert { + + public static void assertAccountInfo(TestAccount a, AccountInfo ai) { + assertTrue(a.id.get() == ai._account_id); + assertEquals(a.fullName, ai.name); + assertEquals(a.email, ai.email); + } +} diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AccountInfo.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountInfo.java similarity index 93% rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AccountInfo.java rename to gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountInfo.java index 0e77af6af4..cf88bc687c 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AccountInfo.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountInfo.java @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.group; +package com.google.gerrit.acceptance.rest.account; public class AccountInfo { public Integer _account_id; diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java new file mode 100644 index 0000000000..8d75487022 --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java @@ -0,0 +1,88 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// 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. + +package com.google.gerrit.acceptance.rest.account; + +import static com.google.gerrit.acceptance.rest.account.AccountAssert.assertAccountInfo; +import static org.junit.Assert.assertEquals; + +import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.AccountCreator; +import com.google.gerrit.acceptance.RestResponse; +import com.google.gerrit.acceptance.RestSession; +import com.google.gerrit.acceptance.TestAccount; +import com.google.gerrit.extensions.restapi.Url; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.google.inject.Inject; + +import org.apache.http.HttpStatus; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +public class GetAccountIT extends AbstractDaemonTest { + + @Inject + private AccountCreator accounts; + + private TestAccount admin; + private RestSession session; + + @Before + public void setUp() throws Exception { + admin = accounts.create("admin", "admin@example.com", "Administrator", + "Administrators"); + session = new RestSession(admin); + } + + @Test + public void getNonExistingAccount_NotFound() throws IOException { + assertEquals(HttpStatus.SC_NOT_FOUND, session.get("/accounts/non-existing") + .getStatusCode()); + } + + @Test + public void getAccount() throws IOException { + // by formatted string + testGetAccount("/accounts/" + + Url.encode(admin.fullName + " <" + admin.email + ">"), admin); + + // by email + testGetAccount("/accounts/" + admin.email, admin); + + // by full name + testGetAccount("/accounts/" + admin.fullName, admin); + + // by account ID + testGetAccount("/accounts/" + admin.id.get(), admin); + + // by user name + testGetAccount("/accounts/" + admin.username, admin); + + // by 'self' + testGetAccount("/accounts/self", admin); + } + + private void testGetAccount(String url, TestAccount expectedAccount) + throws IOException { + RestResponse r = session.get(url); + assertEquals(HttpStatus.SC_OK, r.getStatusCode()); + AccountInfo account = + (new Gson()).fromJson(r.getReader(), + new TypeToken() {}.getType()); + assertAccountInfo(expectedAccount, account); + } +} diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddRemoveGroupMembersIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddRemoveGroupMembersIT.java index f788f7061e..a254f15444 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddRemoveGroupMembersIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddRemoveGroupMembersIT.java @@ -14,6 +14,7 @@ package com.google.gerrit.acceptance.rest.group; +import static com.google.gerrit.acceptance.rest.account.AccountAssert.assertAccountInfo; import static com.google.gerrit.acceptance.rest.group.GroupAssert.assertGroupInfo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -28,6 +29,7 @@ import com.google.gerrit.acceptance.AccountCreator; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.acceptance.RestSession; import com.google.gerrit.acceptance.TestAccount; +import com.google.gerrit.acceptance.rest.account.AccountInfo; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.AccountGroupIncludeByUuid; @@ -188,12 +190,6 @@ public class AddRemoveGroupMembersIT extends AbstractDaemonTest { session.put("/groups/" + name, in).consume(); } - private void assertAccountInfo(TestAccount a, AccountInfo ai) { - assertTrue(a.id.get() == ai._account_id); - assertEquals(a.fullName, ai.name); - assertEquals(a.email, ai.email); - } - private void assertMembers(String group, TestAccount... members) throws OrmException { AccountGroup g = groupCache.get(new AccountGroup.NameKey(group)); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/ListGroupMembersIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/ListGroupMembersIT.java index 26ecf6a1e3..a5aa3dd30e 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/ListGroupMembersIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/ListGroupMembersIT.java @@ -24,6 +24,7 @@ import com.google.gerrit.acceptance.AccountCreator; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.acceptance.RestSession; import com.google.gerrit.acceptance.TestAccount; +import com.google.gerrit.acceptance.rest.account.AccountInfo; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.google.inject.Inject; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAccount.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAccount.java new file mode 100644 index 0000000000..b022420e33 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAccount.java @@ -0,0 +1,24 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// 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. + +package com.google.gerrit.server.account; + +import com.google.gerrit.extensions.restapi.RestReadView; + +public class GetAccount implements RestReadView { + @Override + public AccountInfo apply(AccountResource rsrc) { + return AccountInfo.parse(rsrc.getUser().getAccount(), true); + } +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java index 9901dfdbd8..ac045f75e9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java @@ -29,6 +29,7 @@ public class Module extends RestApiModule { DynamicMap.mapOf(binder(), ACCOUNT_KIND); DynamicMap.mapOf(binder(), CAPABILITY_KIND); + get(ACCOUNT_KIND).to(GetAccount.class); get(ACCOUNT_KIND, "avatar").to(GetAvatar.class); child(ACCOUNT_KIND, "capabilities").to(Capabilities.class); get(ACCOUNT_KIND, "groups").to(GetGroups.class);