Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

merge release 490 into develop #5307

Merged
merged 2 commits into from
Feb 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,19 @@

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.inject.Inject;
import org.sagebionetworks.repo.model.AccessRequirement;
import org.sagebionetworks.repo.model.RestrictableObjectDescriptor;
import org.sagebionetworks.repo.model.RestrictableObjectType;
import org.sagebionetworks.web.client.SynapseJavascriptClient;
import org.sagebionetworks.web.client.place.AccessRequirementPlace;
import org.sagebionetworks.web.client.place.AccessRequirementsPlace;
import org.sagebionetworks.web.client.view.DivView;
import org.sagebionetworks.web.client.view.PlaceView;
import org.sagebionetworks.web.client.widget.accessrequirements.AccessRequirementWidget;
import org.sagebionetworks.web.client.widget.entity.controller.SynapseAlert;

public class AccessRequirementPresenter
extends AbstractActivity
Expand All @@ -20,15 +24,21 @@ public class AccessRequirementPresenter
private PlaceView view;
private AccessRequirementWidget arWidget;
private String requirementId;
private SynapseJavascriptClient jsClient;
private SynapseAlert synAlert;

@Inject
public AccessRequirementPresenter(
PlaceView view,
AccessRequirementWidget arWidget,
DivView arDiv
DivView arDiv,
SynapseJavascriptClient jsClient,
SynapseAlert synAlert
) {
this.view = view;
this.arWidget = arWidget;
this.jsClient = jsClient;
this.synAlert = synAlert;
arDiv.addStyleName("markdown");
arDiv.add(arWidget.asWidget());
view.add(arDiv.asWidget());
Expand All @@ -44,23 +54,42 @@ public void start(AcceptsOneWidget panel, EventBus eventBus) {
public void setPlace(AccessRequirementPlace place) {
this.place = place;
view.initHeaderAndFooter();
synAlert.clear();
requirementId = place.getParam(AccessRequirementPlace.AR_ID_PARAM);
String id = place.getParam(AccessRequirementsPlace.ID_PARAM);
String typeString = place.getParam(AccessRequirementsPlace.TYPE_PARAM);

// Note: configuring the Access Requirement widget without a target subject will result in notifications sent to the user will not have the context (Project/Folder/File associated with the restriction).
RestrictableObjectDescriptor targetSubject = null;

if (id != null && typeString != null) {
targetSubject = new RestrictableObjectDescriptor();
RestrictableObjectDescriptor targetSubject =
new RestrictableObjectDescriptor();
RestrictableObjectType type = RestrictableObjectType.valueOf(
typeString.toUpperCase()
);
targetSubject.setType(type);
targetSubject.setId(id);
}

arWidget.configure(requirementId, targetSubject);
arWidget.configure(requirementId, targetSubject);
} else {
// SWC-6700: No subject specified, pick a random one since some code assumes a subject has been specified.
jsClient.getAccessRequirement(
requirementId,
new AsyncCallback<AccessRequirement>() {
@Override
public void onSuccess(AccessRequirement result) {
RestrictableObjectDescriptor firstSubject = result
.getSubjectIds()
.get(0);
arWidget.configure(requirementId, firstSubject);
}

@Override
public void onFailure(Throwable caught) {
synAlert.handleException(caught);
}
}
);
}
}

public AccessRequirementPlace getPlace() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package org.sagebionetworks.web.unitclient.presenter;

import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.sagebionetworks.repo.model.AccessRequirement;
import org.sagebionetworks.repo.model.RestrictableObjectDescriptor;
import org.sagebionetworks.repo.model.RestrictableObjectType;
import org.sagebionetworks.web.client.SynapseJavascriptClient;
import org.sagebionetworks.web.client.place.AccessRequirementPlace;
import org.sagebionetworks.web.client.place.AccessRequirementsPlace;
import org.sagebionetworks.web.client.presenter.AccessRequirementPresenter;
import org.sagebionetworks.web.client.view.DivView;
import org.sagebionetworks.web.client.view.PlaceView;
import org.sagebionetworks.web.client.widget.accessrequirements.AccessRequirementWidget;
import org.sagebionetworks.web.client.widget.entity.controller.SynapseAlert;
import org.sagebionetworks.web.test.helper.AsyncMockStubber;

@RunWith(MockitoJUnitRunner.class)
public class AccessRequirementPresenterTest {

AccessRequirementPresenter presenter;

@Mock
PlaceView mockView;

@Mock
AccessRequirementWidget mockArWidget;

@Mock
DivView mockArDiv;

@Mock
SynapseJavascriptClient mockJsClient;

@Mock
SynapseAlert mockSynAlert;

@Mock
AccessRequirementPlace mockPlace;

@Mock
AccessRequirement mockAR;

@Captor
ArgumentCaptor<RestrictableObjectDescriptor> subjectCaptor;

Exception caught = new Exception("this is an exception");

public static final String AR_ID = "1111112";
public static final String ENTITY_ID = "syn239834";

@Mock
RestrictableObjectDescriptor mockSubject;

@Before
public void setup() {
presenter =
new AccessRequirementPresenter(
mockView,
mockArWidget,
mockArDiv,
mockJsClient,
mockSynAlert
);
when(mockPlace.getParam(AccessRequirementPlace.AR_ID_PARAM))
.thenReturn(AR_ID);
when(mockAR.getSubjectIds())
.thenReturn(Collections.singletonList(mockSubject));
AsyncMockStubber
.callSuccessWith(mockAR)
.when(mockJsClient)
.getAccessRequirement(anyString(), any(AsyncCallback.class));
}

@Test
public void testConstruction() {
verify(mockArDiv).add(any(Widget.class));
verify(mockView).add(any(Widget.class));
}

@Test
public void testParamsProvided() {
when(mockPlace.getParam(AccessRequirementsPlace.ID_PARAM))
.thenReturn(ENTITY_ID);
when(mockPlace.getParam(AccessRequirementsPlace.TYPE_PARAM))
.thenReturn(RestrictableObjectType.ENTITY.toString());

presenter.setPlace(mockPlace);

verify(mockArWidget).configure(eq(AR_ID), subjectCaptor.capture());
RestrictableObjectDescriptor subject = subjectCaptor.getValue();
assertEquals(ENTITY_ID, subject.getId());
assertEquals(RestrictableObjectType.ENTITY, subject.getType());
}

@Test
public void testGetAR() {
presenter.setPlace(mockPlace);

verify(mockArWidget).configure(AR_ID, mockSubject);
}

@Test
public void testGetARFailure() {
AsyncMockStubber
.callFailureWith(caught)
.when(mockJsClient)
.getAccessRequirement(anyString(), any(AsyncCallback.class));
presenter.setPlace(mockPlace);
verify(mockSynAlert).clear();
verify(mockSynAlert).handleException(caught);
}
}
Loading