Merge pull request #6695 from thingsboard/refactoring_tests_alarm_customer
[3.4] Refactoring_tests: alarm, customer
This commit is contained in:
commit
eb710b91cd
@ -335,7 +335,7 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
|
||||
return null;
|
||||
}
|
||||
|
||||
private EdgeEventActionType edgeTypeByActionType(ActionType actionType) {
|
||||
public static EdgeEventActionType edgeTypeByActionType(ActionType actionType) {
|
||||
switch (actionType) {
|
||||
case ADDED:
|
||||
return EdgeEventActionType.ADDED;
|
||||
|
||||
@ -45,7 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
@EnableWebSocket
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
@Slf4j
|
||||
public abstract class AbstractControllerTest extends AbstractWebTest {
|
||||
public abstract class AbstractControllerTest extends AbstractNotifyEntityTest {
|
||||
|
||||
public static final String WS_URL = "ws://localhost:";
|
||||
|
||||
|
||||
@ -0,0 +1,182 @@
|
||||
/**
|
||||
* Copyright © 2016-2022 The Thingsboard Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.controller;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.mockito.Mockito;
|
||||
import org.springframework.boot.test.mock.mockito.SpyBean;
|
||||
import org.thingsboard.server.cluster.TbClusterService;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.common.data.HasName;
|
||||
import org.thingsboard.server.common.data.audit.ActionType;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.EntityId;
|
||||
import org.thingsboard.server.common.data.id.EntityIdFactory;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.data.id.UserId;
|
||||
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
|
||||
import org.thingsboard.server.common.msg.TbMsg;
|
||||
import org.thingsboard.server.dao.audit.AuditLogService;
|
||||
import org.thingsboard.server.dao.model.ModelConstants;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.thingsboard.server.service.entitiy.DefaultTbNotificationEntityService.edgeTypeByActionType;
|
||||
|
||||
@Slf4j
|
||||
public abstract class AbstractNotifyEntityTest extends AbstractWebTest {
|
||||
|
||||
@SpyBean
|
||||
protected TbClusterService tbClusterService;
|
||||
|
||||
@SpyBean
|
||||
protected AuditLogService auditLogService;
|
||||
|
||||
protected void testNotifyEntityAllOneTime(HasName entity, EntityId entityId, EntityId originatorId,
|
||||
TenantId tenantId, CustomerId customerId, UserId userId, String userName,
|
||||
ActionType actionType, Object... additionalInfo) {
|
||||
testSendNotificationMsgToEdgeServiceOneTime(entityId, tenantId, actionType);
|
||||
testLogEntityActionOneTime(entity, originatorId, tenantId, customerId, userId, userName, actionType, additionalInfo);
|
||||
testPushMsgToRuleEngineOneTime(originatorId, tenantId);
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
}
|
||||
|
||||
protected void testNotifyEntityDeleteOneTimeMsgToEdgeServiceNever(HasName entity, EntityId entityId, EntityId originatorId,
|
||||
TenantId tenantId, CustomerId customerId, UserId userId, String userName,
|
||||
ActionType actionType, Object... additionalInfo) {
|
||||
testNotificationMsgToEdgeServiceNever(entityId);
|
||||
testLogEntityActionOneTime(entity, originatorId, tenantId, customerId, userId, userName, actionType, additionalInfo);
|
||||
testPushMsgToRuleEngineOneTime(entityId, tenantId);
|
||||
testBroadcastEntityStateChangeEventOneTime(entityId, tenantId);
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
}
|
||||
protected void testNotifyEntityNeverMsgToEdgeServiceOneTime(HasName entity, EntityId entityId, TenantId tenantId, ActionType actionType) {
|
||||
testSendNotificationMsgToEdgeServiceOneTime(entityId, tenantId, actionType);
|
||||
testLogEntityActionNever(entityId, entity);
|
||||
testPushMsgToRuleEngineNever(entityId);
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
}
|
||||
|
||||
protected void testNotifyEntityOneTimeMsgToEdgeServiceNever(HasName entity, EntityId entityId, EntityId originatorId,
|
||||
TenantId tenantId, CustomerId customerId, UserId userId, String userName,
|
||||
ActionType actionType, Object... additionalInfo) {
|
||||
testNotificationMsgToEdgeServiceNever(entityId);
|
||||
testLogEntityActionOneTime(entity, originatorId, tenantId, customerId, userId, userName, actionType, additionalInfo);
|
||||
testPushMsgToRuleEngineOneTime(originatorId, tenantId);
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
}
|
||||
|
||||
protected void testNotifyEntityBroadcastEntityStateChangeEventOneTimeMsgToEdgeServiceNever(HasName entity, EntityId entityId, EntityId originatorId,
|
||||
TenantId tenantId, CustomerId customerId, UserId userId, String userName,
|
||||
ActionType actionType, Object... additionalInfo) {
|
||||
testNotificationMsgToEdgeServiceNever(entityId);
|
||||
testLogEntityActionOneTime(entity, originatorId, tenantId, customerId, userId, userName, actionType, additionalInfo);
|
||||
testPushMsgToRuleEngineOneTime(originatorId, tenantId);
|
||||
testBroadcastEntityStateChangeEventOneTime(entityId, tenantId);
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
}
|
||||
|
||||
protected void testNotifyEntityError(HasName entity, TenantId tenantId,
|
||||
UserId userId, String userName, ActionType actionType, Exception exp,
|
||||
Object... additionalInfo) {
|
||||
CustomerId customer_NULL_UUID = (CustomerId) EntityIdFactory.getByTypeAndUuid(EntityType.CUSTOMER, ModelConstants.NULL_UUID);
|
||||
EntityId entity_NULL_UUID = EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(entity.getClass().toString()
|
||||
.substring(entity.getClass().toString().lastIndexOf(".") + 1).toUpperCase(Locale.ENGLISH)),
|
||||
ModelConstants.NULL_UUID);
|
||||
testNotificationMsgToEdgeServiceNever(entity_NULL_UUID);
|
||||
if (additionalInfo.length > 0) {
|
||||
Mockito.verify(auditLogService, times(1)).logEntityAction(Mockito.eq(tenantId),
|
||||
Mockito.eq(customer_NULL_UUID), Mockito.eq(userId), Mockito.eq(userName),
|
||||
Mockito.eq(entity_NULL_UUID), Mockito.any(entity.getClass()), Mockito.eq(actionType),
|
||||
Mockito.argThat(argument ->
|
||||
argument.getMessage().equals(exp.getMessage())), Mockito.eq(additionalInfo));
|
||||
} else {
|
||||
Mockito.verify(auditLogService, times(1)).logEntityAction(Mockito.eq(tenantId),
|
||||
Mockito.eq(customer_NULL_UUID), Mockito.eq(userId), Mockito.eq(userName),
|
||||
Mockito.eq(entity_NULL_UUID), Mockito.any(entity.getClass()), Mockito.eq(actionType),
|
||||
Mockito.argThat(argument ->
|
||||
argument.getMessage().equals(exp.getMessage())));
|
||||
}
|
||||
testPushMsgToRuleEngineNever(entity_NULL_UUID);
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
}
|
||||
|
||||
protected void testNotifyEntityNever(EntityId entityId, HasName entity) {
|
||||
testNotificationMsgToEdgeServiceNever(entityId);
|
||||
testLogEntityActionNever(entityId, entity);
|
||||
testPushMsgToRuleEngineNever(entityId);
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
}
|
||||
|
||||
private void testNotificationMsgToEdgeServiceNever(EntityId entityId) {
|
||||
Mockito.verify(tbClusterService, never()).sendNotificationMsgToEdgeService(Mockito.any(),
|
||||
Mockito.any(), Mockito.any(entityId.getClass()), Mockito.any(), Mockito.any(), Mockito.any());
|
||||
}
|
||||
|
||||
private void testLogEntityActionNever(EntityId entityId, HasName entity) {
|
||||
Mockito.verify(auditLogService, never()).logEntityAction(Mockito.any(), Mockito.any(),
|
||||
Mockito.any(), Mockito.any(), Mockito.any(entityId.getClass()), Mockito.any(entity.getClass()),
|
||||
Mockito.any(), Mockito.any());
|
||||
}
|
||||
|
||||
private void testPushMsgToRuleEngineNever(EntityId entityId) {
|
||||
Mockito.verify(tbClusterService, never()).pushMsgToRuleEngine(Mockito.any(),
|
||||
Mockito.any(entityId.getClass()), Mockito.any(), Mockito.any());
|
||||
}
|
||||
|
||||
private void testLogEntityActionOneTime(HasName entity, EntityId originatorId, TenantId tenantId, CustomerId customerId,
|
||||
UserId userId, String userName, ActionType actionType, Object... additionalInfo) {
|
||||
if (additionalInfo.length == 0) {
|
||||
Mockito.verify(auditLogService, times(1)).logEntityAction(Mockito.eq(tenantId), Mockito.eq(customerId),
|
||||
Mockito.eq(userId), Mockito.eq(userName), Mockito.eq(originatorId),
|
||||
Mockito.eq(entity), Mockito.eq(actionType), Mockito.isNull());
|
||||
} else {
|
||||
String additionalInfoStr = extractParameter(String.class, 0, additionalInfo);
|
||||
Mockito.verify(auditLogService, times(1)).logEntityAction(Mockito.eq(tenantId), Mockito.eq(customerId),
|
||||
Mockito.eq(userId), Mockito.eq(userName), Mockito.eq(originatorId),
|
||||
Mockito.eq(entity), Mockito.eq(actionType), Mockito.isNull(), Mockito.eq(additionalInfoStr));
|
||||
}
|
||||
}
|
||||
|
||||
private void testPushMsgToRuleEngineOneTime(EntityId originatorId, TenantId tenantId) {
|
||||
Mockito.verify(tbClusterService, times(1)).pushMsgToRuleEngine(Mockito.eq(tenantId),
|
||||
Mockito.eq(originatorId), Mockito.any(TbMsg.class), Mockito.isNull());
|
||||
}
|
||||
|
||||
private void testSendNotificationMsgToEdgeServiceOneTime(EntityId entityId, TenantId tenantId, ActionType actionType) {
|
||||
Mockito.verify(tbClusterService, times(1)).sendNotificationMsgToEdgeService(Mockito.eq(tenantId),
|
||||
Mockito.isNull(), Mockito.eq(entityId), Mockito.isNull(), Mockito.isNull(),
|
||||
Mockito.eq(edgeTypeByActionType(actionType)));
|
||||
}
|
||||
|
||||
private void testBroadcastEntityStateChangeEventOneTime(EntityId entityId, TenantId tenantId) {
|
||||
Mockito.verify(tbClusterService, times(1)).broadcastEntityStateChangeEvent(Mockito.eq(tenantId),
|
||||
Mockito.any(entityId.getClass()), Mockito.any(ComponentLifecycleEvent.class));
|
||||
}
|
||||
|
||||
private <T> T extractParameter(Class<T> clazz, int index, Object... additionalInfo) {
|
||||
T result = null;
|
||||
if (additionalInfo != null && additionalInfo.length > index) {
|
||||
Object paramObject = additionalInfo[index];
|
||||
if (clazz.isInstance(paramObject)) {
|
||||
result = clazz.cast(paramObject);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -75,11 +75,6 @@ import org.thingsboard.server.common.data.id.UserId;
|
||||
import org.thingsboard.server.common.data.page.PageData;
|
||||
import org.thingsboard.server.common.data.page.PageLink;
|
||||
import org.thingsboard.server.common.data.page.TimePageLink;
|
||||
import org.thingsboard.server.common.data.queue.ProcessingStrategy;
|
||||
import org.thingsboard.server.common.data.queue.ProcessingStrategyType;
|
||||
import org.thingsboard.server.common.data.queue.Queue;
|
||||
import org.thingsboard.server.common.data.queue.SubmitStrategy;
|
||||
import org.thingsboard.server.common.data.queue.SubmitStrategyType;
|
||||
import org.thingsboard.server.common.data.security.Authority;
|
||||
import org.thingsboard.server.config.ThingsboardSecurityConfiguration;
|
||||
import org.thingsboard.server.dao.tenant.TenantProfileService;
|
||||
@ -144,9 +139,11 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
|
||||
|
||||
protected TenantId tenantId;
|
||||
protected UserId tenantAdminUserId;
|
||||
protected CustomerId tenantAdminCustomerId;
|
||||
protected CustomerId customerId;
|
||||
protected TenantId differentTenantId;
|
||||
protected CustomerId differentCustomerId;
|
||||
protected UserId customerUserId;
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
private HttpMessageConverter mappingJackson2HttpMessageConverter;
|
||||
@ -211,6 +208,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
|
||||
|
||||
tenantAdmin = createUserAndLogin(tenantAdmin, TENANT_ADMIN_PASSWORD);
|
||||
tenantAdminUserId = tenantAdmin.getId();
|
||||
tenantAdminCustomerId = tenantAdmin.getCustomerId();
|
||||
|
||||
Customer customer = new Customer();
|
||||
customer.setTitle("Customer");
|
||||
@ -224,7 +222,8 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
|
||||
customerUser.setCustomerId(savedCustomer.getId());
|
||||
customerUser.setEmail(CUSTOMER_USER_EMAIL);
|
||||
|
||||
createUserAndLogin(customerUser, CUSTOMER_USER_PASSWORD);
|
||||
customerUser = createUserAndLogin(customerUser, CUSTOMER_USER_PASSWORD);
|
||||
customerUserId = customerUser.getId();
|
||||
|
||||
logout();
|
||||
|
||||
|
||||
@ -17,10 +17,12 @@ package org.thingsboard.server.controller;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mockito;
|
||||
import org.thingsboard.common.util.JacksonUtil;
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
@ -28,6 +30,7 @@ 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.audit.ActionType;
|
||||
import org.thingsboard.server.common.data.page.PageData;
|
||||
|
||||
import java.util.LinkedList;
|
||||
@ -35,6 +38,7 @@ import java.util.List;
|
||||
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
@Slf4j
|
||||
public abstract class BaseAlarmControllerTest extends AbstractControllerTest {
|
||||
|
||||
public static final String TEST_ALARM_TYPE = "Test";
|
||||
@ -65,142 +69,244 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest {
|
||||
@Test
|
||||
public void testCreateAlarmViaCustomer() throws Exception {
|
||||
loginCustomerUser();
|
||||
createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
testNotifyEntityAllOneTime(alarm, alarm.getId(), alarm.getOriginator(),
|
||||
tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.ADDED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateAlarmViaTenant() throws Exception {
|
||||
loginTenantAdmin();
|
||||
createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
testNotifyEntityAllOneTime(alarm, alarm.getId(), alarm.getOriginator(),
|
||||
tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.ADDED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateAlarmViaCustomer() throws Exception {
|
||||
loginCustomerUser();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
alarm.setSeverity(AlarmSeverity.MAJOR);
|
||||
Alarm updatedAlarm = doPost("/api/alarm", alarm, Alarm.class);
|
||||
Assert.assertNotNull(updatedAlarm);
|
||||
Assert.assertEquals(AlarmSeverity.MAJOR, updatedAlarm.getSeverity());
|
||||
|
||||
testNotifyEntityAllOneTime(updatedAlarm, updatedAlarm.getId(), updatedAlarm.getOriginator(),
|
||||
tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.UPDATED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateAlarmViaTenant() throws Exception {
|
||||
loginTenantAdmin();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
alarm.setSeverity(AlarmSeverity.MAJOR);
|
||||
Alarm updatedAlarm = doPost("/api/alarm", alarm, Alarm.class);
|
||||
Assert.assertNotNull(updatedAlarm);
|
||||
Assert.assertEquals(AlarmSeverity.MAJOR, updatedAlarm.getSeverity());
|
||||
|
||||
testNotifyEntityAllOneTime(updatedAlarm, updatedAlarm.getId(), updatedAlarm.getOriginator(),
|
||||
tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.UPDATED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateAlarmViaDifferentTenant() throws Exception {
|
||||
loginTenantAdmin();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
alarm.setSeverity(AlarmSeverity.MAJOR);
|
||||
loginDifferentTenant();
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/alarm", alarm).andExpect(status().isForbidden());
|
||||
|
||||
testNotifyEntityNever(alarm.getId(), alarm);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateAlarmViaDifferentCustomer() throws Exception {
|
||||
loginCustomerUser();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
loginDifferentCustomer();
|
||||
alarm.setSeverity(AlarmSeverity.MAJOR);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/alarm", alarm).andExpect(status().isForbidden());
|
||||
|
||||
testNotifyEntityNever(alarm.getId(), alarm);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteAlarmViaCustomer() throws Exception {
|
||||
loginCustomerUser();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doDelete("/api/alarm/" + alarm.getId()).andExpect(status().isOk());
|
||||
|
||||
testNotifyEntityOneTimeMsgToEdgeServiceNever(alarm, alarm.getId(), alarm.getOriginator(),
|
||||
tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.DELETED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteAlarmViaTenant() throws Exception {
|
||||
loginTenantAdmin();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doDelete("/api/alarm/" + alarm.getId()).andExpect(status().isOk());
|
||||
|
||||
testNotifyEntityOneTimeMsgToEdgeServiceNever(alarm, alarm.getId(), alarm.getOriginator(),
|
||||
tenantId, tenantAdminCustomerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteAlarmViaDifferentTenant() throws Exception {
|
||||
loginTenantAdmin();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
loginDifferentTenant();
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doDelete("/api/alarm/" + alarm.getId()).andExpect(status().isForbidden());
|
||||
|
||||
testNotifyEntityNever(alarm.getId(), alarm);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteAlarmViaDifferentCustomer() throws Exception {
|
||||
loginCustomerUser();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
loginDifferentCustomer();
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doDelete("/api/alarm/" + alarm.getId()).andExpect(status().isForbidden());
|
||||
|
||||
testNotifyEntityNever(alarm.getId(), alarm);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClearAlarmViaCustomer() throws Exception {
|
||||
loginCustomerUser();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/alarm/" + alarm.getId() + "/clear").andExpect(status().isOk());
|
||||
|
||||
Alarm foundAlarm = doGet("/api/alarm/" + alarm.getId(), Alarm.class);
|
||||
Assert.assertNotNull(foundAlarm);
|
||||
Assert.assertEquals(AlarmStatus.CLEARED_UNACK, foundAlarm.getStatus());
|
||||
|
||||
testNotifyEntityAllOneTime(foundAlarm, foundAlarm.getId(), foundAlarm.getOriginator(),
|
||||
tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.ALARM_CLEAR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClearAlarmViaTenant() throws Exception {
|
||||
loginTenantAdmin();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/alarm/" + alarm.getId() + "/clear").andExpect(status().isOk());
|
||||
Alarm foundAlarm = doGet("/api/alarm/" + alarm.getId(), Alarm.class);
|
||||
Assert.assertNotNull(foundAlarm);
|
||||
Assert.assertEquals(AlarmStatus.CLEARED_UNACK, foundAlarm.getStatus());
|
||||
|
||||
testNotifyEntityAllOneTime(foundAlarm, foundAlarm.getId(), foundAlarm.getOriginator(),
|
||||
tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.ALARM_CLEAR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAcknowledgeAlarmViaCustomer() throws Exception {
|
||||
loginCustomerUser();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/alarm/" + alarm.getId() + "/ack").andExpect(status().isOk());
|
||||
|
||||
Alarm foundAlarm = doGet("/api/alarm/" + alarm.getId(), Alarm.class);
|
||||
Assert.assertNotNull(foundAlarm);
|
||||
Assert.assertEquals(AlarmStatus.ACTIVE_ACK, foundAlarm.getStatus());
|
||||
|
||||
testNotifyEntityAllOneTime(foundAlarm, foundAlarm.getId(), foundAlarm.getOriginator(),
|
||||
tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.ALARM_ACK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClearAlarmViaDifferentCustomer() throws Exception {
|
||||
loginCustomerUser();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
loginDifferentCustomer();
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/alarm/" + alarm.getId() + "/clear").andExpect(status().isForbidden());
|
||||
|
||||
testNotifyEntityNever(alarm.getId(), alarm);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClearAlarmViaDifferentTenant() throws Exception {
|
||||
loginTenantAdmin();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
loginDifferentTenant();
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/alarm/" + alarm.getId() + "/clear").andExpect(status().isForbidden());
|
||||
|
||||
testNotifyEntityNever(alarm.getId(), alarm);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAcknowledgeAlarmViaDifferentCustomer() throws Exception {
|
||||
loginCustomerUser();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
loginDifferentCustomer();
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/alarm/" + alarm.getId() + "/ack").andExpect(status().isForbidden());
|
||||
|
||||
testNotifyEntityNever(alarm.getId(), alarm);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAcknowledgeAlarmViaDifferentTenant() throws Exception {
|
||||
loginTenantAdmin();
|
||||
Alarm alarm = createAlarm(TEST_ALARM_TYPE);
|
||||
|
||||
loginDifferentTenant();
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/alarm/" + alarm.getId() + "/ack").andExpect(status().isForbidden());
|
||||
}
|
||||
|
||||
@ -271,17 +377,20 @@ public abstract class BaseAlarmControllerTest extends AbstractControllerTest {
|
||||
.severity(AlarmSeverity.CRITICAL)
|
||||
.type("Test")
|
||||
.build();
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
alarm = doPost("/api/alarm", alarm, Alarm.class);
|
||||
Assert.assertNotNull("Saved alarm is null!", alarm);
|
||||
|
||||
logout();
|
||||
testNotifyEntityNeverMsgToEdgeServiceOneTime(alarm, alarm.getId(), tenantId, ActionType.ADDED);
|
||||
|
||||
logout();
|
||||
|
||||
JsonNode publicLoginRequest = JacksonUtil.toJsonNode("{\"publicId\": \"" + publicId + "\"}");
|
||||
JsonNode tokens = doPost("/api/auth/login/public", publicLoginRequest, JsonNode.class);
|
||||
this.token = tokens.get("token").asText();
|
||||
|
||||
|
||||
PageData<AlarmInfo> pageData = doGetTyped(
|
||||
"/api/alarm/DEVICE/" + device.getUuidId() + "?page=0&pageSize=1", new TypeReference<PageData<AlarmInfo>>() {}
|
||||
);
|
||||
|
||||
@ -25,14 +25,17 @@ import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mockito;
|
||||
import org.thingsboard.common.util.ThingsBoardExecutors;
|
||||
import org.thingsboard.server.common.data.Customer;
|
||||
import org.thingsboard.server.common.data.Tenant;
|
||||
import org.thingsboard.server.common.data.User;
|
||||
import org.thingsboard.server.common.data.audit.ActionType;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.data.page.PageData;
|
||||
import org.thingsboard.server.common.data.page.PageLink;
|
||||
import org.thingsboard.server.common.data.security.Authority;
|
||||
import org.thingsboard.server.dao.exception.DataValidationException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -86,14 +89,28 @@ public abstract class BaseCustomerControllerTest extends AbstractControllerTest
|
||||
public void testSaveCustomer() throws Exception {
|
||||
Customer customer = new Customer();
|
||||
customer.setTitle("My customer");
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
Customer savedCustomer = doPost("/api/customer", customer, Customer.class);
|
||||
|
||||
testNotifyEntityOneTimeMsgToEdgeServiceNever(savedCustomer, savedCustomer.getId(), savedCustomer.getId(),
|
||||
savedCustomer.getTenantId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(),
|
||||
ActionType.ADDED);
|
||||
|
||||
Assert.assertNotNull(savedCustomer);
|
||||
Assert.assertNotNull(savedCustomer.getId());
|
||||
Assert.assertTrue(savedCustomer.getCreatedTime() > 0);
|
||||
Assert.assertEquals(customer.getTitle(), savedCustomer.getTitle());
|
||||
|
||||
savedCustomer.setTitle("My new customer");
|
||||
|
||||
doPost("/api/customer", savedCustomer, Customer.class);
|
||||
|
||||
testNotifyEntityAllOneTime(savedCustomer, savedCustomer.getId(), savedCustomer.getId(), savedCustomer.getTenantId(),
|
||||
savedCustomer.getId(), tenantAdmin.getId(), tenantAdmin.getEmail(),
|
||||
ActionType.UPDATED);
|
||||
|
||||
Customer foundCustomer = doGet("/api/customer/" + savedCustomer.getId().getId().toString(), Customer.class);
|
||||
Assert.assertEquals(foundCustomer.getTitle(), savedCustomer.getTitle());
|
||||
|
||||
@ -104,23 +121,57 @@ public abstract class BaseCustomerControllerTest extends AbstractControllerTest
|
||||
@Test
|
||||
public void testSaveCustomerWithViolationOfValidation() throws Exception {
|
||||
Customer customer = new Customer();
|
||||
String validationError = "Validation error: ";
|
||||
customer.setTitle(RandomStringUtils.randomAlphabetic(300));
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString("length of title must be equal or less than 255")));
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
String msgError = "length of title must be equal or less than 255";
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString(msgError)));
|
||||
|
||||
testNotifyEntityError(customer, savedTenant.getId(),
|
||||
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(validationError + msgError));
|
||||
|
||||
customer.setTitle("Normal title");
|
||||
customer.setCity(RandomStringUtils.randomAlphabetic(300));
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString("length of city must be equal or less than 255")));
|
||||
msgError = "length of city must be equal or less than 255";
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString(msgError)));
|
||||
|
||||
testNotifyEntityError(customer, savedTenant.getId(),
|
||||
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(validationError + msgError));
|
||||
|
||||
customer.setCity("Normal city");
|
||||
customer.setCountry(RandomStringUtils.randomAlphabetic(300));
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString("length of country must be equal or less than 255")));
|
||||
msgError = "length of country must be equal or less than 255";
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString(msgError)));
|
||||
|
||||
testNotifyEntityError(customer, savedTenant.getId(),
|
||||
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(validationError + msgError));
|
||||
|
||||
customer.setCountry("Ukraine");
|
||||
customer.setPhone(RandomStringUtils.randomAlphabetic(300));
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString("length of phone must be equal or less than 255")));
|
||||
msgError = "length of phone must be equal or less than 255";
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString(msgError)));
|
||||
|
||||
testNotifyEntityError(customer, savedTenant.getId(),
|
||||
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(validationError + msgError));
|
||||
|
||||
customer.setPhone("+3892555554512");
|
||||
customer.setState(RandomStringUtils.randomAlphabetic(300));
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString("length of state must be equal or less than 255")));
|
||||
msgError = "length of state must be equal or less than 255";
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString(msgError)));
|
||||
|
||||
testNotifyEntityError(customer, savedTenant.getId(),
|
||||
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(validationError + msgError));
|
||||
|
||||
customer.setState("Normal state");
|
||||
customer.setZip(RandomStringUtils.randomAlphabetic(300));
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString("length of zip or postal code must be equal or less than 255")));
|
||||
msgError = "length of zip or postal code must be equal or less than 255";
|
||||
doPost("/api/customer", customer).andExpect(statusReason(containsString(msgError)));
|
||||
|
||||
testNotifyEntityError(customer, savedTenant.getId(),
|
||||
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(validationError + msgError));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -131,12 +182,22 @@ public abstract class BaseCustomerControllerTest extends AbstractControllerTest
|
||||
doPost("/api/customer", savedCustomer, Customer.class);
|
||||
|
||||
loginDifferentTenant();
|
||||
doPost("/api/customer", savedCustomer, Customer.class, status().isForbidden());
|
||||
deleteDifferentTenant();
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/customer", savedCustomer, Customer.class, status().isForbidden());
|
||||
|
||||
testNotifyEntityNever(savedCustomer.getId(), savedCustomer);
|
||||
|
||||
deleteDifferentTenant();
|
||||
login(tenantAdmin.getName(), "testPassword1");
|
||||
|
||||
doDelete("/api/customer/" + savedCustomer.getId().getId().toString())
|
||||
.andExpect(status().isOk());
|
||||
|
||||
testNotifyEntityBroadcastEntityStateChangeEventOneTimeMsgToEdgeServiceNever(savedCustomer, savedCustomer.getId(),
|
||||
savedCustomer.getId(), savedCustomer.getTenantId(), savedCustomer.getId(), tenantAdmin.getId(),
|
||||
tenantAdmin.getEmail(), ActionType.DELETED, savedCustomer.getId().getId().toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -149,6 +210,8 @@ public abstract class BaseCustomerControllerTest extends AbstractControllerTest
|
||||
Assert.assertNotNull(foundCustomer);
|
||||
Assert.assertEquals(savedCustomer, foundCustomer);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doDelete("/api/customer/" + savedCustomer.getId().getId().toString())
|
||||
.andExpect(status().isOk());
|
||||
}
|
||||
@ -159,9 +222,15 @@ public abstract class BaseCustomerControllerTest extends AbstractControllerTest
|
||||
customer.setTitle("My customer");
|
||||
Customer savedCustomer = doPost("/api/customer", customer, Customer.class);
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doDelete("/api/customer/" + savedCustomer.getId().getId().toString())
|
||||
.andExpect(status().isOk());
|
||||
|
||||
testNotifyEntityBroadcastEntityStateChangeEventOneTimeMsgToEdgeServiceNever(savedCustomer, savedCustomer.getId(),
|
||||
savedCustomer.getId(), savedCustomer.getTenantId(), savedCustomer.getId(), tenantAdmin.getId(),
|
||||
tenantAdmin.getEmail(), ActionType.DELETED, savedCustomer.getId().getId().toString());
|
||||
|
||||
doGet("/api/customer/" + savedCustomer.getId().getId().toString())
|
||||
.andExpect(status().isNotFound());
|
||||
}
|
||||
@ -169,24 +238,33 @@ public abstract class BaseCustomerControllerTest extends AbstractControllerTest
|
||||
@Test
|
||||
public void testSaveCustomerWithEmptyTitle() throws Exception {
|
||||
Customer customer = new Customer();
|
||||
String msgError = "Customer title should be specified";
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/customer", customer)
|
||||
.andExpect(status().isBadRequest())
|
||||
.andExpect(statusReason(containsString("Customer title should be specified")));
|
||||
.andExpect(statusReason(containsString(msgError)));
|
||||
|
||||
testNotifyEntityError(customer, savedTenant.getId(),
|
||||
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(msgError + "!"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSaveCustomerWithInvalidEmail() throws Exception {
|
||||
Customer customer = new Customer();
|
||||
String msgError = "Invalid email address format 'invalid@mail'";
|
||||
customer.setTitle("My customer");
|
||||
customer.setEmail("invalid@mail");
|
||||
|
||||
Mockito.reset(tbClusterService, auditLogService);
|
||||
|
||||
doPost("/api/customer", customer)
|
||||
.andExpect(status().isBadRequest())
|
||||
.andExpect(statusReason(containsString("Invalid email address format 'invalid@mail'")));
|
||||
.andExpect(statusReason(containsString(msgError)));
|
||||
|
||||
// loginSysAdmin();
|
||||
//
|
||||
// doDelete("/api/tenant/"+savedTenant.getId().getId().toString())
|
||||
// .andExpect(status().isOk());
|
||||
testNotifyEntityError(customer, savedTenant.getId(),
|
||||
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(msgError + "!"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@ -40,12 +40,12 @@ import org.thingsboard.server.common.data.device.profile.AlarmConditionFilter;
|
||||
import org.thingsboard.server.common.data.device.profile.AlarmConditionFilterKey;
|
||||
import org.thingsboard.server.common.data.device.profile.AlarmConditionKeyType;
|
||||
import org.thingsboard.server.common.data.device.profile.AlarmRule;
|
||||
import org.thingsboard.server.common.data.device.profile.CustomTimeSchedule;
|
||||
import org.thingsboard.server.common.data.device.profile.CustomTimeScheduleItem;
|
||||
import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm;
|
||||
import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
|
||||
import org.thingsboard.server.common.data.device.profile.DurationAlarmConditionSpec;
|
||||
import org.thingsboard.server.common.data.device.profile.RepeatingAlarmConditionSpec;
|
||||
import org.thingsboard.server.common.data.device.profile.CustomTimeSchedule;
|
||||
import org.thingsboard.server.common.data.device.profile.CustomTimeScheduleItem;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.DeviceId;
|
||||
import org.thingsboard.server.common.data.id.DeviceProfileId;
|
||||
@ -71,10 +71,10 @@ import org.thingsboard.server.dao.timeseries.TimeseriesService;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Optional;
|
||||
import java.util.TreeMap;
|
||||
import java.util.UUID;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user