Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SD-1823 Revisit the OVS checks with unit test cases #235

Merged
merged 11 commits into from
Dec 15, 2024
Merged

SD-1823 Revisit the OVS checks with unit test cases #235

merged 11 commits into from
Dec 15, 2024

Conversation

preetamnpr
Copy link
Collaborator

@preetamnpr preetamnpr commented Nov 28, 2024

User description

I am enhancing the unit test cases to capture all possible cases. Once its done this PR will be ready for the review


PR Type

Enhancement, Tests


Description

  • Enhanced the OVS checks with improved validation logic and logging.
  • Added comprehensive unit tests for the OVS checks to ensure validation accuracy.
  • Updated scenario dates and message structures for consistency and testing.
  • Introduced new test messages with incorrect values, dates, and structures for validation.
  • Added JUnit Jupiter dependency to support the new tests.

Changes walkthrough 📝

Relevant files
Enhancement
6 files
OvsScenarioListBuilder.java
Update scenario dates for consistency                                       

ovs/src/main/java/org/dcsa/conformance/standards/ovs/OvsScenarioListBuilder.java

  • Updated start and end dates for scenarios.
+2/-2     
OvsChecks.java
Refactor and enhance OVS checks with logging                         

ovs/src/main/java/org/dcsa/conformance/standards/ovs/checks/OvsChecks.java

  • Added logging with @Slf4j.
  • Refactored validation logic for schedule checks.
  • Improved error handling for date parsing.
  • +194/-202
    OvsFilterParameter.java
    Enhance OvsFilterParameter with additional attributes       

    ovs/src/main/java/org/dcsa/conformance/standards/ovs/party/OvsFilterParameter.java

  • Added @Getter annotation.
  • Introduced jsonPaths and isSeparateCheckRequired attributes.
  • +37/-11 
    OvsPublisher.java
    Add test flags for response scenarios in OvsPublisher       

    ovs/src/main/java/org/dcsa/conformance/standards/ovs/party/OvsPublisher.java

    • Added flags for testing different response scenarios.
    +37/-1   
    ovs-300-response.json
    Update transport call reference and event date time           

    ovs/src/main/resources/standards/ovs/messages/ovs-300-response.json

    • Updated transport call reference and event date time.
    +42/-2   
    OVS_v3.0.0.yaml
    Restrict additional properties in UNLocationLocation schema

    ovs/src/main/resources/standards/ovs/schemas/OVS_v3.0.0.yaml

    • Set additionalProperties to false for UNLocationLocation.
    +1/-0     
    Tests
    4 files
    OvsChecksTest.java
    Add unit tests for OvsChecks validation logic                       

    ovs/src/test/java/org/dcsa/conformance/standards/ovs/OvsChecksTest.java

  • Added comprehensive unit tests for OvsChecks.
  • Covered various validation scenarios.
  • +426/-0 
    ovs-300-response-wrong-attribute-values.json
    Add test message with incorrect attribute values                 

    ovs/src/main/resources/standards/ovs/messages/ovs-300-response-wrong-attribute-values.json

    • Added new test message with wrong attribute values.
    +119/-0 
    ovs-300-response-wrong-date-times.json
    Add test message with incorrect date formats                         

    ovs/src/main/resources/standards/ovs/messages/ovs-300-response-wrong-date-times.json

    • Added new test message with wrong date formats.
    +118/-0 
    ovs-300-response-wrong-structure.json
    Add test message with incorrect structure                               

    ovs/src/main/resources/standards/ovs/messages/ovs-300-response-wrong-structure.json

    • Added new test message with incorrect structure.
    +119/-0 
    Dependencies
    1 files
    pom.xml
    Add JUnit Jupiter dependency for testing                                 

    ovs/pom.xml

    • Added JUnit Jupiter dependency for testing.
    +5/-0     

    💡 PR-Agent usage: Comment /help "your question" on any pull request to receive relevant information

    @preetamnpr preetamnpr requested a review from gj0dcsa November 28, 2024 15:33
    Copy link

    qodo-merge-pro bot commented Nov 28, 2024

    CI Failure Feedback 🧐

    (Checks updated until commit a75e892)

    Action: build

    Failed stage: Build and test Conformance-Gateway [❌]

    Failed test name: ManualScenarioTest.testStandards

    Failure summary:

    The action failed due to test failures in the spring-boot module:

  • Two tests in the org.dcsa.conformance.manual.ManualScenarioTest class failed.
  • The specific test method testStandards failed with an AssertionFailedError, expecting but was .
  • There was a NullPointerException in the StatefulExecutor related to
    SuppliedScenarioParameters.getMap(), indicating a potential issue with null values being returned
    from a supplier.

  • Relevant error logs:
    1:  ##[group]Operating System
    2:  Ubuntu
    ...
    
    89:  [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
    90:  [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic ***
    91:  ##[endgroup]
    92:  ##[group]Fetching the repository
    93:  [command]/usr/bin/git -c protocol.version=2 fetch --prune --no-recurse-submodules origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* +b2a6d741c9366c97e4b19a6a086da962478d5637:refs/remotes/pull/235/merge
    94:  From https://github.com/dcsaorg/Conformance-Gateway
    95:  * [new branch]        DT-1153                                  -> origin/DT-1153
    96:  * [new branch]        DT-1216                                  -> origin/DT-1216
    97:  * [new branch]        DT-1678_Fail-Conformance-on-missing-actionId -> origin/DT-1678_Fail-Conformance-on-missing-actionId
    ...
    
    268:  [INFO] 
    269:  [INFO] --- surefire:3.5.2:test (default-test) @ core ---
    270:  [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
    271:  [INFO] 
    272:  [INFO] -------------------------------------------------------
    273:  [INFO]  T E S T S
    274:  [INFO] -------------------------------------------------------
    275:  [INFO] Running org.dcsa.conformance.core.check.KeywordDatasetTest
    276:  [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.104 s -- in org.dcsa.conformance.core.check.KeywordDatasetTest
    277:  [INFO] Running org.dcsa.conformance.core.check.JsonSchemaValidatorTest
    278:  SLF4J(W): No SLF4J providers were found.
    279:  SLF4J(W): Defaulting to no-operation (NOP) logger implementation
    280:  SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.
    281:  [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.834 s -- in org.dcsa.conformance.core.check.JsonSchemaValidatorTest
    282:  [INFO] Running org.dcsa.conformance.core.check.JsonAttributeTest
    283:  Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3
    284:  WARNING: A Java agent has been loaded dynamically (/home/runner/.m2/repository/net/bytebuddy/byte-buddy-agent/1.15.4/byte-buddy-agent-1.15.4.jar)
    285:  WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
    286:  WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
    287:  WARNING: Dynamic loading of agents will be disallowed by default in a future release
    288:  OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
    289:  [INFO] Tests run: 44, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.615 s -- in org.dcsa.conformance.core.check.JsonAttributeTest
    290:  [INFO] 
    291:  [INFO] Results:
    292:  [INFO] 
    293:  [INFO] Tests run: 49, Failures: 0, Errors: 0, Skipped: 0
    ...
    
    326:  [INFO] 
    327:  [INFO] --- surefire:3.5.2:test (default-test) @ booking ---
    328:  [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
    329:  [INFO] 
    330:  [INFO] -------------------------------------------------------
    331:  [INFO]  T E S T S
    332:  [INFO] -------------------------------------------------------
    333:  [INFO] Running org.dcsa.conformance.standards.booking.party.DynamicScenarioParametersTest
    334:  [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.613 s -- in org.dcsa.conformance.standards.booking.party.DynamicScenarioParametersTest
    335:  [INFO] 
    336:  [INFO] Results:
    337:  [INFO] 
    338:  [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
    ...
    
    566:  [INFO] 
    567:  [INFO] -------------------------------------------------------
    568:  [INFO]  T E S T S
    569:  [INFO] -------------------------------------------------------
    570:  [INFO] Running org.dcsa.conformance.standards.ovs.checks.OvsChecksTest
    571:  SLF4J(W): No SLF4J providers were found.
    572:  SLF4J(W): Defaulting to no-operation (NOP) logger implementation
    573:  SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.
    574:  [INFO] Tests run: 35, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.566 s -- in org.dcsa.conformance.standards.ovs.checks.OvsChecksTest
    575:  [INFO] 
    576:  [INFO] Results:
    577:  [INFO] 
    578:  [INFO] Tests run: 35, Failures: 0, Errors: 0, Skipped: 0
    ...
    
    611:  [INFO] 
    612:  [INFO] --- surefire:3.5.2:test (default-test) @ tnt ---
    613:  [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
    614:  [INFO] 
    615:  [INFO] -------------------------------------------------------
    616:  [INFO]  T E S T S
    617:  [INFO] -------------------------------------------------------
    618:  [INFO] Running org.dcsa.conformance.standards.tnt.checks.TntChecksTest
    619:  [INFO] Tests run: 24, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.560 s -- in org.dcsa.conformance.standards.tnt.checks.TntChecksTest
    620:  [INFO] 
    621:  [INFO] Results:
    622:  [INFO] 
    623:  [INFO] Tests run: 24, Failures: 0, Errors: 0, Skipped: 0
    ...
    
    659:  [INFO] 
    660:  [INFO] -------------------------------------------------------
    661:  [INFO]  T E S T S
    662:  [INFO] -------------------------------------------------------
    663:  [INFO] Running org.dcsa.conformance.standards.adoption.action.SupplyScenarioParametersActionTest
    664:  SLF4J(W): No SLF4J providers were found.
    665:  SLF4J(W): Defaulting to no-operation (NOP) logger implementation
    666:  SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.
    667:  [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.602 s -- in org.dcsa.conformance.standards.adoption.action.SupplyScenarioParametersActionTest
    668:  [INFO] 
    669:  [INFO] Results:
    670:  [INFO] 
    671:  [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0
    ...
    
    968:  INFO 2126 --- [           main] o.s.t.web.servlet.TestDispatcherServlet  : Completed initialization in 20 ms
    969:  INFO 2126 --- [           main] o.d.c.s.ConformanceBasicAPITest          : Started ConformanceBasicAPITest in 2.825 seconds (process running for 4.489)
    970:  Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3
    971:  OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
    972:  WARNING: A Java agent has been loaded dynamically (/home/runner/.m2/repository/net/bytebuddy/byte-buddy-agent/1.15.4/byte-buddy-agent-1.15.4.jar)
    973:  WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
    974:  WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
    975:  WARNING: Dynamic loading of agents will be disallowed by default in a future release
    976:  [WARNING] Tests run: 5, Failures: 0, Errors: 0, Skipped: 3, Time elapsed: 4.687 s -- in org.dcsa.conformance.springboot.ConformanceBasicAPITest
    ...
    
    1092:  INFO 2126 --- [           main] o.d.c.s.ConformanceApplicationTest       : Done! Run took 00:00:02.016. Original start status of sandboxId: pint-300-conformance-auto-all-in-one was: {"scenariosLeft":18}
    1093:  INFO 2126 --- [           main] o.d.c.s.ConformanceApplicationTest       : Starting scenario suite: tnt-220-conformance-auto-all-in-one
    1094:  INFO 2126 --- [at-handler-4407] o.d.c.core.check.JsonSchemaValidator     : Loading schema: /standards/tnt/schemas/TNT_v2.2.0-resolved.yaml with schemaName: equipmentEvent
    1095:  INFO 2126 --- [at-handler-4407] o.d.c.core.check.JsonSchemaValidator     : Loading schema: /standards/tnt/schemas/TNT_v2.2.0-resolved.yaml with schemaName: shipmentEvent
    1096:  INFO 2126 --- [at-handler-4407] o.d.c.core.check.JsonSchemaValidator     : Loading schema: /standards/tnt/schemas/TNT_v2.2.0-resolved.yaml with schemaName: transportEvent
    1097:  INFO 2126 --- [           main] o.d.c.s.ConformanceApplicationTest       : Current status: {"scenariosLeft":27}
    1098:  INFO 2126 --- [           main] o.d.c.s.ConformanceApplicationTest       : Current status: {"scenariosLeft":0}
    1099:  INFO 2126 --- [           main] o.d.c.s.ConformanceApplicationTest       : Done! Run took 00:00:02.009. Original start status of sandboxId: tnt-220-conformance-auto-all-in-one was: {"scenariosLeft":50}
    1100:  [INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 28.53 s -- in org.dcsa.conformance.springboot.ConformanceApplicationTest
    ...
    
    1648:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyScenarioParameters(vesselIMONumber, limit) - GetEvents'.
    1649:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyScenarioParameters(carrierServiceCode, limit) - GetEvents'.
    1650:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyScenarioParameters(UNLocationCode, limit) - GetEvents'.
    1651:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyScenarioParameters(operationsEventTypeCode, limit) - GetEvents'.
    1652:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyScenarioParameters(eventCreatedDateTime:gte, eventCreatedDateTime:lt, limit) - GetEvents'.
    1653:  INFO 2126 --- [           main] o.d.c.manual.ManualScenarioTest          : Done with JIT as role: Subscriber
    1654:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Created sandbox: OVS v3.0.0, suite: Conformance, role: Publisher, defaultType: true
    1655:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Created sandbox: OVS v3.0.0, suite: Conformance, role: Publisher, defaultType: false
    1656:  WARN 2126 --- [           main] o.d.c.core.state.StatefulExecutor        : Execution failed, unlocking (lockedBy='56e64c78-fb0c-4af4-a8a0-77e3d4c82953', partitionKey='session#ab3c4734-e4d2-4d6d-912a-c7d6fc707125', sortKey='state#orchestrator'): java.lang.NullPointerException: Cannot invoke "org.dcsa.conformance.standards.ovs.party.SuppliedScenarioParameters.getMap()" because the return value of "java.util.function.Supplier.get()" is null
    ...
    
    1823:  at org.apache.maven.surefire.junitplatform.LazyLauncher.execute(LazyLauncher.java:56) ~[surefire-junit-platform-3.5.2.jar:3.5.2]
    1824:  at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:184) ~[surefire-junit-platform-3.5.2.jar:3.5.2]
    1825:  at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:148) ~[surefire-junit-platform-3.5.2.jar:3.5.2]
    1826:  at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:122) ~[surefire-junit-platform-3.5.2.jar:3.5.2]
    1827:  at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385) ~[surefire-booter-3.5.2.jar:3.5.2]
    1828:  at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162) ~[surefire-booter-3.5.2.jar:3.5.2]
    1829:  at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507) ~[surefire-booter-3.5.2.jar:3.5.2]
    1830:  at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495) ~[surefire-booter-3.5.2.jar:3.5.2]
    1831:  WARN 2126 --- [           main] o.d.c.sandbox.ConformanceWebuiHandler    : Internal Server Error: java.lang.RuntimeException; Message: Execution failed: java.lang.NullPointerException: Cannot invoke "org.dcsa.conformance.standards.ovs.party.SuppliedScenarioParameters.getMap()" because the return value of "java.util.function.Supplier.get()" is null
    1832:  INFO 2126 --- [           main] o.d.c.manual.ManualScenarioTest          : Run for the 2nd time, and verify it still works.
    1833:  INFO 2126 --- [           main] o.d.c.manual.ManualScenarioTest          : Using sandboxes: OVS v3.0.0, suite: Conformance, role: Publisher
    1834:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Reset state of sandbox: OVS v3.0.0, Conformance, Publisher - Testing: synthetic Publisher as tested party
    1835:  WARN 2126 --- [           main] o.d.c.core.state.StatefulExecutor        : Execution failed, unlocking (lockedBy='837f7679-90f9-4f5b-af7b-97f87f96988a', partitionKey='session#ab3c4734-e4d2-4d6d-912a-c7d6fc707125', sortKey='state#orchestrator'): java.lang.NullPointerException: Cannot invoke "org.dcsa.conformance.standards.ovs.party.SuppliedScenarioParameters.getMap()" because the return value of "java.util.function.Supplier.get()" is null
    ...
    
    2002:  at org.apache.maven.surefire.junitplatform.LazyLauncher.execute(LazyLauncher.java:56) ~[surefire-junit-platform-3.5.2.jar:3.5.2]
    2003:  at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:184) ~[surefire-junit-platform-3.5.2.jar:3.5.2]
    2004:  at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:148) ~[surefire-junit-platform-3.5.2.jar:3.5.2]
    2005:  at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:122) ~[surefire-junit-platform-3.5.2.jar:3.5.2]
    2006:  at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385) ~[surefire-booter-3.5.2.jar:3.5.2]
    2007:  at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162) ~[surefire-booter-3.5.2.jar:3.5.2]
    2008:  at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507) ~[surefire-booter-3.5.2.jar:3.5.2]
    2009:  at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495) ~[surefire-booter-3.5.2.jar:3.5.2]
    2010:  WARN 2126 --- [           main] o.d.c.sandbox.ConformanceWebuiHandler    : Internal Server Error: java.lang.RuntimeException; Message: Execution failed: java.lang.NullPointerException: Cannot invoke "org.dcsa.conformance.standards.ovs.party.SuppliedScenarioParameters.getMap()" because the return value of "java.util.function.Supplier.get()" is null
    ...
    
    2399:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyTDR[Negotiable eBL] - SurrenderForAmendmentAndSwitchToPaperAccepted'.
    2400:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyTDR[Straight eBL] - SurrenderForDeliveryRejected'.
    2401:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyTDR[Straight eBL] - SurrenderForAmendmentRejected'.
    2402:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyTDR[Straight eBL] - SurrenderForAmendmentAndSwitchToPaperRejected'.
    2403:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyTDR[Negotiable eBL] - SurrenderForDeliveryRejected'.
    2404:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyTDR[Negotiable eBL] - SurrenderForAmendmentRejected'.
    2405:  INFO 2126 --- [           main] o.d.conformance.manual.ManualTestBase    : Validating scenario 'SupplyTDR[Negotiable eBL] - SurrenderForAmendmentAndSwitchToPaperRejected'.
    2406:  INFO 2126 --- [           main] o.d.c.manual.ManualScenarioTest          : Done with eBL Surrender as role: Platform
    2407:  [ERROR] Tests run: 21, Failures: 2, Errors: 0, Skipped: 1, Time elapsed: 623.4 s <<< FAILURE! -- in org.dcsa.conformance.manual.ManualScenarioTest
    2408:  [ERROR] org.dcsa.conformance.manual.ManualScenarioTest.testStandards(String, boolean)[11] -- Time elapsed: 0.016 s <<< FAILURE!
    2409:  org.opentest4j.AssertionFailedError: expected: <true> but was: <false>
    ...
    
    2477:  at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    2478:  at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    2479:  at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    2480:  at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    2481:  at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    2482:  at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
    2483:  at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
    2484:  at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
    2485:  [ERROR] org.dcsa.conformance.manual.ManualScenarioTest.testStandards(String, boolean)[12] -- Time elapsed: 0.010 s <<< FAILURE!
    2486:  org.opentest4j.AssertionFailedError: expected: <true> but was: <false>
    ...
    
    2557:  at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    2558:  at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    2559:  at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
    2560:  at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
    2561:  at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
    2562:  [INFO] 
    2563:  [INFO] Results:
    2564:  [INFO] 
    2565:  [ERROR] Failures: 
    2566:  [ERROR]   ManualScenarioTest.testStandards:61->lambda$testStandards$4:65->lambda$testStandards$3:69->lambda$testStandards$2:71->runManualTests:116->ManualTestBase.getScenarioDigests:343 expected: <true> but was: <false>
    2567:  [ERROR]   ManualScenarioTest.testStandards:61->lambda$testStandards$4:65->lambda$testStandards$3:69->lambda$testStandards$2:71->runManualTests:116->ManualTestBase.getScenarioDigests:343 expected: <true> but was: <false>
    2568:  [INFO] 
    2569:  [ERROR] Tests run: 38, Failures: 2, Errors: 0, Skipped: 4
    ...
    
    2581:  [INFO] dcsa-conformance-ebl-surrender ..................... SUCCESS [  0.478 s]
    2582:  [INFO] dcsa-conformance-jit ............................... SUCCESS [  0.329 s]
    2583:  [INFO] dcsa-conformance-ovs ............................... SUCCESS [  2.220 s]
    2584:  [INFO] dcsa-conformance-tnt ............................... SUCCESS [  2.509 s]
    2585:  [INFO] dcsa-conformance-adoption .......................... SUCCESS [  2.154 s]
    2586:  [INFO] dcsa-conformance-cdk ............................... SUCCESS [  1.673 s]
    2587:  [INFO] dcsa-conformance-sandbox ........................... SUCCESS [  0.894 s]
    2588:  [INFO] dcsa-conformance-lambda ............................ SUCCESS [  3.223 s]
    2589:  [INFO] dcsa-conformance-spring-boot ....................... FAILURE [10:59 min]
    2590:  [INFO] ------------------------------------------------------------------------
    2591:  [INFO] BUILD FAILURE
    2592:  [INFO] ------------------------------------------------------------------------
    2593:  [INFO] Total time:  11:28 min
    2594:  [INFO] Finished at: [INFO] ------------------------------------------------------------------------
    2595:  [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.5.2:test (default-test) on project spring-boot: There are test failures.
    2596:  [ERROR] 
    2597:  [ERROR] See /home/runner/work/Conformance-Gateway/Conformance-Gateway/spring-boot/target/surefire-reports for the individual test results.
    2598:  [ERROR] See dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
    2599:  [ERROR] -> [Help 1]
    2600:  [ERROR] 
    2601:  [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    2602:  [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    2603:  [ERROR] 
    2604:  [ERROR] For more information about the errors and possible solutions, please read the following articles:
    2605:  [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
    2606:  [ERROR] 
    2607:  [ERROR] After correcting the problems, you can resume the build with the command
    2608:  [ERROR]   mvn <args> -rf :spring-boot
    2609:  ##[error]Process completed with exit code 1.
    

    ✨ CI feedback usage guide:

    The CI feedback tool (/checks) automatically triggers when a PR has a failed check.
    The tool analyzes the failed checks and provides several feedbacks:

    • Failed stage
    • Failed test name
    • Failure summary
    • Relevant error logs

    In addition to being automatically triggered, the tool can also be invoked manually by commenting on a PR:

    /checks "https://github.com/{repo_name}/actions/runs/{run_number}/job/{job_number}"
    

    where {repo_name} is the name of the repository, {run_number} is the run number of the failed check, and {job_number} is the job number of the failed check.

    Configuration options

    • enable_auto_checks_feedback - if set to true, the tool will automatically provide feedback when a check is failed. Default is true.
    • excluded_checks_list - a list of checks to exclude from the feedback, for example: ["check1", "check2"]. Default is an empty list.
    • enable_help_text - if set to true, the tool will provide a help message with the feedback. Default is true.
    • persistent_comment - if set to true, the tool will overwrite a previous checks comment with the new feedback. Default is true.
    • final_update_message - if persistent_comment is true and updating a previous checks message, the tool will also create a new message: "Persistent checks updated to latest commit". Default is true.

    See more information about the checks tool in the docs.

    @jkosternl jkosternl changed the title SD-1823 revisit of the Ovs checks with unit test cases. SD-1823 Revisit the OVS checks with unit test cases Nov 28, 2024
    @preetamnpr preetamnpr marked this pull request as ready for review November 29, 2024 08:59
    Copy link

    PR-Agent was enabled for this repository. To continue using it, please link your git user with your CodiumAI identity here.

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

    ⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
    🧪 PR contains tests
    🔒 No security concerns identified
    ⚡ Recommended focus areas for review

    Error Handling
    The error handling in date parsing could be improved. Currently, errors are silently logged and null is returned, which could lead to validation issues being missed.

    Code Duplication
    The validation logic for different parameters follows similar patterns and could be refactored to reduce duplication and improve maintainability.

    Dead Code
    Several boolean flags are defined but never used in the actual logic, which could lead to confusion and maintenance issues.

    Copy link

    qodo-merge-pro bot commented Nov 29, 2024

    PR-Agent was enabled for this repository. To continue using it, please link your git user with your CodiumAI identity here.

    PR Code Suggestions ✨

    Explore these optional code suggestions:

    CategorySuggestion                                                                                                                                    Score
    Possible issue
    ✅ Ensure consistent property naming across all objects in the JSON array
    Suggestion Impact:The commit removed the JSON structure entirely, which included the inconsistent property naming issue. This indirectly resolved the inconsistency by eliminating the problematic data.

    code diff:

    -[
    -  {
    -    "carrierServiceName": "Great Lion Servicedd",
    -    "carrierServiceCode": "FE1",
    -    "universalServiceReference": "SR12345A",
    -    "vessels": [
    -      {
    -        "vesselOperatorSMDGLinerCode": "HLC",
    -        "vesselIMONumber": "9321483",
    -        "vesselName": "King of the Seas",
    -        "vesselCallSign": "NCVV",
    -        "isDummyVessel": true,
    -        "transportCalls": [
    -          {
    -            "portVisitReference": "NLAMS1234589",
    -            "transportCallReference": "SR11111X-9321483-2107W-NLAMS-ACT-1-1",
    -            "carrierImportVoyageNumber": "2103N",
    -            "carrierExportVoyageNumber": "2103S",
    -            "universalImportVoyageReference": "2103N",
    -            "universalExportVoyageReference": "2103S",
    -            "location": {
    -              "locationName": "Port of Amsterdam",
    -              "locationType": "UNLO",
    -              "UNLocationCode": "NLAMS"
    -            },
    -            "statusCode": "OMIT",
    -            "timestamps": [
    -              {
    -                "eventTypeCode": "ARRI",
    -                "eventClassifierCode": "PLN",
    -                "eventDateTime": "2025-01-14T09:21:00+01:00",
    -                "delayReasonCode": "WEA",
    -                "changeRemark": "Bad weather"
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "carrierServiceName": "Great Lion Servicedd",
    -    "carrierServiceCode": "BW1",
    -    "universalServiceReference": "SR67890B",
    -    "vesselSchedules": [
    -      {
    -        "vesselOperatorSMDGLinerCode": "MSC",
    -        "vesselIMONumber": "9456789",
    -        "vesselName": "Queen of the Oceans",
    -        "vesselCallSign": "QOCE",
    -        "isDummyVessel": false,
    -        "transportCalls": [
    -          {
    -            "portVisitReference": "SGSIN1234567",
    -            "transportCallReference": "SR22222Y-9456789-2108E-SGSIN-ACT-2-2",
    -            "carrierImportVoyageNumber": "2104N",
    -            "carrierExportVoyageNumber": "2104S",
    -            "universalImportVoyageReference": "2104N",
    -            "universalExportVoyageReference": "2104S",
    -            "location": {
    -              "locationName": "Port of Singapore",
    -              "locationType": "UNLO",
    -              "UNLocationCode": "SGSIN"
    -            },
    -            "statusCode": "ARRI",
    -            "timestamps": [
    -              {
    -                "eventTypeCode": "DEPA",
    -                "eventClassifierCode": "ACT",
    -                "eventDateTime": "2025-02-20T15:30:00+08:00",
    -                "delayReasonCode": "TRF",
    -                "changeRemark": "Traffic congestion"
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "carrierServiceName": "Red Falcon Service",
    -    "carrierServiceCode": "RF1",
    -    "universalServiceReference": "SR54321C",
    -    "vesselSchedules": [
    -      {
    -        "vesselOperatorSMDGLinerCode": "MAE",
    -        "vesselIMONumber": "9876543",
    -        "vesselName": "Eagle of the Seas",
    -        "vesselCallSign": "EGLS",
    -        "isDummyVessel": false,
    -        "transportCalls": [
    -          {
    -            "portVisitReference": "USNYC1234567",
    -            "transportCallReference": "SR33333Z-9876543-2109W-USNYC-ACT-3-3",
    -            "carrierImportVoyageNumber": "2105N",
    -            "carrierExportVoyageNumber": "2105S",
    -            "universalImportVoyageReference": "2105N",
    -            "universalExportVoyageReference": "2105S",
    -            "location": {
    -              "locationName": "Port of New York",
    -              "locationType": "UNLO",
    -              "UNLocationCode": "USNYC"
    -            },
    -            "statusCode": "ARRI",
    -            "timestamps": [
    -              {
    -                "eventTypeCode": "ARRI",
    -                "eventClassifierCode": "ACT",
    -                "eventDateTime": "2025-03-15T10:00:00-05:00",
    -                "delayReasonCode": "TRF",
    -                "changeRemark": "Heavy traffic"
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  }
    -]

    The first object in the array uses "vessels" as a key while others use
    "vesselSchedules". This inconsistency should be fixed to maintain a uniform
    structure across all objects.

    ovs/src/main/resources/standards/ovs/messages/ovs-300-response-wrong-structure.json [4-6]

     {
       "carrierServiceName": "Great Lion Servicedd",
       "carrierServiceCode": "FE1",
       "universalServiceReference": "SR12345A",
    -  "vessels": [
    +  "vesselSchedules": [
    • Apply this suggestion
    Suggestion importance[1-10]: 9

    Why: The inconsistent use of "vessels" vs "vesselSchedules" in the JSON structure is a significant issue that could cause parsing errors and data inconsistency. This needs to be standardized across all objects.

    9
    Include required timestamp fields in all timestamp objects

    The first timestamp object is missing the required "eventDateTime" field, which is
    present in all other timestamp objects.

    ovs/src/main/resources/standards/ovs/messages/ovs-300-response-wrong-date-times.json [28-34]

     "timestamps": [
       {
         "eventTypeCode": "ARRI",
         "eventClassifierCode": "PLN",
    +    "eventDateTime": "2025-01-14T09:21:00+01:00",
         "delayReasonCode": "WEA",
         "changeRemark": "Bad weather"
       }
     ]
    • Apply this suggestion
    Suggestion importance[1-10]: 9

    Why: Missing the required "eventDateTime" field in a timestamp object is a critical data completeness issue that could cause validation failures and processing errors.

    9
    Add null check to prevent NullPointerException when parsing date values

    Add null check before parsing the eventDateTime string to avoid potential
    NullPointerException if the timestamp node is missing the eventDateTime field.

    ovs/src/main/java/org/dcsa/conformance/standards/ovs/checks/OvsChecks.java [214]

    -LocalDate eventDateTime = stringToISODateTime(timestampNode.path("eventDateTime").asText());
    +JsonNode eventDateTimeNode = timestampNode.path("eventDateTime");
    +LocalDate eventDateTime = !eventDateTimeNode.isMissingNode() ? stringToISODateTime(eventDateTimeNode.asText()) : null;
    • Apply this suggestion
    Suggestion importance[1-10]: 8

    Why: The suggestion addresses a critical null safety issue that could cause runtime exceptions. Adding null checks for eventDateTime is essential for robust error handling.

    8
    ✅ Add null check to prevent NullPointerException when accessing timestamps node
    Suggestion Impact:The commit added null checks for eventDateTime nodes in the timestamps stream, which aligns with the suggestion's goal of preventing NullPointerException

    code diff:

    +                            eventDateTimeNode ->
    +                                !eventDateTimeNode.isMissingNode() && !eventDateTimeNode.isNull())
    +                        .filter(

    Return early if timestamps node is missing or null to avoid potential
    NullPointerException in the stream operations.

    ovs/src/main/java/org/dcsa/conformance/standards/ovs/checks/OvsChecks.java [207-210]

     findMatchingNodes(body, "*/vesselSchedules/*/transportCalls/*/timestamps")
    +    .filter(timestampsNode -> !timestampsNode.getValue().isMissingNode() && !timestampsNode.getValue().isNull())
         .flatMap(timestampsNode ->
             StreamSupport.stream(timestampsNode.getValue().spliterator(), false)
    • Apply this suggestion
    Suggestion importance[1-10]: 8

    Why: This suggestion prevents potential NullPointerException by validating the timestamps node before processing, which is crucial for the application's stability.

    8
    ✅ Use standard ISO 8601 date format with hyphens for timestamp values
    Suggestion Impact:The commit removed the JSON file containing timestamps with incorrect separators, which indirectly resolves the issue by eliminating the problematic data.

    code diff:

    @@ -1,118 +0,0 @@
    -[
    -  {
    -    "carrierServiceName": "Great Lion Servicedd",
    -    "carrierServiceCode": "FE1",
    -    "universalServiceReference": "SR12345A",
    -    "vesselSchedules": [
    -      {
    -        "vesselOperatorSMDGLinerCode": "HLC",
    -        "vesselIMONumber": "9321483",
    -        "vesselName": "King of the Seas",
    -        "vesselCallSign": "NCVV",
    -        "isDummyVessel": true,
    -        "transportCalls": [
    -          {
    -            "portVisitReference": "NLAMS1234589",
    -            "transportCallReference": "SR11111X-9321483-2107W-NLAMS-ACT-1-1",
    -            "carrierImportVoyageNumber": "2103N",
    -            "carrierExportVoyageNumber": "2103S",
    -            "universalImportVoyageReference": "2103N",
    -            "universalExportVoyageReference": "2103S",
    -            "location": {
    -              "locationName": "Port of Amsterdam",
    -              "locationType": "UNLO",
    -              "UNLocationCode": "NLAMS"
    -            },
    -            "statusCode": "OMIT",
    -            "timestamps": [
    -              {
    -                "eventTypeCode": "ARRI",
    -                "eventClassifierCode": "PLN",
    -                "delayReasonCode": "WEA",
    -                "changeRemark": "Bad weather"
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "carrierServiceName": "Great Lion Servicedd",
    -    "carrierServiceCode": "BW1",
    -    "universalServiceReference": "SR67890B",
    -    "vesselSchedules": [
    -      {
    -        "vesselOperatorSMDGLinerCode": "MSC",
    -        "vesselIMONumber": "9456789",
    -        "vesselName": "Queen of the Oceans",
    -        "vesselCallSign": "QOCE",
    -        "isDummyVessel": false,
    -        "transportCalls": [
    -          {
    -            "portVisitReference": "SGSIN1234567",
    -            "transportCallReference": "SR22222Y-9456789-2108E-SGSIN-ACT-2-2",
    -            "carrierImportVoyageNumber": "2104N",
    -            "carrierExportVoyageNumber": "2104S",
    -            "universalImportVoyageReference": "2104N",
    -            "universalExportVoyageReference": "2104S",
    -            "location": {
    -              "locationName": "Port of Singapore",
    -              "locationType": "UNLO",
    -              "UNLocationCode": "SGSIN"
    -            },
    -            "statusCode": "ARRI",
    -            "timestamps": [
    -              {
    -                "eventTypeCode": "DEPA",
    -                "eventClassifierCode": "ACT",
    -                "eventDateTime": "2025/02/20T15:30:00+08:00",
    -                "delayReasonCode": "TRF",
    -                "changeRemark": "Traffic congestion"
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "carrierServiceName": "Red Falcon Service",
    -    "carrierServiceCode": "RF1",
    -    "universalServiceReference": "SR54321C",
    -    "vesselSchedules": [
    -      {
    -        "vesselOperatorSMDGLinerCode": "MAE",
    -        "vesselIMONumber": "9876543",
    -        "vesselName": "Eagle of the Seas",
    -        "vesselCallSign": "EGLS",
    -        "isDummyVessel": false,
    -        "transportCalls": [
    -          {
    -            "portVisitReference": "USNYC1234567",
    -            "transportCallReference": "SR33333Z-9876543-2109W-USNYC-ACT-3-3",
    -            "carrierImportVoyageNumber": "2105N",
    -            "carrierExportVoyageNumber": "2105S",
    -            "universalImportVoyageReference": "2105N",
    -            "universalExportVoyageReference": "2105S",
    -            "location": {
    -              "locationName": "Port of New York",
    -              "locationType": "UNLO",
    -              "UNLocationCode": "USNYC"
    -            },
    -            "statusCode": "ARRI",
    -            "timestamps": [
    -              {
    -                "eventTypeCode": "ARRI",
    -                "eventClassifierCode": "ACT",
    -                "eventDateTime": "2025.03.15T10:00:00-05:00",
    -                "delayReasonCode": "TRF",
    -                "changeRemark": "Heavy traffic"
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  }

    The date format in timestamps uses incorrect separators (/ and .) instead of the
    standard ISO 8601 format with hyphens (-).

    ovs/src/main/resources/standards/ovs/messages/ovs-300-response-wrong-date-times.json [69-108]

    -"eventDateTime": "2025/02/20T15:30:00+08:00",
    +"eventDateTime": "2025-02-20T15:30:00+08:00",
     ...
    -"eventDateTime": "2025.03.15T10:00:00-05:00",
    +"eventDateTime": "2025-03-15T10:00:00-05:00",
    Suggestion importance[1-10]: 8

    Why: Using non-standard date formats (/ and .) instead of ISO 8601 format (-) could cause parsing errors and data validation issues. This is a critical data format consistency issue.

    8
    Throw exception instead of returning null for invalid date formats

    Add error handling for invalid date format in stringToISODateTime method to avoid
    returning null which could lead to NPE.

    ovs/src/main/java/org/dcsa/conformance/standards/ovs/checks/OvsChecks.java [233-240]

     private static LocalDate stringToISODateTime(String dateTimeString) {
       try {
         return OffsetDateTime.parse(dateTimeString, DateTimeFormatter.ISO_DATE_TIME).toLocalDate();
       } catch (DateTimeParseException e) {
         log.error("Failed to parse date time string: {}", dateTimeString, e);
    -    return null;
    +    throw new IllegalArgumentException("Invalid date time format: " + dateTimeString, e);
       }
     }
    • Apply this suggestion
    Suggestion importance[1-10]: 7

    Why: Converting null returns to explicit exceptions improves error handling and makes the code more predictable, though the current logging approach is already somewhat helpful.

    7

    💡 Need additional feedback ? start a PR chat

    sspSupplier,
    OvsFilterParameter.FACILITY_SMDG_CODE,
    "*/vesselSchedules/*/transportCalls/*/location/facilitySMDGCode")));
    "If present, at least schedule attribute must match the corresponding query parameters",
    Copy link
    Collaborator

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Does this mean at least one schedule? I didn't get it from this message string

    Copy link
    Collaborator Author

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    it should have been "at least one schedule". it corrrect it

    if (RETURN_EMPTY_RESPONSE) {
    return request.createResponse(
    200, headers, new ConformanceMessageBody(OBJECT_MAPPER.createArrayNode()));
    } else if (USE_WRONG_ATTRIBUTE_VALUES) {
    Copy link
    Collaborator

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Do we need two different responses for both wrong attributes and dates?

    Copy link
    Collaborator

    @jkosternl jkosternl left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    I've investigated the code locally and I think you can make it easier, with a few adjustments. Let's have a Team call if you think it is not feasible.

    }
    }

    return Set.of();
    }));

    return JsonAttribute.contentChecks(
    Copy link
    Collaborator

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    @preetamnpr, I've checked on how you can unit test this without the modifications in JsonAttributeBasedCheck. I think it is possible if you move each separate check into a package private method, which generates just one check. Or if you don't like that, just have this method return the checks and make it package private. The checks itself are easy to validate with. And create the wrapper a level higher: JsonAttribute.contentChecks(OvsRole::isPublisher, matched, HttpMessageType.RESPONSE, standardVersion, checks);

    Copy link
    Collaborator Author

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    The wrapper method works and this doesnt require any core changes in order to build the unit test cases. I have implemented the wrapper method and it works fine with no changs to core.

    Copy link
    Collaborator

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    It was just a suggestion on how you can more easily unit test it. The last sentence on the wrapper is just a side note.. just keep it if it is needed. No worries.

    .map(Map.Entry::getKey)
    .collect(Collectors.joining(", ")), // Get keys here
    attributeValues.size() > 1 ? "" : "es",
    parameterValues.size() > 1 ? "s" : "",
    Copy link
    Collaborator

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    You're doing this very properly..but I think perhaps it is too nice 😉 . You can just safe time and code by doing this: Value(s). If it was on the front page of a site, it is important, but since this is an error code, which is still clear, you can make it yourself easy.

    Copy link
    Collaborator

    @jkosternl jkosternl left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Thanks Preetam. Please wait before merging, on the others. Only put some minor remarks.

    "CheckServiceSchedules failed: %s".formatted(validationError)));
    if (validationErrors.isEmpty()) {
    return Set.of();
    }
    Copy link
    Collaborator

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Line 41-43 can be removed, because line 44 does the same (return empty Set, or with entries).


    if (body == null || body.isMissingNode() || body.isNull()) {
    return Set.of("Response body is missing or null.");
    } else {
    Copy link
    Collaborator

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Suggested change
    } else {
    }

    @gj0dcsa gj0dcsa merged commit 9410509 into dev Dec 15, 2024
    1 check passed
    @gj0dcsa gj0dcsa deleted the SD-1823 branch December 15, 2024 14:43
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    4 participants