Skip to content

Commit

Permalink
Fixes bug in serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew Omondi committed Apr 2, 2024
1 parent 46cd68f commit f6ca2e4
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 7 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

## [1.1.3] - 2024-04-02

### Changed

- Fixes a bug in the seriliazer that would `IllegalStateException` for json arrays in the additional data.

## [1.1.2] - 2024-03-26

### Changed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ public JsonParseNode(@Nonnull final JsonElement node) {
}
}

private <T> List<T> iterateOnArray(Function<JsonParseNode, T> fn) {
JsonArray array = currentNode.getAsJsonArray();
private <T> List<T> iterateOnArray(JsonElement jsonElement, Function<JsonParseNode, T> fn) {
JsonArray array = jsonElement.getAsJsonArray();
final Iterator<JsonElement> sourceIterator = array.iterator();
final List<T> result = new ArrayList<>();
while (sourceIterator.hasNext()) {
Expand All @@ -182,7 +182,8 @@ private <T> List<T> iterateOnArray(Function<JsonParseNode, T> fn) {
if (currentNode.isJsonNull()) {
return null;
} else if (currentNode.isJsonArray()) {
return iterateOnArray(itemNode -> getPrimitiveValue(targetClass, itemNode));
return iterateOnArray(
currentNode, itemNode -> getPrimitiveValue(targetClass, itemNode));
} else throw new RuntimeException("invalid state expected to have an array node");
}

Expand All @@ -192,7 +193,7 @@ private <T> List<T> iterateOnArray(Function<JsonParseNode, T> fn) {
if (currentNode.isJsonNull()) {
return null;
} else if (currentNode.isJsonArray()) {
return iterateOnArray(itemNode -> itemNode.getObjectValue(factory));
return iterateOnArray(currentNode, itemNode -> itemNode.getObjectValue(factory));
} else return null;
}

Expand All @@ -202,7 +203,7 @@ private <T> List<T> iterateOnArray(Function<JsonParseNode, T> fn) {
if (currentNode.isJsonNull()) {
return null;
} else if (currentNode.isJsonArray()) {
return iterateOnArray(itemNode -> itemNode.getEnumValue(enumParser));
return iterateOnArray(currentNode, itemNode -> itemNode.getEnumValue(enumParser));
} else throw new RuntimeException("invalid state expected to have an array node");
}

Expand Down Expand Up @@ -242,7 +243,7 @@ else if (element.isJsonPrimitive()) {
return new UntypedObject(propertiesMap);

} else if (element.isJsonArray()) {
return new UntypedArray(iterateOnArray(JsonParseNode::getUntypedValue));
return new UntypedArray(iterateOnArray(element, JsonParseNode::getUntypedValue));
}

throw new RuntimeException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static org.junit.jupiter.api.Assertions.*;

import com.google.gson.JsonParser;
import com.microsoft.kiota.serialization.mocks.TestEntity;
import com.microsoft.kiota.serialization.mocks.UntypedTestEntity;

import org.junit.jupiter.api.Test;
Expand All @@ -16,6 +17,10 @@
class JsonParseNodeTests {
private static final JsonParseNodeFactory _parseNodeFactory = new JsonParseNodeFactory();
private static final String contentType = "application/json";

private static final String testJsonString =
"{\"displayName\":\"My Group\",\"id\":\"11111111-1111-1111-1111-111111111111"
+ "\",\"members@delta\":[{\"@odata.type\":\"#microsoft.graph.user\",\"id\":\"22222222-2222-2222-2222-222222222222\"}]}";
private static final String testUntypedJson =
"{\r\n"
+ " \"@odata.context\":"
Expand Down Expand Up @@ -95,6 +100,17 @@ void testInvalidOffsetDateTimeStringThrowsException(final String dateTimeString)
}
}

@Test
void getEntityWithArrayInAdditionalData() throws UnsupportedEncodingException {
final var rawResponse = new ByteArrayInputStream(testJsonString.getBytes("UTF-8"));
final var parseNode = _parseNodeFactory.getParseNode(contentType, rawResponse);
// Act
var entity = parseNode.getObjectValue(TestEntity::createFromDiscriminatorValue);
assertEquals("11111111-1111-1111-1111-111111111111", entity.getId());
final var arrayValue = (UntypedArray) entity.getAdditionalData().get("members@delta");
assertEquals(1, arrayValue.getValue().spliterator().estimateSize());
}

@Test
void GetEntityWithUntypedNodesFromJson() throws UnsupportedEncodingException {
final var rawResponse = new ByteArrayInputStream(testUntypedJson.getBytes("UTF-8"));
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ org.gradle.caching=true
mavenGroupId = com.microsoft.kiota
mavenMajorVersion = 1
mavenMinorVersion = 1
mavenPatchVersion = 2
mavenPatchVersion = 3
mavenArtifactSuffix =

#These values are used to run functional tests
Expand Down

0 comments on commit f6ca2e4

Please sign in to comment.