From 3cf2caed005166968fb9ae07ac34380ee9a8f89a Mon Sep 17 00:00:00 2001 From: ivankozka Date: Thu, 31 Mar 2022 19:24:02 +0300 Subject: [PATCH] add tests to search for alarms with user hierarchy --- .../server/controller/AbstractWebTest.java | 63 +++++++--- .../controller/BaseAlarmControllerTest.java | 116 +++++++++++++++--- 2 files changed, 143 insertions(+), 36 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java index cc561e31a8..a355eb17d2 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java @@ -101,6 +101,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest { protected ObjectMapper mapper = new ObjectMapper(); protected static final String TEST_TENANT_NAME = "TEST TENANT"; + protected static final String TEST_DIFFERENT_TENANT_NAME = "TEST DIFFERENT TENANT"; protected static final String SYS_ADMIN_EMAIL = "sysadmin@thingsboard.org"; private static final String SYS_ADMIN_PASSWORD = "sysadmin"; @@ -108,9 +109,15 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest { protected static final String TENANT_ADMIN_EMAIL = "testtenant@thingsboard.org"; private static final String TENANT_ADMIN_PASSWORD = "tenant"; + protected static final String DIFFERENT_TENANT_ADMIN_EMAIL = "testdifftenant@thingsboard.org"; + private static final String DIFFERENT_TENANT_ADMIN_PASSWORD = "difftenant"; + protected static final String CUSTOMER_USER_EMAIL = "testcustomer@thingsboard.org"; private static final String CUSTOMER_USER_PASSWORD = "customer"; + protected static final String DIFFERENT_CUSTOMER_USER_EMAIL = "testdifferentcustomer@thingsboard.org"; + private static final String DIFFERENT_CUSTOMER_USER_PASSWORD = "diffcustomer"; + /** See {@link org.springframework.test.web.servlet.DefaultMvcResult#getAsyncResult(long)} * and {@link org.springframework.mock.web.MockAsyncContext#getTimeout()} */ @@ -126,6 +133,8 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest { protected TenantId tenantId; protected CustomerId customerId; + protected TenantId differentTenantId; + protected CustomerId differentCustomerId; @SuppressWarnings("rawtypes") private HttpMessageConverter mappingJackson2HttpMessageConverter; @@ -260,36 +269,52 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest { private Customer savedDifferentCustomer; protected void loginDifferentTenant() throws Exception { - loginSysAdmin(); if (savedDifferentTenant != null) { - deleteDifferentTenant(); + login(savedDifferentTenant.getEmail(), TENANT_ADMIN_PASSWORD); + } else { + loginSysAdmin(); + + Tenant tenant = new Tenant(); + tenant.setTitle(TEST_DIFFERENT_TENANT_NAME); + savedDifferentTenant = doPost("/api/tenant", tenant, Tenant.class); + differentTenantId = savedDifferentTenant.getId(); + Assert.assertNotNull(savedDifferentTenant); + User differentTenantAdmin = new User(); + differentTenantAdmin.setAuthority(Authority.TENANT_ADMIN); + differentTenantAdmin.setTenantId(savedDifferentTenant.getId()); + differentTenantAdmin.setEmail(DIFFERENT_TENANT_ADMIN_EMAIL); + + createUserAndLogin(differentTenantAdmin, DIFFERENT_TENANT_ADMIN_PASSWORD); } - - Tenant tenant = new Tenant(); - tenant.setTitle("Different tenant"); - savedDifferentTenant = doPost("/api/tenant", tenant, Tenant.class); - Assert.assertNotNull(savedDifferentTenant); - User differentTenantAdmin = new User(); - differentTenantAdmin.setAuthority(Authority.TENANT_ADMIN); - differentTenantAdmin.setTenantId(savedDifferentTenant.getId()); - differentTenantAdmin.setEmail("different_tenant@thingsboard.org"); - - createUserAndLogin(differentTenantAdmin, "testPassword"); } protected void loginDifferentCustomer() throws Exception { + if (savedDifferentCustomer != null) { + login(savedDifferentCustomer.getEmail(), CUSTOMER_USER_PASSWORD); + } else { + createDifferentCustomer(); + + loginTenantAdmin(); + User differentCustomerUser = new User(); + differentCustomerUser.setAuthority(Authority.CUSTOMER_USER); + differentCustomerUser.setTenantId(tenantId); + differentCustomerUser.setCustomerId(savedDifferentCustomer.getId()); + differentCustomerUser.setEmail(DIFFERENT_CUSTOMER_USER_EMAIL); + + createUserAndLogin(differentCustomerUser, DIFFERENT_CUSTOMER_USER_PASSWORD); + } + } + + protected void createDifferentCustomer() throws Exception { loginTenantAdmin(); + Customer customer = new Customer(); customer.setTitle("Different customer"); savedDifferentCustomer = doPost("/api/customer", customer, Customer.class); Assert.assertNotNull(savedDifferentCustomer); - User differentCustomerUser = new User(); - differentCustomerUser.setAuthority(Authority.CUSTOMER_USER); - differentCustomerUser.setTenantId(tenantId); - differentCustomerUser.setCustomerId(savedDifferentCustomer.getId()); - differentCustomerUser.setEmail("different_customer@thingsboard.org"); + differentCustomerId = savedDifferentCustomer.getId(); - createUserAndLogin(differentCustomerUser, "testPassword"); + logout(); } protected void deleteDifferentTenant() throws Exception { diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseAlarmControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseAlarmControllerTest.java index ce9b6916fc..2695a18fc2 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseAlarmControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseAlarmControllerTest.java @@ -15,14 +15,23 @@ */ package org.thingsboard.server.controller; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.Device; +import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmStatus; +import org.thingsboard.server.common.data.page.PageData; + +import java.util.LinkedList; +import java.util.List; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -57,14 +66,12 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { public void testCreateAlarmViaCustomer() throws Exception { loginCustomerUser(); createAlarm(TEST_ALARM_TYPE); - logout(); } @Test public void testCreateAlarmViaTenant() throws Exception { loginTenantAdmin(); createAlarm(TEST_ALARM_TYPE); - logout(); } @Test @@ -75,7 +82,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm updatedAlarm = doPost("/api/alarm", alarm, Alarm.class); Assert.assertNotNull(updatedAlarm); Assert.assertEquals(AlarmSeverity.MAJOR, updatedAlarm.getSeverity()); - logout(); } @Test @@ -86,7 +92,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm updatedAlarm = doPost("/api/alarm", alarm, Alarm.class); Assert.assertNotNull(updatedAlarm); Assert.assertEquals(AlarmSeverity.MAJOR, updatedAlarm.getSeverity()); - logout(); } @Test @@ -96,7 +101,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { alarm.setSeverity(AlarmSeverity.MAJOR); loginDifferentTenant(); doPost("/api/alarm", alarm).andExpect(status().isForbidden()); - logout(); } @Test @@ -106,7 +110,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { loginDifferentCustomer(); alarm.setSeverity(AlarmSeverity.MAJOR); doPost("/api/alarm", alarm).andExpect(status().isForbidden()); - logout(); } @Test @@ -114,7 +117,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { loginCustomerUser(); Alarm alarm = createAlarm(TEST_ALARM_TYPE); doDelete("/api/alarm/" + alarm.getId()).andExpect(status().isOk()); - logout(); } @Test @@ -122,7 +124,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { loginTenantAdmin(); Alarm alarm = createAlarm(TEST_ALARM_TYPE); doDelete("/api/alarm/" + alarm.getId()).andExpect(status().isOk()); - logout(); } @Test @@ -131,16 +132,14 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm alarm = createAlarm(TEST_ALARM_TYPE); loginDifferentTenant(); doDelete("/api/alarm/" + alarm.getId()).andExpect(status().isForbidden()); - logout(); } @Test - public void testDeleteAlarmViaAnotherCustomer() throws Exception { + public void testDeleteAlarmViaDifferentCustomer() throws Exception { loginCustomerUser(); Alarm alarm = createAlarm(TEST_ALARM_TYPE); loginDifferentCustomer(); doDelete("/api/alarm/" + alarm.getId()).andExpect(status().isForbidden()); - logout(); } @Test @@ -151,7 +150,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm foundAlarm = doGet("/api/alarm/" + alarm.getId(), Alarm.class); Assert.assertNotNull(foundAlarm); Assert.assertEquals(AlarmStatus.CLEARED_UNACK, foundAlarm.getStatus()); - logout(); } @Test @@ -162,7 +160,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm foundAlarm = doGet("/api/alarm/" + alarm.getId(), Alarm.class); Assert.assertNotNull(foundAlarm); Assert.assertEquals(AlarmStatus.CLEARED_UNACK, foundAlarm.getStatus()); - logout(); } @Test @@ -173,7 +170,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm foundAlarm = doGet("/api/alarm/" + alarm.getId(), Alarm.class); Assert.assertNotNull(foundAlarm); Assert.assertEquals(AlarmStatus.ACTIVE_ACK, foundAlarm.getStatus()); - logout(); } @Test @@ -182,7 +178,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm alarm = createAlarm(TEST_ALARM_TYPE); loginDifferentCustomer(); doPost("/api/alarm/" + alarm.getId() + "/clear").andExpect(status().isForbidden()); - logout(); } @Test @@ -191,7 +186,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm alarm = createAlarm(TEST_ALARM_TYPE); loginDifferentTenant(); doPost("/api/alarm/" + alarm.getId() + "/clear").andExpect(status().isForbidden()); - logout(); } @Test @@ -200,7 +194,6 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm alarm = createAlarm(TEST_ALARM_TYPE); loginDifferentCustomer(); doPost("/api/alarm/" + alarm.getId() + "/ack").andExpect(status().isForbidden()); - logout(); } @Test @@ -209,7 +202,96 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest { Alarm alarm = createAlarm(TEST_ALARM_TYPE); loginDifferentTenant(); doPost("/api/alarm/" + alarm.getId() + "/ack").andExpect(status().isForbidden()); + } + + @Test + public void testFindAlarmsViaCustomerUser() throws Exception { + loginCustomerUser(); + + List createdAlarms = new LinkedList<>(); + + final int size = 10; + for (int i = 0; i < size; i++) { + createdAlarms.add( + createAlarm(TEST_ALARM_TYPE + i) + ); + } + + var response = doGetTyped( + "/api/alarm/" + EntityType.DEVICE + "/" + + customerDevice.getUuidId() + "?page=0&pageSize=" + size, + new TypeReference>() {} + ); + var foundAlarmInfos = response.getData(); + Assert.assertNotNull("Found pageData is null", foundAlarmInfos); + Assert.assertNotEquals( + "Expected alarms are not found!", + 0, foundAlarmInfos.size() + ); + + boolean allMatch = createdAlarms.stream() + .allMatch(alarm -> foundAlarmInfos.stream() + .map(Alarm::getType) + .anyMatch(type -> alarm.getType().equals(type)) + ); + Assert.assertTrue("Created alarm doesn't match any found!", allMatch); + } + + @Test + public void testFindAlarmsViaDifferentCustomerUser() throws Exception { + loginCustomerUser(); + + final int size = 10; + for (int i = 0; i < size; i++) { + createAlarm(TEST_ALARM_TYPE + i); + } + + loginDifferentCustomer(); + doGet("/api/alarm/" + EntityType.DEVICE + "/" + + customerDevice.getUuidId() + "?page=0&pageSize=" + size) + .andExpect(status().isForbidden()); + } + + @Test + public void testFindAlarmsViaPublicCustomer() throws Exception { + loginTenantAdmin(); + + Device device = new Device(); + device.setName("Test Public Device"); + device.setLabel("Label"); + device.setCustomerId(customerId); + device = doPost("/api/device", device, Device.class); + device = doPost("/api/customer/public/device/" + device.getUuidId(), Device.class); + + String publicId = device.getCustomerId().toString(); + + Alarm alarm = Alarm.builder() + .originator(device.getId()) + .status(AlarmStatus.ACTIVE_UNACK) + .severity(AlarmSeverity.CRITICAL) + .type("Test") + .build(); + alarm = doPost("/api/alarm", alarm, Alarm.class); + Assert.assertNotNull("Saved alarm is null!", alarm); + logout(); + + + JsonNode publicLoginRequest = JacksonUtil.toJsonNode("{\"publicId\": \"" + publicId + "\"}"); + JsonNode tokens = doPost("/api/auth/login/public", publicLoginRequest, JsonNode.class); + this.token = tokens.get("token").asText(); + + + PageData pageData = doGetTyped( + "/api/alarm/DEVICE/" + device.getUuidId() + "?page=0&pageSize=1", new TypeReference>() {} + ); + + Assert.assertNotNull("Found pageData is null", pageData); + Assert.assertNotEquals("Expected alarms are not found!", 0, pageData.getTotalElements()); + + AlarmInfo alarmInfo = pageData.getData().get(0); + boolean equals = alarm.getId().equals(alarmInfo.getId()) && alarm.getType().equals(alarmInfo.getType()); + Assert.assertTrue("Created alarm doesn't match the found one!", equals); } private Alarm createAlarm(String type) throws Exception {