Skip to content

Commit f733d0c

Browse files
author
Radek Mensik
committed
1078 List projects for a user
1 parent 835790c commit f733d0c

5 files changed

Lines changed: 152 additions & 1 deletion

File tree

gooddata-java/src/main/java/com/gooddata/sdk/service/project/ProjectService.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.gooddata.sdk.common.GoodDataException;
99
import com.gooddata.sdk.common.GoodDataRestException;
10+
import com.gooddata.sdk.common.collections.CustomPageRequest;
1011
import com.gooddata.sdk.common.collections.Page;
1112
import com.gooddata.sdk.common.collections.PageBrowser;
1213
import com.gooddata.sdk.common.collections.PageRequest;
@@ -124,6 +125,30 @@ public PageBrowser<Project> listProjects(final PageRequest startPage) {
124125
return new PageBrowser<>(startPage, page -> listProjects(getProjectsUri(userId, page)));
125126
}
126127

128+
/**
129+
* Get defined page of paged list of projects that given user/account has access to.
130+
*
131+
* @param account user whose projects will be returned
132+
* @param startPage page to be retrieved
133+
* @return {@link PageBrowser} list of found projects for given user or empty list
134+
*/
135+
public PageBrowser<Project> listProjects(final Account account, final PageRequest startPage) {
136+
notNull(startPage, "startPage");
137+
notNull(account, "account");
138+
notEmpty(account.getId(), "account.uri");
139+
return new PageBrowser<>(startPage, page -> listProjects(getProjectsUri(account.getId(), page)));
140+
}
141+
142+
/**
143+
* Get browser of projects that given user/account has access to.
144+
*
145+
* @param account user whose projects will be returned
146+
* @return {@link PageBrowser} list of found projects for given user or empty list
147+
*/
148+
public PageBrowser<Project> listProjects(final Account account) {
149+
return listProjects(account, new CustomPageRequest());
150+
}
151+
127152
private Page<Project> listProjects(final URI uri) {
128153
try {
129154
final Projects projects = restTemplate.getForObject(uri, Projects.class);

gooddata-java/src/test/java/com/gooddata/sdk/service/project/ProjectServiceAT.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131

3232
import static com.gooddata.sdk.model.project.ProjectEnvironment.TESTING;
3333
import static org.hamcrest.MatcherAssert.assertThat;
34+
import static org.hamcrest.Matchers.contains;
35+
import static org.hamcrest.Matchers.containsInAnyOrder;
3436
import static org.hamcrest.Matchers.empty;
3537
import static org.hamcrest.Matchers.hasSize;
3638
import static org.hamcrest.Matchers.is;
@@ -145,6 +147,26 @@ public void addUsersToProject() {
145147
}
146148

147149
@Test(groups = {"project", "isolated_domain"}, dependsOnMethods = "addUsersToProject")
150+
public void listProjectsForUser() {
151+
final ProjectService projectService = gd.getProjectService();
152+
153+
final PageBrowser<Project> projects = projectService.listProjects(account1);
154+
155+
assertThat(projects, is(notNullValue()));
156+
assertThat(projects.getPageItems().get(0).getTitle(), is(title));
157+
}
158+
159+
@Test(groups = {"project", "isolated_domain"}, dependsOnMethods = "addUsersToProject")
160+
public void listProjectsForUserSettingStartPage() {
161+
final ProjectService projectService = gd.getProjectService();
162+
163+
final PageBrowser<Project> projects = projectService.listProjects(account1, new CustomPageRequest(10, 1));
164+
165+
assertThat(projects, is(notNullValue()));
166+
assertThat(projects.getPageItems().isEmpty(), is(true));
167+
}
168+
169+
@Test(groups = {"project", "isolated_domain"}, dependsOnMethods = {"listProjectsForUser", "listProjectsForUserSettingStartPage"})
148170
public void disableUserInProject() {
149171
user.setStatus(DISABLED_STATUS);
150172

gooddata-java/src/test/java/com/gooddata/sdk/service/project/ProjectServiceIT.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.gooddata.sdk.common.GoodDataException;
99
import com.gooddata.sdk.common.collections.CustomPageRequest;
10+
import com.gooddata.sdk.common.collections.PageBrowser;
1011
import com.gooddata.sdk.model.account.Account;
1112
import com.gooddata.sdk.model.gdc.AsyncTask;
1213
import com.gooddata.sdk.model.gdc.TaskStatus;
@@ -21,6 +22,8 @@
2122
import com.gooddata.sdk.model.project.Role;
2223
import com.gooddata.sdk.model.project.User;
2324
import com.gooddata.sdk.service.AbstractGoodDataIT;
25+
26+
import org.hamcrest.core.Is;
2427
import org.testng.annotations.BeforeClass;
2528
import org.testng.annotations.Test;
2629

@@ -451,4 +454,23 @@ public void removeUserFromProjectNotFound() {
451454

452455
gd.getProjectService().removeUserFromProject(enabled, account);
453456
}
457+
458+
459+
@Test
460+
public void shouldListProjectsForUser() {
461+
onRequest()
462+
.havingMethodEqualTo("GET")
463+
.havingPathEqualTo(ProjectService.LIST_PROJECTS_TEMPLATE.expand("ID").toString())
464+
.havingQueryStringEqualTo("offset=0&limit=100")
465+
.respond()
466+
.withStatus(200)
467+
.withBody(readFromResource("/project/projects-for-user.json"));
468+
469+
470+
final PageBrowser<Project> projects = gd.getProjectService().listProjects(
471+
account,
472+
new CustomPageRequest(0, 100));
473+
assertThat(projects.getPageItems().isEmpty(), is(false));
474+
assertThat(projects.getPageItems().get(0).getTitle(), Is.is("defaultEmptyProject"));
475+
}
454476
}

gooddata-java/src/test/java/com/gooddata/sdk/service/project/ProjectServiceTest.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public class ProjectServiceTest {
6565

6666
@BeforeMethod
6767
public void setUp() throws Exception {
68-
MockitoAnnotations.openMocks(this).close();;
68+
MockitoAnnotations.openMocks(this).close();
6969
service = new ProjectService(restTemplate, accountService, new GoodDataSettings());
7070
when(accountService.getCurrent()).thenReturn(account);
7171
when(account.getId()).thenReturn(ACCOUNT_ID);
@@ -119,6 +119,33 @@ public void testListProjectsWithClientException() throws Exception {
119119
service.listProjects();
120120
}
121121

122+
@Test
123+
public void testListProjectsForUserWithPage() throws Exception {
124+
doReturn(new Projects(singletonList(project), new Paging(""))).when(restTemplate)
125+
.getForObject(new URI(LIST_PROJECTS_TEMPLATE.expand(ACCOUNT_ID) + "?offset=1&limit=100"), Projects.class);
126+
final Collection<Project> result = service.listProjects(account, new CustomPageRequest(1, 100)).getPageItems();
127+
128+
assertThat(result, hasSize(1));
129+
assertThat(result, hasItem(project));
130+
}
131+
132+
@Test
133+
public void testListProjectsForUser() throws Exception {
134+
doReturn(new Projects(singletonList(project), new Paging(""))).when(restTemplate)
135+
.getForObject(new URI(LIST_PROJECTS_TEMPLATE.expand(ACCOUNT_ID) + "?limit=100"), Projects.class);
136+
final Collection<Project> result = service.listProjects(account).getPageItems();
137+
138+
assertThat(result, hasSize(1));
139+
assertThat(result, hasItem(project));
140+
}
141+
142+
@Test(expectedExceptions = GoodDataException.class)
143+
public void testListProjectsForuserWithClientException() throws Exception {
144+
doThrow(new GoodDataException("")).when(restTemplate)
145+
.getForObject(new URI(LIST_PROJECTS_TEMPLATE.expand(ACCOUNT_ID) + "?limit=100"), Projects.class);
146+
service.listProjects();
147+
}
148+
122149
@Test(expectedExceptions = IllegalArgumentException.class)
123150
public void testGetProjectByUriWithNullUri() {
124151
service.getProjectByUri(null);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"projects": {
3+
"paging": {
4+
"offset": 0,
5+
"limit": 100,
6+
"count": 1,
7+
"totalCount": 1
8+
},
9+
"items": [
10+
{
11+
"project": {
12+
"content": {
13+
"state": "ENABLED",
14+
"cluster": "",
15+
"environment": "TESTING",
16+
"driver": "Pg",
17+
"isPublic": "0",
18+
"guidedNavigation": "1"
19+
},
20+
"meta": {
21+
"title": "defaultEmptyProject",
22+
"summary": "",
23+
"created": "2018-08-10 23:00:21",
24+
"updated": "2018-08-10 23:00:22",
25+
"author": "/gdc/account/profile/ID",
26+
"contributor": "/gdc/account/profile/ID"
27+
},
28+
"links": {
29+
"self": "/gdc/projects/defaultEmptyProject",
30+
"roles": "/gdc/projects/defaultEmptyProject/roles",
31+
"users": "/gdc/projects/defaultEmptyProject/users?link=1&offset=0&limit=100",
32+
"userRoles": "/gdc/projects/defaultEmptyProject/users/ID/roles",
33+
"userPermissions": "/gdc/projects/defaultEmptyProject/users/ID/permissions",
34+
"invitations": "/gdc/projects/defaultEmptyProject/invitations",
35+
"ldm": "/gdc/projects/defaultEmptyProject/ldm",
36+
"ldm_thumbnail": "/gdc/projects/defaultEmptyProject/ldm?thumbnail=1",
37+
"publicartifacts": "/gdc/projects/defaultEmptyProject/publicartifacts",
38+
"uploads": "/gdc/projects/defaultEmptyProject/uploads/",
39+
"metadata": "/gdc/md/defaultEmptyProject",
40+
"templates": "/gdc/md/defaultEmptyProject/templates",
41+
"connectors": "/gdc/projects/defaultEmptyProject/connectors",
42+
"schedules": "/gdc/projects/defaultEmptyProject/schedules",
43+
"dataload": "/gdc/projects/defaultEmptyProject/dataload",
44+
"eventstores": "/gdc/projects/defaultEmptyProject/dataload/eventstore/stores",
45+
"execute": "/gdc/projects/defaultEmptyProject/execute",
46+
"clearCaches": "/gdc/projects/defaultEmptyProject/clearCaches",
47+
"checkXaeCompatibility": "/gdc/projects/defaultEmptyProject/checkXaeCompatibility",
48+
"projectFeatureFlags": "/gdc/projects/defaultEmptyProject/projectFeatureFlags",
49+
"config": "/gdc/projects/defaultEmptyProject/config"
50+
}
51+
}
52+
}
53+
]
54+
}
55+
}

0 commit comments

Comments
 (0)