diff --git a/application/src/main/java/org/thingsboard/server/controller/TbResourceController.java b/application/src/main/java/org/thingsboard/server/controller/TbResourceController.java index 1d966e358a..0190c3e790 100644 --- a/application/src/main/java/org/thingsboard/server/controller/TbResourceController.java +++ b/application/src/main/java/org/thingsboard/server/controller/TbResourceController.java @@ -117,6 +117,8 @@ public class TbResourceController extends BaseController { StringJoiner noSaveResources = new StringJoiner("; "); resources.forEach(resource -> { try { + resource.setTenantId(getTenantId()); + checkEntity(resource.getId(), resource, Resource.TB_RESOURCE); addResources.add(addResource(resource)); } catch (Exception e) { noSaveResources.add(resource.getFileName()); @@ -197,7 +199,6 @@ public class TbResourceController extends BaseController { } private TbResource addResource(TbResource resource) throws Exception { - resource.setTenantId(getTenantId()); checkEntity(resource.getId(), resource, Resource.TB_RESOURCE); TbResource savedResource = checkNotNull(resourceService.saveResource(resource)); tbClusterService.onResourceChange(savedResource, null); diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java index e25592e35e..3bbf29c8c8 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java @@ -465,6 +465,10 @@ public abstract class AbstractWebTest { return readResponse(doPost(urlTemplate, content, params).andExpect(status().isOk()), responseType); } + protected R doPostWithTypedResponse(String urlTemplate, T content, TypeReference responseType, ResultMatcher resultMatcher, String... params) throws Exception { + return readResponse(doPost(urlTemplate, content, params).andExpect(resultMatcher), responseType); + } + protected T doPostAsync(String urlTemplate, T content, Class responseClass, ResultMatcher resultMatcher, String... params) throws Exception { return readResponse(doPostAsync(urlTemplate, content, DEFAULT_TIMEOUT, params).andExpect(resultMatcher), responseClass); } diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseTbResourceControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseTbResourceControllerTest.java index 31c77f2830..8fae23881a 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseTbResourceControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseTbResourceControllerTest.java @@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.security.Authority; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -79,7 +80,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes resource.setFileName(DEFAULT_FILE_NAME); resource.setData("Test Data"); - TbResource savedResource = doPost("/api/resource", resource, TbResource.class); + TbResource savedResource = save(resource); Assert.assertNotNull(savedResource); Assert.assertNotNull(savedResource.getId()); @@ -92,7 +93,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes savedResource.setTitle("My new resource"); - doPost("/api/resource", savedResource, TbResource.class); + save(savedResource); TbResource foundResource = doGet("/api/resource/" + savedResource.getId().getId().toString(), TbResource.class); Assert.assertEquals(foundResource.getTitle(), savedResource.getTitle()); @@ -106,10 +107,10 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes resource.setFileName(DEFAULT_FILE_NAME); resource.setData("Test Data"); - TbResource savedResource = doPost("/api/resource", resource, TbResource.class); + TbResource savedResource = save(resource); loginDifferentTenant(); - doPost("/api/resource", savedResource, TbResource.class, status().isForbidden()); + doPostWithTypedResponse("/api/resource", Collections.singletonList(savedResource), new TypeReference<>(){}, status().isBadRequest()); deleteDifferentTenant(); } @@ -121,7 +122,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes resource.setFileName(DEFAULT_FILE_NAME); resource.setData("Test Data"); - TbResource savedResource = doPost("/api/resource", resource, TbResource.class); + TbResource savedResource = save(resource); TbResource foundResource = doGet("/api/resource/" + savedResource.getId().getId().toString(), TbResource.class); Assert.assertNotNull(foundResource); @@ -136,7 +137,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes resource.setFileName(DEFAULT_FILE_NAME); resource.setData("Test Data"); - TbResource savedResource = doPost("/api/resource", resource, TbResource.class); + TbResource savedResource = save(resource); doDelete("/api/resource/" + savedResource.getId().getId().toString()) .andExpect(status().isOk()); @@ -147,15 +148,18 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @Test public void testFindTenantTbResources() throws Exception { - List resources = new ArrayList<>(); + List resourcesToSave = new ArrayList<>(); for (int i = 0; i < 173; i++) { TbResource resource = new TbResource(); resource.setTitle("Resource" + i); resource.setResourceType(ResourceType.JKS); resource.setFileName(i + DEFAULT_FILE_NAME); resource.setData("Test Data"); - resources.add(new TbResourceInfo(doPost("/api/resource", resource, TbResource.class))); + resourcesToSave.add(resource); } + + List resources =save(resourcesToSave).stream().map(TbResourceInfo::new).collect(Collectors.toList()); + List loadedResources = new ArrayList<>(); PageLink pageLink = new PageLink(24); PageData pageData; @@ -186,7 +190,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes resource.setResourceType(ResourceType.JKS); resource.setFileName(i + DEFAULT_FILE_NAME); resource.setData("Test Data"); - resources.add(new TbResourceInfo(doPost("/api/resource", resource, TbResource.class))); + resources.add(new TbResourceInfo(save(resource))); } List loadedResources = new ArrayList<>(); PageLink pageLink = new PageLink(24); @@ -236,7 +240,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes resource.setResourceType(ResourceType.JKS); resource.setFileName(i + DEFAULT_FILE_NAME); resource.setData("Test Data"); - expectedResources.add(new TbResourceInfo(doPost("/api/resource", resource, TbResource.class))); + expectedResources.add(new TbResourceInfo(save(resource))); } loginSysAdmin(); @@ -247,7 +251,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes resource.setResourceType(ResourceType.JKS); resource.setFileName(i + DEFAULT_FILE_NAME); resource.setData("Test Data"); - TbResourceInfo savedResource = new TbResourceInfo(doPost("/api/resource", resource, TbResource.class)); + TbResourceInfo savedResource = new TbResourceInfo(save(resource)); systemResources.add(savedResource); if (i >= 73) { expectedResources.add(savedResource); @@ -281,4 +285,12 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes .andExpect(status().isOk()); } } + + private TbResource save(TbResource tbResource) throws Exception { + return save(Collections.singletonList(tbResource)).get(0); + } + + private List save(List tbResources) throws Exception { + return doPostWithTypedResponse("/api/resource", tbResources, new TypeReference<>(){}); + } }