Skip to content

Commit

Permalink
MODROLESKC-262: filter replacing override permissions
Browse files Browse the repository at this point in the history
  • Loading branch information
yauhen-vavilkin committed Jan 24, 2025
1 parent 3ee3e73 commit 01251ce
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public Optional<CapabilityReplacements> deduceReplacements(CapabilityEvent newVa
permission -> getPermissionReplacementsAsCapabilities(permission).map(replacesValue -> entry(replacesValue,
permissionNameToCapabilityName(applyFolioPermissionOverrides(permission.getPermissionName())))))
.filter(entry -> entry.getValue().isPresent()).map(entry -> entry(entry.getKey(), entry.getValue().get()))
.filter(entry -> !entry.getKey().equals(entry.getValue()))
.collect(groupingBy(Entry::getKey, Collectors.mapping(Entry::getValue, Collectors.toSet())));

if (capabilityReplacements.isEmpty()) {
Expand Down
48 changes: 40 additions & 8 deletions src/test/java/org/folio/roles/it/KafkaMessageListenerIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import static org.folio.roles.domain.dto.CapabilityAction.CREATE;
import static org.folio.roles.domain.dto.CapabilityAction.DELETE;
import static org.folio.roles.domain.dto.CapabilityAction.EDIT;
import static org.folio.roles.domain.dto.CapabilityAction.EXECUTE;
import static org.folio.roles.domain.dto.CapabilityAction.MANAGE;
import static org.folio.roles.domain.dto.CapabilityAction.VIEW;
import static org.folio.roles.domain.dto.CapabilityType.DATA;
import static org.folio.roles.domain.dto.CapabilityType.PROCEDURAL;
import static org.folio.roles.support.CapabilitySetUtils.capabilitySets;
import static org.folio.roles.support.CapabilityUtils.APPLICATION_ID;
import static org.folio.roles.support.CapabilityUtils.APPLICATION_ID_V2;
Expand Down Expand Up @@ -52,6 +54,7 @@
import org.folio.roles.domain.dto.CapabilityAction;
import org.folio.roles.domain.dto.CapabilitySet;
import org.folio.roles.domain.dto.CapabilitySets;
import org.folio.roles.domain.dto.CapabilityType;
import org.folio.roles.domain.dto.Endpoint;
import org.folio.roles.integration.kafka.CapabilitySetDescriptorService;
import org.folio.roles.integration.kafka.model.ResourceEvent;
Expand All @@ -68,10 +71,11 @@
import org.junit.jupiter.params.provider.MethodSource;
import org.postgresql.util.PSQLException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.dao.InvalidDataAccessResourceUsageException;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.SqlMergeMode;
import org.testcontainers.shaded.org.awaitility.Awaitility;
import org.testcontainers.shaded.org.awaitility.core.ConditionFactory;

Expand All @@ -81,12 +85,13 @@
"classpath:/sql/truncate-permission-table.sql",
"classpath:/sql/truncate-capability-tables.sql",
})
@SqlMergeMode(SqlMergeMode.MergeMode.MERGE)
class KafkaMessageListenerIT extends BaseIntegrationTest {

@Autowired private KafkaTemplate<String, Object> kafkaTemplate;

@SpyBean private CapabilityService capabilityService;
@SpyBean private CapabilitySetDescriptorService capabilitySetDescriptorService;
@MockitoSpyBean private CapabilityService capabilityService;
@MockitoSpyBean private CapabilitySetDescriptorService capabilitySetDescriptorService;

@BeforeAll
static void beforeAll() {
Expand All @@ -100,24 +105,27 @@ static void afterAll() {

@Test
void handleCapabilityEvent_positive_freshInstallation() throws Exception {
await().untilAsserted(() -> doGet("/capabilities").andExpect(jsonPath("$.totalRecords", is(0))));
sendCapabilityEventAndCheckResult();
}

@Test
@Sql("classpath:/sql/kafka-message-listener-it/all-capabilities.sql")
void handleCapabilityEvent_positive_prePopulatedCapabilities() throws Exception {
await().untilAsserted(() -> doGet("/capabilities").andExpect(jsonPath("$.totalRecords", is(5))));
sendCapabilityEventAndCheckResult();
}

@Test
@Sql("classpath:/sql/kafka-message-listener-it/all-capabilities.sql")
void handleCapabilityEvent_positive_applicationVersionUpgradeEvent() throws Exception {
@Sql("classpath:/sql/kafka-message-listener-it/partial-capabilities.sql")
void handleCapabilityEvent_positive_partiallyPopulatedCapabilities() throws Exception {
await().untilAsserted(() -> doGet("/capabilities").andExpect(jsonPath("$.totalRecords", is(3))));
sendCapabilityEventAndCheckResult();
}

@Test
@Sql("classpath:/sql/kafka-message-listener-it/all-capabilities.sql")
void handleCapabilityEvent_positive_partiallyPopulatedCapabilities() throws Exception {
void handleCapabilityEvent_positive_applicationVersionUpgradeEvent() throws Exception {
var capabilityEvent = readValue("json/kafka-events/be-app-upgrade-capability-event.json", ResourceEvent.class);
kafkaTemplate.send(FOLIO_IT_CAPABILITIES_TOPIC, capabilityEvent);

Expand Down Expand Up @@ -173,6 +181,20 @@ void handleCapabilityEvent_positive_uiPermissions() throws Exception {
"ui-test_foo.create")));
}

@Test
void handleCapabilityEvent_positive_permissionReplacesSameOverridePermission() {
var capabilityEvent =
readValue("json/kafka-events/be-capability-event-replaced-perm-is-override.json", ResourceEvent.class);
kafkaTemplate.send(FOLIO_IT_CAPABILITIES_TOPIC, capabilityEvent);

var expectedCapabilitiesJson = asJsonString(capabilities(
fooItemCapability(EXECUTE, PROCEDURAL, "foo.item.execute")));

await().untilAsserted(() -> doGet("/capabilities")
.andExpect(content().json(expectedCapabilitiesJson))
.andExpect(jsonPath("$.capabilities[0].metadata.createdDate", notNullValue())));
}

private void sendCapabilityEventAndCheckResult() throws Exception {
var capabilityEvent = readValue("json/kafka-events/be-capability-event.json", ResourceEvent.class);
kafkaTemplate.send(FOLIO_IT_CAPABILITIES_TOPIC, capabilityEvent);
Expand Down Expand Up @@ -301,18 +323,28 @@ private static ConditionFactory await() {
}

private static Capability fooItemCapability(CapabilityAction action, String permission, Endpoint... endpoints) {
return fooItemCapability(action, permission, APPLICATION_ID, endpoints);
return fooItemCapability(action, DATA, permission, APPLICATION_ID, endpoints);
}

private static Capability fooItemCapability(CapabilityAction action, CapabilityType type, String permission,
Endpoint... endpoints) {
return fooItemCapability(action, type, permission, APPLICATION_ID, endpoints);
}

private static Capability fooItemCapability(CapabilityAction action, String permission,
String applicationId, Endpoint... endpoints) {
return fooItemCapability(action, DATA, permission, applicationId, endpoints);
}

private static Capability fooItemCapability(CapabilityAction action, CapabilityType type, String permission,
String applicationId, Endpoint... endpoints) {
var capabilityName = getCapabilityName(FOO_RESOURCE, action);
return new Capability()
.id(null)
.name(capabilityName)
.resource(FOO_RESOURCE)
.action(action)
.type(DATA)
.type(type)
.applicationId(applicationId)
.permission(permission)
.endpoints(Arrays.asList(endpoints))
Expand Down
5 changes: 5 additions & 0 deletions src/test/resources/folio-permissions/mappings-overrides.json
Original file line number Diff line number Diff line change
Expand Up @@ -1068,5 +1068,10 @@
"resource": "UI-Finance encumbrance unrelease",
"action": "execute",
"type": "procedural"
},
"foo.item.doSomething": {
"resource": "Foo Item",
"action": "execute",
"type": "procedural"
}
}

0 comments on commit 01251ce

Please sign in to comment.