From c69670f387f87f30566b8185bcfe3ad8a322730f Mon Sep 17 00:00:00 2001 From: Hardik Kaurani Date: Tue, 27 Oct 2026 19:13:44 +0530 Subject: [PATCH 1/4] test(serialization): add reproduction tests for quoted strings in TextParseNode Signed-off-by: Hardik Kaurani --- .../serialization/TextParseNodeTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/components/serialization/text/src/test/java/com/microsoft/kiota/serialization/TextParseNodeTest.java b/components/serialization/text/src/test/java/com/microsoft/kiota/serialization/TextParseNodeTest.java index 6b88e405d..b65a80ce4 100644 --- a/components/serialization/text/src/test/java/com/microsoft/kiota/serialization/TextParseNodeTest.java +++ b/components/serialization/text/src/test/java/com/microsoft/kiota/serialization/TextParseNodeTest.java @@ -36,4 +36,28 @@ void testInvalidOffsetDateTimeStringThrowsException(final String dateTimeString) assertTrue(ex.getMessage().contains(dateTimeString)); } } + + @Test + void testParsesQuotedString() { + final var node = new TextParseNode("\"hello world\""); + assertEquals("hello world", node.getStringValue()); + } + + @Test + void testParsesEmptyQuotedString() { + final var node = new TextParseNode("\"\""); + assertEquals("", node.getStringValue()); + } + + @Test + void testParsesSingleQuoteString() { + final var node = new TextParseNode("\""); + assertEquals("\"", node.getStringValue()); + } + + @Test + void testParsesUnquotedString() { + final var node = new TextParseNode("hello world"); + assertEquals("hello world", node.getStringValue()); + } } From 266ced8602c05b21fecff31c757b815026eea8e4 Mon Sep 17 00:00:00 2001 From: Hardik Kaurani Date: Tue, 27 Oct 2026 19:14:23 +0530 Subject: [PATCH 2/4] fix(serialization): fix quote stripping bounds in TextParseNode Signed-off-by: Hardik Kaurani --- .../java/com/microsoft/kiota/serialization/TextParseNode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/serialization/text/src/main/java/com/microsoft/kiota/serialization/TextParseNode.java b/components/serialization/text/src/main/java/com/microsoft/kiota/serialization/TextParseNode.java index 387436864..71e2e826b 100644 --- a/components/serialization/text/src/main/java/com/microsoft/kiota/serialization/TextParseNode.java +++ b/components/serialization/text/src/main/java/com/microsoft/kiota/serialization/TextParseNode.java @@ -32,8 +32,8 @@ public class TextParseNode implements ParseNode { public TextParseNode(@Nonnull final String rawText) { Objects.requireNonNull(rawText, "parameter node cannot be null"); text = - rawText.startsWith("\"") && rawText.endsWith("\"") - ? rawText.substring(1, rawText.length() - 2) + rawText.length() >= 2 && rawText.startsWith("\"") && rawText.endsWith("\"") + ? rawText.substring(1, rawText.length() - 1) : rawText; } From abbf117e03b142c84f6f580f0af5c5bc8410c4bd Mon Sep 17 00:00:00 2001 From: Hardik Kaurani Date: Tue, 27 Oct 2026 19:14:31 +0530 Subject: [PATCH 3/4] test(serialization): add comprehensive unit tests for TextSerializationWriter Signed-off-by: Hardik Kaurani --- .../TextSerializationWriterTest.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 components/serialization/text/src/test/java/com/microsoft/kiota/serialization/TextSerializationWriterTest.java diff --git a/components/serialization/text/src/test/java/com/microsoft/kiota/serialization/TextSerializationWriterTest.java b/components/serialization/text/src/test/java/com/microsoft/kiota/serialization/TextSerializationWriterTest.java new file mode 100644 index 000000000..1a760e085 --- /dev/null +++ b/components/serialization/text/src/test/java/com/microsoft/kiota/serialization/TextSerializationWriterTest.java @@ -0,0 +1,102 @@ +package com.microsoft.kiota.serialization; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.stream.Collectors; + +public class TextSerializationWriterTest { + + private String readStream(final TextSerializationWriter writer) { + try (final var is = writer.getSerializedContent(); + final var isr = new InputStreamReader(is, StandardCharsets.UTF_8); + final var reader = new BufferedReader(isr)) { + return reader.lines().collect(Collectors.joining("\n")); + } catch (final Exception ex) { + throw new RuntimeException(ex); + } + } + + @Test + void testWritesStringValue() { + try (final var writer = new TextSerializationWriter()) { + writer.writeStringValue(null, "hello world"); + assertEquals("hello world", readStream(writer)); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Test + void testWritesBooleanValue() { + try (final var writer = new TextSerializationWriter()) { + writer.writeBooleanValue(null, true); + assertEquals("true", readStream(writer)); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Test + void testWritesIntegerValue() { + try (final var writer = new TextSerializationWriter()) { + writer.writeIntegerValue(null, 42); + assertEquals("42", readStream(writer)); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Test + void testWritesByteArrayValue() { + try (final var writer = new TextSerializationWriter()) { + writer.writeByteArrayValue(null, "test".getBytes(StandardCharsets.UTF_8)); + assertEquals("dGVzdA==", readStream(writer)); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Test + void testThrowsWhenKeyIsProvided() { + try (final var writer = new TextSerializationWriter()) { + assertThrows( + UnsupportedOperationException.class, + () -> writer.writeStringValue("key", "value")); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Test + void testThrowsWhenWritingMultipleValues() { + try (final var writer = new TextSerializationWriter()) { + writer.writeStringValue(null, "first"); + assertThrows( + UnsupportedOperationException.class, + () -> writer.writeStringValue(null, "second")); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Test + void testThrowsOnStructuredDataCalls() { + try (final var writer = new TextSerializationWriter()) { + assertThrows( + UnsupportedOperationException.class, + () -> writer.writeCollectionOfPrimitiveValues(null, Collections.emptyList())); + assertThrows( + UnsupportedOperationException.class, + () -> writer.writeAdditionalData(Collections.emptyMap())); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } +} From 90ff242cf83db60ae9d0b2ea407d9f5072d694eb Mon Sep 17 00:00:00 2001 From: Hardik Kaurani Date: Tue, 27 Oct 2026 19:14:53 +0530 Subject: [PATCH 4/4] docs(serialization): document quoted string handling in TextParseNode Signed-off-by: Hardik Kaurani --- .../java/com/microsoft/kiota/serialization/TextParseNode.java | 1 + 1 file changed, 1 insertion(+) diff --git a/components/serialization/text/src/main/java/com/microsoft/kiota/serialization/TextParseNode.java b/components/serialization/text/src/main/java/com/microsoft/kiota/serialization/TextParseNode.java index 71e2e826b..de029a771 100644 --- a/components/serialization/text/src/main/java/com/microsoft/kiota/serialization/TextParseNode.java +++ b/components/serialization/text/src/main/java/com/microsoft/kiota/serialization/TextParseNode.java @@ -27,6 +27,7 @@ public class TextParseNode implements ParseNode { /** * Initializes a new instance of the {@link TextParseNode} class. + * Enclosing double quotes are stripped when the string length is at least 2. * @param rawText the raw text to parse. */ public TextParseNode(@Nonnull final String rawText) {