From 9b15cd609c0e8291e1eb0a21566af111252b7dfd Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 31 Aug 2023 14:17:23 +0200 Subject: [PATCH 01/14] StringUtils: contains0x00 implemented to prevent org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 --- .../server/common/data/StringUtils.java | 7 ++++ .../server/common/data/StringUtilsTest.java | 40 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 common/data/src/test/java/org/thingsboard/server/common/data/StringUtilsTest.java diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java b/common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java index a7671f4327..7360f9b8ab 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java @@ -181,6 +181,13 @@ public class StringUtils { return org.apache.commons.lang3.StringUtils.contains(seq, searchSeq); } + /** + * Use this to prevent org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 + **/ + public static boolean contains0x00(final String s) { + return s != null && s.contains("\u0000"); + } + public static String randomNumeric(int length) { return RandomStringUtils.randomNumeric(length); } diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/StringUtilsTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/StringUtilsTest.java new file mode 100644 index 0000000000..4cf21baa99 --- /dev/null +++ b/common/data/src/test/java/org/thingsboard/server/common/data/StringUtilsTest.java @@ -0,0 +1,40 @@ +/** + * Copyright © 2016-2023 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.common.data; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class StringUtilsTest { + + @ParameterizedTest + @ValueSource(strings = { + "\000", "\u0000", " \000", " \000 ", "\000 ", "\000\000", "\000 \000", + "世\000界", "F0929906\000\000\000\000\000\000\000\000\000", + }) + void testContains0x00_thenTrue(String sample) { + assertThat(StringUtils.contains0x00(sample)).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = {"", " ", "abc", "世界", "\001", "\uD83D\uDC0C"}) + void testContains0x00_thenFalse(String sample) { + assertThat(StringUtils.contains0x00(sample)).isFalse(); + } + +} From 7177f8143c10f2601b4b12969bbd6887562080b9 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 31 Aug 2023 14:30:12 +0200 Subject: [PATCH 02/14] DeviceDataValidatorTest implemented to expose 0x00 problem in the device name --- .../validator/DeviceDataValidatorTest.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java new file mode 100644 index 0000000000..4e023ad6ac --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java @@ -0,0 +1,90 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.thingsboard.server.common.data.Device; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.customer.CustomerDao; +import org.thingsboard.server.dao.device.DeviceDao; +import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.ThrowableAssert.catchThrowableOfType; +import static org.mockito.BDDMockito.willReturn; + +@SpringBootTest(classes = DeviceDataValidator.class) +@Slf4j +class DeviceDataValidatorTest { + + @MockBean + DeviceDao deviceDao; + @MockBean + TenantService tenantService; + @MockBean + CustomerDao customerDao; + @Autowired + DeviceDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @ParameterizedTest + @ValueSource(strings = { + "coffee", "1", "big box", "世界", "!", "--", "~!@#$%^&*()_+=-/|\\[]{};:'`\"?<>,.", "\uD83D\uDC0C", "\041", + "Gdy Pomorze nie pomoże, to pomoże może morze, a gdy morze nie pomoże, to pomoże może Gdańsk", + }) + void testDeviceName_thenOK(final String name) { + Device device = new Device(); + device.setTenantId(tenantId); + device.setName(name); + validator.validateDataImpl(tenantId, device); + } + + @ParameterizedTest + @ValueSource(strings = { + "", " ", " ", "\n", "\r\n", "\t", "\000", "\000\000", "\001", "\002", "\040", "\u0000", "\u0000\u0000", + "F0929906\000\000\000\000\000\000\000\000\000", "\000\000\000F0929906", + "\u0000F0929906", "F092\u00009906", "F0929906\u0000" + }) + + void testDeviceName_thenDataValidationException(final String name) { + Device device = new Device(); + device.setTenantId(tenantId); + device.setName(name); + + DataValidationException exception = catchThrowableOfType(() -> + validator.validateDataImpl(tenantId, device), DataValidationException.class); + log.warn("Exception message: {}", exception == null ? null : exception.getMessage()); + + assertThatThrownBy(() -> validator.validateDataImpl(tenantId, device)) + .isInstanceOf(DataValidationException.class) + .hasMessageMatching(".*\\S.*"); + } + +} From 22c9aa3776a28fce36c902578bb5b66f47765ee5 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 31 Aug 2023 14:33:11 +0200 Subject: [PATCH 03/14] DeviceDataValidator: invalidate name containing 0x00 symbols --- .../server/dao/service/validator/DeviceDataValidator.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java index 51517a4dc2..a202aa257c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java @@ -64,6 +64,9 @@ public class DeviceDataValidator extends AbstractHasOtaPackageValidator if (StringUtils.isEmpty(device.getName()) || device.getName().trim().length() == 0) { throw new DataValidationException("Device name should be specified!"); } + if (StringUtils.contains0x00(device.getName())) { + throw new DataValidationException("Device name should not contain 0x00 symbol!"); + } if (device.getTenantId() == null) { throw new DataValidationException("Device should be assigned to tenant!"); } else { From f621c1026023ef543b7930a8ff24584d85df9aeb Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 1 Sep 2023 15:08:50 +0200 Subject: [PATCH 04/14] Tests added for JpaDeviceDao and DeviceService --- .../server/dao/service/DeviceServiceTest.java | 11 +++++++++++ .../server/dao/sql/device/JpaDeviceDaoTest.java | 15 +++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java index a2d3062cff..1073f20be4 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java @@ -283,6 +283,17 @@ public class DeviceServiceTest extends AbstractServiceTest { }); } + @Test + public void testSaveDeviceWithNameContains0x00_thenDataValidationException() { + Device device = new Device(); + device.setType("default"); + device.setTenantId(tenantId); + device.setName("F0929906\000\000\000\000\000\000\000\000\000"); + Assertions.assertThrows(DataValidationException.class, () -> { + deviceService.saveDevice(device); + }); + } + @Test public void testSaveDeviceWithInvalidTenant() { Device device = new Device(); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java index dc174b7423..c8e6c2cfc5 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java @@ -45,6 +45,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -101,6 +102,12 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { } } + @Test + public void testSaveDeviceName0x00_thenSomeDatabaseException() { + Device device = getDevice(tenantId1, customerId1, "\u0000"); + assertThatThrownBy(() -> deviceIds.add(deviceDao.save(TenantId.fromUUID(tenantId1), device).getUuidId())); + } + @Test public void testFindDevicesByTenantId() { PageLink pageLink = new PageLink(15, 0, PREFIX_FOR_DEVICE_NAME); @@ -155,16 +162,16 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { return savedDevicesUUID; } - private Device getDevice(UUID tenantId, UUID customerID, int number) { - return getDevice(tenantId, customerID, Uuids.timeBased(), number); + private Device getDevice(UUID tenantId, UUID customerID, Object nameSuffix) { + return getDevice(tenantId, customerID, Uuids.timeBased(), nameSuffix); } - private Device getDevice(UUID tenantId, UUID customerID, UUID deviceId, int number) { + private Device getDevice(UUID tenantId, UUID customerID, UUID deviceId, Object nameSuffix) { Device device = new Device(); device.setId(new DeviceId(deviceId)); device.setTenantId(TenantId.fromUUID(tenantId)); device.setCustomerId(new CustomerId(customerID)); - device.setName(PREFIX_FOR_DEVICE_NAME + number); + device.setName(PREFIX_FOR_DEVICE_NAME + nameSuffix); device.setDeviceProfileId(savedDeviceProfile.getId()); return device; } From c14719a4f843a6ddbfa4eef5db272afb09764ff4 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 1 Sep 2023 15:41:22 +0200 Subject: [PATCH 05/14] Asset tests: name validation added. validate name contains 0x00 as well to crush tests before fix --- .../server/dao/service/AssetServiceTest.java | 11 +++ .../validator/AssetDataValidatorTest.java | 89 +++++++++++++++++++ .../validator/DeviceDataValidatorTest.java | 2 +- .../server/dao/sql/asset/JpaAssetDaoTest.java | 7 ++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/AssetServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/AssetServiceTest.java index adb97196fd..ccddcb16bf 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/AssetServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/AssetServiceTest.java @@ -85,6 +85,17 @@ public class AssetServiceTest extends AbstractServiceTest { }); } + @Test + public void testSaveDeviceWithNameContains0x00_thenDataValidationException() { + Asset asset = new Asset(); + asset.setTenantId(tenantId); + asset.setType("default"); + asset.setName("F0929906\000\000\000\000\000\000\000\000\000"); + Assertions.assertThrows(DataValidationException.class, () -> { + assetService.saveAsset(asset); + }); + } + @Test public void testSaveAssetWithEmptyTenant() { Asset asset = new Asset(); diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java new file mode 100644 index 0000000000..c26f02ee1f --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java @@ -0,0 +1,89 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.thingsboard.server.common.data.asset.Asset; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.asset.AssetDao; +import org.thingsboard.server.dao.customer.CustomerDao; +import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.ThrowableAssert.catchThrowableOfType; +import static org.mockito.BDDMockito.willReturn; + +@SpringBootTest(classes = AssetDataValidator.class) +@Slf4j +class AssetDataValidatorTest { + + @MockBean + AssetDao assetDao; + @MockBean + TenantService tenantService; + @MockBean + CustomerDao customerDao; + @Autowired + AssetDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @ParameterizedTest + @ValueSource(strings = { + "coffee", "1", "big box", "世界", "!", "--", "~!@#$%^&*()_+=-/|\\[]{};:'`\"?<>,.", "\uD83D\uDC0C", "\041", + "Gdy Pomorze nie pomoże, to pomoże może morze, a gdy morze nie pomoże, to pomoże może Gdańsk", + }) + void testAssetName_thenOK(final String name) { + Asset asset = new Asset(); + asset.setTenantId(tenantId); + asset.setName(name); + validator.validateDataImpl(tenantId, asset); + } + + @ParameterizedTest + @ValueSource(strings = { + "", " ", " ", "\n", "\r\n", "\t", "\000", "\000\000", "\001", "\002", "\040", "\u0000", "\u0000\u0000", + "F0929906\000\000\000\000\000\000\000\000\000", "\000\000\000F0929906", + "\u0000F0929906", "F092\u00009906", "F0929906\u0000" + }) + void testAssetName_thenDataValidationException(final String name) { + Asset asset = new Asset(); + asset.setTenantId(tenantId); + asset.setName(name); + + DataValidationException exception = catchThrowableOfType(() -> + validator.validateDataImpl(tenantId, asset), DataValidationException.class); + log.warn("Exception message: {}", exception == null ? null : exception.getMessage()); + + assertThatThrownBy(() -> validator.validateDataImpl(tenantId, asset)) + .isInstanceOf(DataValidationException.class) + .hasMessageMatching(".*Asset.*"); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java index 4e023ad6ac..b1a83b034e 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java @@ -84,7 +84,7 @@ class DeviceDataValidatorTest { assertThatThrownBy(() -> validator.validateDataImpl(tenantId, device)) .isInstanceOf(DataValidationException.class) - .hasMessageMatching(".*\\S.*"); + .hasMessageMatching(".*Device.*"); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java index ef68465256..1ffb740553 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java @@ -44,6 +44,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -94,6 +95,12 @@ public class JpaAssetDaoTest extends AbstractJpaDaoTest { savedAssetProfiles.clear(); } + @Test + public void testSaveDeviceName0x00_thenSomeDatabaseException() { + assertThatThrownBy(() -> assets.add( + saveAsset(UUID.randomUUID(), tenantId2, customerId2, "F0929906\000\000\000\000\000\000\000\000\000"))); + } + @Test public void testFindAssetsByTenantId() { PageLink pageLink = new PageLink(20, 0, "ASSET_"); From 9e7a6500d2916e36cd784b3f0e5ebd9b50415e08 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 1 Sep 2023 15:42:27 +0200 Subject: [PATCH 06/14] Asset validator: validation that name does not contain 0x00 symbols --- .../server/dao/service/validator/AssetDataValidator.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java index 57ae7d3c5e..c89e50e01c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java @@ -67,6 +67,9 @@ public class AssetDataValidator extends DataValidator { if (StringUtils.isEmpty(asset.getName())) { throw new DataValidationException("Asset name should be specified!"); } + if (StringUtils.contains0x00(asset.getName())) { + throw new DataValidationException("Asset name should not contain 0x00 symbol!"); + } if (asset.getTenantId() == null) { throw new DataValidationException("Asset should be assigned to tenant!"); } else { From f46ba5aa936f45bf22f8fe1dc043449f626c5cc2 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 1 Sep 2023 15:43:56 +0200 Subject: [PATCH 07/14] Asset validator: validate that trimmed name has length (same as device validator) --- .../server/dao/service/validator/AssetDataValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java index c89e50e01c..9482ee265e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java @@ -64,7 +64,7 @@ public class AssetDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Asset asset) { - if (StringUtils.isEmpty(asset.getName())) { + if (StringUtils.isEmpty(asset.getName()) || asset.getName().trim().length() == 0) { throw new DataValidationException("Asset name should be specified!"); } if (StringUtils.contains0x00(asset.getName())) { From 608d3a6621c88ba8c500dceddf27ace9ecbc15be Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Mon, 4 Sep 2023 20:58:20 +0200 Subject: [PATCH 08/14] DataValidator: extracted validateName method from Asset and Device to use in all other validators. Tests added --- .../server/dao/service/DataValidator.java | 9 ++++ .../server/dao/service/DataValidatorTest.java | 44 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java index e4bc622354..74af7e5d1a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java @@ -86,6 +86,15 @@ public abstract class DataValidator> { public void validateDelete(TenantId tenantId, EntityId entityId) { } + protected void validateName(String dataType, String name) { + if (StringUtils.isEmpty(name) || name.trim().length() == 0) { + throw new DataValidationException(dataType + " name should be specified!"); + } + if (StringUtils.contains0x00(name)) { + throw new DataValidationException(dataType + " name should not contain 0x00 symbol!"); + } + } + protected boolean isSameData(D existentData, D actualData) { return actualData.getId() != null && existentData.getId().equals(actualData.getId()); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java index 40262ac2b8..4d9406eb65 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java @@ -15,12 +15,56 @@ */ package org.thingsboard.server.dao.service; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.thingsboard.server.dao.exception.DataValidationException; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.spy; + +@Slf4j public class DataValidatorTest { + DataValidator dataValidator; + + @BeforeEach + void setUp() { + dataValidator = spy(DataValidator.class); + } + + @ParameterizedTest + @ValueSource(strings = { + "coffee", "1", "big box", "世界", "!", "--", "~!@#$%^&*()_+=-/|\\[]{};:'`\"?<>,.", "\uD83D\uDC0C", "\041", + "Gdy Pomorze nie pomoże, to pomoże może morze, a gdy morze nie pomoże, to pomoże może Gdańsk", + }) + void testDeviceName_thenOK(final String name) { + dataValidator.validateName("Device", name); + dataValidator.validateName("Asset", name); + dataValidator.validateName("Customer", name); + dataValidator.validateName("Tenant", name); + } + + @ParameterizedTest + @ValueSource(strings = { + "", " ", " ", "\n", "\r\n", "\t", "\000", "\000\000", "\001", "\002", "\040", "\u0000", "\u0000\u0000", + "F0929906\000\000\000\000\000\000\000\000\000", "\000\000\000F0929906", + "\u0000F0929906", "F092\u00009906", "F0929906\u0000" + }) + void testDeviceName_thenDataValidationException(final String name) { + DataValidationException exception; + exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateName("Asset", name)); + log.warn("Exception message Asset: {}", exception.getMessage()); + assertThat(exception.getMessage()).as("message Asset").containsPattern("Asset .*name.*"); + + exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateName("Device", name)); + log.warn("Exception message Device: {}", exception.getMessage()); + assertThat(exception.getMessage()).as("message Device").containsPattern("Device .*name.*"); + } + @Test public void validateEmail() { String email = "aZ1_!#$%&'*+/=?`{|}~^.-@mail.io"; From 77d4a29f2ebee925ff81f06d4872516e72bb6c32 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Mon, 4 Sep 2023 21:10:23 +0200 Subject: [PATCH 09/14] DataValidatorTest: validateEmail refactored using parameterized tests --- .../server/dao/service/DataValidatorTest.java | 64 ++++--------------- 1 file changed, 14 insertions(+), 50 deletions(-) diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java index 4d9406eb65..0802852e65 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.service; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.thingsboard.server.dao.exception.DataValidationException; @@ -41,7 +40,7 @@ public class DataValidatorTest { "coffee", "1", "big box", "世界", "!", "--", "~!@#$%^&*()_+=-/|\\[]{};:'`\"?<>,.", "\uD83D\uDC0C", "\041", "Gdy Pomorze nie pomoże, to pomoże może morze, a gdy morze nie pomoże, to pomoże może Gdańsk", }) - void testDeviceName_thenOK(final String name) { + void validateName_thenOK(final String name) { dataValidator.validateName("Device", name); dataValidator.validateName("Asset", name); dataValidator.validateName("Customer", name); @@ -54,7 +53,7 @@ public class DataValidatorTest { "F0929906\000\000\000\000\000\000\000\000\000", "\000\000\000F0929906", "\u0000F0929906", "F092\u00009906", "F0929906\u0000" }) - void testDeviceName_thenDataValidationException(final String name) { + void validateName_thenDataValidationException(final String name) { DataValidationException exception; exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateName("Asset", name)); log.warn("Exception message Asset: {}", exception.getMessage()); @@ -65,56 +64,21 @@ public class DataValidatorTest { assertThat(exception.getMessage()).as("message Device").containsPattern("Device .*name.*"); } - @Test - public void validateEmail() { - String email = "aZ1_!#$%&'*+/=?`{|}~^.-@mail.io"; + @ParameterizedTest + @ValueSource(strings = { + "aZ1_!#$%&'*+/=?`{|}~^.-@mail.io", "support@thingsboard.io", + }) + public void validateEmail(String email) { DataValidator.validateEmail(email); } - @Test - public void validateInvalidEmail1() { - String email = "test:1@mail.io"; - Assertions.assertThrows(DataValidationException.class, () -> { - DataValidator.validateEmail(email); - }); - } - @Test - public void validateInvalidEmail2() { - String email = "test()1@mail.io"; - Assertions.assertThrows(DataValidationException.class, () -> { - DataValidator.validateEmail(email); - }); - } - - @Test - public void validateInvalidEmail3() { - String email = "test[]1@mail.io"; - Assertions.assertThrows(DataValidationException.class, () -> { - DataValidator.validateEmail(email); - }); - } - - @Test - public void validateInvalidEmail4() { - String email = "test\\1@mail.io"; - Assertions.assertThrows(DataValidationException.class, () -> { - DataValidator.validateEmail(email); - }); - } - - @Test - public void validateInvalidEmail5() { - String email = "test\"1@mail.io"; - Assertions.assertThrows(DataValidationException.class, () -> { - DataValidator.validateEmail(email); - }); + @ParameterizedTest + @ValueSource(strings = { + "test:1@mail.io", "test()1@mail.io", "test[]1@mail.io", + "test\\1@mail.io", "test\"1@mail.io", "test<>1@mail.io", + }) + public void validateEmailInvalid(String email) { + Assertions.assertThrows(DataValidationException.class, () -> DataValidator.validateEmail(email)); } - @Test - public void validateInvalidEmail6() { - String email = "test<>1@mail.io"; - Assertions.assertThrows(DataValidationException.class, () -> { - DataValidator.validateEmail(email); - }); - } } From 8224051d35298a0ee82a5721bd972e7492de2b64 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Mon, 4 Sep 2023 21:30:15 +0200 Subject: [PATCH 10/14] DataValidator: refactored validateName to have an exception Prefix to feet many entity types needs --- .../server/dao/service/DataValidator.java | 6 ++--- .../service/validator/AssetDataValidator.java | 7 +----- .../validator/DeviceDataValidator.java | 7 +----- .../server/dao/service/DataValidatorTest.java | 22 ++++++++++--------- .../validator/AssetDataValidatorTest.java | 14 +++++------- .../validator/DeviceDataValidatorTest.java | 15 +++++-------- 6 files changed, 27 insertions(+), 44 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java index 74af7e5d1a..b66c44ee62 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java @@ -86,12 +86,12 @@ public abstract class DataValidator> { public void validateDelete(TenantId tenantId, EntityId entityId) { } - protected void validateName(String dataType, String name) { + protected void validateName(String exceptionPrefix, String name) { if (StringUtils.isEmpty(name) || name.trim().length() == 0) { - throw new DataValidationException(dataType + " name should be specified!"); + throw new DataValidationException(exceptionPrefix + " should be specified!"); } if (StringUtils.contains0x00(name)) { - throw new DataValidationException(dataType + " name should not contain 0x00 symbol!"); + throw new DataValidationException(exceptionPrefix + " should not contain 0x00 symbol!"); } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java index 9482ee265e..871c27a4d7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java @@ -64,12 +64,7 @@ public class AssetDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Asset asset) { - if (StringUtils.isEmpty(asset.getName()) || asset.getName().trim().length() == 0) { - throw new DataValidationException("Asset name should be specified!"); - } - if (StringUtils.contains0x00(asset.getName())) { - throw new DataValidationException("Asset name should not contain 0x00 symbol!"); - } + validateName("Asset name", asset.getName()); if (asset.getTenantId() == null) { throw new DataValidationException("Asset should be assigned to tenant!"); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java index a202aa257c..22e7f75c5c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java @@ -61,12 +61,7 @@ public class DeviceDataValidator extends AbstractHasOtaPackageValidator @Override protected void validateDataImpl(TenantId tenantId, Device device) { - if (StringUtils.isEmpty(device.getName()) || device.getName().trim().length() == 0) { - throw new DataValidationException("Device name should be specified!"); - } - if (StringUtils.contains0x00(device.getName())) { - throw new DataValidationException("Device name should not contain 0x00 symbol!"); - } + validateName("Device name", device.getName()); if (device.getTenantId() == null) { throw new DataValidationException("Device should be assigned to tenant!"); } else { diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java index 0802852e65..440cb5b663 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java @@ -41,10 +41,12 @@ public class DataValidatorTest { "Gdy Pomorze nie pomoże, to pomoże może morze, a gdy morze nie pomoże, to pomoże może Gdańsk", }) void validateName_thenOK(final String name) { - dataValidator.validateName("Device", name); - dataValidator.validateName("Asset", name); - dataValidator.validateName("Customer", name); - dataValidator.validateName("Tenant", name); + dataValidator.validateName("Device name", name); + dataValidator.validateName("Asset name", name); + dataValidator.validateName("Asset profile name", name); + dataValidator.validateName("Alarm type", name); + dataValidator.validateName("Customer name", name); + dataValidator.validateName("Tenant name", name); } @ParameterizedTest @@ -55,13 +57,13 @@ public class DataValidatorTest { }) void validateName_thenDataValidationException(final String name) { DataValidationException exception; - exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateName("Asset", name)); - log.warn("Exception message Asset: {}", exception.getMessage()); - assertThat(exception.getMessage()).as("message Asset").containsPattern("Asset .*name.*"); + exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateName("Asset name", name)); + log.warn("Exception message Asset name: {}", exception.getMessage()); + assertThat(exception.getMessage()).as("message Asset name").containsPattern("Asset name .*"); - exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateName("Device", name)); - log.warn("Exception message Device: {}", exception.getMessage()); - assertThat(exception.getMessage()).as("message Device").containsPattern("Device .*name.*"); + exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateName("Device name", name)); + log.warn("Exception message Device name: {}", exception.getMessage()); + assertThat(exception.getMessage()).as("message Device name").containsPattern("Device name .*"); } @ParameterizedTest diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java index c26f02ee1f..7922cdacfa 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetDataValidatorTest.java @@ -16,6 +16,7 @@ package org.thingsboard.server.dao.service.validator; import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -31,8 +32,7 @@ import org.thingsboard.server.dao.tenant.TenantService; import java.util.UUID; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.assertj.core.api.ThrowableAssert.catchThrowableOfType; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.willReturn; @SpringBootTest(classes = AssetDataValidator.class) @@ -77,13 +77,9 @@ class AssetDataValidatorTest { asset.setTenantId(tenantId); asset.setName(name); - DataValidationException exception = catchThrowableOfType(() -> - validator.validateDataImpl(tenantId, asset), DataValidationException.class); - log.warn("Exception message: {}", exception == null ? null : exception.getMessage()); - - assertThatThrownBy(() -> validator.validateDataImpl(tenantId, asset)) - .isInstanceOf(DataValidationException.class) - .hasMessageMatching(".*Asset.*"); + DataValidationException exception = Assertions.assertThrows(DataValidationException.class, () -> validator.validateDataImpl(tenantId, asset)); + log.warn("Exception message: {}", exception.getMessage()); + assertThat(exception.getMessage()).as("message Asset name").containsPattern("Asset name .*"); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java index b1a83b034e..4c4ed5a0e2 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceDataValidatorTest.java @@ -16,6 +16,7 @@ package org.thingsboard.server.dao.service.validator; import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -31,8 +32,7 @@ import org.thingsboard.server.dao.tenant.TenantService; import java.util.UUID; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.assertj.core.api.ThrowableAssert.catchThrowableOfType; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.willReturn; @SpringBootTest(classes = DeviceDataValidator.class) @@ -72,19 +72,14 @@ class DeviceDataValidatorTest { "F0929906\000\000\000\000\000\000\000\000\000", "\000\000\000F0929906", "\u0000F0929906", "F092\u00009906", "F0929906\u0000" }) - void testDeviceName_thenDataValidationException(final String name) { Device device = new Device(); device.setTenantId(tenantId); device.setName(name); - DataValidationException exception = catchThrowableOfType(() -> - validator.validateDataImpl(tenantId, device), DataValidationException.class); - log.warn("Exception message: {}", exception == null ? null : exception.getMessage()); - - assertThatThrownBy(() -> validator.validateDataImpl(tenantId, device)) - .isInstanceOf(DataValidationException.class) - .hasMessageMatching(".*Device.*"); + DataValidationException exception = Assertions.assertThrows(DataValidationException.class, () -> validator.validateDataImpl(tenantId, device)); + log.warn("Exception message: {}", exception.getMessage()); + assertThat(exception.getMessage()).as("message Device name").containsPattern("Device name .*"); } } From f27ac2cc51d9e1c1766f2d4a8d7f422fccde9a0e Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Tue, 5 Sep 2023 12:10:44 +0200 Subject: [PATCH 11/14] DataValidator validateQueueNameOrTopic added check for non-empty string with test --- .../server/dao/service/DataValidator.java | 6 +++--- .../server/dao/service/DataValidatorTest.java | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java index b66c44ee62..3c1723be8c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java @@ -86,7 +86,7 @@ public abstract class DataValidator> { public void validateDelete(TenantId tenantId, EntityId entityId) { } - protected void validateName(String exceptionPrefix, String name) { + public void validateName(String exceptionPrefix, String name) { if (StringUtils.isEmpty(name) || name.trim().length() == 0) { throw new DataValidationException(exceptionPrefix + " should be specified!"); } @@ -160,8 +160,8 @@ public abstract class DataValidator> { validateQueueNameOrTopic(topic, TOPIC); } - private static void validateQueueNameOrTopic(String value, String fieldName) { - if (StringUtils.isEmpty(value)) { + static void validateQueueNameOrTopic(String value, String fieldName) { + if (StringUtils.isEmpty(value) || value.trim().length() == 0 ) { throw new DataValidationException(String.format("Queue %s should be specified!", fieldName)); } if (!QUEUE_PATTERN.matcher(value).matches()) { diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java index 440cb5b663..a0217c06c8 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java @@ -83,4 +83,25 @@ public class DataValidatorTest { Assertions.assertThrows(DataValidationException.class, () -> DataValidator.validateEmail(email)); } + @ParameterizedTest + @ValueSource(strings = { + "azAZ09_.-", "topic", + }) + public void validateQueueNameOrTopic(String value) { + DataValidator.validateQueueNameOrTopic(value, "name"); + DataValidator.validateQueueNameOrTopic(value, "topic"); + } + + @ParameterizedTest + @ValueSource(strings = { + "", " ", " ", "\n", "\r\n", "\t", "\000", "\000\000", "\001", "\002", "\040", "\u0000", "\u0000\u0000", + "topic@home", "!", ",", "Łódź", + "\uD83D\uDC0C", "\041", + "F0929906\000\000\000\000\000\000\000\000\000", + }) + public void validateQueueNameOrTopicInvalid(String value) { + Assertions.assertThrows(DataValidationException.class, () -> DataValidator.validateQueueNameOrTopic(value, "name")); + Assertions.assertThrows(DataValidationException.class, () -> DataValidator.validateQueueNameOrTopic(value, "topic")); + } + } From 71434dbb468d3718cb92f06eefb37ca03bc1603b Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Tue, 5 Sep 2023 12:11:26 +0200 Subject: [PATCH 12/14] WidgetTypeDataValidator resolver merge conflicts --- .../validator/AdminSettingsDataValidator.java | 6 +- .../service/validator/AlarmDataValidator.java | 5 +- .../service/validator/AssetDataValidator.java | 1 - .../validator/AssetProfileDataValidator.java | 4 +- .../BaseOtaPackageDataValidator.java | 13 +-- .../ComponentDescriptorDataValidator.java | 4 +- .../validator/CustomerDataValidator.java | 4 +- .../validator/DashboardDataValidator.java | 9 +- .../validator/DeviceDataValidator.java | 1 - .../validator/DeviceProfileDataValidator.java | 4 +- .../service/validator/EdgeDataValidator.java | 8 +- .../validator/EntityViewDataValidator.java | 9 +- .../validator/ResourceDataValidator.java | 4 +- .../validator/RuleChainDataValidator.java | 5 +- .../validator/TenantDataValidator.java | 4 +- .../validator/TenantProfileDataValidator.java | 5 +- .../validator/WidgetTypeDataValidator.java | 6 +- .../validator/WidgetsBundleDataValidator.java | 5 +- .../AdminSettingsDataValidatorTest.java | 50 +++++++++++ .../validator/AlarmDataValidatorTest.java | 61 ++++++++++++++ .../AssetProfileDataValidatorTest.java | 71 ++++++++++++++++ .../BaseOtaPackageDataValidatorTest.java | 61 ++++++++++++++ .../ComponentDescriptorDataValidatorTest.java | 43 ++++++++++ .../validator/CustomerDataValidatorTest.java | 59 +++++++++++++ .../validator/DashboardDataValidatorTest.java | 56 +++++++++++++ .../DeviceProfileDataValidatorTest.java | 83 +++++++++++++++++++ .../validator/EdgeDataValidatorTest.java | 66 +++++++++++++++ .../EntityViewDataValidatorTest.java | 64 ++++++++++++++ .../validator/ResourceDataValidatorTest.java | 69 +++++++++++++++ .../validator/RuleChainDataValidatorTest.java | 64 ++++++++++++++ .../validator/TenantDataValidatorTest.java | 49 +++++++++++ .../TenantProfileDataValidatorTest.java | 56 +++++++++++++ .../WidgetTypeDataValidatorTest.java | 65 +++++++++++++++ .../WidgetsBundleDataValidatorTest.java | 59 +++++++++++++ 34 files changed, 1001 insertions(+), 72 deletions(-) create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/AlarmDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/CustomerDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/DashboardDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/EdgeDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/ResourceDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidatorTest.java diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java index 692690f328..1d36f9ec17 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.service.validator; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.AdminSettings; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; @@ -49,12 +48,9 @@ public class AdminSettingsDataValidator extends DataValidator { return existentAdminSettings; } - @Override protected void validateDataImpl(TenantId tenantId, AdminSettings adminSettings) { - if (StringUtils.isEmpty(adminSettings.getKey())) { - throw new DataValidationException("Key should be specified!"); - } + validateName("Key", adminSettings.getKey()); if (adminSettings.getJsonValue() == null) { throw new DataValidationException("Json value should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java index 2c76fd2bff..252a4acabe 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java @@ -17,7 +17,6 @@ package org.thingsboard.server.dao.service.validator; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.exception.DataValidationException; @@ -32,9 +31,7 @@ public class AlarmDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Alarm alarm) { - if (StringUtils.isEmpty(alarm.getType())) { - throw new DataValidationException("Alarm type should be specified!"); - } + validateName("Alarm type", alarm.getType()); if (alarm.getOriginator() == null) { throw new DataValidationException("Alarm originator should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java index 871c27a4d7..59e41f1e61 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java @@ -20,7 +20,6 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java index d206dfefba..86981b5897 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java @@ -53,9 +53,7 @@ public class AssetProfileDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, AssetProfile assetProfile) { - if (StringUtils.isEmpty(assetProfile.getName())) { - throw new DataValidationException("Asset profile name should be specified!"); - } + validateName("Asset profile name", assetProfile.getName()); if (assetProfile.getTenantId() == null) { throw new DataValidationException("Asset profile should be assigned to tenant!"); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java index df37676688..3297f73f52 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.service.validator; +import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.thingsboard.server.common.data.BaseData; @@ -31,23 +32,27 @@ import java.util.Objects; public abstract class BaseOtaPackageDataValidator> extends DataValidator { @Autowired + @Getter @Lazy private TenantService tenantService; @Autowired + @Getter private DeviceProfileDao deviceProfileDao; protected void validateImpl(OtaPackageInfo otaPackageInfo) { + validateName("OtaPackage title", otaPackageInfo.getTitle()); + if (otaPackageInfo.getTenantId() == null) { throw new DataValidationException("OtaPackage should be assigned to tenant!"); } else { - if (!tenantService.tenantExists(otaPackageInfo.getTenantId())) { + if (!getTenantService().tenantExists(otaPackageInfo.getTenantId())) { throw new DataValidationException("OtaPackage is referencing to non-existent tenant!"); } } if (otaPackageInfo.getDeviceProfileId() != null) { - DeviceProfile deviceProfile = deviceProfileDao.findById(otaPackageInfo.getTenantId(), otaPackageInfo.getDeviceProfileId().getId()); + DeviceProfile deviceProfile = getDeviceProfileDao().findById(otaPackageInfo.getTenantId(), otaPackageInfo.getDeviceProfileId().getId()); if (deviceProfile == null) { throw new DataValidationException("OtaPackage is referencing to non-existent device profile!"); } @@ -57,10 +62,6 @@ public abstract class BaseOtaPackageDataValidator> extends throw new DataValidationException("Type should be specified!"); } - if (StringUtils.isEmpty(otaPackageInfo.getTitle())) { - throw new DataValidationException("OtaPackage title should be specified!"); - } - if (StringUtils.isEmpty(otaPackageInfo.getVersion())) { throw new DataValidationException("OtaPackage version should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java index 831b81a6fc..b3d5f56068 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java @@ -27,15 +27,13 @@ public class ComponentDescriptorDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Customer customer) { - if (StringUtils.isEmpty(customer.getTitle())) { - throw new DataValidationException("Customer title should be specified!"); - } + validateName("Customer title", customer.getTitle()); if (customer.getTitle().equals(CustomerServiceImpl.PUBLIC_CUSTOMER_TITLE)) { throw new DataValidationException("'Public' title for customer is system reserved!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java index 246944199a..5238fb2898 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java @@ -19,9 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.dashboard.DashboardDao; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantService; @@ -29,9 +27,6 @@ import org.thingsboard.server.dao.tenant.TenantService; @Component public class DashboardDataValidator extends DataValidator { - @Autowired - private DashboardDao dashboardDao; - @Autowired private TenantService tenantService; @@ -42,9 +37,7 @@ public class DashboardDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Dashboard dashboard) { - if (StringUtils.isEmpty(dashboard.getTitle())) { - throw new DataValidationException("Dashboard title should be specified!"); - } + validateName("Dashboard title", dashboard.getTitle()); if (dashboard.getTenantId() == null) { throw new DataValidationException("Dashboard should be assigned to tenant!"); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java index 22e7f75c5c..2e02d4cf56 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java @@ -20,7 +20,6 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.device.data.DeviceTransportConfiguration; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java index bd4bf04c45..828fdad610 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java @@ -103,9 +103,7 @@ public class DeviceProfileDataValidator extends AbstractHasOtaPackageValidator { @Override protected void validateDataImpl(TenantId tenantId, Edge edge) { - if (StringUtils.isEmpty(edge.getType())) { - throw new DataValidationException("Edge type should be specified!"); - } - if (StringUtils.isEmpty(edge.getName())) { - throw new DataValidationException("Edge name should be specified!"); - } + validateName("Edge name", edge.getName()); + validateName("Edge type", edge.getType()); if (StringUtils.isEmpty(edge.getSecret())) { throw new DataValidationException("Edge secret should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidator.java index dddae3195d..f8916b77f5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidator.java @@ -19,7 +19,6 @@ import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.EntityView; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.customer.CustomerDao; @@ -59,12 +58,8 @@ public class EntityViewDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, EntityView entityView) { - if (StringUtils.isEmpty(entityView.getType())) { - throw new DataValidationException("Entity View type should be specified!"); - } - if (StringUtils.isEmpty(entityView.getName())) { - throw new DataValidationException("Entity view name should be specified!"); - } + validateName("Entity view name", entityView.getName()); + validateName("Entity view type", entityView.getType()); if (entityView.getTenantId() == null) { throw new DataValidationException("Entity view should be assigned to tenant!"); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java index 9939d887fa..1c1bea5cb5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java @@ -66,9 +66,7 @@ public class ResourceDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, TbResource resource) { - if (StringUtils.isEmpty(resource.getTitle())) { - throw new DataValidationException("Resource title should be specified!"); - } + validateName("Resource title", resource.getTitle()); if (resource.getResourceType() == null) { throw new DataValidationException("Resource type should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidator.java index 5450e29706..230b4cfc62 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidator.java @@ -23,7 +23,6 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.rule.NodeConnectionInfo; import org.thingsboard.server.common.data.rule.RuleChain; @@ -65,9 +64,7 @@ public class RuleChainDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, RuleChain ruleChain) { - if (StringUtils.isEmpty(ruleChain.getName())) { - throw new DataValidationException("Rule chain name should be specified!"); - } + validateName("Rule chain name", ruleChain.getName()); if (ruleChain.getType() == null) { ruleChain.setType(RuleChainType.CORE); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantDataValidator.java index c6e8e055a5..058ca0c889 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantDataValidator.java @@ -32,9 +32,7 @@ public class TenantDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Tenant tenant) { - if (StringUtils.isEmpty(tenant.getTitle())) { - throw new DataValidationException("Tenant title should be specified!"); - } + validateName("Tenant title", tenant.getTitle()); if (!StringUtils.isEmpty(tenant.getEmail())) { validateEmail(tenant.getEmail()); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidator.java index aa166ba12e..362cb95e76 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidator.java @@ -19,7 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.DataConstants; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.queue.ProcessingStrategy; @@ -48,9 +47,7 @@ public class TenantProfileDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, TenantProfile tenantProfile) { - if (StringUtils.isEmpty(tenantProfile.getName())) { - throw new DataValidationException("Tenant profile name should be specified!"); - } + validateName("Tenant profile name", tenantProfile.getName()); if (tenantProfile.getProfileData() == null) { throw new DataValidationException("Tenant profile data should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java index 1cec787b0f..f364a4a40a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java @@ -17,7 +17,6 @@ package org.thingsboard.server.dao.service.validator; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetTypeDetails; @@ -39,9 +38,8 @@ public class WidgetTypeDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, WidgetTypeDetails widgetTypeDetails) { - if (StringUtils.isEmpty(widgetTypeDetails.getName())) { - throw new DataValidationException("Widgets type name should be specified!"); - } + validateName("Widgets type name", widgetTypeDetails.getName()); + validateName("Widgets type bundle alias", widgetTypeDetails.getBundleAlias()); if (widgetTypeDetails.getDescriptor() == null || widgetTypeDetails.getDescriptor().size() == 0) { throw new DataValidationException("Widgets type descriptor can't be empty!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidator.java index 8c730398ed..40bf75d903 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidator.java @@ -17,7 +17,6 @@ package org.thingsboard.server.dao.service.validator; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.dao.exception.DataValidationException; @@ -35,9 +34,7 @@ public class WidgetsBundleDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, WidgetsBundle widgetsBundle) { - if (StringUtils.isEmpty(widgetsBundle.getTitle())) { - throw new DataValidationException("Widgets bundle title should be specified!"); - } + validateName("Widgets bundle title", widgetsBundle.getTitle()); if (widgetsBundle.getTenantId() == null) { widgetsBundle.setTenantId(TenantId.fromUUID(ModelConstants.NULL_UUID)); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidatorTest.java new file mode 100644 index 0000000000..1408f1934d --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidatorTest.java @@ -0,0 +1,50 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.server.common.data.AdminSettings; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.settings.AdminSettingsService; + +import java.util.UUID; + +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = AdminSettingsDataValidator.class) +class AdminSettingsDataValidatorTest { + + @MockBean + AdminSettingsService adminSettingsService; + @SpyBean + AdminSettingsDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @Test + void testValidateNameInvocation() { + AdminSettings adminSettings = new AdminSettings(); + adminSettings.setKey("jwt"); + adminSettings.setJsonValue(JacksonUtil.toJsonNode("{}")); + + validator.validateDataImpl(tenantId, adminSettings); + verify(validator).validateName("Key", adminSettings.getKey()); + } + +} \ No newline at end of file diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AlarmDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AlarmDataValidatorTest.java new file mode 100644 index 0000000000..153b147e97 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AlarmDataValidatorTest.java @@ -0,0 +1,61 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmSeverity; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = AlarmDataValidator.class) +class AlarmDataValidatorTest { + + @MockBean + TenantService tenantService; + @SpyBean + AlarmDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + Alarm alarm = new Alarm(); + alarm.setType("overheating"); + alarm.setOriginator(tenantId); + alarm.setSeverity(AlarmSeverity.CRITICAL); + alarm.setCleared(false); + alarm.setAcknowledged(false); + alarm.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, alarm); + verify(validator).validateName("Alarm type", alarm.getType()); + } + +} \ No newline at end of file diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidatorTest.java new file mode 100644 index 0000000000..d0958649a0 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidatorTest.java @@ -0,0 +1,71 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.asset.AssetProfile; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.asset.AssetProfileDao; +import org.thingsboard.server.dao.asset.AssetProfileService; +import org.thingsboard.server.dao.dashboard.DashboardService; +import org.thingsboard.server.dao.queue.QueueService; +import org.thingsboard.server.dao.rule.RuleChainService; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = AssetProfileDataValidator.class) +class AssetProfileDataValidatorTest { + + @MockBean + AssetProfileDao assetProfileDao; + @MockBean + AssetProfileService assetProfileService; + @MockBean + TenantService tenantService; + @MockBean + QueueService queueService; + @MockBean + RuleChainService ruleChainService; + @MockBean + DashboardService dashboardService; + @SpyBean + AssetProfileDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + AssetProfile assetProfile = new AssetProfile(); + assetProfile.setName("prod"); + assetProfile.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, assetProfile); + verify(validator).validateName("Asset profile name", assetProfile.getName()); + } + +} \ No newline at end of file diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidatorTest.java new file mode 100644 index 0000000000..3f35a2d7c1 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidatorTest.java @@ -0,0 +1,61 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.thingsboard.server.common.data.OtaPackageInfo; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.ota.OtaPackageType; +import org.thingsboard.server.dao.device.DeviceProfileDao; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +class BaseOtaPackageDataValidatorTest { + + + DeviceProfileDao deviceProfileDao = mock(DeviceProfileDao.class); + TenantService tenantService = mock(TenantService.class); + BaseOtaPackageDataValidator validator = spy(BaseOtaPackageDataValidator.class); + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + willReturn(tenantService).given(validator).getTenantService(); + willReturn(deviceProfileDao).given(validator).getDeviceProfileDao(); + } + + @Test + void testValidateNameInvocation() { + OtaPackageInfo otaPackageInfo = new OtaPackageInfo(); + otaPackageInfo.setTitle("fw"); + otaPackageInfo.setVersion("1.0"); + otaPackageInfo.setType(OtaPackageType.FIRMWARE); + otaPackageInfo.setTenantId(tenantId); + + validator.validateImpl(otaPackageInfo); + verify(validator).validateName("OtaPackage title", otaPackageInfo.getTitle()); + } + + +} \ No newline at end of file diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidatorTest.java new file mode 100644 index 0000000000..9b214a3150 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidatorTest.java @@ -0,0 +1,43 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.plugin.ComponentDescriptor; +import org.thingsboard.server.common.data.plugin.ComponentScope; +import org.thingsboard.server.common.data.plugin.ComponentType; + +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = ComponentDescriptorDataValidator.class) +class ComponentDescriptorDataValidatorTest { + @SpyBean + ComponentDescriptorDataValidator validator; + + @Test + void testValidateNameInvocation() { + ComponentDescriptor plugin = new ComponentDescriptor(); + plugin.setType(ComponentType.ENRICHMENT); + plugin.setScope(ComponentScope.SYSTEM); + plugin.setName("originator attributes"); + plugin.setClazz("org.thingsboard.rule.engine.metadata.TbGetAttributesNode"); + validator.validateDataImpl(TenantId.SYS_TENANT_ID, plugin); + verify(validator).validateName("Component name", plugin.getName()); + } +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/CustomerDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/CustomerDataValidatorTest.java new file mode 100644 index 0000000000..5935278948 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/CustomerDataValidatorTest.java @@ -0,0 +1,59 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.Customer; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.customer.CustomerDao; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = CustomerDataValidator.class) +class CustomerDataValidatorTest { + + @MockBean + CustomerDao customerDao; + @MockBean + TenantService tenantService; + @SpyBean + CustomerDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + Customer customer = new Customer(); + customer.setTitle("Customer A"); + customer.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, customer); + verify(validator).validateName("Customer title", customer.getTitle()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DashboardDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DashboardDataValidatorTest.java new file mode 100644 index 0000000000..7a0990a742 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DashboardDataValidatorTest.java @@ -0,0 +1,56 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.Dashboard; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = DashboardDataValidator.class) +class DashboardDataValidatorTest { + + @MockBean + TenantService tenantService; + @SpyBean + DashboardDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + Dashboard dashboard = new Dashboard(); + dashboard.setTitle("flight control"); + dashboard.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, dashboard); + verify(validator).validateName("Dashboard title", dashboard.getTitle()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidatorTest.java new file mode 100644 index 0000000000..483b8a55f6 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidatorTest.java @@ -0,0 +1,83 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.DeviceProfile; +import org.thingsboard.server.common.data.DeviceProfileType; +import org.thingsboard.server.common.data.DeviceTransportType; +import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileTransportConfiguration; +import org.thingsboard.server.common.data.device.profile.DeviceProfileData; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.dashboard.DashboardService; +import org.thingsboard.server.dao.device.DeviceDao; +import org.thingsboard.server.dao.device.DeviceProfileDao; +import org.thingsboard.server.dao.device.DeviceProfileService; +import org.thingsboard.server.dao.queue.QueueService; +import org.thingsboard.server.dao.rule.RuleChainService; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = DeviceProfileDataValidator.class) +class DeviceProfileDataValidatorTest { + + @MockBean + DeviceProfileDao deviceProfileDao; + @MockBean + DeviceProfileService deviceProfileService; + @MockBean + DeviceDao deviceDao; + @MockBean + TenantService tenantService; + @MockBean + QueueService queueService; + @MockBean + RuleChainService ruleChainService; + @MockBean + DashboardService dashboardService; + @SpyBean + DeviceProfileDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + DeviceProfile deviceProfile = new DeviceProfile(); + deviceProfile.setName("default"); + deviceProfile.setType(DeviceProfileType.DEFAULT); + deviceProfile.setTransportType(DeviceTransportType.DEFAULT); + DeviceProfileData data = new DeviceProfileData(); + data.setTransportConfiguration(new DefaultDeviceProfileTransportConfiguration()); + deviceProfile.setProfileData(data); + deviceProfile.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, deviceProfile); + verify(validator).validateName("Device profile name", deviceProfile.getName()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/EdgeDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/EdgeDataValidatorTest.java new file mode 100644 index 0000000000..26ce237eab --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/EdgeDataValidatorTest.java @@ -0,0 +1,66 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.customer.CustomerDao; +import org.thingsboard.server.dao.edge.EdgeDao; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = EdgeDataValidator.class) +class EdgeDataValidatorTest { + + @MockBean + EdgeDao edgeDao; + @MockBean + TenantService tenantService; + @MockBean + CustomerDao customerDao; + @SpyBean + EdgeDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + Edge edge = new Edge(); + edge.setName("Edge 007"); + edge.setType("Silos"); + edge.setSecret("secret"); + edge.setRoutingKey("53c56104-d302-4d6e-97f5-a7a99c7effdc"); + edge.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, edge); + verify(validator).validateName("Edge name", edge.getName()); + verify(validator).validateName("Edge type", edge.getType()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidatorTest.java new file mode 100644 index 0000000000..019e89f103 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidatorTest.java @@ -0,0 +1,64 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.EntityView; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.customer.CustomerDao; +import org.thingsboard.server.dao.entityview.EntityViewDao; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = EntityViewDataValidator.class) +class EntityViewDataValidatorTest { + + @MockBean + EntityViewDao entityViewDao; + @MockBean + TenantService tenantService; + @MockBean + CustomerDao customerDao; + @SpyBean + EntityViewDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + EntityView entityView = new EntityView(); + entityView.setName("view"); + entityView.setType("default"); + entityView.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, entityView); + verify(validator).validateName("Entity view name", entityView.getName()); + verify(validator).validateName("Entity view type", entityView.getType()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/ResourceDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/ResourceDataValidatorTest.java new file mode 100644 index 0000000000..a49896f52f --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/ResourceDataValidatorTest.java @@ -0,0 +1,69 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.ResourceType; +import org.thingsboard.server.common.data.TbResource; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.resource.TbResourceDao; +import org.thingsboard.server.dao.tenant.TbTenantProfileCache; +import org.thingsboard.server.dao.tenant.TenantService; +import org.thingsboard.server.dao.widget.WidgetTypeDao; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = ResourceDataValidator.class) +class ResourceDataValidatorTest { + + @MockBean + TbResourceDao resourceDao; + @MockBean + WidgetTypeDao widgetTypeDao; + @MockBean + TenantService tenantService; + @MockBean + TbTenantProfileCache tenantProfileCache; + @SpyBean + ResourceDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + TbResource resource = new TbResource(); + resource.setTitle("rss"); + resource.setResourceType(ResourceType.PKCS_12); + resource.setFileName("cert.pem"); + resource.setResourceKey("19_1.0"); + resource.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, resource); + verify(validator).validateName("Resource title", resource.getTitle()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidatorTest.java new file mode 100644 index 0000000000..15570247d3 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidatorTest.java @@ -0,0 +1,64 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.rule.RuleChain; +import org.thingsboard.server.common.data.rule.RuleChainType; +import org.thingsboard.server.dao.rule.RuleChainDao; +import org.thingsboard.server.dao.rule.RuleChainService; +import org.thingsboard.server.dao.tenant.TenantService; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = RuleChainDataValidator.class) +class RuleChainDataValidatorTest { + + @MockBean + RuleChainDao ruleChainDao; + @MockBean + RuleChainService ruleChainService; + @MockBean + TenantService tenantService; + @SpyBean + RuleChainDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + RuleChain ruleChain = new RuleChain(); + ruleChain.setName("generate daily report"); + ruleChain.setType(RuleChainType.CORE); + ruleChain.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, ruleChain); + verify(validator).validateName("Rule chain name", ruleChain.getName()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantDataValidatorTest.java new file mode 100644 index 0000000000..00b6644da8 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantDataValidatorTest.java @@ -0,0 +1,49 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.Tenant; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.tenant.TenantDao; + +import java.util.UUID; + +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = TenantDataValidator.class) +class TenantDataValidatorTest { + + @MockBean + TenantDao tenantDao; + @SpyBean + TenantDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @Test + void testValidateNameInvocation() { + Tenant tenant = new Tenant(); + tenant.setTitle("Monster corporation ©"); + tenant.setEmail("support@thingsboard.io"); + + validator.validateDataImpl(tenantId, tenant); + verify(validator).validateName("Tenant title", tenant.getTitle()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidatorTest.java new file mode 100644 index 0000000000..2f1070bcf7 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidatorTest.java @@ -0,0 +1,56 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.TenantProfile; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; +import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; +import org.thingsboard.server.dao.tenant.TenantProfileDao; +import org.thingsboard.server.dao.tenant.TenantProfileService; + +import java.util.UUID; + +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = TenantProfileDataValidator.class) +class TenantProfileDataValidatorTest { + + @MockBean + TenantProfileDao tenantProfileDao; + @MockBean + TenantProfileService tenantProfileService; + @SpyBean + TenantProfileDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @Test + void testValidateNameInvocation() { + TenantProfile tenantProfile = new TenantProfile(); + tenantProfile.setName("Sandbox"); + TenantProfileData tenantProfileData = new TenantProfileData(); + tenantProfileData.setConfiguration(new DefaultTenantProfileConfiguration()); + tenantProfile.setProfileData(tenantProfileData); + + validator.validateDataImpl(tenantId, tenantProfile); + verify(validator).validateName("Tenant profile name", tenantProfile.getName()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java new file mode 100644 index 0000000000..5ef17f9c35 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java @@ -0,0 +1,65 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.widget.WidgetTypeDetails; +import org.thingsboard.server.dao.tenant.TenantService; +import org.thingsboard.server.dao.widget.WidgetTypeDao; +import org.thingsboard.server.dao.widget.WidgetsBundleDao; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = WidgetTypeDataValidator.class) +class WidgetTypeDataValidatorTest { + @MockBean + WidgetTypeDao widgetTypeDao; + @MockBean + WidgetsBundleDao widgetsBundleDao; + @MockBean + TenantService tenantService; + @SpyBean + WidgetTypeDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + WidgetTypeDetails widgetTypeDetails = new WidgetTypeDetails(); + widgetTypeDetails.setName("widget type gas"); + widgetTypeDetails.setBundleAlias("Widget bundle fuel"); + widgetTypeDetails.setDescriptor(JacksonUtil.toJsonNode("{\"content\":\"empty\"}")); + widgetTypeDetails.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, widgetTypeDetails); + verify(validator).validateName("Widgets type name", widgetTypeDetails.getName()); + verify(validator).validateName("Widgets type bundle alias", widgetTypeDetails.getBundleAlias()); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidatorTest.java new file mode 100644 index 0000000000..ec592ea949 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidatorTest.java @@ -0,0 +1,59 @@ +/** + * Copyright © 2016-2023 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.dao.service.validator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.widget.WidgetsBundle; +import org.thingsboard.server.dao.tenant.TenantService; +import org.thingsboard.server.dao.widget.WidgetsBundleDao; + +import java.util.UUID; + +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +@SpringBootTest(classes = WidgetsBundleDataValidator.class) +class WidgetsBundleDataValidatorTest { + + @MockBean + WidgetsBundleDao widgetsBundleDao; + @MockBean + TenantService tenantService; + @SpyBean + WidgetsBundleDataValidator validator; + TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); + + @BeforeEach + void setUp() { + willReturn(true).given(tenantService).tenantExists(tenantId); + } + + @Test + void testValidateNameInvocation() { + WidgetsBundle widgetsBundle = new WidgetsBundle(); + widgetsBundle.setTitle("my fancy WB"); + widgetsBundle.setTenantId(tenantId); + + validator.validateDataImpl(tenantId, widgetsBundle); + verify(validator).validateName("Widgets bundle title", widgetsBundle.getTitle()); + } + +} From e69009c1128a8a1c8368282a176529f25cacfc51 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Tue, 5 Sep 2023 14:02:22 +0200 Subject: [PATCH 13/14] WidgetTypeDataValidator - removed bundleAlias validation because it removed from WidgetTypeDetails --- .../server/dao/service/validator/WidgetTypeDataValidator.java | 2 -- .../dao/service/validator/WidgetTypeDataValidatorTest.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java index f364a4a40a..27728025e6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java @@ -20,7 +20,6 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetTypeDetails; -import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.service.DataValidator; @@ -39,7 +38,6 @@ public class WidgetTypeDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, WidgetTypeDetails widgetTypeDetails) { validateName("Widgets type name", widgetTypeDetails.getName()); - validateName("Widgets type bundle alias", widgetTypeDetails.getBundleAlias()); if (widgetTypeDetails.getDescriptor() == null || widgetTypeDetails.getDescriptor().size() == 0) { throw new DataValidationException("Widgets type descriptor can't be empty!"); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java index 5ef17f9c35..2e0be61949 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java @@ -53,13 +53,11 @@ class WidgetTypeDataValidatorTest { void testValidateNameInvocation() { WidgetTypeDetails widgetTypeDetails = new WidgetTypeDetails(); widgetTypeDetails.setName("widget type gas"); - widgetTypeDetails.setBundleAlias("Widget bundle fuel"); widgetTypeDetails.setDescriptor(JacksonUtil.toJsonNode("{\"content\":\"empty\"}")); widgetTypeDetails.setTenantId(tenantId); validator.validateDataImpl(tenantId, widgetTypeDetails); verify(validator).validateName("Widgets type name", widgetTypeDetails.getName()); - verify(validator).validateName("Widgets type bundle alias", widgetTypeDetails.getBundleAlias()); } } From e36231364d3e2d55c69f83673e47cc1e4d2114d3 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Tue, 5 Sep 2023 16:34:30 +0200 Subject: [PATCH 14/14] DataValidator: validateName renamed to validateString --- .../server/dao/service/DataValidator.java | 2 +- .../validator/AdminSettingsDataValidator.java | 2 +- .../service/validator/AlarmDataValidator.java | 2 +- .../service/validator/AssetDataValidator.java | 2 +- .../validator/AssetProfileDataValidator.java | 2 +- .../validator/BaseOtaPackageDataValidator.java | 2 +- .../ComponentDescriptorDataValidator.java | 2 +- .../service/validator/CustomerDataValidator.java | 2 +- .../validator/DashboardDataValidator.java | 2 +- .../service/validator/DeviceDataValidator.java | 2 +- .../validator/DeviceProfileDataValidator.java | 2 +- .../dao/service/validator/EdgeDataValidator.java | 4 ++-- .../validator/EntityViewDataValidator.java | 4 ++-- .../service/validator/ResourceDataValidator.java | 2 +- .../validator/RuleChainDataValidator.java | 2 +- .../service/validator/TenantDataValidator.java | 2 +- .../validator/TenantProfileDataValidator.java | 2 +- .../validator/WidgetTypeDataValidator.java | 2 +- .../validator/WidgetsBundleDataValidator.java | 2 +- .../server/dao/service/DataValidatorTest.java | 16 ++++++++-------- .../AdminSettingsDataValidatorTest.java | 2 +- .../validator/AlarmDataValidatorTest.java | 2 +- .../validator/AssetProfileDataValidatorTest.java | 2 +- .../BaseOtaPackageDataValidatorTest.java | 2 +- .../ComponentDescriptorDataValidatorTest.java | 2 +- .../validator/CustomerDataValidatorTest.java | 2 +- .../validator/DashboardDataValidatorTest.java | 2 +- .../DeviceProfileDataValidatorTest.java | 2 +- .../service/validator/EdgeDataValidatorTest.java | 4 ++-- .../validator/EntityViewDataValidatorTest.java | 4 ++-- .../validator/ResourceDataValidatorTest.java | 2 +- .../validator/RuleChainDataValidatorTest.java | 2 +- .../validator/TenantDataValidatorTest.java | 2 +- .../TenantProfileDataValidatorTest.java | 2 +- .../validator/WidgetTypeDataValidatorTest.java | 2 +- .../WidgetsBundleDataValidatorTest.java | 2 +- 36 files changed, 47 insertions(+), 47 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java index 3c1723be8c..d81c05044f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java @@ -86,7 +86,7 @@ public abstract class DataValidator> { public void validateDelete(TenantId tenantId, EntityId entityId) { } - public void validateName(String exceptionPrefix, String name) { + public void validateString(String exceptionPrefix, String name) { if (StringUtils.isEmpty(name) || name.trim().length() == 0) { throw new DataValidationException(exceptionPrefix + " should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java index 1d36f9ec17..9d0d53732c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidator.java @@ -50,7 +50,7 @@ public class AdminSettingsDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, AdminSettings adminSettings) { - validateName("Key", adminSettings.getKey()); + validateString("Key", adminSettings.getKey()); if (adminSettings.getJsonValue() == null) { throw new DataValidationException("Json value should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java index 252a4acabe..6ef2eb5052 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AlarmDataValidator.java @@ -31,7 +31,7 @@ public class AlarmDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Alarm alarm) { - validateName("Alarm type", alarm.getType()); + validateString("Alarm type", alarm.getType()); if (alarm.getOriginator() == null) { throw new DataValidationException("Alarm originator should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java index 59e41f1e61..6c0d862c0d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetDataValidator.java @@ -63,7 +63,7 @@ public class AssetDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Asset asset) { - validateName("Asset name", asset.getName()); + validateString("Asset name", asset.getName()); if (asset.getTenantId() == null) { throw new DataValidationException("Asset should be assigned to tenant!"); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java index 86981b5897..f0816621e0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidator.java @@ -53,7 +53,7 @@ public class AssetProfileDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, AssetProfile assetProfile) { - validateName("Asset profile name", assetProfile.getName()); + validateString("Asset profile name", assetProfile.getName()); if (assetProfile.getTenantId() == null) { throw new DataValidationException("Asset profile should be assigned to tenant!"); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java index 3297f73f52..5befacf8ea 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidator.java @@ -41,7 +41,7 @@ public abstract class BaseOtaPackageDataValidator> extends private DeviceProfileDao deviceProfileDao; protected void validateImpl(OtaPackageInfo otaPackageInfo) { - validateName("OtaPackage title", otaPackageInfo.getTitle()); + validateString("OtaPackage title", otaPackageInfo.getTitle()); if (otaPackageInfo.getTenantId() == null) { throw new DataValidationException("OtaPackage should be assigned to tenant!"); diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java index b3d5f56068..446091a698 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidator.java @@ -27,7 +27,7 @@ public class ComponentDescriptorDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Customer customer) { - validateName("Customer title", customer.getTitle()); + validateString("Customer title", customer.getTitle()); if (customer.getTitle().equals(CustomerServiceImpl.PUBLIC_CUSTOMER_TITLE)) { throw new DataValidationException("'Public' title for customer is system reserved!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java index 5238fb2898..60e1045f07 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DashboardDataValidator.java @@ -37,7 +37,7 @@ public class DashboardDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Dashboard dashboard) { - validateName("Dashboard title", dashboard.getTitle()); + validateString("Dashboard title", dashboard.getTitle()); if (dashboard.getTenantId() == null) { throw new DataValidationException("Dashboard should be assigned to tenant!"); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java index 2e02d4cf56..41cdcb0b2e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceDataValidator.java @@ -60,7 +60,7 @@ public class DeviceDataValidator extends AbstractHasOtaPackageValidator @Override protected void validateDataImpl(TenantId tenantId, Device device) { - validateName("Device name", device.getName()); + validateString("Device name", device.getName()); if (device.getTenantId() == null) { throw new DataValidationException("Device should be assigned to tenant!"); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java index 828fdad610..89510c6076 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidator.java @@ -103,7 +103,7 @@ public class DeviceProfileDataValidator extends AbstractHasOtaPackageValidator { @Override protected void validateDataImpl(TenantId tenantId, Edge edge) { - validateName("Edge name", edge.getName()); - validateName("Edge type", edge.getType()); + validateString("Edge name", edge.getName()); + validateString("Edge type", edge.getType()); if (StringUtils.isEmpty(edge.getSecret())) { throw new DataValidationException("Edge secret should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidator.java index f8916b77f5..7cc72a67cf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidator.java @@ -58,8 +58,8 @@ public class EntityViewDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, EntityView entityView) { - validateName("Entity view name", entityView.getName()); - validateName("Entity view type", entityView.getType()); + validateString("Entity view name", entityView.getName()); + validateString("Entity view type", entityView.getType()); if (entityView.getTenantId() == null) { throw new DataValidationException("Entity view should be assigned to tenant!"); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java index 1c1bea5cb5..d620950628 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java @@ -66,7 +66,7 @@ public class ResourceDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, TbResource resource) { - validateName("Resource title", resource.getTitle()); + validateString("Resource title", resource.getTitle()); if (resource.getResourceType() == null) { throw new DataValidationException("Resource type should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidator.java index 230b4cfc62..08e047904f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidator.java @@ -64,7 +64,7 @@ public class RuleChainDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, RuleChain ruleChain) { - validateName("Rule chain name", ruleChain.getName()); + validateString("Rule chain name", ruleChain.getName()); if (ruleChain.getType() == null) { ruleChain.setType(RuleChainType.CORE); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantDataValidator.java index 058ca0c889..64dff6495a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantDataValidator.java @@ -32,7 +32,7 @@ public class TenantDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, Tenant tenant) { - validateName("Tenant title", tenant.getTitle()); + validateString("Tenant title", tenant.getTitle()); if (!StringUtils.isEmpty(tenant.getEmail())) { validateEmail(tenant.getEmail()); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidator.java index 362cb95e76..a46371de39 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidator.java @@ -47,7 +47,7 @@ public class TenantProfileDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, TenantProfile tenantProfile) { - validateName("Tenant profile name", tenantProfile.getName()); + validateString("Tenant profile name", tenantProfile.getName()); if (tenantProfile.getProfileData() == null) { throw new DataValidationException("Tenant profile data should be specified!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java index 27728025e6..71bc17a8fa 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidator.java @@ -37,7 +37,7 @@ public class WidgetTypeDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, WidgetTypeDetails widgetTypeDetails) { - validateName("Widgets type name", widgetTypeDetails.getName()); + validateString("Widgets type name", widgetTypeDetails.getName()); if (widgetTypeDetails.getDescriptor() == null || widgetTypeDetails.getDescriptor().size() == 0) { throw new DataValidationException("Widgets type descriptor can't be empty!"); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidator.java index 40bf75d903..42b60588cb 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidator.java @@ -34,7 +34,7 @@ public class WidgetsBundleDataValidator extends DataValidator { @Override protected void validateDataImpl(TenantId tenantId, WidgetsBundle widgetsBundle) { - validateName("Widgets bundle title", widgetsBundle.getTitle()); + validateString("Widgets bundle title", widgetsBundle.getTitle()); if (widgetsBundle.getTenantId() == null) { widgetsBundle.setTenantId(TenantId.fromUUID(ModelConstants.NULL_UUID)); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java index a0217c06c8..0eafd9aeaf 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java @@ -41,12 +41,12 @@ public class DataValidatorTest { "Gdy Pomorze nie pomoże, to pomoże może morze, a gdy morze nie pomoże, to pomoże może Gdańsk", }) void validateName_thenOK(final String name) { - dataValidator.validateName("Device name", name); - dataValidator.validateName("Asset name", name); - dataValidator.validateName("Asset profile name", name); - dataValidator.validateName("Alarm type", name); - dataValidator.validateName("Customer name", name); - dataValidator.validateName("Tenant name", name); + dataValidator.validateString("Device name", name); + dataValidator.validateString("Asset name", name); + dataValidator.validateString("Asset profile name", name); + dataValidator.validateString("Alarm type", name); + dataValidator.validateString("Customer name", name); + dataValidator.validateString("Tenant name", name); } @ParameterizedTest @@ -57,11 +57,11 @@ public class DataValidatorTest { }) void validateName_thenDataValidationException(final String name) { DataValidationException exception; - exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateName("Asset name", name)); + exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateString("Asset name", name)); log.warn("Exception message Asset name: {}", exception.getMessage()); assertThat(exception.getMessage()).as("message Asset name").containsPattern("Asset name .*"); - exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateName("Device name", name)); + exception = Assertions.assertThrows(DataValidationException.class, () -> dataValidator.validateString("Device name", name)); log.warn("Exception message Device name: {}", exception.getMessage()); assertThat(exception.getMessage()).as("message Device name").containsPattern("Device name .*"); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidatorTest.java index 1408f1934d..1f021b16e7 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AdminSettingsDataValidatorTest.java @@ -44,7 +44,7 @@ class AdminSettingsDataValidatorTest { adminSettings.setJsonValue(JacksonUtil.toJsonNode("{}")); validator.validateDataImpl(tenantId, adminSettings); - verify(validator).validateName("Key", adminSettings.getKey()); + verify(validator).validateString("Key", adminSettings.getKey()); } } \ No newline at end of file diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AlarmDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AlarmDataValidatorTest.java index 153b147e97..fc91a099fa 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AlarmDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AlarmDataValidatorTest.java @@ -55,7 +55,7 @@ class AlarmDataValidatorTest { alarm.setTenantId(tenantId); validator.validateDataImpl(tenantId, alarm); - verify(validator).validateName("Alarm type", alarm.getType()); + verify(validator).validateString("Alarm type", alarm.getType()); } } \ No newline at end of file diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidatorTest.java index d0958649a0..66fdd54c86 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/AssetProfileDataValidatorTest.java @@ -65,7 +65,7 @@ class AssetProfileDataValidatorTest { assetProfile.setTenantId(tenantId); validator.validateDataImpl(tenantId, assetProfile); - verify(validator).validateName("Asset profile name", assetProfile.getName()); + verify(validator).validateString("Asset profile name", assetProfile.getName()); } } \ No newline at end of file diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidatorTest.java index 3f35a2d7c1..74fac9cfb9 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/BaseOtaPackageDataValidatorTest.java @@ -54,7 +54,7 @@ class BaseOtaPackageDataValidatorTest { otaPackageInfo.setTenantId(tenantId); validator.validateImpl(otaPackageInfo); - verify(validator).validateName("OtaPackage title", otaPackageInfo.getTitle()); + verify(validator).validateString("OtaPackage title", otaPackageInfo.getTitle()); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidatorTest.java index 9b214a3150..7effbf57ba 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/ComponentDescriptorDataValidatorTest.java @@ -38,6 +38,6 @@ class ComponentDescriptorDataValidatorTest { plugin.setName("originator attributes"); plugin.setClazz("org.thingsboard.rule.engine.metadata.TbGetAttributesNode"); validator.validateDataImpl(TenantId.SYS_TENANT_ID, plugin); - verify(validator).validateName("Component name", plugin.getName()); + verify(validator).validateString("Component name", plugin.getName()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/CustomerDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/CustomerDataValidatorTest.java index 5935278948..67329ba864 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/CustomerDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/CustomerDataValidatorTest.java @@ -53,7 +53,7 @@ class CustomerDataValidatorTest { customer.setTenantId(tenantId); validator.validateDataImpl(tenantId, customer); - verify(validator).validateName("Customer title", customer.getTitle()); + verify(validator).validateString("Customer title", customer.getTitle()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DashboardDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DashboardDataValidatorTest.java index 7a0990a742..b2953ad912 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DashboardDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DashboardDataValidatorTest.java @@ -50,7 +50,7 @@ class DashboardDataValidatorTest { dashboard.setTenantId(tenantId); validator.validateDataImpl(tenantId, dashboard); - verify(validator).validateName("Dashboard title", dashboard.getTitle()); + verify(validator).validateString("Dashboard title", dashboard.getTitle()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidatorTest.java index 483b8a55f6..fc066c201d 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/DeviceProfileDataValidatorTest.java @@ -77,7 +77,7 @@ class DeviceProfileDataValidatorTest { deviceProfile.setTenantId(tenantId); validator.validateDataImpl(tenantId, deviceProfile); - verify(validator).validateName("Device profile name", deviceProfile.getName()); + verify(validator).validateString("Device profile name", deviceProfile.getName()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/EdgeDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/EdgeDataValidatorTest.java index 26ce237eab..d852b3680a 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/EdgeDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/EdgeDataValidatorTest.java @@ -59,8 +59,8 @@ class EdgeDataValidatorTest { edge.setTenantId(tenantId); validator.validateDataImpl(tenantId, edge); - verify(validator).validateName("Edge name", edge.getName()); - verify(validator).validateName("Edge type", edge.getType()); + verify(validator).validateString("Edge name", edge.getName()); + verify(validator).validateString("Edge type", edge.getType()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidatorTest.java index 019e89f103..0eebb15554 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/EntityViewDataValidatorTest.java @@ -57,8 +57,8 @@ class EntityViewDataValidatorTest { entityView.setTenantId(tenantId); validator.validateDataImpl(tenantId, entityView); - verify(validator).validateName("Entity view name", entityView.getName()); - verify(validator).validateName("Entity view type", entityView.getType()); + verify(validator).validateString("Entity view name", entityView.getName()); + verify(validator).validateString("Entity view type", entityView.getType()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/ResourceDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/ResourceDataValidatorTest.java index a49896f52f..985b80331f 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/ResourceDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/ResourceDataValidatorTest.java @@ -63,7 +63,7 @@ class ResourceDataValidatorTest { resource.setTenantId(tenantId); validator.validateDataImpl(tenantId, resource); - verify(validator).validateName("Resource title", resource.getTitle()); + verify(validator).validateString("Resource title", resource.getTitle()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidatorTest.java index 15570247d3..7f9d3e1fc2 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/RuleChainDataValidatorTest.java @@ -58,7 +58,7 @@ class RuleChainDataValidatorTest { ruleChain.setTenantId(tenantId); validator.validateDataImpl(tenantId, ruleChain); - verify(validator).validateName("Rule chain name", ruleChain.getName()); + verify(validator).validateString("Rule chain name", ruleChain.getName()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantDataValidatorTest.java index 00b6644da8..e6c6a96146 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantDataValidatorTest.java @@ -43,7 +43,7 @@ class TenantDataValidatorTest { tenant.setEmail("support@thingsboard.io"); validator.validateDataImpl(tenantId, tenant); - verify(validator).validateName("Tenant title", tenant.getTitle()); + verify(validator).validateString("Tenant title", tenant.getTitle()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidatorTest.java index 2f1070bcf7..e3bca21984 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/TenantProfileDataValidatorTest.java @@ -50,7 +50,7 @@ class TenantProfileDataValidatorTest { tenantProfile.setProfileData(tenantProfileData); validator.validateDataImpl(tenantId, tenantProfile); - verify(validator).validateName("Tenant profile name", tenantProfile.getName()); + verify(validator).validateString("Tenant profile name", tenantProfile.getName()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java index 2e0be61949..209d2b4bb8 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetTypeDataValidatorTest.java @@ -57,7 +57,7 @@ class WidgetTypeDataValidatorTest { widgetTypeDetails.setTenantId(tenantId); validator.validateDataImpl(tenantId, widgetTypeDetails); - verify(validator).validateName("Widgets type name", widgetTypeDetails.getName()); + verify(validator).validateString("Widgets type name", widgetTypeDetails.getName()); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidatorTest.java index ec592ea949..9e54f85689 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidatorTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/validator/WidgetsBundleDataValidatorTest.java @@ -53,7 +53,7 @@ class WidgetsBundleDataValidatorTest { widgetsBundle.setTenantId(tenantId); validator.validateDataImpl(tenantId, widgetsBundle); - verify(validator).validateName("Widgets bundle title", widgetsBundle.getTitle()); + verify(validator).validateString("Widgets bundle title", widgetsBundle.getTitle()); } }