citrusframework / citrus

Framework for automated integration tests with focus on messaging integration
https://citrusframework.org
Apache License 2.0
445 stars 135 forks source link

NPE when OpenAPI declares a response header without required attribute #1170

Closed ueberfuhr closed 1 month ago

ueberfuhr commented 1 month ago

Citrus Version 4.2.1

Expected behavior If a response header is declared without any required attribute, it should be interpreted as optional.

Actual behavior There`s an exception:

java.lang.NullPointerException: Cannot invoke "java.lang.Boolean.booleanValue()" because "java.util.Map$Entry.getValue().required" is null
    at org.citrusframework.openapi.model.v3.Oas30ModelHelper.lambda$getRequiredHeaders$14(Oas30ModelHelper.java:222)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)
    at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
    at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at org.citrusframework.openapi.model.v3.Oas30ModelHelper.getRequiredHeaders(Oas30ModelHelper.java:223)
    at org.citrusframework.openapi.model.OasModelHelper.delegate(OasModelHelper.java:216)
    at org.citrusframework.openapi.model.OasModelHelper.getRequiredHeaders(OasModelHelper.java:167)
    at org.citrusframework.openapi.actions.OpenApiClientResponseActionBuilder$OpenApiClientResponseMessageBuilder.build(OpenApiClientResponseActionBuilder.java:101)
    at org.citrusframework.actions.ReceiveMessageAction.createControlMessage(ReceiveMessageAction.java:276)
    at org.citrusframework.actions.ReceiveMessageAction.validateMessage(ReceiveMessageAction.java:226)
    at org.citrusframework.actions.ReceiveMessageAction.doExecute(ReceiveMessageAction.java:167)
    at org.citrusframework.actions.AbstractTestAction.execute(AbstractTestAction.java:59)
    at org.citrusframework.DefaultTestCase.executeAction(DefaultTestCase.java:190)
    ... 8 more

Test case sample The OpenAPI declared a Location header for a POST operation:

      responses:
        201:
          description: Todo created
          headers:
            Location:
              description: The URL of the newly created todo.
              # required: true
              schema:
                type: string
                format: uri

This is used to validate the response.

bbortt commented 1 month ago

many thanks @ueberfuhr for the report and the quick fix! 💃🏼