diff --git a/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java b/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java index a8ba70bf..e48f1fc1 100644 --- a/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java +++ b/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java @@ -5,6 +5,8 @@ import com.openelements.hiero.base.implementation.FileClientImpl; import com.openelements.hiero.base.protocol.FileCreateResult; import com.openelements.hiero.base.protocol.FileCreateRequest; +import com.openelements.hiero.base.protocol.FileUpdateResult; +import com.openelements.hiero.base.protocol.FileUpdateRequest; import com.openelements.hiero.base.protocol.FileAppendRequest; import com.openelements.hiero.base.protocol.FileAppendResult; import com.openelements.hiero.base.protocol.FileInfoRequest; @@ -120,6 +122,104 @@ void testCreateFileThrowsExceptionForNullContent() { Assertions.assertTrue(exception.getMessage().contains(message)); } + @Test + void testUpdateFile() throws HieroException { + // mock + final FileUpdateResult fileUpdateResult = Mockito.mock(FileUpdateResult.class); + + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = "Hello Hiero! Updated".getBytes(); + + // then + when(protocolLayerClient.executeFileUpdateRequestTransaction(any(FileUpdateRequest.class))) + .thenReturn(fileUpdateResult); + + fileClientImpl.updateFile(fileId, updatedContent); + + verify(protocolLayerClient, times(1)) + .executeFileUpdateRequestTransaction(any(FileUpdateRequest.class)); + } + + @Test + void testUpdateFileForSizeGreaterThanFileCreateMaxSize() throws HieroException { + // mock + final FileUpdateResult fileUpdateResult = Mockito.mock(FileUpdateResult.class); + final FileAppendResult fileAppendResult = Mockito.mock(FileAppendResult.class); + + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = new byte[FileCreateRequest.FILE_CREATE_MAX_SIZE * 2]; + // -1 because 1 for executeFileCreateTransaction() + final int appendCount = Math.floorDiv(updatedContent.length, FileCreateRequest.FILE_CREATE_MAX_SIZE) - 1; + + //then + when(protocolLayerClient.executeFileUpdateRequestTransaction(any(FileUpdateRequest.class))) + .thenReturn(fileUpdateResult); + when(protocolLayerClient.executeFileAppendRequestTransaction(any(FileAppendRequest.class))) + .thenReturn(fileAppendResult); + + fileClientImpl.updateFile(fileId, updatedContent); + + verify(protocolLayerClient, times(1)) + .executeFileUpdateRequestTransaction(any(FileUpdateRequest.class)); + verify(protocolLayerClient, times(appendCount)) + .executeFileAppendRequestTransaction(any(FileAppendRequest.class)); + } + + @Test + void testUpdateFileThrowsExceptionForInvalidFileId() throws HieroException { + final String message = "Failed to execute transaction of type FileUpdateTransaction"; + + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = "Hello Hiero! Updated".getBytes(); + + // then + when(protocolLayerClient.executeFileUpdateRequestTransaction(any(FileUpdateRequest.class))) + .thenThrow(new HieroException(message)); + + final HieroException exception = Assertions.assertThrows( + HieroException.class, () -> fileClientImpl.updateFile(fileId, updatedContent) + ); + Assertions.assertTrue(exception.getMessage().contains(message)); + } + + @Test + void testUpdateFileThrowsExceptionForSizeGreaterThanMaxFileSize() { + final String message = "File contents must be less than " + FileCreateRequest.FILE_MAX_SIZE + " bytes"; + + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = new byte[FileCreateRequest.FILE_MAX_SIZE + 1]; + + // then + final HieroException exception = Assertions.assertThrows( + HieroException.class, () -> fileClientImpl.updateFile(fileId, updatedContent) + ); + Assertions.assertTrue(exception.getMessage().contains(message)); + } + + @Test + void testUpdateFileThrowsExceptionForNullArguments() { + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = "Hello Hiero! Updated".getBytes(); + + // then + final NullPointerException nullContentException = Assertions.assertThrows( + NullPointerException.class, () -> fileClientImpl.updateFile(fileId, null) + ); + Assertions.assertTrue(nullContentException.getMessage().contains("content must not be null")); + + final NullPointerException nullIdException = Assertions.assertThrows( + NullPointerException.class, () -> fileClientImpl.updateFile(null, updatedContent) + ); + Assertions.assertTrue(nullIdException.getMessage().contains("fileId must not be null")); + + Assertions.assertThrows(NullPointerException.class, () -> fileClientImpl.updateFile(null, null)); + } + @Test void testGetFileSize() throws HieroException { // mocks diff --git a/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java b/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java index 84bcb429..3289c70b 100644 --- a/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java +++ b/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java @@ -3,6 +3,7 @@ import com.hedera.hashgraph.sdk.FileId; import com.openelements.hiero.base.FileClient; import com.openelements.hiero.base.HieroException; + import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -147,9 +148,9 @@ void testDeleteFileByFileId() throws Exception { @Test void testUpdateFileByFileId() throws Exception { //given - final byte[] contents = "Hello, Hedera!".getBytes(); + final byte[] contents = "Hello, Hiero!".getBytes(); final FileId fileId = fileClient.createFile(contents); - final String newContent = "Hello, Hedera! Updated"; + final String newContent = "Hello, Hiero! Updated"; //when fileClient.updateFile(fileId, newContent.getBytes()); @@ -159,6 +160,55 @@ void testUpdateFileByFileId() throws Exception { Assertions.assertArrayEquals(newContent.getBytes(), readContents); } + @Test + void testUpdateFileForSizeGreaterThanCreateFileSize() throws HieroException { + // given + final byte[] contents = "Hello, Hiero!".getBytes(); + final FileId fileId = fileClient.createFile(contents); + final byte[] updatedContent = new byte[FileCreateRequest.FILE_CREATE_MAX_SIZE * 2]; + + // when + fileClient.updateFile(fileId, updatedContent); + + // then + final byte[] readContent = fileClient.readFile(fileId); + Assertions.assertArrayEquals(updatedContent, readContent); + } + + @Test + void testUpdateFileThrowExceptionForInvalidFileId() { + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = "Hello, Hiero! Update".getBytes(); + + // then + Assertions.assertThrows(HieroException.class, () -> fileClient.updateFile(fileId, updatedContent)); + } + + @Test + void testUpdateFileThrowExceptionIfSizeExceedMaxSize() throws HieroException { + // given + final byte[] contents = "Hello, Hiero!".getBytes(); + final FileId fileId = fileClient.createFile(contents); + final byte[] updatedContent = new byte[FileCreateRequest.FILE_MAX_SIZE + 1]; + + // then + Assertions.assertThrows(HieroException.class, () -> fileClient.updateFile(fileId, updatedContent)); + } + + @Test + void testUpdateFileThrowsErrorForNullValues() throws HieroException { + // given + final byte[] contents = "Hello, Hiero!".getBytes(); + final FileId fileId = fileClient.createFile(contents); + final byte[] updatedContent = "Hello, Hiero! Update".getBytes(); + + // then + Assertions.assertThrows(NullPointerException.class, () -> fileClient.updateFile(fileId, null)); + Assertions.assertThrows(NullPointerException.class, () -> fileClient.updateFile(null, updatedContent)); + Assertions.assertThrows(NullPointerException.class, () -> fileClient.updateFile(null, null)); + } + @Test void testDeleteFileByStringId() throws Exception { //given