Skip to content

Commit 2147eda

Browse files
Merge branch 'develop' into 360-modify-notvalid-deaccession-reason
2 parents 8373dd5 + 5c73026 commit 2147eda

File tree

5 files changed

+73
-4
lines changed

5 files changed

+73
-4
lines changed

src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,8 @@ protected <T> T execCommand( Command<T> cmd ) throws WrappedResponse {
892892
throw new WrappedResponse(ex, badRequest(ex.getMessage(), ex.getFieldErrors()));
893893
} catch (InvalidCommandArgumentsException ex) {
894894
throw new WrappedResponse(ex, error(Status.BAD_REQUEST, ex.getMessage()));
895+
} catch (ConflictException ex) {
896+
throw new WrappedResponse(ex, conflict(ex.getMessage()));
895897
} catch (CommandException ex) {
896898
Logger.getLogger(AbstractApiBean.class.getName()).log(Level.SEVERE, "Error while executing command " + cmd, ex);
897899
throw new WrappedResponse(ex, error(Status.INTERNAL_SERVER_ERROR, ex.getMessage()));
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package edu.harvard.iq.dataverse.engine.command.exception;
2+
3+
import edu.harvard.iq.dataverse.engine.command.Command;
4+
5+
/**
6+
* An exception raised when a command cannot be executed because it clashes with the current state, e.g. when trying to
7+
* create a resource that already exists.
8+
*/
9+
public class ConflictException extends CommandException {
10+
11+
public ConflictException(String message, Command aCommand) {
12+
super(message, aCommand);
13+
}
14+
}

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AssignRoleCommand.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import edu.harvard.iq.dataverse.engine.command.CommandContext;
1717
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
1818
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
19+
import edu.harvard.iq.dataverse.engine.command.exception.ConflictException;
1920
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
2021
import edu.harvard.iq.dataverse.util.BundleUtil;
2122

@@ -73,7 +74,7 @@ public RoleAssignment execute(CommandContext ctxt) throws CommandException {
7374
}
7475
}
7576
if(isExistingRole(ctxt)){
76-
throw new IllegalCommandException(BundleUtil.getStringFromBundle("datasets.api.grant.role.assignee.has.role.error"), this);
77+
throw new ConflictException(BundleUtil.getStringFromBundle("datasets.api.grant.role.assignee.has.role.error"), this);
7778
}
7879
// TODO make sure the role is defined on the dataverse.
7980
RoleAssignment roleAssignment = new RoleAssignment(role, grantee, defPoint, privateUrlToken, anonymizedAccess);

src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,4 +2867,46 @@ public void testDataverseMetadataLanguage() {
28672867
singleLang.then().assertThat().body("data", equalTo(List.of(Map.of("locale", "en", "title", "English"))));
28682868
}
28692869

2870+
@Test
2871+
public void testAssignRoleOnDataverse() {
2872+
// Create user
2873+
Response createUser = UtilIT.createRandomUser();
2874+
createUser.prettyPrint();
2875+
String username = UtilIT.getUsernameFromResponse(createUser);
2876+
String apiToken = UtilIT.getApiTokenFromResponse(createUser);
2877+
2878+
// Create collection as that user
2879+
Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken);
2880+
createDataverseResponse.prettyPrint();
2881+
String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse);
2882+
2883+
// Create second user
2884+
Response createSecondUserResponse = UtilIT.createRandomUser();
2885+
String secondUsername = UtilIT.getUsernameFromResponse(createSecondUserResponse);
2886+
String secondApiToken = UtilIT.getApiTokenFromResponse(createSecondUserResponse);
2887+
2888+
// Let the first user assign a role on their collection to the second user
2889+
Response grantRoleResponse = UtilIT.grantRoleOnDataverse(dataverseAlias, DataverseRole.DS_CONTRIBUTOR, "@" + secondUsername, apiToken);
2890+
grantRoleResponse.prettyPrint();
2891+
grantRoleResponse.then().assertThat().statusCode(OK.getStatusCode());
2892+
2893+
// Let the first user assign the same role to the same user again -> 409 Conflict
2894+
Response grantRoleTwiceResponse = UtilIT.grantRoleOnDataverse(dataverseAlias, DataverseRole.DS_CONTRIBUTOR, "@" + secondUsername, apiToken);
2895+
grantRoleTwiceResponse.prettyPrint();
2896+
grantRoleTwiceResponse.then().assertThat().statusCode(CONFLICT.getStatusCode());
2897+
2898+
// Clean up
2899+
Response deleteDataverse = UtilIT.deleteDataverse(dataverseAlias, apiToken);
2900+
deleteDataverse.prettyPrint();
2901+
deleteDataverse.then().assertThat().statusCode(OK.getStatusCode());
2902+
2903+
Response deleteUserResponse = UtilIT.deleteUser(username);
2904+
deleteUserResponse.prettyPrint();
2905+
assertEquals(200, deleteUserResponse.getStatusCode());
2906+
2907+
Response deleteSecondUserResponse = UtilIT.deleteUser(secondUsername);
2908+
deleteSecondUserResponse.prettyPrint();
2909+
assertEquals(200, deleteSecondUserResponse.getStatusCode());
2910+
}
2911+
28702912
}

src/test/java/edu/harvard/iq/dataverse/util/cache/CacheFactoryBeanTest.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ public void init() throws IOException {
109109
RateLimitUtil.rateLimitMap.clear();
110110
RateLimitUtil.rateLimits.clear();
111111
}
112-
112+
// Reset cache for each test
113+
cache.rateLimitCache.clear();
114+
113115
// Reset to default auth user
114116
authUser.setRateLimitTier(1);
115117
authUser.setSuperuser(false);
@@ -163,15 +165,23 @@ public void testAuthenticatedUserGettingRateLimited() throws InterruptedExceptio
163165
authUser.setRateLimitTier(2); // 120 cals per hour - 1 added token every 30 seconds
164166
boolean rateLimited = false;
165167
int cnt;
168+
long startTime = System.currentTimeMillis();
166169
for (cnt = 0; cnt <200; cnt++) {
167170
rateLimited = !cache.checkRate(authUser, action);
168171
if (rateLimited) {
169172
break;
170173
}
171174
}
172-
assertTrue(rateLimited);
173-
assertEquals(120, cnt);
175+
long endTime = System.currentTimeMillis();
176+
System.out.println("Test loop took " + (endTime - startTime) + " ms");
177+
//Add a few seconds to account for time outside loop
178+
long durationMinutes = (6000 + endTime - startTime) / 60000L;
179+
// 120 calls/hr = 2 calls/min. Add any tokens that may have been added during the test run
180+
long expectedMax = 120 + (durationMinutes * 2);
174181

182+
assertTrue(rateLimited);
183+
assertTrue(cnt >= 120 && cnt <= expectedMax, "cnt was " + cnt + ", expected between 120 and " + expectedMax);
184+
175185
for (cnt = 0; cnt <60; cnt++) {
176186
Thread.sleep(1000);// Wait for bucket to be replenished (check each second for 1 minute max)
177187
rateLimited = !cache.checkRate(authUser, action);

0 commit comments

Comments
 (0)