From 15fdadb3635e70a34cad0e4b3d79a7166529e49a Mon Sep 17 00:00:00 2001 From: SandorArpa Date: Mon, 8 Dec 2025 17:45:17 +0000 Subject: [PATCH] PP-14760 upgrade to Dropwizard v5 iteration 2 - Remove Dropwizard v4 modules - Refactor poms to use the root pom as parent (Dropwizard bom) --- .github/dependabot.yml | 42 -- .secrets.baseline | 29 +- logging-dropwizard-4/pom.xml | 68 --- ...ovUkPayDropwizardRequestJsonLogLayout.java | 75 ---- ...DropwizardRequestJsonLogLayoutFactory.java | 50 --- .../payments/logging/LoggingFilter.java | 67 --- .../service/payments/logging/LoggingKeys.java | 247 ----------- .../LogstashConsoleAppenderFactory.java | 56 --- .../logging/RestClientLoggingFilter.java | 66 --- .../uk/gov/service/payments/logging/Fake.java | 4 - ...wizardRequestJsonLogLayoutFactoryTest.java | 16 - .../payments/logging/LoggingFilterTest.java | 129 ------ .../logging/RestClientLoggingFilterTest.java | 111 ----- logging-dropwizard-5/pom.xml | 18 - model-dropwizard-4/pom.xml | 56 --- .../api/exception/ValidationException.java | 16 - .../json/ApiResponseDateTimeDeserializer.java | 31 -- .../json/ApiResponseDateTimeSerializer.java | 27 -- .../json/ExternalMetadataDeserialiser.java | 29 -- .../api/json/ExternalMetadataSerialiser.java | 27 -- .../IsoInstantMicrosecondDeserializer.java | 27 -- .../json/IsoInstantMicrosecondSerializer.java | 27 -- .../IsoInstantMillisecondDeserializer.java | 27 -- .../json/IsoInstantMillisecondSerializer.java | 27 -- .../payments/commons/api/json/JsonMapper.java | 45 -- ...rosecondPrecisionDateTimeDeserializer.java | 34 -- ...icrosecondPrecisionDateTimeSerializer.java | 34 -- .../api/resources/ResourceStrings.java | 14 - .../api/validation/AllowedStrings.java | 34 -- .../validation/AllowedStringsValidator.java | 21 - .../validation/JsonPatchRequestValidator.java | 96 ---- .../validation/MapKeyInsensitiveUnique.java | 29 -- .../MapKeyInsensitiveUniqueValidator.java | 20 - .../commons/api/validation/MapKeyLength.java | 32 -- .../api/validation/MapKeyLengthValidator.java | 28 -- .../MapValueAsStringLengthValidator.java | 31 -- .../api/validation/MapValueLength.java | 32 -- .../api/validation/MapValueNotNull.java | 28 -- .../validation/MapValueNotNullValidator.java | 20 - .../commons/api/validation/MapValueTypes.java | 30 -- .../validation/MapValueTypesValidator.java | 34 -- .../api/validation/PatchPathOperation.java | 36 -- .../api/validation/RequestValidator.java | 120 ----- .../api/validation/ValidExternalMetadata.java | 41 -- .../commons/jpa/CardExpiryDateConverter.java | 29 -- ...oUtcTimestampWithoutTimeZoneConverter.java | 39 -- .../commons/model/AgreementPaymentType.java | 31 -- .../commons/model/AuthorisationMode.java | 33 -- .../commons/model/CardExpiryDate.java | 101 ----- .../model/CommonDateTimeFormatters.java | 33 -- .../commons/model/ErrorIdentifier.java | 35 -- .../payments/commons/model/Source.java | 17 - .../commons/model/SupportedLanguage.java | 28 -- .../model/SupportedLanguageJpaConverter.java | 19 - .../SupportedLanguageJsonDeserializer.java | 15 - .../commons/model/TokenPaymentType.java | 23 - .../commons/model/WrappedStringValue.java | 37 -- .../model/agreement/AgreementStatus.java | 17 - .../agreement/PaymentInstrumentType.java | 14 - .../model/charge/ExternalMetadata.java | 26 -- .../model/jsonpatch/JsonPatchKeys.java | 9 - .../commons/model/jsonpatch/JsonPatchOp.java | 7 - .../model/jsonpatch/JsonPatchRequest.java | 114 ----- .../ApiResponseDateTimeDeserializerTest.java | 61 --- .../ApiResponseDateTimeSerializerTest.java | 30 -- .../ExternalMetadataDeserialiserTest.java | 54 --- ...IsoInstantMicrosecondDeserializerTest.java | 128 ------ .../IsoInstantMicrosecondSerializerTest.java | 34 -- ...IsoInstantMillisecondDeserializerTest.java | 128 ------ .../IsoInstantMillisecondSerializerTest.java | 34 -- .../commons/api/json/JsonMapperTest.java | 32 -- ...condPrecisionDateTimeDeserializerTest.java | 64 --- ...secondPrecisionDateTimeSerializerTest.java | 32 -- .../JsonPatchRequestValidatorTest.java | 181 -------- .../jpa/CardExpiryDateConverterTest.java | 39 -- ...TimestampWithoutTimeZoneConverterTest.java | 42 -- .../commons/model/CardExpiryDateTest.java | 419 ------------------ .../model/CommonDateTimeFormattersTest.java | 156 ------- ...SupportedLanguageJsonDeserializerTest.java | 76 ---- .../commons/model/SupportedLanguageTest.java | 38 -- .../commons/model/TokenPaymentTypeTest.java | 40 -- .../commons/model/WrappedStringValueTest.java | 114 ----- .../model/charge/ExternalMetadataTest.java | 161 ------- model-dropwizard-5/pom.xml | 12 - pom.xml | 10 +- queue-dropwizard-4/pom.xml | 52 --- .../queue/exception/QueueException.java | 12 - .../commons/queue/model/QueueMessage.java | 48 -- .../commons/queue/sqs/AbstractQueue.java | 46 -- .../commons/queue/sqs/SqsQueueService.java | 120 ----- .../queue/sqs/SqsQueueServiceTest.java | 155 ------- queue-dropwizard-5/pom.xml | 12 - testing-dropwizard-4/pom.xml | 115 ----- .../commons/testing/db/PostgresContainer.java | 115 ----- .../testing/db/PostgresDockerExtension.java | 14 - .../testing/db/PostgresDockerRule.java | 21 - .../testing/db/PostgresTestHelper.java | 32 -- .../testing/matchers/HamcrestMatchers.java | 13 - .../testing/pact/consumers/MultiPacts.java | 12 - .../commons/testing/pact/consumers/Pacts.java | 16 - .../pact/consumers/PayPactProviderRule.java | 77 ---- .../pact/provider/CreateTestSuite.java | 30 -- .../commons/testing/port/PortFactory.java | 20 - .../consumers/PayPactProviderRuleTest.java | 73 --- .../pact/consumers/PayPactPublishingTest.java | 37 -- .../pact/provider/CreateTestSuiteTest.java | 44 -- .../src/test/resources/pact-from-broker.json | 136 ------ .../pact-from-broker-2.json | 105 ----- .../resources/pact-publishing-test/pacts.json | 86 ---- .../provider-service-pacts.json | 31 -- .../pacts/consumer-order-service.json | 32 -- .../consumer-stock-quote-service-axp.json | 47 -- .../pacts/consumer-stock-quote-service-v.json | 47 -- .../pacts/consumer-weather-service.json | 41 -- testing-dropwizard-5/pom.xml | 8 - utils-dropwizard-4/pom.xml | 63 --- .../healthchecks/DatabaseHealthCheck.java | 32 -- .../utils/metrics/DatabaseMetricsService.java | 161 ------- .../ApplicationStartupDependentResource.java | 5 - ...cationStartupDependentResourceChecker.java | 41 -- .../startup/DatabaseStartupResource.java | 40 -- .../src/main/resources/sampling-rules.json | 17 - .../metrics/DatabaseMetricsServiceTest.java | 86 ---- ...onStartupDependentResourceCheckerTest.java | 91 ---- utils-dropwizard-5/pom.xml | 18 - validation-dropwizard-4/pom.xml | 26 -- .../commons/validation/DateTimeUtils.java | 62 --- .../commons/validation/DateValidator.java | 19 - .../commons/validation/ValidDate.java | 28 -- .../commons/validation/DateTimeUtilsTest.java | 90 ---- validation-dropwizard-5/pom.xml | 12 - 131 files changed, 3 insertions(+), 6928 deletions(-) delete mode 100644 logging-dropwizard-4/pom.xml delete mode 100644 logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayout.java delete mode 100644 logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayoutFactory.java delete mode 100644 logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LoggingFilter.java delete mode 100644 logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LoggingKeys.java delete mode 100644 logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LogstashConsoleAppenderFactory.java delete mode 100644 logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/RestClientLoggingFilter.java delete mode 100644 logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/Fake.java delete mode 100644 logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayoutFactoryTest.java delete mode 100644 logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/LoggingFilterTest.java delete mode 100644 logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/RestClientLoggingFilterTest.java delete mode 100644 model-dropwizard-4/pom.xml delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/exception/ValidationException.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeDeserializer.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeSerializer.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ExternalMetadataDeserialiser.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ExternalMetadataSerialiser.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondDeserializer.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondSerializer.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondDeserializer.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondSerializer.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/JsonMapper.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeDeserializer.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeSerializer.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/resources/ResourceStrings.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/AllowedStrings.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/AllowedStringsValidator.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/JsonPatchRequestValidator.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyInsensitiveUnique.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyInsensitiveUniqueValidator.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyLength.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyLengthValidator.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueAsStringLengthValidator.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueLength.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueNotNull.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueNotNullValidator.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueTypes.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueTypesValidator.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/PatchPathOperation.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/RequestValidator.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/ValidExternalMetadata.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/jpa/CardExpiryDateConverter.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/jpa/InstantToUtcTimestampWithoutTimeZoneConverter.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/AgreementPaymentType.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/AuthorisationMode.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/CardExpiryDate.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/CommonDateTimeFormatters.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/ErrorIdentifier.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/Source.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguage.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguageJpaConverter.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguageJsonDeserializer.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/TokenPaymentType.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/WrappedStringValue.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/agreement/AgreementStatus.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/agreement/PaymentInstrumentType.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/charge/ExternalMetadata.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchKeys.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchOp.java delete mode 100644 model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchRequest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeDeserializerTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeSerializerTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ExternalMetadataDeserialiserTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondDeserializerTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondSerializerTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondDeserializerTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondSerializerTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/JsonMapperTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeDeserializerTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeSerializerTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/validation/JsonPatchRequestValidatorTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/jpa/CardExpiryDateConverterTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/jpa/InstantToUtcTimestampWithoutTimeZoneConverterTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/CardExpiryDateTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/CommonDateTimeFormattersTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/SupportedLanguageJsonDeserializerTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/SupportedLanguageTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/TokenPaymentTypeTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/WrappedStringValueTest.java delete mode 100644 model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/charge/ExternalMetadataTest.java delete mode 100644 queue-dropwizard-4/pom.xml delete mode 100644 queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/exception/QueueException.java delete mode 100644 queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/model/QueueMessage.java delete mode 100644 queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/sqs/AbstractQueue.java delete mode 100644 queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/sqs/SqsQueueService.java delete mode 100644 queue-dropwizard-4/src/test/java/uk/gov/service/payments/commons/queue/sqs/SqsQueueServiceTest.java delete mode 100644 testing-dropwizard-4/pom.xml delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresContainer.java delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresDockerExtension.java delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresDockerRule.java delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresTestHelper.java delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/matchers/HamcrestMatchers.java delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/MultiPacts.java delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/Pacts.java delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactProviderRule.java delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/provider/CreateTestSuite.java delete mode 100644 testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/port/PortFactory.java delete mode 100644 testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactProviderRuleTest.java delete mode 100644 testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactPublishingTest.java delete mode 100644 testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/provider/CreateTestSuiteTest.java delete mode 100644 testing-dropwizard-4/src/test/resources/pact-from-broker.json delete mode 100644 testing-dropwizard-4/src/test/resources/pact-publishing-test/pact-from-broker-2.json delete mode 100644 testing-dropwizard-4/src/test/resources/pact-publishing-test/pacts.json delete mode 100644 testing-dropwizard-4/src/test/resources/pact-publishing-test/provider-service-pacts.json delete mode 100644 testing-dropwizard-4/src/test/resources/pacts/consumer-order-service.json delete mode 100644 testing-dropwizard-4/src/test/resources/pacts/consumer-stock-quote-service-axp.json delete mode 100644 testing-dropwizard-4/src/test/resources/pacts/consumer-stock-quote-service-v.json delete mode 100644 testing-dropwizard-4/src/test/resources/pacts/consumer-weather-service.json delete mode 100644 utils-dropwizard-4/pom.xml delete mode 100644 utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/healthchecks/DatabaseHealthCheck.java delete mode 100644 utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/metrics/DatabaseMetricsService.java delete mode 100644 utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupDependentResource.java delete mode 100644 utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupDependentResourceChecker.java delete mode 100644 utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/DatabaseStartupResource.java delete mode 100644 utils-dropwizard-4/src/main/resources/sampling-rules.json delete mode 100644 utils-dropwizard-4/src/test/java/uk/gov/service/payments/commons/utils/metrics/DatabaseMetricsServiceTest.java delete mode 100644 utils-dropwizard-4/src/test/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupApplicationStartupDependentResourceCheckerTest.java delete mode 100644 validation-dropwizard-4/pom.xml delete mode 100644 validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/DateTimeUtils.java delete mode 100644 validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/DateValidator.java delete mode 100644 validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/ValidDate.java delete mode 100644 validation-dropwizard-4/src/test/java/uk/gov/service/payments/commons/validation/DateTimeUtilsTest.java diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 59514db7..30281cdf 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,14 +7,6 @@ updates: interval: weekly time: "03:00" ignore: - - dependency-name: "io.dropwizard:dropwizard-dependencies" - # We don't want to upgrade to Dropwizard 5.x just yet - versions: - - ">= 5" - - dependency-name: "io.dropwizard.modules:dropwizard-testing-junit4" - # We don't want to upgrade to Dropwizard 5.x just yet - versions: - - ">= 5" - dependency-name: "net.logstash.logback:logstash-logback-encoder" # logstash 8+ needs refactoring on our end versions: @@ -24,70 +16,36 @@ updates: - dependencies - govuk-pay - java - - package-ecosystem: maven - directory: "/logging-dropwizard-4" - schedule: - interval: weekly - time: "03:00" - open-pull-requests-limit: 10 - package-ecosystem: maven directory: "/logging-dropwizard-5" schedule: interval: weekly time: "03:00" open-pull-requests-limit: 10 - - package-ecosystem: maven - directory: "/utils-dropwizard-4" - schedule: - interval: weekly - time: "03:00" - open-pull-requests-limit: 10 - package-ecosystem: maven directory: "/utils-dropwizard-5" schedule: interval: weekly time: "03:00" open-pull-requests-limit: 10 - - package-ecosystem: maven - directory: "/testing-dropwizard-4" - schedule: - interval: weekly - time: "03:00" - package-ecosystem: maven directory: "/testing-dropwizard-5" schedule: interval: weekly time: "03:00" open-pull-requests-limit: 10 - - package-ecosystem: maven - directory: "/queue-dropwizard-4" - schedule: - interval: weekly - time: "03:00" - open-pull-requests-limit: 10 - package-ecosystem: maven directory: "/queue-dropwizard-5" schedule: interval: weekly time: "03:00" open-pull-requests-limit: 10 - - package-ecosystem: maven - directory: "/model-dropwizard-4" - schedule: - interval: weekly - time: "03:00" - package-ecosystem: maven directory: "/model-dropwizard-5" schedule: interval: weekly time: "03:00" open-pull-requests-limit: 10 - - package-ecosystem: maven - directory: "/validation-dropwizard-4" - schedule: - interval: weekly - time: "03:00" - open-pull-requests-limit: 10 - package-ecosystem: maven directory: "/validation-dropwizard-5" schedule: diff --git a/.secrets.baseline b/.secrets.baseline index e5e019ad..51d59e31 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -112,33 +112,6 @@ } ], "results": { - "testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresContainer.java": [ - { - "type": "Secret Keyword", - "filename": "testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresContainer.java", - "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", - "is_verified": false, - "line_number": 22 - } - ], - "testing-dropwizard-4/src/test/resources/pact-from-broker.json": [ - { - "type": "Hex High Entropy String", - "filename": "testing-dropwizard-4/src/test/resources/pact-from-broker.json", - "hashed_secret": "d046d31e2e14cb07ac95b087e349f28fa8ed752f", - "is_verified": false, - "line_number": 79 - } - ], - "testing-dropwizard-4/src/test/resources/pact-publishing-test/pact-from-broker-2.json": [ - { - "type": "Hex High Entropy String", - "filename": "testing-dropwizard-4/src/test/resources/pact-publishing-test/pact-from-broker-2.json", - "hashed_secret": "d046d31e2e14cb07ac95b087e349f28fa8ed752f", - "is_verified": false, - "line_number": 48 - } - ], "testing-dropwizard-5/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresContainer.java": [ { "type": "Secret Keyword", @@ -167,5 +140,5 @@ } ] }, - "generated_at": "2025-12-02T17:06:21Z" + "generated_at": "2025-12-08T17:47:23Z" } diff --git a/logging-dropwizard-4/pom.xml b/logging-dropwizard-4/pom.xml deleted file mode 100644 index a651684d..00000000 --- a/logging-dropwizard-4/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - 4.0.0 - - logging-dropwizard-4 - Common logging DW 4 - jar - - - pay-java-commons - uk.gov.service.payments - 1.0.0 - - - - - - io.dropwizard - dropwizard-core - - - io.dropwizard - dropwizard-json-logging - - - - - org.dhatim - dropwizard-sentry - 4.0.5 - - - net.logstash.logback - logstash-logback-encoder - 7.4 - - - com.google.code.gson - gson - 2.13.2 - - - jakarta.servlet - jakarta.servlet-api - 6.1.0 - - - - - - - org.hamcrest - hamcrest - ${hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${hamcrest.version} - test - - - diff --git a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayout.java b/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayout.java deleted file mode 100644 index 4aebbc04..00000000 --- a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayout.java +++ /dev/null @@ -1,75 +0,0 @@ -package uk.gov.service.payments.logging; - -import ch.qos.logback.access.common.spi.IAccessEvent; -import io.dropwizard.logging.json.layout.AbstractJsonLayout; -import io.dropwizard.logging.json.layout.JsonFormatter; -import io.dropwizard.logging.json.layout.TimestampFormatter; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -import static uk.gov.service.payments.logging.LoggingKeys.HTTP_STATUS; -import static uk.gov.service.payments.logging.LoggingKeys.MDC_REQUEST_ID_KEY; -import static uk.gov.service.payments.logging.LoggingKeys.METHOD; -import static uk.gov.service.payments.logging.LoggingKeys.REMOTE_ADDRESS; -import static uk.gov.service.payments.logging.LoggingKeys.RESPONSE_TIME; -import static uk.gov.service.payments.logging.LoggingKeys.URL; - -public class GovUkPayDropwizardRequestJsonLogLayout extends AbstractJsonLayout { - - private static final String HEADER_REQUEST_ID = "X-Request-Id"; - private static final String HEADER_USER_AGENT = "User-Agent"; - private static final String HEADER_FORWARDED_FOR = "X-Forwarded-For"; - - private final int logVersion; - private final Map additionalFields; - private final TimestampFormatter timestampFormatter; - - public GovUkPayDropwizardRequestJsonLogLayout(JsonFormatter jsonFormatter, - TimestampFormatter timestampFormatter, - int logVersion, - Map additionalFields) { - super(jsonFormatter); - this.timestampFormatter = timestampFormatter; - this.logVersion = logVersion; - this.additionalFields = additionalFields; - } - - @Override - protected Map toJsonMap(IAccessEvent event) { - Map jsonMap = new HashMap<>(); - jsonMap.put("@version", logVersion); - jsonMap.put(RESPONSE_TIME, event.getElapsedTime()); - jsonMap.put(HTTP_STATUS, event.getStatusCode()); - jsonMap.put("content_length", event.getContentLength()); - putIfNotNull(jsonMap, "@timestamp", formatTimeStamp(event.getTimeStamp())); - putIfNotNull(jsonMap, URL, event.getRequestURI()); - putIfNotNull(jsonMap, METHOD, event.getMethod()); - putIfNotNull(jsonMap,"http_version", event.getProtocol()); - putIfNotNull(jsonMap, "user_agent", event.getRequestHeader(HEADER_USER_AGENT)); - putIfNotNull(jsonMap, MDC_REQUEST_ID_KEY, event.getRequestHeader(HEADER_REQUEST_ID)); - - Optional.ofNullable(event.getRequestHeader(HEADER_FORWARDED_FOR)) - .map(forwarded -> forwarded.split(",")[0]) - .ifPresent(clientAddress -> jsonMap.put(REMOTE_ADDRESS, clientAddress)); - - jsonMap.putAll(additionalFields); - - return jsonMap; - } - - private Object formatTimeStamp(long timeStamp) { - if (timeStamp > 0) { - return timestampFormatter.format(timeStamp); - } - - return null; - } - - private void putIfNotNull(Map jsonMap, String key, Object value) { - if (value != null) { - jsonMap.put(key, value); - } - } -} diff --git a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayoutFactory.java b/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayoutFactory.java deleted file mode 100644 index aec6439f..00000000 --- a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayoutFactory.java +++ /dev/null @@ -1,50 +0,0 @@ -package uk.gov.service.payments.logging; - -import ch.qos.logback.access.common.spi.IAccessEvent; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.core.LayoutBase; -import com.fasterxml.jackson.annotation.JsonTypeName; -import io.dropwizard.logging.json.AccessJsonLayoutBaseFactory; -import io.dropwizard.logging.json.layout.TimestampFormatter; - -import java.util.TimeZone; - -/** - * Our custom implementation of the factory used to format dropwizard request logs as json. - * This is configured in Java apps by adding the following to the config.yaml: - * - - * requestLog: - * appenders: - * - type: console - * layout: - * type: govuk-pay-access-json - * additionalFields: - * container: "ledger" - * environment: ${ENVIRONMENT} - * - - * More additional fields can be added as required; however it is mandatory to add a "container" key as this is - * standard across all our dropwizard apps. - */ -@JsonTypeName("govuk-pay-access-json") -public class GovUkPayDropwizardRequestJsonLogLayoutFactory extends AccessJsonLayoutBaseFactory { - - private static final String TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; - - @Override - public LayoutBase build(LoggerContext context, TimeZone timeZone) { - if (!this.getAdditionalFields().containsKey("container")) { - throw new IllegalArgumentException("When using govuk-pay-access-json, an additional field with the key of " + - "\"container\" must be present"); - } - var jsonLayout = new GovUkPayDropwizardRequestJsonLogLayout(this.createDropwizardJsonFormatter(), - this.createTimestampFormatter(timeZone), 1, this.getAdditionalFields()); - jsonLayout.setContext(context); - return jsonLayout; - } - - @Override - protected TimestampFormatter createTimestampFormatter(TimeZone timeZone) { - return new TimestampFormatter(TIMESTAMP_FORMAT, timeZone.toZoneId()); - } -} - diff --git a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LoggingFilter.java b/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LoggingFilter.java deleted file mode 100644 index 42771a7a..00000000 --- a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LoggingFilter.java +++ /dev/null @@ -1,67 +0,0 @@ -package uk.gov.service.payments.logging; - -import com.codahale.metrics.MetricRegistry; -import com.google.common.base.Stopwatch; -import jakarta.servlet.FilterChain; -import jakarta.servlet.FilterConfig; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; -import jakarta.servlet.http.HttpServletRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import java.util.concurrent.TimeUnit; - -import jakarta.servlet.Filter; - -import static uk.gov.service.payments.logging.LoggingKeys.MDC_REQUEST_ID_KEY; - -public class LoggingFilter implements Filter { - - private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class); - - private final MetricRegistry metricRegistry; - - public LoggingFilter() { - this.metricRegistry = null; - } - - public LoggingFilter(MetricRegistry metricRegistry) { - this.metricRegistry = metricRegistry; - } - - @Override - public void init(FilterConfig filterConfig) { /* empty */ } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { - Stopwatch stopwatch = Stopwatch.createStarted(); - HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; - - String requestURL = httpRequest.getRequestURI(); - String requestMethod = httpRequest.getMethod(); - String requestId = httpRequest.getHeader("X-Request-Id"); - - if (requestId == null) { - MDC.remove(MDC_REQUEST_ID_KEY); - } else { - MDC.put(MDC_REQUEST_ID_KEY, requestId); - } - - logger.info("{} to {} began", requestMethod, requestURL); - try { - filterChain.doFilter(servletRequest, servletResponse); - } catch (Throwable throwable) { - logger.error("Exception - {}", throwable.getMessage(), throwable); - } finally { - long elapsed = stopwatch.stop().elapsed(TimeUnit.MILLISECONDS); - logger.info("{} to {} ended - total time {}ms", requestMethod, requestURL, elapsed); - if (metricRegistry != null) - metricRegistry.histogram("response-times").update(elapsed); - } - } - - @Override - public void destroy() { /* empty */ } -} diff --git a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LoggingKeys.java b/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LoggingKeys.java deleted file mode 100644 index 1af3c87b..00000000 --- a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LoggingKeys.java +++ /dev/null @@ -1,247 +0,0 @@ -package uk.gov.service.payments.logging; - -/** - * This file needs to be kept in sync with its Node.js consociate - * @see https://github.com/alphagov/pay-js-commons/blob/master/src/logging-keys/index.js - */ -public interface LoggingKeys { - - /** - * "card", "Direct Debit" - */ - String PAYMENT_TYPE = "payment_type"; - - /** - * "payment", "mandate", "refund" - */ - String RESOURCE_TYPE = "resource_type"; - - /** - * "sandbox", "Worldpay", "Smartpay", "ePDQ", "Stripe", "GoCardless" - */ - String PROVIDER = "provider"; - - /** - * The digital wallet used for a payment - * Value must be a value of the WalletType enum - * @see WalletType - */ - String WALLET = "wallet"; - - /** - * The type of a gateway account - * Value must be a value of the GatewayAccountEntity.Type enum - * @see GatewayAccountEntity - */ - String GATEWAY_ACCOUNT_TYPE = "gateway_account_type"; - - /** - * The type of operation being performed with a gateway for a card payment - * Value must be a value of the OperationType enum - * @see OperationType - */ - String GATEWAY_CARD_OPERATION = "gateway_card_operation"; - - /** - * The amount of a payment in pence - */ - String AMOUNT = "amount"; - - /** - * Mandate external id - */ - String MANDATE_EXTERNAL_ID = "mandate_external_id"; - - /** - * The PSP's identifier for a payment - */ - String PROVIDER_PAYMENT_ID = "provider_payment_id"; - - /** - * The ID a provider gives to an event (e.g. one in a notification) - */ - String PROVIDER_EVENT_ID = "provider_event_id"; - - /** - * The reference a partner service assigns to a payment, mandate etc. - */ - String SERVICE_PAYMENT_REFERENCE = "service_reference"; - - /** - * The ID GOV.UK Pay gives to a gateway account - */ - String GATEWAY_ACCOUNT_ID = "gateway_account_id"; - - /** - * The ID of an event emitted to ledger - */ - String LEDGER_EVENT_ID = "ledger_event_id"; - - /** - * The type of an event emitted to ledger - */ - String LEDGER_EVENT_TYPE = "ledger_event_type"; - - /** - * The type of an internal event recorded by Direct Debit - * Value must be a value from the GovUkPayEventType enum - * @see GovUkPayEventType - */ - String DIRECT_DEBIT_INTERNAL_EVENT_TYPE = "direct_debit_internal_event_type"; - - /** - * The current (or new if transitioning) internal state of a payment, mandate etc. - */ - String CURRENT_INTERNAL_STATE = "current_internal_state"; - - /** - * The previous internal state of a payment, mandate etc. when transitioning - */ - String PREVIOUS_INTERNAL_STATUS = "previous_internal_status"; - - /** - * The last event (status) that Worldpay recorded for a payment, refund etc. - */ - String WORLDPAY_LAST_EVENT = "worldpay_last_event"; - - /** - * The result code (status) that Smartpay recorded for a payment, refund etc. - */ - String SMARTPAY_RESULT_CODE = "smartpay_result_code"; - - /** - * The status code that ePDQ recorded for a payment, refund etc. - */ - String EPDQ_STATUS = "epdq_status"; - - /** - * The status that Stripe recorded for a payment, refund etc. - */ - String STRIPE_STATUS = "stripe_status"; - - /** - * The action that GoCardless recorded for a payment, mandate etc. - */ - String GOCARDLESS_PAYMENT_ACTION = "gocardless_action"; - - /** - * The HTTP status we sent to a client - */ - String HTTP_STATUS = "status_code"; - - /** - * The HTTP method for a request - */ - String METHOD = "method"; - - /** - * The URL for a request - */ - String URL = "url"; - - /** - * The time taken for the server to respond to a request - */ - String RESPONSE_TIME = "response_time"; - - /** - * The HTTP status code we received from a remote server (e.g. a payment provider) - */ - String REMOTE_HTTP_STATUS = "remote_http_status"; - - /** - * The Internet Protocol (IP) address of the client that sent the request. - */ - String REMOTE_ADDRESS = "remote_address"; - - /** - * AWS error code - */ - String AWS_ERROR_CODE = "aws_error_code"; - - /** - * Payment External Id - */ - String PAYMENT_EXTERNAL_ID = "payment_external_id"; - - /** - * Refund External Id - */ - String REFUND_EXTERNAL_ID = "refund_external_id"; - - /** - * The resource (e.g. payment, refund) external ID. Used when log line could relate to one of multiple resource types - */ - String RESOURCE_EXTERNAL_ID = "resource_external_id"; - - /** - * Secure Token - */ - String SECURE_TOKEN = "secure_token"; - - /** - * Logging key that maps to the http X-Request-Id header - */ - String MDC_REQUEST_ID_KEY = "x_request_id"; - - /** - * User external id - */ - String USER_EXTERNAL_ID = "user_external_id"; - - /** - * A service's external id - */ - String SERVICE_EXTERNAL_ID = "service_external_id"; - - /** - * The error returned by a payment gateway. - */ - String GATEWAY_ERROR = "gateway_error"; - - /** - * The id of a payout with the gateway (Stripe specific) - */ - String GATEWAY_PAYOUT_ID = "gateway_payout_id"; - - /** - * The id of the connect account in Stripe - */ - String CONNECT_ACCOUNT_ID = "stripe_connect_account_id"; - - /** - * The id of the Stripe event notification - */ - String STRIPE_EVENT_ID = "stripe_event_id"; - - /** - * The id of a dispute from gateway (Stripe specific) - */ - String GATEWAY_DISPUTE_ID = "gateway_dispute_id"; - - /** - * Dispute external Id - */ - String DISPUTE_EXTERNAL_ID = "dispute_external_id"; - - /** - * Agreement external ID - */ - String AGREEMENT_EXTERNAL_ID = "agreement_external_id"; - - /** - * The authorisation mode for a payment - */ - String AUTHORISATION_MODE = "authorisation_mode"; - - /** - * Payment instrument external ID - */ - String PAYMENT_INSTRUMENT_EXTERNAL_ID = "payment_instrument_external_id"; - - /** - * The ID that AWS assigns to an SQS message - */ - String SQS_MESSAGE_ID = "sqs_message_id"; - -} diff --git a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LogstashConsoleAppenderFactory.java b/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LogstashConsoleAppenderFactory.java deleted file mode 100644 index de5e7387..00000000 --- a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/LogstashConsoleAppenderFactory.java +++ /dev/null @@ -1,56 +0,0 @@ -package uk.gov.service.payments.logging; - -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.filter.ThresholdFilter; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.Appender; -import ch.qos.logback.core.ConsoleAppender; -import com.fasterxml.jackson.annotation.JsonTypeName; -import com.google.gson.Gson; -import io.dropwizard.logging.common.ConsoleAppenderFactory; -import io.dropwizard.logging.common.async.AsyncAppenderFactory; -import io.dropwizard.logging.common.filter.LevelFilterFactory; -import io.dropwizard.logging.common.layout.LayoutFactory; -import net.logstash.logback.encoder.LogstashEncoder; - -import java.util.Map; - -@JsonTypeName("logstash-console") -public class LogstashConsoleAppenderFactory extends ConsoleAppenderFactory { - - private Map customFields; - - @Override - public Appender build(LoggerContext context, - String applicationName, - LayoutFactory layout, - LevelFilterFactory levelFilterFactory, - AsyncAppenderFactory asyncAppenderFactory) { - - LogstashEncoder encoder = new LogstashEncoder(); - encoder.setCustomFields(new Gson().toJson(customFields)); - encoder.setContext(context); - encoder.start(); - - final ConsoleAppender appender = new ConsoleAppender<>(); - appender.setName("logstash-console-appender"); - appender.setContext(context); - appender.setTarget(getTarget().get()); - appender.setEncoder(encoder); - final ThresholdFilter filter = new ThresholdFilter(); - filter.setLevel(threshold.toString()); - filter.start(); - appender.addFilter(filter); - appender.start(); - - return wrapAsync(appender, asyncAppenderFactory); - } - - public Map getCustomFields() { - return customFields; - } - - public void setCustomFields(Map customFields) { - this.customFields = customFields; - } -} diff --git a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/RestClientLoggingFilter.java b/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/RestClientLoggingFilter.java deleted file mode 100644 index 3e617aec..00000000 --- a/logging-dropwizard-4/src/main/java/uk/gov/service/payments/logging/RestClientLoggingFilter.java +++ /dev/null @@ -1,66 +0,0 @@ -package uk.gov.service.payments.logging; - -import com.google.common.base.Stopwatch; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import jakarta.ws.rs.client.ClientRequestContext; -import jakarta.ws.rs.client.ClientRequestFilter; -import jakarta.ws.rs.client.ClientResponseContext; -import jakarta.ws.rs.client.ClientResponseFilter; -import java.util.concurrent.TimeUnit; - -import static net.logstash.logback.argument.StructuredArguments.kv; -import static uk.gov.service.payments.logging.LoggingKeys.HTTP_STATUS; -import static uk.gov.service.payments.logging.LoggingKeys.METHOD; -import static uk.gov.service.payments.logging.LoggingKeys.RESPONSE_TIME; -import static uk.gov.service.payments.logging.LoggingKeys.URL; - -public class RestClientLoggingFilter implements ClientRequestFilter, ClientResponseFilter { - - private static final Logger logger = LoggerFactory.getLogger(RestClientLoggingFilter.class); - private static final String HEADER_REQUEST_ID = "X-Request-Id"; - private static final ThreadLocal requestId = new ThreadLocal<>(); - private static final ThreadLocal timer = new ThreadLocal<>(); - - @SuppressWarnings("java:S3457") - @Override - public void filter(ClientRequestContext requestContext) { - timer.set(Stopwatch.createStarted()); - requestId.set(StringUtils.defaultString(MDC.get(LoggingKeys.MDC_REQUEST_ID_KEY))); - - requestContext.getHeaders().add(HEADER_REQUEST_ID, requestId.get()); - - logger.info("[{}] - {} to {} began", - requestId.get(), - requestContext.getMethod(), - requestContext.getUri(), - kv(METHOD, requestContext.getMethod()), - kv(URL, requestContext.getUri()) - ); - - } - - @SuppressWarnings("java:S3457") - @Override - public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) { - long elapsed = timer.get().elapsed(TimeUnit.MILLISECONDS); - responseContext.getHeaders().add(HEADER_REQUEST_ID, requestId.get()); - - logger.info("[{}] - {} to {} ended - total time {}ms", - requestId.get(), - requestContext.getMethod(), - requestContext.getUri(), - elapsed, - kv(METHOD, requestContext.getMethod()), - kv(URL, requestContext.getUri()), - kv(HTTP_STATUS, responseContext.getStatus()), - kv(RESPONSE_TIME, elapsed)); - - requestId.remove(); - timer.get().stop(); - timer.remove(); - } -} diff --git a/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/Fake.java b/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/Fake.java deleted file mode 100644 index 877eff76..00000000 --- a/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/Fake.java +++ /dev/null @@ -1,4 +0,0 @@ -package uk.gov.service.payments.logging; - -public class Fake { -} diff --git a/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayoutFactoryTest.java b/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayoutFactoryTest.java deleted file mode 100644 index eb15f468..00000000 --- a/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/GovUkPayDropwizardRequestJsonLogLayoutFactoryTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package uk.gov.service.payments.logging; - -import org.junit.jupiter.api.Test; - -import java.util.TimeZone; - -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class GovUkPayDropwizardRequestJsonLogLayoutFactoryTest { - - @Test - public void throw_runtime_exception_if_no_additional_field_named_container() { - var jsonLogLayoutFactory = new GovUkPayDropwizardRequestJsonLogLayoutFactory(); - assertThrows(RuntimeException.class, () -> jsonLogLayoutFactory.build(null, TimeZone.getDefault())); - } -} diff --git a/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/LoggingFilterTest.java b/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/LoggingFilterTest.java deleted file mode 100644 index 703d5988..00000000 --- a/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/LoggingFilterTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package uk.gov.service.payments.logging; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.classic.spi.LoggingEvent; -import ch.qos.logback.core.Appender; -import org.jboss.logging.MDC; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.slf4j.LoggerFactory; - -import jakarta.servlet.FilterChain; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.List; - -import static java.lang.String.format; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.matchesRegex; -import static org.hamcrest.core.Is.is; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -public class LoggingFilterTest { - - private LoggingFilter loggingFilter; - - @Mock - HttpServletRequest mockRequest; - - @Mock - HttpServletResponse mockResponse; - - @Mock - FilterChain mockFilterChain; - - private Appender mockAppender; - - @Captor - ArgumentCaptor loggingEventArgumentCaptor; - - @BeforeEach - public void setup() { - loggingFilter = new LoggingFilter(); - Logger root = (Logger) LoggerFactory.getLogger(LoggingFilter.class); - mockAppender = mockAppender(); - root.addAppender(mockAppender); - } - - @Test - public void shouldLogEntryAndExitPointsOfEndPoints() throws Exception { - when(mockRequest.getRequestURI()).thenReturn("/publicauth-request"); - when(mockRequest.getMethod()).thenReturn("GET"); - - loggingFilter.doFilter(mockRequest, mockResponse, mockFilterChain); - - verify(mockAppender, times(2)).doAppend(loggingEventArgumentCaptor.capture()); - List loggingEvents = loggingEventArgumentCaptor.getAllValues(); - - assertThat(loggingEvents.get(0).getFormattedMessage(), is("GET to /publicauth-request began")); - String endLogMessage = loggingEvents.get(1).getFormattedMessage(); - assertThat(endLogMessage, containsString("GET to /publicauth-request ended - total time ")); - assertThat(endLogMessage, matchesRegex(".*total time \\d+ms")); - verify(mockFilterChain).doFilter(mockRequest, mockResponse); - } - - @Test - public void shouldLogEntryAndExitPointsEvenIfRequestIdDoesNotExist() throws Exception { - when(mockRequest.getRequestURI()).thenReturn("/publicauth-request"); - when(mockRequest.getMethod()).thenReturn("GET"); - - loggingFilter.doFilter(mockRequest, mockResponse, mockFilterChain); - - verify(mockAppender, times(2)).doAppend(loggingEventArgumentCaptor.capture()); - List loggingEvents = loggingEventArgumentCaptor.getAllValues(); - - assertThat(loggingEvents.get(0).getFormattedMessage(), is("GET to /publicauth-request began")); - String endLogMessage = loggingEvents.get(1).getFormattedMessage(); - assertThat(endLogMessage, containsString("GET to /publicauth-request ended - total time ")); - verify(mockFilterChain).doFilter(mockRequest, mockResponse); - } - - @Test - public void shouldLogEntryAndExitPointsEvenWhenFilterChainingThrowsException() throws Exception { - when(mockRequest.getRequestURI()).thenReturn("/publicauth-url-with-exception"); - when(mockRequest.getMethod()).thenReturn("GET"); - - IOException exception = new IOException("Failed request"); - doThrow(exception).when(mockFilterChain).doFilter(mockRequest, mockResponse); - - loggingFilter.doFilter(mockRequest, mockResponse, mockFilterChain); - - verify(mockAppender, times(3)).doAppend(loggingEventArgumentCaptor.capture()); - List loggingEvents = loggingEventArgumentCaptor.getAllValues(); - - assertThat(loggingEvents.get(0).getFormattedMessage(), is("GET to /publicauth-url-with-exception began")); - assertThat(loggingEvents.get(1).getFormattedMessage(), is(format("Exception - %s", exception.getMessage()))); - assertThat(loggingEvents.get(1).getLevel(), is(Level.ERROR)); - assertThat(loggingEvents.get(1).getThrowableProxy().getMessage(), is("Failed request")); - String endLogMessage = loggingEvents.get(2).getFormattedMessage(); - assertThat(endLogMessage, containsString("GET to /publicauth-url-with-exception ended - total time ")); - assertThat(endLogMessage, matchesRegex(".*total time \\d+ms")); - } - - @Test - public void shouldSetDiagnosticContextPerRequest() { - when(mockRequest.getHeader("X-Request-Id")).thenReturn("some-id"); - loggingFilter.doFilter(mockRequest, mockResponse, mockFilterChain); - assertThat(MDC.get("x_request_id"), is("some-id")); - } - - @SuppressWarnings("unchecked") - private Appender mockAppender() { - return mock(Appender.class); - } - -} diff --git a/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/RestClientLoggingFilterTest.java b/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/RestClientLoggingFilterTest.java deleted file mode 100644 index 2b688c18..00000000 --- a/logging-dropwizard-4/src/test/java/uk/gov/service/payments/logging/RestClientLoggingFilterTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package uk.gov.service.payments.logging; - -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.classic.spi.LoggingEvent; -import ch.qos.logback.core.Appender; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.math.NumberUtils; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import jakarta.ws.rs.client.ClientRequestContext; -import jakarta.ws.rs.client.ClientResponseContext; -import jakarta.ws.rs.core.MultivaluedHashMap; -import jakarta.ws.rs.core.MultivaluedMap; -import java.net.URI; -import java.util.List; -import java.util.UUID; - -import static java.lang.String.format; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.core.Is.is; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -class RestClientLoggingFilterTest { - - private RestClientLoggingFilter loggingFilter; - - @Mock - private ClientRequestContext clientRequestContext; - - @Mock - private ClientResponseContext clientResponseContext; - - @Mock - private Appender mockAppender; - - @Captor - ArgumentCaptor loggingEventArgumentCaptor; - - @BeforeEach - public void setup() { - loggingFilter = new RestClientLoggingFilter(); - Logger root = (Logger) LoggerFactory.getLogger(RestClientLoggingFilter.class); - root.addAppender(mockAppender); - } - - @Test - void shouldLogRestClientStartEventWithRequestId() { - - String requestId = UUID.randomUUID().toString(); - URI requestUrl = URI.create("/publicapi-request"); - String requestMethod = "GET"; - MultivaluedMap mockHeaders = new MultivaluedHashMap<>(); - - when(clientRequestContext.getUri()).thenReturn(requestUrl); - when(clientRequestContext.getMethod()).thenReturn(requestMethod); - when(clientRequestContext.getHeaders()).thenReturn(mockHeaders); - MDC.put(LoggingKeys.MDC_REQUEST_ID_KEY, requestId); - - loggingFilter.filter(clientRequestContext); - - verify(mockAppender, times(1)).doAppend(loggingEventArgumentCaptor.capture()); - List loggingEvents = loggingEventArgumentCaptor.getAllValues(); - - assertThat(loggingEvents.get(0).getFormattedMessage(), is(format("[%s] - %s to %s began", requestId, requestMethod, requestUrl))); - - } - - @Test - void shouldLogRestClientEndEventWithRequestIdAndElapsedTime() { - - String requestId = UUID.randomUUID().toString(); - URI requestUrl = URI.create("/publicapi-request"); - String requestMethod = "GET"; - - when(clientRequestContext.getUri()).thenReturn(requestUrl); - when(clientRequestContext.getMethod()).thenReturn(requestMethod); - MultivaluedMap mockHeaders = new MultivaluedHashMap<>(); - MultivaluedMap mockHeaders2 = new MultivaluedHashMap<>(); - - when(clientRequestContext.getHeaders()).thenReturn(mockHeaders); - when(clientResponseContext.getHeaders()).thenReturn(mockHeaders2); - MDC.put(LoggingKeys.MDC_REQUEST_ID_KEY, requestId); - loggingFilter.filter(clientRequestContext); - - loggingFilter.filter(clientRequestContext, clientResponseContext); - - verify(mockAppender, times(2)).doAppend(loggingEventArgumentCaptor.capture()); - List loggingEvents = loggingEventArgumentCaptor.getAllValues(); - - assertThat(loggingEvents.get(0).getFormattedMessage(), is(format("[%s] - %s to %s began", requestId, requestMethod, requestUrl))); - String endLogMessage = loggingEvents.get(1).getFormattedMessage(); - assertThat(endLogMessage, containsString(format("[%s] - %s to %s ended - total time ", requestId, requestMethod, requestUrl))); - String[] timeTaken = StringUtils.substringsBetween(endLogMessage, "total time ", "ms"); - Assertions.assertTrue(NumberUtils.isCreatable(timeTaken[0])); - } -} - diff --git a/logging-dropwizard-5/pom.xml b/logging-dropwizard-5/pom.xml index c5c66f8e..fe08f3ad 100644 --- a/logging-dropwizard-5/pom.xml +++ b/logging-dropwizard-5/pom.xml @@ -14,18 +14,6 @@ Common logging DW 5 jar - - - - io.dropwizard - dropwizard-dependencies - 5.0.0 - pom - import - - - - @@ -64,12 +52,6 @@ in in the parent POM, so no explicit versions needed --> - - io.dropwizard.modules - dropwizard-testing-junit4 - 5.0.0 - test - org.hamcrest hamcrest diff --git a/model-dropwizard-4/pom.xml b/model-dropwizard-4/pom.xml deleted file mode 100644 index 5c2bcc07..00000000 --- a/model-dropwizard-4/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - pay-java-commons - uk.gov.service.payments - 1.0.0 - - - model-dropwizard-4 - Common domain model objects DW 4 - jar - - - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.core - jackson-annotations - - - org.apache.commons - commons-lang3 - compile - - - - - jakarta.persistence - jakarta.persistence-api - 3.2.0 - provided - - - jakarta.validation - jakarta.validation-api - 3.1.1 - - - - - - - - diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/exception/ValidationException.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/exception/ValidationException.java deleted file mode 100644 index 73a1b0a2..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/exception/ValidationException.java +++ /dev/null @@ -1,16 +0,0 @@ -package uk.gov.service.payments.commons.api.exception; - -import java.util.List; - -public class ValidationException extends RuntimeException { - - private List errors; - - public ValidationException(List errors) { - this.errors = errors; - } - - public List getErrors() { - return errors; - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeDeserializer.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeDeserializer.java deleted file mode 100644 index c8305f5f..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeDeserializer.java +++ /dev/null @@ -1,31 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; - -import java.io.IOException; -import java.time.ZonedDateTime; - -import static java.time.ZoneOffset.UTC; -import static java.time.format.DateTimeFormatter.ISO_ZONED_DATE_TIME; - -/** - * Custom JSON Deserializer that will try to parse a String into a ZonedDateTime - */ -public class ApiResponseDateTimeDeserializer extends StdDeserializer { - - public ApiResponseDateTimeDeserializer() { - this(null); - } - - public ApiResponseDateTimeDeserializer(Class vc) { - super(vc); - } - - @Override - public ZonedDateTime deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException { - final String dateString = jsonparser.getText(); - return ZonedDateTime.parse(dateString, ISO_ZONED_DATE_TIME).withZoneSameInstant(UTC); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeSerializer.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeSerializer.java deleted file mode 100644 index 63b009b8..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeSerializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -import java.io.IOException; -import java.time.ZonedDateTime; - -import static uk.gov.service.payments.commons.model.CommonDateTimeFormatters.ISO_INSTANT_MILLISECOND_PRECISION; - -public class ApiResponseDateTimeSerializer extends StdSerializer { - - public ApiResponseDateTimeSerializer() { - this(null); - } - - private ApiResponseDateTimeSerializer(Class t) { - super(t); - } - - @Override - public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider sp) throws IOException { - gen.writeString(ISO_INSTANT_MILLISECOND_PRECISION.format(value)); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ExternalMetadataDeserialiser.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ExternalMetadataDeserialiser.java deleted file mode 100644 index d3154c26..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ExternalMetadataDeserialiser.java +++ /dev/null @@ -1,29 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonMappingException; -import uk.gov.service.payments.commons.model.charge.ExternalMetadata; - -import java.io.IOException; -import java.util.Map; - -public class ExternalMetadataDeserialiser extends JsonDeserializer { - - @Override - public ExternalMetadata deserialize(final JsonParser jsonParser, final DeserializationContext ctxt) throws IOException { - if (!jsonParser.isExpectedStartObjectToken()){ - throw new JsonMappingException(jsonParser, "Field [metadata] must be an object of JSON key-value pairs"); - } - - Map metadata = jsonParser.getCodec().readValue(jsonParser, new TypeReference>() {}); - if (metadata != null) { - return metadata.isEmpty() ? null : new ExternalMetadata(metadata); - } - - assert false : "This should never be invoked since we currently do no deserialize null values."; - throw new JsonMappingException(jsonParser, "metadata cannot be null"); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ExternalMetadataSerialiser.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ExternalMetadataSerialiser.java deleted file mode 100644 index 01d35693..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/ExternalMetadataSerialiser.java +++ /dev/null @@ -1,27 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonNaming; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; -import uk.gov.service.payments.commons.model.charge.ExternalMetadata; - -import java.io.IOException; - -@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) -public class ExternalMetadataSerialiser extends StdSerializer { - - public ExternalMetadataSerialiser() { - this(null); - } - - private ExternalMetadataSerialiser(Class t) { - super(t); - } - - @Override - public void serialize(ExternalMetadata externalMetadata, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { - serializerProvider.defaultSerializeValue(externalMetadata.getMetadata(), jsonGenerator); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondDeserializer.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondDeserializer.java deleted file mode 100644 index 1e31f896..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondDeserializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; - -import java.io.IOException; -import java.time.Instant; - -import static uk.gov.service.payments.commons.model.CommonDateTimeFormatters.ISO_INSTANT_MICROSECOND_PRECISION; - -public class IsoInstantMicrosecondDeserializer extends StdDeserializer { - - public IsoInstantMicrosecondDeserializer() { - this(null); - } - - private IsoInstantMicrosecondDeserializer(Class t) { - super(t); - } - - @Override - public Instant deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException { - return ISO_INSTANT_MICROSECOND_PRECISION.parse(jsonParser.getText(), Instant::from); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondSerializer.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondSerializer.java deleted file mode 100644 index 38ec6172..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondSerializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -import java.io.IOException; -import java.time.Instant; - -import static uk.gov.service.payments.commons.model.CommonDateTimeFormatters.ISO_INSTANT_MICROSECOND_PRECISION; - -public class IsoInstantMicrosecondSerializer extends StdSerializer { - - public IsoInstantMicrosecondSerializer() { - this(null); - } - - private IsoInstantMicrosecondSerializer(Class t) { - super(t); - } - - @Override - public void serialize(Instant value, JsonGenerator gen, SerializerProvider sp) throws IOException { - gen.writeString(ISO_INSTANT_MICROSECOND_PRECISION.format(value)); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondDeserializer.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondDeserializer.java deleted file mode 100644 index 5ef6394b..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondDeserializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; - -import java.io.IOException; -import java.time.Instant; - -import static uk.gov.service.payments.commons.model.CommonDateTimeFormatters.ISO_INSTANT_MILLISECOND_PRECISION; - -public class IsoInstantMillisecondDeserializer extends StdDeserializer { - - public IsoInstantMillisecondDeserializer() { - this(null); - } - - private IsoInstantMillisecondDeserializer(Class t) { - super(t); - } - - @Override - public Instant deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException { - return ISO_INSTANT_MILLISECOND_PRECISION.parse(jsonParser.getText(), Instant::from); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondSerializer.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondSerializer.java deleted file mode 100644 index d41a1420..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondSerializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -import java.io.IOException; -import java.time.Instant; - -import static uk.gov.service.payments.commons.model.CommonDateTimeFormatters.ISO_INSTANT_MILLISECOND_PRECISION; - -public class IsoInstantMillisecondSerializer extends StdSerializer { - - public IsoInstantMillisecondSerializer() { - this(null); - } - - private IsoInstantMillisecondSerializer(Class t) { - super(t); - } - - @Override - public void serialize(Instant value, JsonGenerator gen, SerializerProvider sp) throws IOException { - gen.writeString(ISO_INSTANT_MILLISECOND_PRECISION.format(value)); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/JsonMapper.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/JsonMapper.java deleted file mode 100644 index 9da115c7..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/JsonMapper.java +++ /dev/null @@ -1,45 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import static org.apache.commons.lang3.StringUtils.isEmpty; - -public class JsonMapper { - private ObjectMapper objectMapper; - - public JsonMapper(ObjectMapper objectMapper) { - this.objectMapper = objectMapper; - } - - public Map getAsMap(JsonNode jsonNode) { - if (jsonNode != null) { - if ((jsonNode.isTextual() && !isEmpty(jsonNode.asText())) || (!jsonNode.isNull() && jsonNode.isObject())) { - try { - return objectMapper.readValue(jsonNode.traverse(), new TypeReference>() {}); - } catch (IOException e) { - throw new RuntimeException("Malformed JSON object in value", e); - } - } - } - return null; - } - - public List getAsListOfString(JsonNode jsonNode) { - if (jsonNode != null) { - if (jsonNode.isArray()) { - try { - return objectMapper.readValue(jsonNode.traverse(), new TypeReference>() {}); - } catch (IOException e) { - throw new RuntimeException("Malformed JSON object in value", e); - } - } - } - return null; - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeDeserializer.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeDeserializer.java deleted file mode 100644 index 7863b1ff..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeDeserializer.java +++ /dev/null @@ -1,34 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.fasterxml.jackson.databind.annotation.JsonNaming; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; - -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; - -@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) -public class MicrosecondPrecisionDateTimeDeserializer extends StdDeserializer { - - public static final DateTimeFormatter MICROSECOND_FORMATTER = - MicrosecondPrecisionDateTimeSerializer.MICROSECOND_FORMATTER; - - public MicrosecondPrecisionDateTimeDeserializer() { - this(null); - } - - @Override - public ZonedDateTime deserialize(JsonParser p, DeserializationContext ctxt) { - try { - return ZonedDateTime.from(MICROSECOND_FORMATTER.parse(p.getText())); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private MicrosecondPrecisionDateTimeDeserializer(Class t) { - super(t); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeSerializer.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeSerializer.java deleted file mode 100644 index 4f63cdfc..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeSerializer.java +++ /dev/null @@ -1,34 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -import java.io.IOException; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.util.Locale; - -public class MicrosecondPrecisionDateTimeSerializer extends StdSerializer { - - public static final DateTimeFormatter MICROSECOND_FORMATTER = - new DateTimeFormatterBuilder() - .appendInstant(6) - .toFormatter(Locale.ENGLISH) - .withZone(ZoneOffset.UTC); - - public MicrosecondPrecisionDateTimeSerializer() { - this(null); - } - - private MicrosecondPrecisionDateTimeSerializer(Class t) { - super(t); - } - - @Override - public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider sp) throws IOException { - gen.writeString(MICROSECOND_FORMATTER.format(value)); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/resources/ResourceStrings.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/resources/ResourceStrings.java deleted file mode 100644 index 36cf8226..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/resources/ResourceStrings.java +++ /dev/null @@ -1,14 +0,0 @@ -package uk.gov.service.payments.commons.api.resources; - -public class ResourceStrings { - private static final String API_OPERATION_NOTES_AUTH = "The Authorisation token needs to be specified in the 'authorization' header "; - private static final String API_OPERATION_NOTES_BEARER = "as 'authorization: Bearer YOUR_API_KEY_HERE'"; - public static final String API_OPERATION_NOTES_AUTH_BEARER = API_OPERATION_NOTES_AUTH + API_OPERATION_NOTES_BEARER; - public static final String API_RESPONSE_ERROR_MSG_CREDENTIALS_REQ = "Credentials are required to access this resource"; - public static final String API_RESPONSE_OK = "OK"; - public static final String API_RESPONSE_CREATED = "Created"; - public static final String API_RESPONSE_ERROR_MSG_BAD_REQUEST = "Bad request"; - public static final String API_RESPONSE_ERROR_MSG_TOO_MANY_REQUESTS = "Too many requests"; - public static final String API_OPERATION_ERROR_MSG_NOT_FOUND = "Not found"; - public static final String API_OPERATION_ERROR_MSG_DOWNSTREAM_SYS_ERROR = "Downstream system error"; -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/AllowedStrings.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/AllowedStrings.java deleted file mode 100644 index 716d7253..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/AllowedStrings.java +++ /dev/null @@ -1,34 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Target({ FIELD }) -@Retention(RUNTIME) -@Constraint(validatedBy = AllowedStringsValidator.class) -@Documented -public @interface AllowedStrings { - - String message(); - - Class[] groups() default { }; - - Class[] payload() default { }; - - String[] allowed(); - - @Target({ FIELD }) - @Retention(RUNTIME) - @Documented - @interface List { - - AllowedStrings[] value(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/AllowedStringsValidator.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/AllowedStringsValidator.java deleted file mode 100644 index 30f8def2..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/AllowedStringsValidator.java +++ /dev/null @@ -1,21 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import java.util.Set; - -public class AllowedStringsValidator implements ConstraintValidator { - - private Set allowedStrings; - - @Override - public void initialize(AllowedStrings parameters) { - allowedStrings = Set.of(parameters.allowed()); - } - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - if (value == null) return false; - return allowedStrings.contains(value); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/JsonPatchRequestValidator.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/JsonPatchRequestValidator.java deleted file mode 100644 index f9cf9d33..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/JsonPatchRequestValidator.java +++ /dev/null @@ -1,96 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import com.fasterxml.jackson.databind.JsonNode; -import uk.gov.service.payments.commons.api.exception.ValidationException; -import uk.gov.service.payments.commons.model.jsonpatch.JsonPatchOp; -import uk.gov.service.payments.commons.model.jsonpatch.JsonPatchRequest; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static java.lang.String.format; -import static uk.gov.service.payments.commons.model.jsonpatch.JsonPatchKeys.FIELD_OPERATION; -import static uk.gov.service.payments.commons.model.jsonpatch.JsonPatchKeys.FIELD_OPERATION_PATH; -import static uk.gov.service.payments.commons.model.jsonpatch.JsonPatchKeys.FIELD_VALUE; - -public class JsonPatchRequestValidator { - - private static final Set allowedOps = Arrays.stream(JsonPatchOp.values()) - .map(jsonPatchOp -> jsonPatchOp.name().toLowerCase(Locale.ROOT)) - .collect(Collectors.toSet()); - - private final Map> operationValidators; - - public JsonPatchRequestValidator(Map> operationValidators) { - this.operationValidators = operationValidators; - } - - public void validate(JsonNode payload) { - if (!payload.isArray()) { - throw new ValidationException(Collections.singletonList("JSON is not an array")); - } - - for (JsonNode jsonNode : payload) { - List fieldErrors = Stream.concat(RequestValidator.checkIfExistsOrEmpty(jsonNode, FIELD_OPERATION, FIELD_OPERATION_PATH).stream(), - RequestValidator.checkIfNull(jsonNode, FIELD_VALUE).stream()) - .collect(Collectors.toList()); - if (!fieldErrors.isEmpty()) { - throw new ValidationException(fieldErrors); - } - - List opPathTypeErrors = RequestValidator.checkIsString(jsonNode, FIELD_OPERATION, FIELD_OPERATION_PATH); - if (!opPathTypeErrors.isEmpty()) { - throw new ValidationException(opPathTypeErrors); - } - - String op = jsonNode.get(FIELD_OPERATION).asText(); - List opErrors = RequestValidator.checkIsAllowedValue(jsonNode, allowedOps, FIELD_OPERATION); - if (!opErrors.isEmpty()) { - throw new ValidationException(opErrors); - } - - JsonPatchOp jsonPatchOp = JsonPatchOp.valueOf(op.toUpperCase()); - - String path = jsonNode.get(FIELD_OPERATION_PATH).asText(); - Set allowedPaths = operationValidators.keySet().stream().map(PatchPathOperation::getPath).collect(Collectors.toSet()); - - List pathErrors = RequestValidator.checkIsAllowedValue(jsonNode, allowedPaths, FIELD_OPERATION_PATH); - if (!pathErrors.isEmpty()) { - throw new ValidationException(pathErrors); - } - - PatchPathOperation pathOperation = new PatchPathOperation(path, jsonPatchOp); - if (!operationValidators.containsKey(pathOperation)) { - throw new ValidationException(Collections.singletonList(format("Operation [%s] not supported for path [%s]", op, path))); - } - - JsonPatchRequest request = JsonPatchRequest.from(jsonNode); - operationValidators.get(pathOperation).accept(request); - } - } - - public static void throwIfValueNotString(JsonPatchRequest request) { - if (!request.valueIsString()) { - throw new ValidationException(Collections.singletonList(format("Value for path [%s] must be a string", request.getPath()))); - } - } - - public static void throwIfValueNotBoolean(JsonPatchRequest request) { - if (!request.valueIsBoolean()) { - throw new ValidationException(Collections.singletonList(format("Value for path [%s] must be a boolean", request.getPath()))); - } - } - - public static void throwIfValueNotArray(JsonPatchRequest request) { - if (!request.valueIsArray()) { - throw new ValidationException(Collections.singletonList(format("Value for path [%s] must be an array", request.getPath()))); - } - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyInsensitiveUnique.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyInsensitiveUnique.java deleted file mode 100644 index 1a568410..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyInsensitiveUnique.java +++ /dev/null @@ -1,29 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Target({FIELD, PARAMETER, ANNOTATION_TYPE}) -@Retention(RUNTIME) -@Constraint(validatedBy = MapKeyInsensitiveUniqueValidator.class) -public @interface MapKeyInsensitiveUnique { - - String message() default "key must be case insensitive unique"; - - Class[] groups() default { }; - - Class[] payload() default { }; - - @Target({ FIELD, PARAMETER}) - @Retention(RUNTIME) - @interface List { - MapKeyInsensitiveUnique[] value(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyInsensitiveUniqueValidator.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyInsensitiveUniqueValidator.java deleted file mode 100644 index 94021721..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyInsensitiveUniqueValidator.java +++ /dev/null @@ -1,20 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import java.util.Map; - -public class MapKeyInsensitiveUniqueValidator implements ConstraintValidator> { - - @Override - public boolean isValid(Map theMap, ConstraintValidatorContext context) { - if (theMap == null) { - return true; - } - return theMap.keySet() - .stream() - .map(String::toLowerCase) - .distinct() - .count() == theMap.keySet().size(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyLength.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyLength.java deleted file mode 100644 index 9b7bf55d..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyLength.java +++ /dev/null @@ -1,32 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Target({FIELD, PARAMETER, ANNOTATION_TYPE}) -@Retention(RUNTIME) -@Constraint(validatedBy = MapKeyLengthValidator.class) -public @interface MapKeyLength { - String message() default "keys must be between {min} and {max}"; - - Class[] groups() default { }; - - Class[] payload() default { }; - - int min() default 0; - - int max() default Integer.MAX_VALUE; - - @Target({ FIELD, PARAMETER}) - @Retention(RUNTIME) - @interface List { - MapKeyLength[] value(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyLengthValidator.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyLengthValidator.java deleted file mode 100644 index 384d73fb..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapKeyLengthValidator.java +++ /dev/null @@ -1,28 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -import java.util.Map; - -public class MapKeyLengthValidator implements ConstraintValidator> { - - private int max; - private int min; - - @Override - public void initialize(MapKeyLength constraintAnnotation) { - max = constraintAnnotation.max(); - min = constraintAnnotation.min(); - } - - @Override - public boolean isValid(Map theMap, ConstraintValidatorContext context) { - if (theMap == null) { - return true; - } - - return theMap.keySet().stream() - .noneMatch(key -> key.length() < min || key.length() > max); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueAsStringLengthValidator.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueAsStringLengthValidator.java deleted file mode 100644 index 89d4e1f8..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueAsStringLengthValidator.java +++ /dev/null @@ -1,31 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -import java.util.Map; -import java.util.Objects; - -public class MapValueAsStringLengthValidator implements ConstraintValidator> { - - private int max; - private int min; - - @Override - public void initialize(MapValueLength constraintAnnotation) { - max = constraintAnnotation.max(); - min = constraintAnnotation.min(); - } - - @Override - public boolean isValid(Map theMap, ConstraintValidatorContext context) { - if (theMap == null) { - return true; - } - - return theMap.values().stream() - .filter(Objects::nonNull) - .map(Object::toString) - .noneMatch(value -> value.length() < min || value.length() > max); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueLength.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueLength.java deleted file mode 100644 index 7e1d0e41..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueLength.java +++ /dev/null @@ -1,32 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Target({FIELD, PARAMETER, ANNOTATION_TYPE}) -@Retention(RUNTIME) -@Constraint(validatedBy = MapValueAsStringLengthValidator.class) -public @interface MapValueLength { - String message() default "values must be between {min} and {max}"; - - Class[] groups() default { }; - - Class[] payload() default { }; - - int min() default 0; - - int max() default Integer.MAX_VALUE; - - @Target({ FIELD, PARAMETER}) - @Retention(RUNTIME) - @interface List { - MapValueLength[] value(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueNotNull.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueNotNull.java deleted file mode 100644 index 2899cb5f..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueNotNull.java +++ /dev/null @@ -1,28 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Target({FIELD, PARAMETER, ANNOTATION_TYPE}) -@Retention(RUNTIME) -@Constraint(validatedBy = MapValueNotNullValidator.class) -public @interface MapValueNotNull { - String message() default "value must not be null"; - - Class[] groups() default { }; - - Class[] payload() default { }; - - @Target({ FIELD, PARAMETER}) - @Retention(RUNTIME) - @interface List { - MapValueNotNull[] value(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueNotNullValidator.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueNotNullValidator.java deleted file mode 100644 index 12f08d3b..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueNotNullValidator.java +++ /dev/null @@ -1,20 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -import java.util.Map; -import java.util.Objects; - -public class MapValueNotNullValidator implements ConstraintValidator> { - - @Override - public boolean isValid(Map theMap, ConstraintValidatorContext context) { - if (theMap == null) { - return true; - } - - return theMap.values().stream() - .noneMatch(Objects::isNull); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueTypes.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueTypes.java deleted file mode 100644 index 3b9a85e9..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueTypes.java +++ /dev/null @@ -1,30 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Target({FIELD, PARAMETER, ANNOTATION_TYPE}) -@Retention(RUNTIME) -@Constraint(validatedBy = MapValueTypesValidator.class) -public @interface MapValueTypes { - String message() default "value must be of type {types}"; - - Class[] groups() default { }; - - Class[] payload() default { }; - - Class[] types(); - - @Target({ FIELD, PARAMETER}) - @Retention(RUNTIME) - @interface List { - MapValueTypes[] value(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueTypesValidator.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueTypesValidator.java deleted file mode 100644 index d643eceb..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/MapValueTypesValidator.java +++ /dev/null @@ -1,34 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -public class MapValueTypesValidator implements ConstraintValidator> { - - private Set allowedTypes; - - @Override - public void initialize(MapValueTypes constraintAnnotation) { - allowedTypes = Set.of(constraintAnnotation.types()); - } - - @Override - public boolean isValid(Map theMap, ConstraintValidatorContext context) { - if (theMap == null) { - return true; - } - - return theMap.values().stream() - .filter(Objects::nonNull) - .map(Object::getClass) - .allMatch(this::validType); - } - - private boolean validType(Class clazz) { - return allowedTypes.stream().anyMatch(permittedClass -> permittedClass.isAssignableFrom(clazz)); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/PatchPathOperation.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/PatchPathOperation.java deleted file mode 100644 index 9cb293bb..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/PatchPathOperation.java +++ /dev/null @@ -1,36 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import uk.gov.service.payments.commons.model.jsonpatch.JsonPatchOp; - -import java.util.Objects; - -public class PatchPathOperation { - private final String path; - private final JsonPatchOp operation; - - public PatchPathOperation(String path, JsonPatchOp operation) { - this.path = path; - this.operation = operation; - } - - public String getPath() { - return path; - } - - public JsonPatchOp getOperation() { - return operation; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - PatchPathOperation that = (PatchPathOperation) o; - return Objects.equals(path, that.path) && Objects.equals(operation, that.operation); - } - - @Override - public int hashCode() { - return Objects.hash(path, operation); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/RequestValidator.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/RequestValidator.java deleted file mode 100644 index 0f31106d..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/RequestValidator.java +++ /dev/null @@ -1,120 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static java.lang.String.format; -import static org.apache.commons.lang3.StringUtils.isBlank; -import static org.apache.commons.lang3.math.NumberUtils.isDigits; - -public class RequestValidator { - - public static List checkIsNumeric(JsonNode payload, String... fieldNames) { - return applyCheck(payload, isNotNumeric(), fieldNames, "Field [%s] must be a number"); - } - - public static List checkIsBoolean(JsonNode payload, String... fieldNames) { - return applyCheck(payload, isNotBoolean(), fieldNames, "Field [%s] must be a boolean"); - } - - public static List checkIsString(JsonNode payload, String... fieldNames) { - return applyCheck(payload, isNotString(), fieldNames, "Field [%s] must be a string"); - } - - public static List checkIfExistsOrEmpty(JsonNode payload, String... fieldNames) { - return applyCheck(payload, notExistOrEmpty(), fieldNames, "Field [%s] is required"); - } - - public static List checkIfNull(JsonNode payload, String... fieldNames) { - return applyCheck(payload, isNullValue(), fieldNames, "Field [%s] is required"); - } - - public static List checkMaxLength(JsonNode payload, int maxLength, String... fieldNames) { - return applyCheck(payload, exceedsMaxLength(maxLength), fieldNames, "Field [%s] must have a maximum length of " + maxLength + " characters"); - } - - public static List checkIsAllowedValue(JsonNode payload, Set allowedValues, String... fieldNames) { - return applyCheck(payload, isNotAllowedValue(allowedValues), fieldNames, "Field [%s] must be one of " - + allowedValues.stream().sorted().collect(Collectors.joining(", ", "[", "]"))); - } - - private static List applyCheck(JsonNode payload, Function check, String[] fieldNames, String errorMessage) { - List errors = new ArrayList<>(); - for (String fieldName : fieldNames) { - if (check.apply(payload.get(fieldName))) { - errors.add(format(errorMessage, fieldName)); - } - } - return errors; - } - - private static Function exceedsMaxLength(int maxLength) { - return jsonNode -> jsonNode.asText().length() > maxLength; - } - - private static Function notExistOrEmpty() { - return (jsonElement) -> { - if (jsonElement instanceof NullNode) { - return isNullValue().apply(jsonElement); - } else if (jsonElement instanceof ArrayNode) { - return notExistOrEmptyArray().apply(jsonElement); - } else if (jsonElement instanceof ObjectNode) { - return notExistOrEmptyObject().apply(jsonElement); - } else { - return notExistOrBlankText().apply(jsonElement); - } - }; - } - - private static Function notExistOrEmptyArray() { - return jsonElement -> ( - jsonElement == null || - ((jsonElement instanceof ArrayNode) && (jsonElement.size() == 0)) - ); - } - - private static Function notExistOrEmptyObject() { - return jsonElement -> ( - jsonElement == null || - ((jsonElement instanceof ObjectNode) && jsonElement.isEmpty()) - ); - } - - private static Function notExistOrBlankText() { - return jsonElement -> ( - jsonElement == null || - isBlank(jsonElement.asText()) - ); - } - - private static Function isNullValue() { - return jsonElement -> ( - jsonElement == null || jsonElement.isNull() - ); - } - - private static Function isNotNumeric() { - return jsonNode -> !isDigits(jsonNode.asText()); - } - - private static Function isNotBoolean() { - return jsonNode -> jsonNode == null || !jsonNode.isBoolean(); - } - - private static Function isNotAllowedValue(Set allowedValues) { - return jsonNode -> jsonNode == null || !allowedValues.contains(jsonNode.asText()); - } - - private static Function isNotString() { - return jsonNode -> !jsonNode.isTextual(); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/ValidExternalMetadata.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/ValidExternalMetadata.java deleted file mode 100644 index fd473b06..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/api/validation/ValidExternalMetadata.java +++ /dev/null @@ -1,41 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; -import static uk.gov.service.payments.commons.model.charge.ExternalMetadata.MAX_KEY_LENGTH; -import static uk.gov.service.payments.commons.model.charge.ExternalMetadata.MAX_KEY_VALUE_PAIRS; -import static uk.gov.service.payments.commons.model.charge.ExternalMetadata.MAX_VALUE_LENGTH; -import static uk.gov.service.payments.commons.model.charge.ExternalMetadata.MIN_KEY_LENGTH; - -@Target({FIELD, PARAMETER}) -@Retention(RUNTIME) -@Constraint(validatedBy = {}) -@NotNull(message = "Field [metadata] must not be null") -@Size(max = MAX_KEY_VALUE_PAIRS, message = "Field [metadata] cannot have more than {max} key-value pairs") -@MapKeyLength(max = MAX_KEY_LENGTH, min = MIN_KEY_LENGTH, message = "Field [metadata] keys must be between {min} and {max} characters long") -@MapValueTypes(types = {String.class, Number.class, Boolean.class}, message = "Field [metadata] values must be of type String, Boolean or Number") -@MapValueLength(max = MAX_VALUE_LENGTH, message = "Field [metadata] values must be no greater than {max} characters long") -@MapValueNotNull(message = "Field [metadata] must not have null values") -@MapKeyInsensitiveUnique(message = "Field [metadata] must have case insensitive unique keys") -public @interface ValidExternalMetadata { - String message() default "Invalid metadata"; - - Class[] groups() default {}; - - Class[] payload() default {}; - - @Target({FIELD, PARAMETER}) - @Retention(RUNTIME) - @interface List { - ValidExternalMetadata[] value(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/jpa/CardExpiryDateConverter.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/jpa/CardExpiryDateConverter.java deleted file mode 100644 index 7659c5c3..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/jpa/CardExpiryDateConverter.java +++ /dev/null @@ -1,29 +0,0 @@ -package uk.gov.service.payments.commons.jpa; - -import uk.gov.service.payments.commons.model.CardExpiryDate; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Converter; - -@Converter -public class CardExpiryDateConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(CardExpiryDate cardExpiryDate) { - if (cardExpiryDate == null) { - return null; - } - - return cardExpiryDate.toString(); - } - - @Override - public CardExpiryDate convertToEntityAttribute(String cardExpiryDate) { - if (cardExpiryDate == null) { - return null; - } - - return CardExpiryDate.valueOf(cardExpiryDate); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/jpa/InstantToUtcTimestampWithoutTimeZoneConverter.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/jpa/InstantToUtcTimestampWithoutTimeZoneConverter.java deleted file mode 100644 index 00131c5f..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/jpa/InstantToUtcTimestampWithoutTimeZoneConverter.java +++ /dev/null @@ -1,39 +0,0 @@ -package uk.gov.service.payments.commons.jpa; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Converter; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneOffset; - -/** - * Converts an Instant to a LocalDateTime using UTC as the assumed local time - * zone. Per JDBC 4.2, this LocalDateTime can then be stored in a database - * column of type TIMESTAMP WITHOUT TIME ZONE. - * - * Alternatively, takes a LocalDateTime read from a database column of type - * TIMESTAMP WITHOUT TIME ZONE and converts it into an Instant by assuming it - * refers to a date and time in the UTC time zone. - **/ -@Converter -public class InstantToUtcTimestampWithoutTimeZoneConverter implements AttributeConverter { - - @Override - public LocalDateTime convertToDatabaseColumn(Instant instant) { - if (instant == null) { - return null; - } - - return LocalDateTime.ofInstant(instant, ZoneOffset.UTC); - } - - @Override - public Instant convertToEntityAttribute(LocalDateTime localDateTime) { - if (localDateTime == null) { - return null; - } - - return localDateTime.toInstant(ZoneOffset.UTC); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/AgreementPaymentType.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/AgreementPaymentType.java deleted file mode 100644 index 5c94cc9f..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/AgreementPaymentType.java +++ /dev/null @@ -1,31 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.stream.Stream; - -public enum AgreementPaymentType { - @JsonProperty("instalment") - INSTALMENT("instalment"), - @JsonProperty("recurring") - RECURRING("recurring"), - @JsonProperty("unscheduled") - UNSCHEDULED("unscheduled"); - - private final String name; - - AgreementPaymentType(String name) { - this.name = name; - } - - public static AgreementPaymentType of(String name) { - return Stream.of(AgreementPaymentType.values()) - .filter(n -> n.getName().equals(name)) - .findFirst() - .orElseThrow(IllegalArgumentException::new); - } - - public String getName() { - return this.name; - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/AuthorisationMode.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/AuthorisationMode.java deleted file mode 100644 index ba95824a..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/AuthorisationMode.java +++ /dev/null @@ -1,33 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.stream.Stream; - -public enum AuthorisationMode { - @JsonProperty("web") - WEB("web"), - @JsonProperty("moto_api") - MOTO_API("moto_api"), - @JsonProperty("agreement") - AGREEMENT("agreement"), - @JsonProperty("external") - EXTERNAL("external"); - - private final String name; - - AuthorisationMode(String name) { - this.name = name; - } - - public static AuthorisationMode of(String name) { - return Stream.of(AuthorisationMode.values()) - .filter(n -> n.getName().equals(name)) - .findFirst() - .orElseThrow(IllegalArgumentException::new); - } - - public String getName() { - return this.name; - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/CardExpiryDate.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/CardExpiryDate.java deleted file mode 100644 index e022833b..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/CardExpiryDate.java +++ /dev/null @@ -1,101 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import java.time.YearMonth; -import java.util.Objects; -import java.util.regex.Pattern; - -public class CardExpiryDate { - - public static final Pattern CARD_EXPIRY_DATE_PATTERN = Pattern.compile("(0[1-9]|1[0-2])/([0-9]{2})"); - private static final String PREFIX_TO_MAKE_2_DIGIT_YEAR_INTO_4_DIGIT_YEAR = "20"; - private static final YearMonth MIN_EXPIRY_DATE = YearMonth.of(2000, 1); - private static final YearMonth MAX_EXPIRY_DATE = YearMonth.of(2099, 12); - - private final String month2Digits; - private final String year2Digits; - - private CardExpiryDate(String expiryDate) { - Objects.requireNonNull(expiryDate, "expiryDate"); - - var matcher = CARD_EXPIRY_DATE_PATTERN.matcher(expiryDate); - - if (!matcher.matches()) { - throw new IllegalArgumentException("Not in MM/yy format: " + expiryDate); - } - - this.month2Digits = matcher.group(1); - this.year2Digits = matcher.group(2); - } - - private CardExpiryDate(YearMonth expiryDate) { - if (expiryDate.isBefore(MIN_EXPIRY_DATE) || expiryDate.isAfter(MAX_EXPIRY_DATE)) { - throw new IllegalArgumentException("Expiry date must be in the range 01/2000 - 12/2099"); - } - int month = expiryDate.getMonthValue(); - this.month2Digits = String.format("%02d", month); - this.year2Digits = String.valueOf(expiryDate.getYear()).substring(2,4); - } - - /** - * Parses a string in the MM/yy format used for expiry dates on most - * payment cards into a CardExpiryDate. For example, "09/22". - * - * Both the month and the year must be 2 digits, zero-padded if necessary - * (so "09" rather than "9"), thus the string must be exactly 5 characters - * in total. - **/ - public static CardExpiryDate valueOf(String expiryDate) { - return new CardExpiryDate(expiryDate); - } - - public static CardExpiryDate valueOf(YearMonth expiryDate) { - return new CardExpiryDate(expiryDate); - } - - public String getTwoDigitMonth() { - return month2Digits; - } - - public String getTwoDigitYear() { - return year2Digits; - } - - public String getFourDigitYear() { - return PREFIX_TO_MAKE_2_DIGIT_YEAR_INTO_4_DIGIT_YEAR + year2Digits; - } - - public YearMonth toYearMonth() { - var month = Integer.parseInt(month2Digits); - var year = Integer.parseInt(getFourDigitYear()); - return YearMonth.of(year, month); - } - - /** - * Returns the card expiry date in the MM/yy format used for expiry dates - * on most payment cards. For example, "09/22". - */ - @Override - public String toString() { - return month2Digits + '/' + year2Digits; - } - - @Override - public boolean equals(Object other) { - if (this == other) { - return true; - } - - if (other == null || other.getClass() != CardExpiryDate.class) { - return false; - } - - var that = (CardExpiryDate) other; - return this.month2Digits.equals(that.month2Digits) && this.year2Digits.equals(that.year2Digits); - } - - @Override - public int hashCode() { - return Objects.hash(month2Digits, year2Digits); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/CommonDateTimeFormatters.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/CommonDateTimeFormatters.java deleted file mode 100644 index 97b0cc06..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/CommonDateTimeFormatters.java +++ /dev/null @@ -1,33 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.util.Locale; - -public class CommonDateTimeFormatters { - - /** - * DateTimeFormatter that produces a standard ISO-8601 format date and time - * in UTC with millisecond precision (three fractional second digits, zero - * right-padded if necessary), for example 2015-10-21T07:28:00.000Z - */ - public static final DateTimeFormatter ISO_INSTANT_MILLISECOND_PRECISION = - new DateTimeFormatterBuilder().appendInstant(3).toFormatter(Locale.ENGLISH); - - /** - * DateTimeFormatter that produces a standard ISO-8601 format date and time - * in UTC with microsecond precision (six fractional second digits, zero - * right-padded if necessary), for example 2015-10-21T07:28:00.000000Z - */ - public static final DateTimeFormatter ISO_INSTANT_MICROSECOND_PRECISION = - new DateTimeFormatterBuilder().appendInstant(6).toFormatter(Locale.ENGLISH); - - /** - * DateTimeFormatter that produces a standard ISO-8601 local date in UTC - * without an offset, for example 2022-10-04 - */ - public static final DateTimeFormatter ISO_LOCAL_DATE_IN_UTC = - DateTimeFormatter.ISO_LOCAL_DATE.withZone(ZoneOffset.UTC); - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/ErrorIdentifier.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/ErrorIdentifier.java deleted file mode 100644 index a7a1af52..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/ErrorIdentifier.java +++ /dev/null @@ -1,35 +0,0 @@ -package uk.gov.service.payments.commons.model; - -public enum ErrorIdentifier { - ACCOUNT_DISABLED, - ACCOUNT_NOT_LINKED_WITH_PSP, - AGREEMENT_NOT_ACTIVE, - AGREEMENT_NOT_FOUND, - AMOUNT_BELOW_MINIMUM, - AUTH_TOKEN_INVALID, - AUTH_TOKEN_REVOKED, - AUTHORISATION_API_NOT_ALLOWED, - AUTHORISATION_ERROR, - AUTHORISATION_REJECTED, - AUTHORISATION_TIMEOUT, - CANCEL_CHARGE_FAILURE_DUE_TO_CONFLICTING_TERMINAL_STATE_AT_GATEWAY_CHARGE_STATE_FORCIBLY_TRANSITIONED, - CANCEL_CHARGE_FAILURE_DUE_TO_CONFLICTING_TERMINAL_STATE_AT_GATEWAY_INVALID_STATE_TRANSITION, - CARD_NUMBER_IN_PAYMENT_LINK_REFERENCE_REJECTED, - CARD_NUMBER_REJECTED, - GENERIC, - IDEMPOTENCY_KEY_USED, - INCORRECT_AUTHORISATION_MODE_FOR_SAVE_PAYMENT_INSTRUMENT_TO_AGREEMENT, - INVALID_ATTRIBUTE_VALUE, - MISSING_MANDATORY_ATTRIBUTE, - MOTO_NOT_ALLOWED, - NON_HTTPS_RETURN_URL_NOT_ALLOWED_FOR_A_LIVE_ACCOUNT, - ONE_TIME_TOKEN_ALREADY_USED, - ONE_TIME_TOKEN_INVALID, - RECURRING_CARD_PAYMENTS_NOT_ALLOWED, - REFUND_AMOUNT_AVAILABLE_MISMATCH, - REFUND_NOT_AVAILABLE, - REFUND_NOT_AVAILABLE_DUE_TO_DISPUTE, - TELEPHONE_PAYMENT_NOTIFICATIONS_NOT_ALLOWED, - UNEXPECTED_ATTRIBUTE, - ZERO_AMOUNT_NOT_ALLOWED -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/Source.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/Source.java deleted file mode 100644 index 2adfa739..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/Source.java +++ /dev/null @@ -1,17 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import java.util.Arrays; -import java.util.Optional; - -public enum Source { - CARD_API, - CARD_PAYMENT_LINK, - CARD_AGENT_INITIATED_MOTO, - CARD_EXTERNAL_TELEPHONE; - - public static Optional from(String sourceName) { - return Arrays.stream(Source.values()) - .filter(v -> v.name().equals(sourceName)) - .findFirst(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguage.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguage.java deleted file mode 100644 index 371f1038..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguage.java +++ /dev/null @@ -1,28 +0,0 @@ -package uk.gov.service.payments.commons.model; - -public enum SupportedLanguage { - - ENGLISH("en"), - WELSH("cy"); - - private final String iso639AlphaTwoCode; - - SupportedLanguage(String iso639AlphaTwoCode) { - this.iso639AlphaTwoCode = iso639AlphaTwoCode; - } - - @Override - public String toString() { - return iso639AlphaTwoCode; - } - - public static SupportedLanguage fromIso639AlphaTwoCode(String iso639AlphaTwoCode) { - for (SupportedLanguage supportedLanguage : SupportedLanguage.values()) { - if (supportedLanguage.iso639AlphaTwoCode.equals(iso639AlphaTwoCode)) { - return supportedLanguage; - } - } - throw new IllegalArgumentException(iso639AlphaTwoCode + " is not a supported ISO 639-1 code"); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguageJpaConverter.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguageJpaConverter.java deleted file mode 100644 index 4b3fee94..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguageJpaConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Converter; - -@Converter -public class SupportedLanguageJpaConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(SupportedLanguage supportedLanguage) { - return supportedLanguage.toString(); - } - - @Override - public SupportedLanguage convertToEntityAttribute(String supportedLanguage) { - return SupportedLanguage.fromIso639AlphaTwoCode(supportedLanguage); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguageJsonDeserializer.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguageJsonDeserializer.java deleted file mode 100644 index c0a3de99..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/SupportedLanguageJsonDeserializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; - -import java.io.IOException; - -public final class SupportedLanguageJsonDeserializer extends JsonDeserializer { - @Override - public SupportedLanguage deserialize(final JsonParser parser, final DeserializationContext context) throws IOException { - final String valueAsString = parser.getValueAsString(); - return SupportedLanguage.fromIso639AlphaTwoCode(valueAsString); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/TokenPaymentType.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/TokenPaymentType.java deleted file mode 100644 index e901b7a6..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/TokenPaymentType.java +++ /dev/null @@ -1,23 +0,0 @@ -package uk.gov.service.payments.commons.model; - -public enum TokenPaymentType { - CARD("Card Payment"), DIRECT_DEBIT("Direct Debit Payment"); - - private String friendlyName; - - TokenPaymentType(String friendlyName) { - this.friendlyName = friendlyName; - } - - public static TokenPaymentType fromString(final String type) { - try { - return TokenPaymentType.valueOf(type); - } catch (Exception e) { - return CARD; - } - } - - public String getFriendlyName() { - return this.friendlyName; - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/WrappedStringValue.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/WrappedStringValue.java deleted file mode 100644 index ddc9425b..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/WrappedStringValue.java +++ /dev/null @@ -1,37 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import java.util.Objects; - -public abstract class WrappedStringValue { - - private final String value; - - public WrappedStringValue(String value) { - this.value = Objects.requireNonNull(value); - } - - @Override - public String toString() { - return value; - } - - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - - if (that != null && this.getClass() == that.getClass()) { - var wrappedStringValueWithSameRuntimeTypeAsThisObject = (WrappedStringValue) that; - return this.value.equals(wrappedStringValueWithSameRuntimeTypeAsThisObject.value); - } - - return false; - } - - @Override - public int hashCode() { - return value.hashCode(); - } - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/agreement/AgreementStatus.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/agreement/AgreementStatus.java deleted file mode 100644 index 64ecae59..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/agreement/AgreementStatus.java +++ /dev/null @@ -1,17 +0,0 @@ -package uk.gov.service.payments.commons.model.agreement; - -import java.util.Arrays; -import java.util.Optional; - -public enum AgreementStatus { - CREATED, - ACTIVE, - INACTIVE, - CANCELLED; - - public static Optional from(String agreementStatusName) { - return Arrays.stream(AgreementStatus.values()) - .filter(v -> v.name().equals(agreementStatusName)) - .findFirst(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/agreement/PaymentInstrumentType.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/agreement/PaymentInstrumentType.java deleted file mode 100644 index 3751789a..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/agreement/PaymentInstrumentType.java +++ /dev/null @@ -1,14 +0,0 @@ -package uk.gov.service.payments.commons.model.agreement; - -import java.util.Arrays; -import java.util.Optional; - -public enum PaymentInstrumentType { - CARD; - - public static Optional from(String paymentInstrumentTypeName) { - return Arrays.stream(PaymentInstrumentType.values()) - .filter(v -> v.name().equals(paymentInstrumentTypeName)) - .findFirst(); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/charge/ExternalMetadata.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/charge/ExternalMetadata.java deleted file mode 100644 index db7c07db..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/charge/ExternalMetadata.java +++ /dev/null @@ -1,26 +0,0 @@ -package uk.gov.service.payments.commons.model.charge; - -import uk.gov.service.payments.commons.api.validation.ValidExternalMetadata; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -public class ExternalMetadata { - - public static final int MAX_KEY_VALUE_PAIRS = 15; - public static final int MIN_KEY_LENGTH = 1; - public static final int MAX_KEY_LENGTH = 30; - public static final int MAX_VALUE_LENGTH = 100; - - @ValidExternalMetadata - private final Map metadata; - - public ExternalMetadata(Map metadata) { - this.metadata = new HashMap<>(metadata); - } - - public Map getMetadata() { - return Collections.unmodifiableMap(metadata); - } -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchKeys.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchKeys.java deleted file mode 100644 index fffbfada..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchKeys.java +++ /dev/null @@ -1,9 +0,0 @@ -package uk.gov.service.payments.commons.model.jsonpatch; - -public interface JsonPatchKeys { - - String FIELD_OPERATION = "op"; - String FIELD_OPERATION_PATH = "path"; - String FIELD_VALUE = "value"; - -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchOp.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchOp.java deleted file mode 100644 index d02ee8c7..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchOp.java +++ /dev/null @@ -1,7 +0,0 @@ -package uk.gov.service.payments.commons.model.jsonpatch; - -public enum JsonPatchOp { - ADD, - REPLACE, - REMOVE -} diff --git a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchRequest.java b/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchRequest.java deleted file mode 100644 index ac0f034c..00000000 --- a/model-dropwizard-4/src/main/java/uk/gov/service/payments/commons/model/jsonpatch/JsonPatchRequest.java +++ /dev/null @@ -1,114 +0,0 @@ -package uk.gov.service.payments.commons.model.jsonpatch; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import uk.gov.service.payments.commons.api.json.JsonMapper; - -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static uk.gov.service.payments.commons.model.jsonpatch.JsonPatchKeys.FIELD_OPERATION; -import static uk.gov.service.payments.commons.model.jsonpatch.JsonPatchKeys.FIELD_OPERATION_PATH; -import static uk.gov.service.payments.commons.model.jsonpatch.JsonPatchKeys.FIELD_VALUE; - -public class JsonPatchRequest { - - private static final ObjectMapper objectMapper = new ObjectMapper(); - private static final JsonMapper jsonObjectMapper = new JsonMapper(objectMapper); - - private final JsonPatchOp op; - private final String path; - private final JsonNode value; - - public JsonPatchOp getOp() { - return op; - } - - public String getPath() { - return path; - } - - public boolean valueIsString() { - return value.isTextual(); - } - - public boolean valueIsArray() { - return value.isArray(); - } - - public boolean valueIsBoolean() { - return value.isBoolean(); - } - - public String valueAsString() { - return value.asText(); - } - - public List valueAsList() { - return objectMapper.convertValue(value, List.class); - } - - public List valueAsListOfString() { - return jsonObjectMapper.getAsListOfString(value); - } - - public long valueAsLong() { - if (value != null && value.isNumber()) { - return Long.parseLong(value.asText()); - } - throw new JsonNodeNotCorrectTypeException("JSON node " + value + " is not of type number"); - } - - public int valueAsInt() { - if(value != null && value.isNumber()) { - return Integer.parseInt(value.asText()); - } - throw new JsonNodeNotCorrectTypeException("JSON node " + value + " is not of type number"); - } - - public boolean valueAsBoolean() { - if (value != null && value.isBoolean()) { - return Boolean.parseBoolean(value.asText()); - } - throw new JsonNodeNotCorrectTypeException("JSON node " + value + " is not of type boolean"); - } - - public Map valueAsObject() { - return jsonObjectMapper.getAsMap(value); - } - - - private JsonPatchRequest(JsonPatchOp op, String path, JsonNode value) { - this.op = op; - this.path = path; - this.value = value; - } - - public static JsonPatchRequest from(JsonNode payload) { - return new JsonPatchRequest( - JsonPatchOp.valueOf(payload.get(FIELD_OPERATION).asText().toUpperCase()), - payload.get(FIELD_OPERATION_PATH).asText(), - payload.get(FIELD_VALUE)); - - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - JsonPatchRequest that = (JsonPatchRequest) o; - return op == that.op && Objects.equals(path, that.path) && Objects.equals(value, that.value); - } - - @Override - public int hashCode() { - return Objects.hash(op, path, value); - } - - public class JsonNodeNotCorrectTypeException extends RuntimeException { - public JsonNodeNotCorrectTypeException(String message) { - super(message); - } - } -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeDeserializerTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeDeserializerTest.java deleted file mode 100644 index 3c049b14..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeDeserializerTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.module.SimpleModule; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.time.ZonedDateTime; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class ApiResponseDateTimeDeserializerTest { - private ObjectMapper objectMapper; - - @BeforeEach - public void before() { - objectMapper = new ObjectMapper(); - SimpleModule simpleModule = new SimpleModule(); - simpleModule.addDeserializer(ZonedDateTime.class, new ApiResponseDateTimeDeserializer()); - objectMapper.registerModule(simpleModule); - } - - @Test - public void shouldDeserializeValidString() throws IOException { - String testValue = "{\"created_date\":\"2019-01-29T11:34:53.849012345Z\"}"; - - RequestDateTimeJsonTest actual = objectMapper.readValue(testValue, RequestDateTimeJsonTest.class); - ZonedDateTime expected = ZonedDateTime.parse("2019-01-29T11:34:53.849012345Z"); - assertEquals(expected, actual.getCreatedDate()); - } - - @Test - public void shouldDeserializeToNull() throws IOException { - String testValue = "{\"created_date\":null}"; - - RequestDateTimeJsonTest response = objectMapper.readValue(testValue, RequestDateTimeJsonTest.class); - assertNull(response.getCreatedDate()); - } - - @Test - public void shouldThrowExceptionWhenNullValue() { - String testValue = "{\"created_date\":\"blah\"}"; - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(testValue, RequestDateTimeJsonTest.class)); - } -} - -class RequestDateTimeJsonTest { - @JsonProperty(value = "created_date") - @JsonDeserialize(using = ApiResponseDateTimeDeserializer.class) - private ZonedDateTime createdDate; - - ZonedDateTime getCreatedDate() { - return createdDate; - } -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeSerializerTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeSerializerTest.java deleted file mode 100644 index 776137eb..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ApiResponseDateTimeSerializerTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializerProvider; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.time.ZonedDateTime; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class ApiResponseDateTimeSerializerTest { - private final ApiResponseDateTimeSerializer serializer = new ApiResponseDateTimeSerializer(); - - @Test - public void shouldSerializeWithMillisecondPrecision() throws IOException { - ZonedDateTime testValue = ZonedDateTime.parse("2019-01-29T11:34:53.849012345Z"); - Writer jsonWriter = new StringWriter(); - JsonGenerator jsonGenerator = new JsonFactory().createGenerator(jsonWriter); - final SerializerProvider serializerProvider = new ObjectMapper().getSerializerProvider(); - serializer.serialize(testValue, jsonGenerator, serializerProvider); - jsonGenerator.flush(); - final String actual = jsonWriter.toString(); - assertEquals("\"2019-01-29T11:34:53.849Z\"", actual); - } -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ExternalMetadataDeserialiserTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ExternalMetadataDeserialiserTest.java deleted file mode 100644 index 5ae98a63..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/ExternalMetadataDeserialiserTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import uk.gov.service.payments.commons.model.charge.ExternalMetadata; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.fail; - -public class ExternalMetadataDeserialiserTest { - - private ObjectMapper objectMapper; - - @BeforeEach - public void before() { - objectMapper = new ObjectMapper(); - SimpleModule simpleModule = new SimpleModule(); - simpleModule.addDeserializer(ExternalMetadata.class, new ExternalMetadataDeserialiser()); - objectMapper.registerModule(simpleModule); - } - - @Test - public void shouldReturnNullIfValueIsAnEmptyJson() throws Exception { - ExternalMetadata externalMetadata = objectMapper.readValue("{}", ExternalMetadata.class); - assertNull(externalMetadata); - } - - @Test - public void shouldDeserialise() throws Exception { - String metadata = "{\"ledger_code\":\"123\", \"fund_code\":\"1234\"}"; - ExternalMetadata externalMetadata = objectMapper.readValue(metadata, ExternalMetadata.class); - assertNotNull(externalMetadata.getMetadata()); - assertEquals(externalMetadata.getMetadata().size(), 2); - assertEquals(externalMetadata.getMetadata().get("ledger_code"), "123"); - assertEquals(externalMetadata.getMetadata().get("fund_code"), "1234"); - } - - @Test - public void shouldReturnErrorIfValueIsNotAnObject() { - String metadata = "some text"; - try { - objectMapper.convertValue(metadata, ExternalMetadata.class); - fail(); - } catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), containsString("Field [metadata] must be an object of JSON key-value pairs")); - } - } -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondDeserializerTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondDeserializerTest.java deleted file mode 100644 index 2a118f7c..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondDeserializerTest.java +++ /dev/null @@ -1,128 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import org.junit.jupiter.api.Test; - -import java.time.Instant; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.nullValue; -import static org.hamcrest.core.Is.is; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class IsoInstantMicrosecondDeserializerTest { - - private record JsonObjectWithInstant( - @JsonDeserialize(using = IsoInstantMicrosecondDeserializer.class) Instant instant) { } - - private final ObjectMapper objectMapper = new ObjectMapper(); - - @Test - void shouldDeserializeIsoInstantStringWithSecondsWith6DecimalPlacesToInstant() throws JsonProcessingException { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.123456Z" - } - """; - - JsonObjectWithInstant deserializedJsonObject = objectMapper.readValue(jsonString, JsonObjectWithInstant.class); - - assertThat(deserializedJsonObject.instant(), is(Instant.parse("2024-10-02T09:30:00.123456Z"))); - } - - @Test - void shouldDeserializeIsoInstantStringWithSecondsWith6DecimalPlacesOfZeroToInstant() throws JsonProcessingException { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.000000Z" - } - """; - - JsonObjectWithInstant deserializedJsonObject = objectMapper.readValue(jsonString, JsonObjectWithInstant.class); - - assertThat(deserializedJsonObject.instant(), is(Instant.parse("2024-10-02T09:30:00.000Z"))); - } - - @Test - void shouldDeserializeNullToNull() throws JsonProcessingException { - var jsonString = """ - { - "instant": null - } - """; - - JsonObjectWithInstant deserializedJsonObject = objectMapper.readValue(jsonString, JsonObjectWithInstant.class); - - assertThat(deserializedJsonObject.instant(), is(nullValue())); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeIsoStringWith5DecimalPlaces() { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.12345Z" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeIsoStringWith7DecimalPlaces() { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.1234567Z" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeIsoStringWith3DecimalPlaces() { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.123Z" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeIsoStringWith6DecimalPlacesButNoTrailingZ() { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.123456" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeNonsenseString() { - var jsonString = """ - { - "instant": "This is clearly not an ISO instant" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeNonString() { - var jsonString = """ - { - "instant": 1727861400123456 - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondSerializerTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondSerializerTest.java deleted file mode 100644 index 2817197a..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMicrosecondSerializerTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.io.StringWriter; -import java.time.Instant; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; - -class IsoInstantMicrosecondSerializerTest { - - private final IsoInstantMicrosecondSerializer isoInstantMicrosecondSerializer = new IsoInstantMicrosecondSerializer(); - - @Test - void shouldSerializeWithMicrosecondPrecision() throws IOException { - var instant = Instant.parse("2020-12-25T15:00:00.123456789Z"); - - var stringWriter = new StringWriter(); - var jsonGenerator = new JsonFactory().createGenerator(stringWriter); - - isoInstantMicrosecondSerializer.serialize(instant, jsonGenerator, new ObjectMapper().getSerializerProvider()); - jsonGenerator.flush(); - - var expected = "\"2020-12-25T15:00:00.123456Z\""; - var actual = stringWriter.toString(); - - assertThat(actual, is(expected)); - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondDeserializerTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondDeserializerTest.java deleted file mode 100644 index 4d7cd2ed..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondDeserializerTest.java +++ /dev/null @@ -1,128 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import org.junit.jupiter.api.Test; - -import java.time.Instant; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.nullValue; -import static org.hamcrest.core.Is.is; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class IsoInstantMillisecondDeserializerTest { - - private record JsonObjectWithInstant( - @JsonDeserialize(using = IsoInstantMillisecondDeserializer.class) Instant instant) { } - - private final ObjectMapper objectMapper = new ObjectMapper(); - - @Test - void shouldDeserializeIsoInstantStringWithSecondsWith3DecimalPlacesToInstant() throws JsonProcessingException { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.123Z" - } - """; - - JsonObjectWithInstant deserializedJsonObject = objectMapper.readValue(jsonString, JsonObjectWithInstant.class); - - assertThat(deserializedJsonObject.instant(), is(Instant.parse("2024-10-02T09:30:00.123Z"))); - } - - @Test - void shouldDeserializeIsoInstantStringWithSecondsWith3DecimalPlacesOfZeroToInstant() throws JsonProcessingException { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.000Z" - } - """; - - JsonObjectWithInstant deserializedJsonObject = objectMapper.readValue(jsonString, JsonObjectWithInstant.class); - - assertThat(deserializedJsonObject.instant(), is(Instant.parse("2024-10-02T09:30:00.000Z"))); - } - - @Test - void shouldDeserializeNullToNull() throws JsonProcessingException { - var jsonString = """ - { - "instant": null - } - """; - - JsonObjectWithInstant deserializedJsonObject = objectMapper.readValue(jsonString, JsonObjectWithInstant.class); - - assertThat(deserializedJsonObject.instant(), is(nullValue())); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeIsoStringWith2DecimalPlaces() { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.12Z" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeIsoStringWith4DecimalPlaces() { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.1234Z" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeIsoStringWith6DecimalPlaces() { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.123456Z" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeIsoStringWith6DecimalPlacesButNoTrailingZ() { - var jsonString = """ - { - "instant": "2024-10-02T09:30:00.123" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeNonsenseString() { - var jsonString = """ - { - "instant": "This is clearly not an ISO instant" - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - - @Test - void shouldThrowExceptionWhenTryingToDeserializeNonString() { - var jsonString = """ - { - "instant": 1727861400123 - } - """; - - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(jsonString, JsonObjectWithInstant.class)); - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondSerializerTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondSerializerTest.java deleted file mode 100644 index a1de5904..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/IsoInstantMillisecondSerializerTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.io.StringWriter; -import java.time.Instant; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; - -class IsoInstantMillisecondSerializerTest { - - private final IsoInstantMillisecondSerializer isoInstantMillisecondSerializer = new IsoInstantMillisecondSerializer(); - - @Test - void shouldSerializeWithMillisecondPrecision() throws IOException { - var instant = Instant.parse("2020-12-25T15:00:00.123456789Z"); - - var stringWriter = new StringWriter(); - var jsonGenerator = new JsonFactory().createGenerator(stringWriter); - - isoInstantMillisecondSerializer.serialize(instant, jsonGenerator, new ObjectMapper().getSerializerProvider()); - jsonGenerator.flush(); - - var expected = "\"2020-12-25T15:00:00.123Z\""; - var actual = stringWriter.toString(); - - assertThat(actual, is(expected)); - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/JsonMapperTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/JsonMapperTest.java deleted file mode 100644 index 6eb1a118..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/JsonMapperTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Test; - -import java.util.List; -import java.util.Map; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.hasEntry; - -public class JsonMapperTest { - private final ObjectMapper objectMapper = new ObjectMapper(); - private final JsonMapper jsonObjectMapper = new JsonMapper(objectMapper); - - @Test - public void shouldMapToMap() throws JsonProcessingException { - JsonNode jsonNode = objectMapper.readTree("{\"foo\":\"bar\"}"); - Map fromJson = jsonObjectMapper.getAsMap(jsonNode); - assertThat(fromJson, hasEntry("foo", "bar")); - } - - @Test - public void shouldListOfString() throws JsonProcessingException { - JsonNode jsonNode = objectMapper.readTree("[\"foo\",\"bar\"]"); - List fromJson = jsonObjectMapper.getAsListOfString(jsonNode); - assertThat(fromJson, contains("foo", "bar")); - } -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeDeserializerTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeDeserializerTest.java deleted file mode 100644 index 3b2109b7..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeDeserializerTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.module.SimpleModule; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.time.ZonedDateTime; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.nullValue; -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class MicrosecondPrecisionDateTimeDeserializerTest { - private ObjectMapper objectMapper; - - @BeforeEach - public void before() { - objectMapper = new ObjectMapper(); - SimpleModule simpleModule = new SimpleModule(); - simpleModule.addDeserializer(ZonedDateTime.class, new MicrosecondPrecisionDateTimeDeserializer()); - objectMapper.registerModule(simpleModule); - } - - @Test - public void shouldDeserializeValidString() throws IOException { - String testValue = "{\"created_date\":\"2019-01-29T11:34:53.849012Z\"}"; - - TestMicrosecondDeserializerObject deserialized = objectMapper.readValue(testValue, TestMicrosecondDeserializerObject.class); - ZonedDateTime expected = ZonedDateTime.parse("2019-01-29T11:34:53.849012Z"); - assertThat(deserialized.getCreatedDate(), is(expected)); - } - - @Test - public void shouldDeserializeToNull() throws IOException { - String testValue = "{\"created_date\":null}"; - - TestMicrosecondDeserializerObject deserialized = objectMapper.readValue(testValue, TestMicrosecondDeserializerObject.class); - assertThat(deserialized.getCreatedDate(), is(nullValue())); - } - - @Test - public void shouldThrowExceptionWhenNullValue() { - String testValue = "{\"created_date\":\"blah\"}"; - assertThrows(JsonMappingException.class, () -> objectMapper.readValue(testValue, TestMicrosecondDeserializerObject.class)); - } -} - -class TestMicrosecondDeserializerObject { - @JsonProperty(value = "created_date") - @JsonDeserialize(using = MicrosecondPrecisionDateTimeDeserializer.class) - private ZonedDateTime createdDate; - - ZonedDateTime getCreatedDate() { - return createdDate; - } -} - - diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeSerializerTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeSerializerTest.java deleted file mode 100644 index 04c68b45..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/json/MicrosecondPrecisionDateTimeSerializerTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package uk.gov.service.payments.commons.api.json; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializerProvider; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.time.ZonedDateTime; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -public class MicrosecondPrecisionDateTimeSerializerTest { - - private final MicrosecondPrecisionDateTimeSerializer serializer = new MicrosecondPrecisionDateTimeSerializer(); - - @Test - public void shouldSerializeWithMicrosecondPrecision() throws IOException { - ZonedDateTime testValue = ZonedDateTime.parse("2019-01-29T11:34:53.849012345Z"); - Writer jsonWriter = new StringWriter(); - JsonGenerator jsonGenerator = new JsonFactory().createGenerator(jsonWriter); - final SerializerProvider serializerProvider = new ObjectMapper().getSerializerProvider(); - serializer.serialize(testValue, jsonGenerator, serializerProvider); - jsonGenerator.flush(); - final String serialized = jsonWriter.toString(); - assertThat(serialized, is("\"2019-01-29T11:34:53.849012Z\"")); - } -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/validation/JsonPatchRequestValidatorTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/validation/JsonPatchRequestValidatorTest.java deleted file mode 100644 index 5d895b0e..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/api/validation/JsonPatchRequestValidatorTest.java +++ /dev/null @@ -1,181 +0,0 @@ -package uk.gov.service.payments.commons.api.validation; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.ArgumentsProvider; -import org.junit.jupiter.params.provider.ArgumentsSource; -import uk.gov.service.payments.commons.api.exception.ValidationException; -import uk.gov.service.payments.commons.model.jsonpatch.JsonPatchOp; -import uk.gov.service.payments.commons.model.jsonpatch.JsonPatchRequest; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; -import java.util.stream.Stream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.hasProperty; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -class JsonPatchRequestValidatorTest { - - private static final ObjectMapper objectMapper = new ObjectMapper(); - - static class InvalidValuesTestProvider implements ArgumentsProvider { - @Override - public Stream provideArguments(ExtensionContext extensionContext) throws Exception { - return Stream.of( - Arguments.of("Field [path] is required", buildPatchRequest(Map.of("operation", "add", "value", true))), - Arguments.of("Field [path] is required", buildPatchRequest(Map.of("operation", "add", "path", "", "value", true))), - Arguments.of("Field [path] is required", buildPatchRequest(new HashMap<>() {{ - put("operation", "add"); - put("path", null); - put("value", true); - }})), - Arguments.of("Field [path] must be a string", buildPatchRequest(Map.of("operation", "add", "path", 1234, "value", true))), - - Arguments.of("Field [op] is required", buildPatchRequest(Map.of("path", "foo", "value", true))), - Arguments.of("Field [op] is required", buildPatchRequest(Map.of("operation", "", "path", "foo", "value", true))), - Arguments.of("Field [op] is required", buildPatchRequest(new HashMap<>() {{ - put("operation", null); - put("path", "foo"); - put("value", true); - }})), - Arguments.of("Field [op] must be a string", buildPatchRequest(Map.of("operation", 1234, "path", "foo", "value", true))), - Arguments.of("Field [op] must be one of [add, remove, replace]", buildPatchRequest(Map.of("operation", "cook", "path", "foo", "value", true))), - - Arguments.of("Field [value] is required", buildPatchRequest(Map.of("operation", "add", "path", "foo"))), - Arguments.of("Field [value] is required", buildPatchRequest(new HashMap<>() {{ - put("operation", "add"); - put("path", "foo"); - put("value", null); - }})), - Arguments.of("Field [path] must be one of [bar, foo]", buildPatchRequest(Map.of("operation", "add", "path", "baz", "value", true))), - Arguments.of("Operation [replace] not supported for path [foo]", buildPatchRequest(Map.of("operation", "replace", "path", "foo", "value", true))) - ); - } - } - - static class ValidValuesTestProvider implements ArgumentsProvider { - @Override - public Stream provideArguments(ExtensionContext extensionContext) { - return Stream.of( - Arguments.of(buildPatchRequest(Map.of("operation", "replace", "path", "bar", "value", ""))), - Arguments.of(buildPatchRequest(new HashMap<>() {{ - put("operation", "replace"); - put("path", "bar"); - put("value", List.of()); - }})), - Arguments.of(buildPatchRequest(new HashMap<>() {{ - put("operation", "replace"); - put("path", "bar"); - put("value", Map.of()); - }})) - ); - } - } - - @ParameterizedTest - @ArgumentsSource(InvalidValuesTestProvider.class) - void shouldThrowExceptionWhenValidationFails(String expectedErrorMessage, JsonNode request) { - Map> operationValidators = Map.of( - new PatchPathOperation("foo", JsonPatchOp.ADD), (node) -> {}, - new PatchPathOperation("bar", JsonPatchOp.REPLACE), (node) -> {} - ); - - var patchRequestValidator = new JsonPatchRequestValidator(operationValidators); - ValidationException validationException = assertThrows(ValidationException.class, - () -> patchRequestValidator.validate(request)); - - assertThat(validationException, hasProperty("errors", contains(expectedErrorMessage))); - } - - @Test - void shouldSucceedForValidRequestAndCallOperationValidator() { - JsonNode fooOperation = objectMapper.valueToTree(Map.of("path", "foo", - "op", "add", - "value", 1)); - JsonNode barOperation = objectMapper.valueToTree(Map.of("path", "bar", - "op", "replace", - "value", 1)); - JsonNode request = objectMapper.valueToTree(List.of(fooOperation, barOperation)); - - Consumer addFooValidator = mock(Consumer.class); - doAnswer((node) -> null).when(addFooValidator).accept(eq(JsonPatchRequest.from(fooOperation))); - - Consumer replaceBarValidator = mock(Consumer.class); - doAnswer((node) -> null).when(replaceBarValidator).accept(eq(JsonPatchRequest.from(barOperation))); - - Map> operationValidators = Map.of( - new PatchPathOperation("foo", JsonPatchOp.ADD), addFooValidator, - new PatchPathOperation("bar", JsonPatchOp.REPLACE), replaceBarValidator - ); - - var patchRequestValidator = new JsonPatchRequestValidator(operationValidators); - - patchRequestValidator.validate(request); - verify(addFooValidator).accept(eq(JsonPatchRequest.from(fooOperation))); - verify(replaceBarValidator).accept(eq(JsonPatchRequest.from(barOperation))); - } - - @Test - public void throwsIfNotArray() { - var patchRequest = objectMapper.valueToTree(Map.of("path", "foo", - "op", "replace", - "value", 1 - )); - var thrown = assertThrows(ValidationException.class, () -> - JsonPatchRequestValidator.throwIfValueNotArray(JsonPatchRequest.from(patchRequest))); - assertThat(thrown.getErrors().get(0), is("Value for path [foo] must be an array")); - } - - @ArgumentsSource(ValidValuesTestProvider.class) - @ParameterizedTest - public void allowsEmptyValues(JsonNode request) { - Map> operationValidators = Map.of( - new PatchPathOperation("bar", JsonPatchOp.REPLACE), (node) -> {} - ); - - var patchRequestValidator = new JsonPatchRequestValidator(operationValidators); - - assertDoesNotThrow(() -> patchRequestValidator.validate(request)); - } - - @Test - public void convertsToList() { - var patchRequestNode = objectMapper.valueToTree(Map.of("path", "foo", - "op", "replace", - "value", List.of("foo", "bar"))); - var patchRequest = JsonPatchRequest.from(patchRequestNode); - assertEquals(patchRequest.valueAsList(), List.of("foo", "bar")); - } - - private static JsonNode buildPatchRequest(Map data) { - Map params = new HashMap<>(); - if (data.containsKey("operation")) { - params.put("op", data.get("operation")); - } - if (data.containsKey("path")) { - params.put("path", data.get("path")); - } - if (data.containsKey("value")) { - params.put("value", data.get("value")); - } - - return objectMapper.valueToTree(Collections.singletonList(params)); - } -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/jpa/CardExpiryDateConverterTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/jpa/CardExpiryDateConverterTest.java deleted file mode 100644 index 45b261fe..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/jpa/CardExpiryDateConverterTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package uk.gov.service.payments.commons.jpa; - -import org.junit.jupiter.api.Test; -import uk.gov.service.payments.commons.model.CardExpiryDate; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.nullValue; - -class CardExpiryDateConverterTest { - - private final CardExpiryDateConverter cardExpiryDateConverter = new CardExpiryDateConverter(); - - @Test - void convertsCardExpiryDateToString() { - var cardExpiryDate = CardExpiryDate.valueOf("09/22"); - String result = cardExpiryDateConverter.convertToDatabaseColumn(cardExpiryDate); - assertThat(result, is("09/22")); - } - - @Test - void convertsNullCardExpiryDateToNull() { - String result = cardExpiryDateConverter.convertToDatabaseColumn(null); - assertThat(result, is(nullValue())); - } - - @Test - void convertsStringToCardExpiryDate() { - CardExpiryDate result = cardExpiryDateConverter.convertToEntityAttribute("09/22"); - assertThat(result, is(CardExpiryDate.valueOf("09/22"))); - } - - @Test - void convertsNullStringToNull() { - CardExpiryDate result = cardExpiryDateConverter.convertToEntityAttribute(null); - assertThat(result, is(nullValue())); - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/jpa/InstantToUtcTimestampWithoutTimeZoneConverterTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/jpa/InstantToUtcTimestampWithoutTimeZoneConverterTest.java deleted file mode 100644 index 67a46db0..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/jpa/InstantToUtcTimestampWithoutTimeZoneConverterTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package uk.gov.service.payments.commons.jpa; - -import org.junit.jupiter.api.Test; - -import java.time.Instant; -import java.time.LocalDateTime; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.nullValue; -import static org.hamcrest.core.Is.is; - -class InstantToUtcTimestampWithoutTimeZoneConverterTest { - - private final InstantToUtcTimestampWithoutTimeZoneConverter converter = new InstantToUtcTimestampWithoutTimeZoneConverter(); - - @Test - void convertsInstantToLocalDateTimeInUtc() { - var instant = Instant.parse("2020-12-25T15:00:00.123456789Z"); - LocalDateTime result = converter.convertToDatabaseColumn(instant); - assertThat(result, is(LocalDateTime.of(2020, 12, 25, 15, 0, 0, 123456789))); - } - - @Test - void convertsNullInstantToNull() { - LocalDateTime result = converter.convertToDatabaseColumn(null); - assertThat(result, is(nullValue())); - } - - @Test - void convertsLocalDateTimeToInstant() { - var localDateTime = LocalDateTime.of(2020, 12, 25, 15, 0, 0, 123456789); - Instant result = converter.convertToEntityAttribute(localDateTime); - assertThat(result, is(Instant.parse("2020-12-25T15:00:00.123456789Z"))); - } - - @Test - void convertsNullLocalDateTimeToNull() { - Instant result = converter.convertToEntityAttribute(null); - assertThat(result, is(nullValue())); - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/CardExpiryDateTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/CardExpiryDateTest.java deleted file mode 100644 index 0ffd0cbb..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/CardExpiryDateTest.java +++ /dev/null @@ -1,419 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import org.junit.jupiter.api.Test; - -import java.time.YearMonth; - -import static java.time.Month.APRIL; -import static java.time.Month.AUGUST; -import static java.time.Month.DECEMBER; -import static java.time.Month.FEBRUARY; -import static java.time.Month.JANUARY; -import static java.time.Month.JULY; -import static java.time.Month.JUNE; -import static java.time.Month.MARCH; -import static java.time.Month.MAY; -import static java.time.Month.NOVEMBER; -import static java.time.Month.OCTOBER; -import static java.time.Month.SEPTEMBER; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class CardExpiryDateTest { - - @Test - void month01Parses() { - var input = "01/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("01")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, JANUARY))); - assertThat(cardExpiryDate.toString(), is("01/22")); - } - - @Test - void month02Parses() { - var input = "02/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("02")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, FEBRUARY))); - assertThat(cardExpiryDate.toString(), is("02/22")); - } - - @Test - void month03Parses() { - var input = "03/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("03")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, MARCH))); - assertThat(cardExpiryDate.toString(), is("03/22")); - } - - @Test - void month04Parses() { - var input = "04/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("04")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, APRIL))); - assertThat(cardExpiryDate.toString(), is("04/22")); - } - - @Test - void month05Parses() { - var input = "05/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("05")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, MAY))); - assertThat(cardExpiryDate.toString(), is("05/22")); - } - - @Test - void month06Parses() { - var input = "06/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("06")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, JUNE))); - assertThat(cardExpiryDate.toString(), is("06/22")); - } - - @Test - void month07Parses() { - var input = "07/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("07")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, JULY))); - assertThat(cardExpiryDate.toString(), is("07/22")); - } - - @Test - void month08Parses() { - var input = "08/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("08")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, AUGUST))); - assertThat(cardExpiryDate.toString(), is("08/22")); - } - - @Test - void month09Parses() { - var input = "09/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("09")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, SEPTEMBER))); - assertThat(cardExpiryDate.toString(), is("09/22")); - } - - @Test - void month10Parses() { - var input = "10/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("10")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, OCTOBER))); - assertThat(cardExpiryDate.toString(), is("10/22")); - } - - @Test - void month11Parses() { - var input = "11/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("11")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, NOVEMBER))); - assertThat(cardExpiryDate.toString(), is("11/22")); - } - - @Test - void month12Parses() { - var input = "12/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("12")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, DECEMBER))); - assertThat(cardExpiryDate.toString(), is("12/22")); - } - - @Test - void year22Parses() { - var input = "10/22"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitYear(), is("22")); - assertThat(cardExpiryDate.getFourDigitYear(), is("2022")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2022, OCTOBER))); - assertThat(cardExpiryDate.toString(), is("10/22")); - } - - @Test - void year00Parses() { - var input = "10/00"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitYear(), is("00")); - assertThat(cardExpiryDate.getFourDigitYear(), is("2000")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2000, OCTOBER))); - assertThat(cardExpiryDate.toString(), is("10/00")); - } - - @Test - void year01Parses() { - var input = "10/01"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitYear(), is("01")); - assertThat(cardExpiryDate.getFourDigitYear(), is("2001")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2001, OCTOBER))); - assertThat(cardExpiryDate.toString(), is("10/01")); - } - - @Test - void year09Parses() { - var input = "10/09"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitYear(), is("09")); - assertThat(cardExpiryDate.getFourDigitYear(), is("2009")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2009, OCTOBER))); - assertThat(cardExpiryDate.toString(), is("10/09")); - } - - @Test - void year30Parses() { - var input = "10/30"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitYear(), is("30")); - assertThat(cardExpiryDate.getFourDigitYear(), is("2030")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2030, OCTOBER))); - assertThat(cardExpiryDate.toString(), is("10/30")); - } - - @Test - void year99Parses() { - var input = "10/99"; - var cardExpiryDate = CardExpiryDate.valueOf(input); - assertThat(cardExpiryDate.getTwoDigitYear(), is("99")); - assertThat(cardExpiryDate.getFourDigitYear(), is("2099")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2099, OCTOBER))); - assertThat(cardExpiryDate.toString(), is("10/99")); - } - - @Test - void createSuccessfullyFromYearMonthWithOneDigitMonth() { - int expiryDateYear = 2023; - int expiryDateMonth = 8; - var yearMonth = YearMonth.of(expiryDateYear, expiryDateMonth); - var cardExpiryDate = CardExpiryDate.valueOf(yearMonth); - assertThat(cardExpiryDate.getTwoDigitYear(), is("23")); - assertThat(cardExpiryDate.getFourDigitYear(), is("2023")); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("08")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2023, AUGUST))); - assertThat(cardExpiryDate.toString(), is("08/23")); - } - - @Test - void createSuccessfullyFromYearMonthWithTwoDigitMonth() { - int expiryDateYear = 2023; - int expiryDateMonth = 11; - var yearMonth = YearMonth.of(expiryDateYear, expiryDateMonth); - var cardExpiryDate = CardExpiryDate.valueOf(yearMonth); - assertThat(cardExpiryDate.getTwoDigitYear(), is("23")); - assertThat(cardExpiryDate.getFourDigitYear(), is("2023")); - assertThat(cardExpiryDate.getTwoDigitMonth(), is("11")); - assertThat(cardExpiryDate.toYearMonth(), is(YearMonth.of(2023, NOVEMBER))); - assertThat(cardExpiryDate.toString(), is("11/23")); - } - - @Test - void dateAfter2100ThrowsException() { - int expiryDateYear = 2100; - int expiryDateMonth = 1; - var yearMonth = YearMonth.of(expiryDateYear, expiryDateMonth); - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(yearMonth)); - } - - @Test - void dateBefore2000ThrowsException() { - int expiryDateYear = 1999; - int expiryDateMonth = 12; - var yearMonth = YearMonth.of(expiryDateYear, expiryDateMonth); - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(yearMonth)); - } - - @Test - void month1WithNoLeadingZeroThrowsException() { - var input = "1/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month2WithNoLeadingZeroThrowsException() { - var input = "2/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month3WithNoLeadingZeroThrowsException() { - var input = "3/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month4WithNoLeadingZeroThrowsException() { - var input = "4/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month5WithNoLeadingZeroThrowsException() { - var input = "5/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month6WithNoLeadingZeroThrowsException() { - var input = "6/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month7WithNoLeadingZeroThrowsException() { - var input = "7/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month8WithNoLeadingZeroThrowsException() { - var input = "8/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month9WithNoLeadingZeroThrowsException() { - var input = "9/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month13ThrowsException() { - var input = "13/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void month00ThrowsException() { - var input = "00/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void yearOpenParenthesis0ThrowsException() { - var input = "10/(2"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void threeDigitMonthThrowsException() { - var input = "100/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void fourDigitYearThrowsException() { - var input = "10/2022"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void singleDigitYearThrowsException() { - var input = "10/2"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void threeDigitYearThrowsException() { - var input = "10/222"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void missingMonthThrowsException() { - var input = "/22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void missingYearThrowsException() { - var input = "10/"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void missingSlashThrowsException() { - var input = "1022"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void dashInsteadOfSlashThrowsException() { - var input = "10-22"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void isoFormatThrowsException() { - var input = "2022-10"; - assertThrows(IllegalArgumentException.class, () -> CardExpiryDate.valueOf(input)); - } - - @Test - void cardExpiryDatesWithSameMonthAndYearAreEqual() { - var cardExpiryDate1 = CardExpiryDate.valueOf("10/22"); - var cardExpiryDate2 = CardExpiryDate.valueOf("10/22"); - assertThat(cardExpiryDate1.equals(cardExpiryDate2), is(true)); - assertThat(cardExpiryDate2.equals(cardExpiryDate1), is(true)); - } - - @Test - void cardExpiryDatesWithSameMonthAndDifferentYearAreNotEqual() { - var cardExpiryDate1 = CardExpiryDate.valueOf("10/22"); - var cardExpiryDate2 = CardExpiryDate.valueOf("10/23"); - assertThat(cardExpiryDate1.equals(cardExpiryDate2), is(false)); - assertThat(cardExpiryDate2.equals(cardExpiryDate1), is(false)); - } - - @Test - void cardExpiryDatesWithDifferentMonthAndSameYearAreNotEqual() { - var cardExpiryDate1 = CardExpiryDate.valueOf("10/22"); - var cardExpiryDate2 = CardExpiryDate.valueOf("11/22"); - assertThat(cardExpiryDate1.equals(cardExpiryDate2), is(false)); - assertThat(cardExpiryDate2.equals(cardExpiryDate1), is(false)); - } - - @Test - void cardExpiryDatesWithDifferentMonthAndDifferentYearAreNotEqual() { - var cardExpiryDate1 = CardExpiryDate.valueOf("10/22"); - var cardExpiryDate2 = CardExpiryDate.valueOf("11/23"); - assertThat(cardExpiryDate1.equals(cardExpiryDate2), is(false)); - assertThat(cardExpiryDate2.equals(cardExpiryDate1), is(false)); - } - - @Test - void cardExpiryDateNotEqualToEquivalentString() { - var cardExpiryDate = CardExpiryDate.valueOf("10/22"); - assertThat(cardExpiryDate.equals("10/22"), is(false)); - } - - @Test - void cardExpiryDateNotEqualToEquivalentYearMonth() { - var cardExpiryDate = CardExpiryDate.valueOf("10/22"); - var yearMonth = YearMonth.of(2022, 10); - assertThat(cardExpiryDate.equals(yearMonth), is(false)); - } - - @Test - void cardExpiryDateNotEqualToNull() { - var cardExpiryDate = CardExpiryDate.valueOf("10/22"); - assertThat(cardExpiryDate.equals(null), is(false)); - } - - @Test - void cardExpiryDatesWithSameMonthAndYearHaveSameHashCode() { - var cardExpiryDate1 = CardExpiryDate.valueOf("10/22"); - var cardExpiryDate2 = CardExpiryDate.valueOf("10/22"); - assertThat(cardExpiryDate1.hashCode(), is(cardExpiryDate2.hashCode())); - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/CommonDateTimeFormattersTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/CommonDateTimeFormattersTest.java deleted file mode 100644 index 48eabc8a..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/CommonDateTimeFormattersTest.java +++ /dev/null @@ -1,156 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import org.junit.jupiter.api.Test; - -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; -import static uk.gov.service.payments.commons.model.CommonDateTimeFormatters.ISO_INSTANT_MICROSECOND_PRECISION; -import static uk.gov.service.payments.commons.model.CommonDateTimeFormatters.ISO_INSTANT_MILLISECOND_PRECISION; -import static uk.gov.service.payments.commons.model.CommonDateTimeFormatters.ISO_LOCAL_DATE_IN_UTC; - -class CommonDateTimeFormattersTest { - - @Test - void isoInstantMillisecondPrecisionConvertsInstantToIsoStringWithMillisecondPrecision() { - var instant = Instant.parse("2015-10-21T07:28:00.12356789Z"); - - String result = ISO_INSTANT_MILLISECOND_PRECISION.format(instant); - - assertThat(result, is("2015-10-21T07:28:00.123Z")); - } - - @Test - void isoInstantMillisecondPrecisionConvertsInstantExactlyOnTheSecondToIsoStringWithMillisecondPrecision() { - var instant = Instant.parse("2015-10-21T07:28:00Z"); - - String result = ISO_INSTANT_MILLISECOND_PRECISION.format(instant); - - assertThat(result, is("2015-10-21T07:28:00.000Z")); - } - - @Test - void isoInstantMillisecondPrecisionConvertsUtcZonedDateTimeToIsoStringWithMillisecondPrecision() { - var zonedDateTime = ZonedDateTime.of(LocalDateTime.parse("2015-10-21T07:28:00.123456789"), ZoneOffset.UTC); - - String result = ISO_INSTANT_MILLISECOND_PRECISION.format(zonedDateTime); - - assertThat(result, is("2015-10-21T07:28:00.123Z")); - } - - @Test - void isoInstantMillisecondPrecisionConvertsNonUtcZonedDateTimeToIsoStringWithMillisecondPrecision() { - var zonedDateTime = ZonedDateTime.of(LocalDateTime.parse("2015-10-21T07:28:00.123456789"), - ZoneId.of("America/Los_Angeles")); - - String result = ISO_INSTANT_MILLISECOND_PRECISION.format(zonedDateTime); - - assertThat(result, is("2015-10-21T14:28:00.123Z")); - } - - @Test - void isoInstantMillisecondPrecisionConvertsZonedDateTimeExactlyOnTheSecondToIsoStringWithMillisecondPrecision() { - var zonedDateTime = ZonedDateTime.of(LocalDateTime.parse("2015-10-21T07:28:00"), ZoneOffset.UTC); - - String result = ISO_INSTANT_MILLISECOND_PRECISION.format(zonedDateTime); - - assertThat(result, is("2015-10-21T07:28:00.000Z")); - } - - @Test - void isoInstantMicrosecondPrecisionConvertsInstantToIsoStringWithMicrosecondPrecision() { - var instant = Instant.parse("2015-10-21T07:28:00.12356789Z"); - - String result = ISO_INSTANT_MICROSECOND_PRECISION.format(instant); - - assertThat(result, is("2015-10-21T07:28:00.123567Z")); - } - - @Test - void isoInstantMicrosecondPrecisionConvertsInstantExactlyOnTheSecondToIsoStringWithMicrosecondPrecision() { - var instant = Instant.parse("2015-10-21T07:28:00Z"); - - String result = ISO_INSTANT_MICROSECOND_PRECISION.format(instant); - - assertThat(result, is("2015-10-21T07:28:00.000000Z")); - } - - @Test - void isoInstantMicrosecondPrecisionConvertsInstantExactlyOnTheMillisecondToIsoStringWithMicrosecondPrecision() { - var instant = Instant.parse("2015-10-21T07:28:00.123Z"); - - String result = ISO_INSTANT_MICROSECOND_PRECISION.format(instant); - - assertThat(result, is("2015-10-21T07:28:00.123000Z")); - } - - @Test - void isoInstantMicrosecondPrecisionConvertsUtcZonedDateTimeToIsoStringWithMicrosecondPrecision() { - var zonedDateTime = ZonedDateTime.of(LocalDateTime.parse("2015-10-21T07:28:00.123456789"), ZoneOffset.UTC); - - String result = ISO_INSTANT_MICROSECOND_PRECISION.format(zonedDateTime); - - assertThat(result, is("2015-10-21T07:28:00.123456Z")); - } - - @Test - void isoInstantMicrosecondPrecisionConvertsNonUtcZonedDateTimeToIsoStringWithMicrosecondPrecision() { - var zonedDateTime = ZonedDateTime.of(LocalDateTime.parse("2015-10-21T07:28:00.123456789"), - ZoneId.of("America/Los_Angeles")); - - String result = ISO_INSTANT_MICROSECOND_PRECISION.format(zonedDateTime); - - assertThat(result, is("2015-10-21T14:28:00.123456Z")); - } - - @Test - void isoInstantMicrosecondPrecisionConvertsZonedDateTimeExactlyOnTheSecondToIsoStringWithMicrosecondPrecision() { - var zonedDateTime = ZonedDateTime.of(LocalDateTime.parse("2015-10-21T07:28:00"), ZoneOffset.UTC); - - String result = ISO_INSTANT_MICROSECOND_PRECISION.format(zonedDateTime); - - assertThat(result, is("2015-10-21T07:28:00.000000Z")); - } - - @Test - void isoInstantMicrosecondPrecisionConvertsZonedDateTimeExactlyOnTheMillisecondToIsoStringWithMicrosecondPrecision() { - var zonedDateTime = ZonedDateTime.of(LocalDateTime.parse("2015-10-21T07:28:00.123"), ZoneOffset.UTC); - - String result = ISO_INSTANT_MICROSECOND_PRECISION.format(zonedDateTime); - - assertThat(result, is("2015-10-21T07:28:00.123000Z")); - } - - @Test - void isoLocalDateInUtcConvertsInstantToIsoLocalDateInUtc() { - var instant = Instant.parse("2022-10-04T12:34:56.789Z"); - - String result = ISO_LOCAL_DATE_IN_UTC.format(instant); - - assertThat(result, is("2022-10-04")); - } - - @Test - void isoLocalDateInUtcConvertsZonedDateTimeInUtcToIsoLocalDateInUtc() { - var zonedDateTime = ZonedDateTime.parse("2022-10-04T12:34:56.789Z"); - - String result = ISO_LOCAL_DATE_IN_UTC.format(zonedDateTime); - - assertThat(result, is("2022-10-04")); - } - - @Test - void isoLocalDateInUtcConvertsZonedDateTimeInAnotherTimeZoneWhereItIsAlreadyTomorrowToIsoLocalDateInUtc() { - var zonedDateTime = ZonedDateTime.of(LocalDateTime.parse("2022-10-05T06:07:08.123"), ZoneId.of("Pacific/Auckland")); - - String result = ISO_LOCAL_DATE_IN_UTC.format(zonedDateTime); - - assertThat(result, is("2022-10-04")); - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/SupportedLanguageJsonDeserializerTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/SupportedLanguageJsonDeserializerTest.java deleted file mode 100644 index 8aca59ea..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/SupportedLanguageJsonDeserializerTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import org.hamcrest.CoreMatchers; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.io.IOException; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.instanceOf; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -public class SupportedLanguageJsonDeserializerTest { - - private ObjectMapper mapper; - - @BeforeEach - public void setup() { - mapper = new ObjectMapper(); - } - - @Test - public void deserialize_shouldDeserializeToEnglish() throws IOException { - String json = "{\"language\" : \"en\"}"; - SupportedLanguageJson fromJson = mapper.readValue(json, SupportedLanguageJson.class); - assertNotNull(fromJson); - assertThat(fromJson.getLanguage(), CoreMatchers.is(SupportedLanguage.ENGLISH)); - } - - @Test - public void deserialize_shouldDeserializeToWelsh() throws IOException { - String json = "{\"language\" : \"cy\"}"; - SupportedLanguageJson fromJson = mapper.readValue(json, SupportedLanguageJson.class); - assertNotNull(fromJson); - assertThat(fromJson.getLanguage(), CoreMatchers.is(SupportedLanguage.WELSH)); - } - - @Test - public void deserialize_shouldThrowExceptionForUnsupportedLanguage() { - String json = "{\"language\" : \"ab\"}"; - try { - mapper.readValue(json, SupportedLanguageJson.class); - } catch (IOException e) { - assertThat(e, instanceOf(JsonMappingException.class)); - assertThat(e.getCause(), instanceOf(IllegalArgumentException.class)); - assertThat(e.getMessage(), containsString("ab is not a supported ISO 639-1 code")); - } - } - - @Test - public void deserialize_shouldThrowExceptionForEmptyString() { - String json = "{\"language\" : \"\"}"; - try { - mapper.readValue(json, SupportedLanguageJson.class); - } catch (IOException e) { - assertThat(e, instanceOf(JsonMappingException.class)); - assertThat(e.getCause(), instanceOf(IllegalArgumentException.class)); - assertThat(e.getMessage(), containsString(" is not a supported ISO 639-1 code")); - } - } -} - -class SupportedLanguageJson { - @JsonDeserialize(using = SupportedLanguageJsonDeserializer.class) - @JsonProperty("language") - private SupportedLanguage language; - - SupportedLanguage getLanguage() { - return this.language; - } -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/SupportedLanguageTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/SupportedLanguageTest.java deleted file mode 100644 index 7f550a77..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/SupportedLanguageTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import org.junit.jupiter.api.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class SupportedLanguageTest { - - @Test - public void enMapsToEnglish() { - SupportedLanguage result = SupportedLanguage.fromIso639AlphaTwoCode("en"); - assertThat(result, is(SupportedLanguage.ENGLISH)); - } - - @Test - public void cyMapsToWelsh() { - SupportedLanguage result = SupportedLanguage.fromIso639AlphaTwoCode("cy"); - assertThat(result, is(SupportedLanguage.WELSH)); - } - - @Test - public void frThrowsException() { - assertThrows(IllegalArgumentException.class, () -> SupportedLanguage.fromIso639AlphaTwoCode("fr")); - } - - @Test - public void enUpperCaseThrowsException() { - assertThrows(IllegalArgumentException.class, () -> SupportedLanguage.fromIso639AlphaTwoCode("EN")); - } - - @Test - public void englishUpperCaseThrowsException() { - assertThrows(IllegalArgumentException.class, () -> SupportedLanguage.fromIso639AlphaTwoCode("ENGLISH")); - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/TokenPaymentTypeTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/TokenPaymentTypeTest.java deleted file mode 100644 index 73a1a63a..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/TokenPaymentTypeTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package uk.gov.service.payments.commons.model; - - -import org.junit.jupiter.api.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; - -public class TokenPaymentTypeTest { - - @Test - public void cardFromStringMapsToCard() { - TokenPaymentType result = TokenPaymentType.fromString("CARD"); - assertThat(result, is(TokenPaymentType.CARD)); - } - - @Test - public void direct_debitFromStringMapsToDirectDebit() { - TokenPaymentType result = TokenPaymentType.fromString("DIRECT_DEBIT"); - assertThat(result, is(TokenPaymentType.DIRECT_DEBIT)); - } - - @Test - public void cashMapsToCard() { - TokenPaymentType result = TokenPaymentType.fromString("CASH"); - assertThat(result, is(TokenPaymentType.CARD)); - } - - @Test - public void cardGetFriendlyNameMapsToCardPayment() { - String result = TokenPaymentType.fromString("CARD").getFriendlyName(); - assertThat(result, is("Card Payment")); - } - - @Test - public void direct_debitGetFriendlyNameMapsToDirectDebitPayment() { - String result = TokenPaymentType.fromString("DIRECT_DEBIT").getFriendlyName(); - assertThat(result, is("Direct Debit Payment")); - } -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/WrappedStringValueTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/WrappedStringValueTest.java deleted file mode 100644 index 137848a5..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/WrappedStringValueTest.java +++ /dev/null @@ -1,114 +0,0 @@ -package uk.gov.service.payments.commons.model; - -import org.junit.jupiter.api.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class WrappedStringValueTest { - - @Test - @SuppressWarnings("SimplifiableJUnitAssertion") - public void twoObjectsWithSameRuntimeTypeAndSameStringValueAreEqual() { - var a = ConcreteWrappedStringValue.valueOf("foo"); - var b = ConcreteWrappedStringValue.valueOf("foo"); - - assertTrue(a.equals(b)); - assertTrue(b.equals(a)); - } - - @Test - @SuppressWarnings("SimplifiableJUnitAssertion") - public void twoObjectsWithSameRuntimeTypeAndDifferentStringValuesAreNotEqual() { - var a = ConcreteWrappedStringValue.valueOf("foo"); - var b = ConcreteWrappedStringValue.valueOf("bar"); - - assertFalse(a.equals(b)); - assertFalse(b.equals(a)); - } - - @Test - @SuppressWarnings({"EqualsBetweenInconvertibleTypes", "SimplifiableJUnitAssertion"}) - public void twoObjectsWithDifferentRuntimeTypesAndSameStringValueAreNotEqual() { - var a = ConcreteWrappedStringValue.valueOf("foo"); - var b = DifferentConcreteWrappedStringValueType.valueOf("foo"); - - assertFalse(a.equals(b)); - assertFalse(b.equals(a)); - } - - @Test - @SuppressWarnings({"EqualsBetweenInconvertibleTypes", "SimplifiableJUnitAssertion"}) - public void twoObjectsWithDifferentRuntimeTypesAndDifferentStringValuesAreNotEqual() { - var a = ConcreteWrappedStringValue.valueOf("foo"); - var b = DifferentConcreteWrappedStringValueType.valueOf("bar"); - - assertFalse(a.equals(b)); - assertFalse(b.equals(a)); - } - - @Test - @SuppressWarnings({"EqualsBetweenInconvertibleTypes", "SimplifiableJUnitAssertion"}) - public void notEqualToObjectOfCompletelyDifferentType() { - var a = ConcreteWrappedStringValue.valueOf("foo"); - var b = "foo"; - - assertFalse(a.equals(b)); - } - - @Test - @SuppressWarnings({"ConstantConditions", "SimplifiableJUnitAssertion"}) - public void notEqualToNull() { - var a = ConcreteWrappedStringValue.valueOf("foo"); - - assertFalse(a.equals(null)); - } - - @Test - public void twoEqualObjectsHaveSameHashCode() { - var a = ConcreteWrappedStringValue.valueOf("foo"); - var b = ConcreteWrappedStringValue.valueOf("foo"); - - assertThat(a.hashCode(), is(b.hashCode())); - } - - @Test - public void toStringReturnsWrappedStringValue() { - var a = ConcreteWrappedStringValue.valueOf("foo"); - - assertThat(a.toString(), is("foo")); - } - - @Test - public void cannotInstantiateWithNullString() { - assertThrows(NullPointerException.class, () -> ConcreteWrappedStringValue.valueOf(null)); - } - - private static class ConcreteWrappedStringValue extends WrappedStringValue { - - private ConcreteWrappedStringValue(String value) { - super(value); - } - - static ConcreteWrappedStringValue valueOf(String value) { - return new ConcreteWrappedStringValue(value); - } - - } - - private static class DifferentConcreteWrappedStringValueType extends WrappedStringValue { - - private DifferentConcreteWrappedStringValueType(String value) { - super(value); - } - - static DifferentConcreteWrappedStringValueType valueOf(String value) { - return new DifferentConcreteWrappedStringValueType(value); - } - - } - -} diff --git a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/charge/ExternalMetadataTest.java b/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/charge/ExternalMetadataTest.java deleted file mode 100644 index 2fe0a851..00000000 --- a/model-dropwizard-4/src/test/java/uk/gov/service/payments/commons/model/charge/ExternalMetadataTest.java +++ /dev/null @@ -1,161 +0,0 @@ -package uk.gov.service.payments.commons.model.charge; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; - -import jakarta.validation.ConstraintViolation; -import jakarta.validation.Validation; -import jakarta.validation.Validator; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static java.util.stream.Collectors.joining; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static uk.gov.service.payments.commons.model.charge.ExternalMetadata.MAX_KEY_LENGTH; -import static uk.gov.service.payments.commons.model.charge.ExternalMetadata.MAX_KEY_VALUE_PAIRS; -import static uk.gov.service.payments.commons.model.charge.ExternalMetadata.MAX_VALUE_LENGTH; -import static uk.gov.service.payments.commons.model.charge.ExternalMetadata.MIN_KEY_LENGTH; - -public class ExternalMetadataTest { - - private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); - private final ObjectMapper mapper = new ObjectMapper(); - - private final String TOO_LONG_VALUE = IntStream.rangeClosed(1, MAX_VALUE_LENGTH + 1).mapToObj(i -> "a").collect(joining()); - private final String TOO_LONG_KEY = IntStream.rangeClosed(1, MAX_KEY_LENGTH + 1).mapToObj(i -> "a").collect(joining()); - - @Test - public void shouldPassValidation() { - Map metadata = Map.of( - "key1", "string", - "key2", true, - "key3", 123, - "key4", 1.234, - "key5", "" - ); - ExternalMetadata validExternalMetadata = new ExternalMetadata(metadata); - - Set> violations = validator.validate(validExternalMetadata); - - assertThat(violations.size(), is(0)); - } - - @Test - public void shouldFailValidationWithMoreThan15Keys() { - Map metadata = IntStream.rangeClosed(1, 16).boxed() - .collect(Collectors.toUnmodifiableMap(i -> "key" + i, i-> "value" + i)); - ExternalMetadata invalidExternalMetadata = new ExternalMetadata(metadata); - - Set> violations = validator.validate(invalidExternalMetadata); - - assertThat(violations.size(), is(1)); - assertThat(violations.iterator().next().getMessage(), is("Field [metadata] cannot have more than " + MAX_KEY_VALUE_PAIRS + " key-value pairs")); - } - - @Test - public void shouldFailValidationForKeysToLong() { - Map metadata = Map.of(TOO_LONG_KEY, "string"); - ExternalMetadata invalidExternalMetadata = new ExternalMetadata(metadata); - - Set> violations = validator.validate(invalidExternalMetadata); - - assertThat(violations.size(), is(1)); - assertThat(violations.iterator().next().getMessage(), - is("Field [metadata] keys must be between " + MIN_KEY_LENGTH + " and " + MAX_KEY_LENGTH + " characters long")); - } - - @Test - public void shouldFailValidationForEmptyKey() { - Map metadata = Map.of("", "string"); - ExternalMetadata invalidExternalMetadata = new ExternalMetadata(metadata); - - Set> violations = validator.validate(invalidExternalMetadata); - - assertThat(violations.size(), is(1)); - assertThat(violations.iterator().next().getMessage(), - is("Field [metadata] keys must be between " + MIN_KEY_LENGTH + " and " + MAX_KEY_LENGTH + " characters long")); - } - - @Test - public void shouldFailValidationForValueToLong() { - Map metadata = Map.of("key1", TOO_LONG_VALUE); - ExternalMetadata invalidExternalMetadata = new ExternalMetadata(metadata); - - Set> violations = validator.validate(invalidExternalMetadata); - - assertThat(violations.size(), is(1)); - assertThat(violations.iterator().next().getMessage(), - is("Field [metadata] values must be no greater than " + MAX_VALUE_LENGTH + " characters long")); - } - - @Test - public void shouldFailValidationWhenValueIsObject() { - Map metadata = Map.of("key1", mapper.createObjectNode()); - ExternalMetadata invalidExternalMetadata = new ExternalMetadata(metadata); - - Set> violations = validator.validate(invalidExternalMetadata); - - assertThat(violations.size(), is(1)); - assertThat(violations.iterator().next().getMessage(), is("Field [metadata] values must be of type String, Boolean or Number")); - } - - @Test - public void shouldFailValidationWhenValueIsArray() { - Map metadata = Map.of("key1", mapper.createArrayNode()); - ExternalMetadata invalidExternalMetadata = new ExternalMetadata(metadata); - - Set> violations = validator.validate(invalidExternalMetadata); - - assertThat(violations.size(), is(1)); - assertThat(violations.iterator().next().getMessage(), is("Field [metadata] values must be of type String, Boolean or Number")); - } - - @Test - public void shouldFailValidationWhenAValueIsNull() { - Map metadata = new HashMap<>(); - metadata.put("key1", null); - ExternalMetadata invalidExternalMetadata = new ExternalMetadata(metadata); - - Set> violations = validator.validate(invalidExternalMetadata); - - assertThat(violations.size(), is(1)); - assertThat(violations.iterator().next().getMessage(), is("Field [metadata] must not have null values")); - } - - @Test - public void shouldFailWithMultipleViolations() { - Map metadata = Map.of( - TOO_LONG_KEY, "string", - "key2", mapper.createArrayNode(), - "key3", TOO_LONG_VALUE - ); - ExternalMetadata invalidExternalMetadata = new ExternalMetadata(metadata); - Set expectedErrorMessages = Set.of( - "Field [metadata] values must be of type String, Boolean or Number", - "Field [metadata] values must be no greater than " + MAX_VALUE_LENGTH + " characters long", - "Field [metadata] keys must be between " + MIN_KEY_LENGTH + " and " + MAX_KEY_LENGTH + " characters long"); - - Set> violations = validator.validate(invalidExternalMetadata); - - assertThat(violations.size(), is(3)); - assertThat(expectedErrorMessages.contains(violations.iterator().next().getMessage()), is(true)); - assertThat(expectedErrorMessages.contains(violations.iterator().next().getMessage()), is(true)); - assertThat(expectedErrorMessages.contains(violations.iterator().next().getMessage()), is(true)); - } - - @Test - public void shouldFailWithDuplicateCaseInsensitiveKeysViolations() { - Map metadata = Map.of( - "key", "string", - "Key", 1L - ); - ExternalMetadata invalidExternalMetadata = new ExternalMetadata(metadata); - Set> violations = validator.validate(invalidExternalMetadata); - assertThat(violations.size(), is(1)); - assertThat(violations.iterator().next().getMessage(), is("Field [metadata] must have case insensitive unique keys")); - } -} diff --git a/model-dropwizard-5/pom.xml b/model-dropwizard-5/pom.xml index 9bc36376..1a0bccfa 100644 --- a/model-dropwizard-5/pom.xml +++ b/model-dropwizard-5/pom.xml @@ -14,18 +14,6 @@ 1.0.0 - - - - io.dropwizard - dropwizard-dependencies - 5.0.0 - pom - import - - - - diff --git a/pom.xml b/pom.xml index 7ad249bb..457d8fb7 100644 --- a/pom.xml +++ b/pom.xml @@ -37,17 +37,11 @@ - logging-dropwizard-4 logging-dropwizard-5 - model-dropwizard-4 model-dropwizard-5 - queue-dropwizard-4 queue-dropwizard-5 - testing-dropwizard-4 testing-dropwizard-5 - utils-dropwizard-4 utils-dropwizard-5 - validation-dropwizard-4 validation-dropwizard-5 @@ -56,7 +50,7 @@ io.dropwizard dropwizard-dependencies - 4.0.16 + 5.0.0 pom import @@ -96,7 +90,7 @@ io.dropwizard.modules dropwizard-testing-junit4 - 4.0.16 + 5.0.0 test diff --git a/queue-dropwizard-4/pom.xml b/queue-dropwizard-4/pom.xml deleted file mode 100644 index 8cc2faeb..00000000 --- a/queue-dropwizard-4/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - pay-java-commons - uk.gov.service.payments - 1.0.0 - - - queue-dropwizard-4 - Classes for receiving and sending queue messages DW 4 - jar - - - - - io.dropwizard - dropwizard-core - - - io.dropwizard - dropwizard-json-logging - - - - - software.amazon.awssdk - sqs - 2.40.8 - - - - - - - org.hamcrest - hamcrest - ${hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${hamcrest.version} - test - - - diff --git a/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/exception/QueueException.java b/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/exception/QueueException.java deleted file mode 100644 index afda6e2b..00000000 --- a/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/exception/QueueException.java +++ /dev/null @@ -1,12 +0,0 @@ -package uk.gov.service.payments.commons.queue.exception; - -public class QueueException extends Exception { - - public QueueException(){ - - } - - public QueueException(String message) { - super(message); - } -} diff --git a/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/model/QueueMessage.java b/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/model/QueueMessage.java deleted file mode 100644 index cb0e9c17..00000000 --- a/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/model/QueueMessage.java +++ /dev/null @@ -1,48 +0,0 @@ -package uk.gov.service.payments.commons.queue.model; - -import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse; -import software.amazon.awssdk.services.sqs.model.SendMessageResponse; - -import java.util.List; -import java.util.stream.Collectors; - -public class QueueMessage { - - private String messageId; - private String receiptHandle; - private String messageBody; - - private QueueMessage(String messageId, String receiptHandle, String messageBody) { - this.messageId = messageId; - this.receiptHandle = receiptHandle; - this.messageBody = messageBody; - } - - private QueueMessage(String messageId, String messageBody) { - this(messageId, null, messageBody); - } - - public static List of(ReceiveMessageResponse receiveMessageResult) { - - return receiveMessageResult.messages() - .stream() - .map(c -> new QueueMessage(c.messageId(), c.receiptHandle(), c.body())) - .collect(Collectors.toList()); - } - - public static QueueMessage of(SendMessageResponse sendMessageResult, String messageBody) { - return new QueueMessage(sendMessageResult.messageId(), messageBody); - } - - public String getMessageId() { - return messageId; - } - - public String getReceiptHandle() { - return receiptHandle; - } - - public String getMessageBody() { - return messageBody; - } -} diff --git a/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/sqs/AbstractQueue.java b/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/sqs/AbstractQueue.java deleted file mode 100644 index 02f3db26..00000000 --- a/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/sqs/AbstractQueue.java +++ /dev/null @@ -1,46 +0,0 @@ -package uk.gov.service.payments.commons.queue.sqs; - -import com.fasterxml.jackson.databind.ObjectMapper; -import uk.gov.service.payments.commons.queue.exception.QueueException; -import uk.gov.service.payments.commons.queue.model.QueueMessage; - -import java.util.List; - -public abstract class AbstractQueue { - - private static final String MESSAGE_ATTRIBUTES_TO_RECEIVE = "All"; - protected ObjectMapper objectMapper; - private String queueUrl; - private int failedMessageRetryDelayInSeconds; - private SqsQueueService sqsQueueService; - - public AbstractQueue(SqsQueueService sqsQueueService, ObjectMapper objectMapper, - String queueUrl, int failedMessageRetryDelayInSeconds) { - this.sqsQueueService = sqsQueueService; - this.queueUrl = queueUrl; - this.failedMessageRetryDelayInSeconds = failedMessageRetryDelayInSeconds; - this.objectMapper = objectMapper; - } - - public QueueMessage sendMessageToQueue(String message) throws QueueException { - return sqsQueueService.sendMessage(queueUrl, message); - } - - public QueueMessage sendMessageToQueueWithDelay(String message, int delayInSeconds) throws QueueException { - return sqsQueueService.sendMessage(queueUrl, message, delayInSeconds); - } - - public List retrieveMessages() throws QueueException { - return sqsQueueService - .receiveMessages(this.queueUrl, MESSAGE_ATTRIBUTES_TO_RECEIVE); - } - - public void markMessageAsProcessed(QueueMessage queueMessage) throws QueueException { - sqsQueueService.deleteMessage(this.queueUrl, queueMessage.getReceiptHandle()); - } - - public void scheduleMessageForRetry(QueueMessage queueMessage) throws QueueException { - sqsQueueService.deferMessage(this.queueUrl, queueMessage.getReceiptHandle(), failedMessageRetryDelayInSeconds); - } -} - diff --git a/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/sqs/SqsQueueService.java b/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/sqs/SqsQueueService.java deleted file mode 100644 index 805753e9..00000000 --- a/queue-dropwizard-4/src/main/java/uk/gov/service/payments/commons/queue/sqs/SqsQueueService.java +++ /dev/null @@ -1,120 +0,0 @@ -package uk.gov.service.payments.commons.queue.sqs; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import software.amazon.awssdk.awscore.exception.AwsServiceException; -import software.amazon.awssdk.services.sqs.SqsClient; -import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest; -import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityResponse; -import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest; -import software.amazon.awssdk.services.sqs.model.DeleteMessageResponse; -import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest; -import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse; -import software.amazon.awssdk.services.sqs.model.SendMessageRequest; -import software.amazon.awssdk.services.sqs.model.SendMessageResponse; -import software.amazon.awssdk.services.sqs.model.SqsException; -import uk.gov.service.payments.commons.queue.exception.QueueException; -import uk.gov.service.payments.commons.queue.model.QueueMessage; - -import java.util.List; - -public class SqsQueueService { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - private SqsClient sqsClient; - - private final int messageMaximumWaitTimeInSeconds; - private final int messageMaximumBatchSize; - - public SqsQueueService(SqsClient sqsClient, int messageMaximumWaitTimeInSeconds, int messageMaximumBatchSize) { - this.sqsClient = sqsClient; - this.messageMaximumWaitTimeInSeconds = messageMaximumWaitTimeInSeconds; - this.messageMaximumBatchSize = messageMaximumBatchSize; - } - - - public QueueMessage sendMessage(String queueUrl, String messageBody) throws QueueException { - SendMessageRequest sendMessageRequest = SendMessageRequest.builder() - .queueUrl(queueUrl) - .messageBody(messageBody) - .build(); - - try { - return sendMessage(sendMessageRequest); - } catch (SqsException e) { - throw new QueueException(e.getMessage()); - } - } - - public QueueMessage sendMessage(String queueUrl, String messageBody, int delayInSeconds) throws QueueException { - SendMessageRequest sendMessageRequest = SendMessageRequest.builder() - .queueUrl(queueUrl) - .messageBody(messageBody) - .delaySeconds(delayInSeconds) - .build(); - return sendMessage(sendMessageRequest); - } - - private QueueMessage sendMessage(SendMessageRequest sendMessageRequest) throws QueueException { - try { - SendMessageResponse sendMessageResult = sqsClient.sendMessage(sendMessageRequest); - - logger.info("Message sent to SQS queue - {}", sendMessageResult); - return QueueMessage.of(sendMessageResult, sendMessageRequest.messageBody()); - } catch (SqsException | UnsupportedOperationException e) { - logger.error("Failed sending message to SQS queue - {}", e.getMessage()); - throw new QueueException(e.getMessage()); - } - } - - public List receiveMessages(String queueUrl, String messageAttributeName) throws QueueException { - try { - ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder() - .queueUrl(queueUrl) - .messageAttributeNames(messageAttributeName) - .waitTimeSeconds(messageMaximumWaitTimeInSeconds) - .maxNumberOfMessages(messageMaximumBatchSize) - .build(); - - ReceiveMessageResponse receiveMessageResult = sqsClient.receiveMessage(receiveMessageRequest); - - return QueueMessage.of(receiveMessageResult); - } catch (SqsException | UnsupportedOperationException e) { - logger.error("Failed to receive messages from SQS queue - {}", e.getMessage()); - throw new QueueException(e.getMessage()); - } - } - - public DeleteMessageResponse deleteMessage(String queueUrl, String messageReceiptHandle) throws QueueException { - try { - DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder() - .queueUrl(queueUrl) - .receiptHandle(messageReceiptHandle) - .build(); - return sqsClient.deleteMessage(deleteMessageRequest); - } catch (SqsException | UnsupportedOperationException e) { - logger.error("Failed to delete message from SQS queue - {}", e.getMessage()); - throw new QueueException(e.getMessage()); - } catch (AwsServiceException e) { - logger.error("Failed to delete message from SQS queue - [errorMessage={}] [awsErrorCode={}]", e.getMessage(), e.awsErrorDetails().errorCode()); - String errorMessage = String.format("%s [%s]", e.getMessage(), e.awsErrorDetails().errorCode()); - throw new QueueException(errorMessage); - } - } - - public ChangeMessageVisibilityResponse deferMessage(String queueUrl, String messageReceiptHandle, int timeoutInSeconds) throws QueueException { - try { - ChangeMessageVisibilityRequest changeVisibilityRequest = ChangeMessageVisibilityRequest.builder() - .queueUrl(queueUrl) - .receiptHandle(messageReceiptHandle) - .visibilityTimeout(timeoutInSeconds) - .build(); - - return sqsClient.changeMessageVisibility(changeVisibilityRequest); - } catch (SqsException | UnsupportedOperationException e) { - logger.error("Failed to defer message from SQS queue - {}", e.getMessage()); - throw new QueueException(e.getMessage()); - } - } -} diff --git a/queue-dropwizard-4/src/test/java/uk/gov/service/payments/commons/queue/sqs/SqsQueueServiceTest.java b/queue-dropwizard-4/src/test/java/uk/gov/service/payments/commons/queue/sqs/SqsQueueServiceTest.java deleted file mode 100644 index 1f2c5d0f..00000000 --- a/queue-dropwizard-4/src/test/java/uk/gov/service/payments/commons/queue/sqs/SqsQueueServiceTest.java +++ /dev/null @@ -1,155 +0,0 @@ -package uk.gov.service.payments.commons.queue.sqs; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.classic.spi.LoggingEvent; -import ch.qos.logback.core.Appender; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.slf4j.LoggerFactory; -import software.amazon.awssdk.services.sqs.SqsClient; -import software.amazon.awssdk.services.sqs.model.Message; -import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest; -import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse; -import software.amazon.awssdk.services.sqs.model.SendMessageRequest; -import software.amazon.awssdk.services.sqs.model.SendMessageResponse; -import software.amazon.awssdk.services.sqs.model.SqsException; -import uk.gov.service.payments.commons.queue.exception.QueueException; -import uk.gov.service.payments.commons.queue.model.QueueMessage; - -import java.util.List; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class SqsQueueServiceTest { - - private static final String QUEUE_URL = "http://queue-url"; - private static final String MESSAGE = "{chargeId: 123}"; - private static final String MESSAGE_ATTRIBUTE_NAME = "All"; - - @Mock - private SqsClient mockSqsClient; - @Mock - private Appender mockAppender; - - private ArgumentCaptor loggingEventArgumentCaptor = ArgumentCaptor.forClass(LoggingEvent.class); - - private SqsQueueService sqsQueueService; - - @Before - public void setUp() { - sqsQueueService = new SqsQueueService(mockSqsClient, 20, 10); - - Logger root = (Logger) LoggerFactory.getLogger(SqsQueueService.class); - root.setLevel(Level.INFO); - root.addAppender(mockAppender); - } - - @Test - public void shouldSendMessageToQueueSuccessfully() throws QueueException { - SendMessageResponse sendMessageResult = SendMessageResponse.builder() - .messageId("test-message-id") - .build(); - - SendMessageRequest sendMessageRequest = SendMessageRequest.builder() - .queueUrl(QUEUE_URL) - .messageBody(MESSAGE) - .build(); - - when(mockSqsClient.sendMessage(sendMessageRequest)).thenReturn(sendMessageResult); - - QueueMessage message = sqsQueueService.sendMessage(QUEUE_URL, MESSAGE); - assertEquals("test-message-id", message.getMessageId()); - - verify(mockAppender, times(1)).doAppend(loggingEventArgumentCaptor.capture()); - List logEvents = loggingEventArgumentCaptor.getAllValues(); - - assertThat(logEvents.stream().anyMatch(e -> e.getFormattedMessage().contains("Message sent to SQS queue - SendMessageResponse(MessageId=test-message-id)")), is(true)); - } - - @Test - public void shouldSendMessageWithDelayToQueueSuccessfully() throws QueueException { - SendMessageResponse sendMessageResult = SendMessageResponse.builder() - .messageId("test-message-id") - .build(); - - SendMessageRequest sendMessageRequest = SendMessageRequest.builder() - .queueUrl(QUEUE_URL) - .messageBody(MESSAGE) - .delaySeconds(2) - .build(); - - when(mockSqsClient.sendMessage(sendMessageRequest)).thenReturn(sendMessageResult); - - QueueMessage message = sqsQueueService.sendMessage(QUEUE_URL, MESSAGE, 2); - assertEquals("test-message-id", message.getMessageId()); - - verify(mockAppender, times(1)).doAppend(loggingEventArgumentCaptor.capture()); - List logEvents = loggingEventArgumentCaptor.getAllValues(); - - assertThat(logEvents.stream().anyMatch(e -> e.getFormattedMessage().contains("Message sent to SQS queue - SendMessageResponse(MessageId=test-message-id)")), is(true)); - } - - @Test(expected = QueueException.class) - public void shouldThrowExceptionIfMessageIsNotSentToQueue() throws QueueException { - SendMessageRequest sendMessageRequest = SendMessageRequest.builder() - .queueUrl(QUEUE_URL) - .messageBody(MESSAGE) - .build(); - when(mockSqsClient.sendMessage(sendMessageRequest)).thenThrow(SqsException.class); - - sqsQueueService.sendMessage(QUEUE_URL, MESSAGE); - } - - @Test - public void shouldReceiveMessagesFromQueueSuccessfully() throws QueueException { - Message message = Message.builder() - .messageId("test-message-id") - .receiptHandle("test-receipt-handle") - .body("test-message-body") - .build(); - - ReceiveMessageResponse receiveMessageResult = ReceiveMessageResponse.builder() - .messages(message) - .build(); - - when(mockSqsClient.receiveMessage(any(ReceiveMessageRequest.class))).thenReturn(receiveMessageResult); - - List queueMessages = sqsQueueService.receiveMessages(QUEUE_URL, MESSAGE_ATTRIBUTE_NAME); - Assert.assertThat(queueMessages.size(), is(1)); - Assert.assertThat(queueMessages.get(0).getMessageId(), is("test-message-id")); - Assert.assertThat(queueMessages.get(0).getReceiptHandle(), is("test-receipt-handle")); - Assert.assertThat(queueMessages.get(0).getMessageBody(), is("test-message-body")); - } - - @Test - public void shouldReturnEmptyListWhenReceiveDoesNotReturnAnyMessages() throws QueueException { - ReceiveMessageResponse receiveMessageResult = ReceiveMessageResponse.builder() - .build(); - when(mockSqsClient.receiveMessage(any(ReceiveMessageRequest.class))).thenReturn(receiveMessageResult); - - List queueMessages = sqsQueueService.receiveMessages(QUEUE_URL, MESSAGE_ATTRIBUTE_NAME); - assertTrue(queueMessages.isEmpty()); - } - - @Test(expected = QueueException.class) - public void shouldThrowExceptionIfMessageCannotBeReceivedFromQueue() throws QueueException { - when(mockSqsClient.receiveMessage(any(ReceiveMessageRequest.class))).thenThrow(SqsException.class); - - sqsQueueService.receiveMessages(QUEUE_URL, MESSAGE_ATTRIBUTE_NAME); - } -} diff --git a/queue-dropwizard-5/pom.xml b/queue-dropwizard-5/pom.xml index 05e3059e..0314ff19 100644 --- a/queue-dropwizard-5/pom.xml +++ b/queue-dropwizard-5/pom.xml @@ -13,18 +13,6 @@ Classes for receiving and sending queue messages DW 5 jar - - - - io.dropwizard - dropwizard-dependencies - 5.0.0 - pom - import - - - - diff --git a/testing-dropwizard-4/pom.xml b/testing-dropwizard-4/pom.xml deleted file mode 100644 index 39cb44cd..00000000 --- a/testing-dropwizard-4/pom.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - 4.0.0 - - uk.gov.service.payments - pay-java-commons - 1.0.0 - - - testing-dropwizard-4 - Testing Utils DW 4 - jar - - - 4.0.10 - - - - - - org.testcontainers - testcontainers-bom - 2.0.2 - pom - import - - - - - - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-core - - - - junit - junit - compile - 4.13.2 - - - org.testcontainers - testcontainers-postgresql - compile - - - - - - - org.junit.jupiter - junit-jupiter-api - - - com.fasterxml.jackson.core - jackson-databind - test - - - - - org.hamcrest - hamcrest-core - ${hamcrest.version} - - - au.com.dius - pact-jvm-provider-junit - ${pact.version} - - - junit - junit - - - xerces - xercesImpl - - - - - au.com.dius - pact-jvm-consumer-junit - ${pact.version} - - - junit - junit - - - - - org.wiremock - wiremock-standalone - 3.13.2 - test - - - org.assertj - assertj-core - 3.27.6 - test - - - diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresContainer.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresContainer.java deleted file mode 100644 index 046ec93d..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresContainer.java +++ /dev/null @@ -1,115 +0,0 @@ -package uk.gov.service.payments.commons.testing.db; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testcontainers.containers.PostgreSQLContainer; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.Properties; - -import static java.sql.DriverManager.getConnection; - -public class PostgresContainer { - - private static final Logger logger = LoggerFactory.getLogger(PostgresContainer.class); - - - private static PostgreSQLContainer POSTGRES_CONTAINER; - private static String DB_NAME = "pay_test"; - private static String DB_USERNAME = "test"; - private static String DB_PASSWORD = "test"; - private static String IMAGE_TAG = "15.2"; - - public PostgresContainer(String imageTag) { - new PostgresContainer(DB_USERNAME, DB_PASSWORD, DB_NAME, imageTag); - } - - public PostgresContainer(String dbUsername, String dbPassword, String dbName, String imageTag) { - this.DB_PASSWORD = dbPassword; - this.DB_USERNAME = dbUsername; - this.DB_NAME = dbName; - this.IMAGE_TAG = imageTag; - } - - public static void getOrCreate() { - try { - if (POSTGRES_CONTAINER == null) { - logger.info("Creating Postgres Container"); - - POSTGRES_CONTAINER = new PostgreSQLContainer<>("postgres:" + IMAGE_TAG) - .withUsername(DB_USERNAME) - .withPassword(DB_PASSWORD); - - POSTGRES_CONTAINER.start(); - createDatabase(); - registerShutdownHook(); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static void getOrCreate(String imageTag) { - IMAGE_TAG = imageTag; - getOrCreate(); - } - - private static void createDatabase() { - try (Connection connection = getConnection(getConnectionUrl(), DB_USERNAME, DB_PASSWORD)) { - connection.createStatement().execute("CREATE DATABASE " + DB_NAME + " WITH owner=" + DB_USERNAME + " TEMPLATE postgres"); - connection.createStatement().execute("GRANT ALL PRIVILEGES ON DATABASE " + DB_NAME + " TO " + DB_USERNAME); - connection.createStatement().execute("CREATE EXTENSION IF NOT EXISTS pg_trgm"); - connection.createStatement().execute("CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\""); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public static String getUsername() { - return DB_USERNAME; - } - - public static String getPassword() { - return DB_PASSWORD; - } - - public static String getConnectionUrl() { - return POSTGRES_CONTAINER.getJdbcUrl(); - } - - public static PostgreSQLContainer getPostgresContainer() { - return POSTGRES_CONTAINER; - } - - public static void stop() { - if (POSTGRES_CONTAINER == null) { - return; - } - try { - POSTGRES_CONTAINER.stop(); - POSTGRES_CONTAINER = null; - } catch (Exception e) { - System.err.println("Could not shutdown Postgres Container"); - e.printStackTrace(); - } - } - - private static void registerShutdownHook() { - Runtime.getRuntime().addShutdownHook(new Thread(PostgresContainer::stop)); - } - - private boolean checkPostgresConnection() { - - Properties props = new Properties(); - props.setProperty("user", this.DB_USERNAME); - props.setProperty("password", this.DB_PASSWORD); - - try (Connection connection = DriverManager.getConnection(getConnectionUrl(), props)) { - return true; - } catch (Exception except) { - return false; - } - } -} diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresDockerExtension.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresDockerExtension.java deleted file mode 100644 index b14c76ce..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresDockerExtension.java +++ /dev/null @@ -1,14 +0,0 @@ -package uk.gov.service.payments.commons.testing.db; - -import org.junit.jupiter.api.extension.Extension; - -public class PostgresDockerExtension extends PostgresTestHelper implements Extension { - - public PostgresDockerExtension() { - startPostgresIfNecessary(); - } - - public PostgresDockerExtension(String imageTage) { - startPostgresIfNecessary(imageTage); - } -} diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresDockerRule.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresDockerRule.java deleted file mode 100644 index f81adc29..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresDockerRule.java +++ /dev/null @@ -1,21 +0,0 @@ -package uk.gov.service.payments.commons.testing.db; - -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -public class PostgresDockerRule extends PostgresTestHelper implements TestRule { - - public PostgresDockerRule(String imageTag) { - startPostgresIfNecessary(imageTag); - } - - public PostgresDockerRule() { - startPostgresIfNecessary(); - } - - @Override - public Statement apply(Statement statement, Description description) { - return statement; - } -} diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresTestHelper.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresTestHelper.java deleted file mode 100644 index 2bfd9aed..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/db/PostgresTestHelper.java +++ /dev/null @@ -1,32 +0,0 @@ -package uk.gov.service.payments.commons.testing.db; - -public abstract class PostgresTestHelper { - - static void startPostgresIfNecessary(String imageTag) { - PostgresContainer.getOrCreate(imageTag); - } - - static void startPostgresIfNecessary() { - PostgresContainer.getOrCreate(); - } - - public String getConnectionUrl() { - return PostgresContainer.getConnectionUrl(); - } - - public String getUsername() { - return PostgresContainer.getUsername(); - } - - public String getPassword() { - return PostgresContainer.getPassword(); - } - - public static void stop() { - PostgresContainer.stop(); - } - - public String getDriverClass() { - return "org.postgresql.Driver"; - } -} diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/matchers/HamcrestMatchers.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/matchers/HamcrestMatchers.java deleted file mode 100644 index 6ba45e51..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/matchers/HamcrestMatchers.java +++ /dev/null @@ -1,13 +0,0 @@ -package uk.gov.service.payments.commons.testing.matchers; - -import org.hamcrest.Matcher; - -import static org.hamcrest.Matchers.nullValue; -import static org.hamcrest.core.Is.is; - -public class HamcrestMatchers { - - public static Matcher optionalMatcher(String value) { - return value == null ? is(nullValue()) : is(value); - } -} diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/MultiPacts.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/MultiPacts.java deleted file mode 100644 index 95555b6c..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/MultiPacts.java +++ /dev/null @@ -1,12 +0,0 @@ -package uk.gov.service.payments.commons.testing.pact.consumers; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface MultiPacts { - Pacts[] value(); -} diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/Pacts.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/Pacts.java deleted file mode 100644 index 516e049d..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/Pacts.java +++ /dev/null @@ -1,16 +0,0 @@ -package uk.gov.service.payments.commons.testing.pact.consumers; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Repeatable; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -@Repeatable(MultiPacts.class) -public @interface Pacts { - String[] pacts(); - - boolean publish() default true; -} diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactProviderRule.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactProviderRule.java deleted file mode 100644 index cf79bbc8..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactProviderRule.java +++ /dev/null @@ -1,77 +0,0 @@ -package uk.gov.service.payments.commons.testing.pact.consumers; - -import au.com.dius.pact.consumer.junit.PactProviderRule; -import au.com.dius.pact.core.model.DefaultPactReader; -import au.com.dius.pact.core.model.FileSource; -import au.com.dius.pact.core.model.RequestResponsePact; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -import java.io.File; -import java.lang.reflect.Method; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import static com.google.common.io.Resources.getResource; -import static java.lang.String.format; -import static java.util.Arrays.stream; -import static uk.gov.service.payments.commons.testing.port.PortFactory.findFreePort; - -public class PayPactProviderRule extends PactProviderRule { - - private String methodName; - private List pactsToDelete = new ArrayList<>(); - - public PayPactProviderRule(String provider, Object target) { - super(provider, "localhost", findFreePort(), target); - } - - @Override - public Statement apply(final Statement base, final Description description) { - this.methodName = description.getMethodName(); - return new Statement() { - @Override - public void evaluate() throws Throwable { - try { - PayPactProviderRule.super.apply(base, description).evaluate(); - } finally { - after(); - } - } - }; - } - - @Override - protected Map getPacts(String fragment) { - HashMap pacts = new HashMap<>(); - for (Method m : target.getClass().getMethods()) { - if (m.getName().equals(methodName)) { - Optional.ofNullable(m.getAnnotationsByType(Pacts.class)).ifPresent(pactsAnnotation -> - stream(pactsAnnotation).forEach(p -> stream(p.pacts()).forEach( - fileName -> { - if (fileName.contains(provider)) { - RequestResponsePact pact = (RequestResponsePact) DefaultPactReader.INSTANCE.loadPact(new FileSource<>(new File(getResource(format("pacts/%s.json", fileName)).getFile()))); - pacts.put(provider, pact); - } - if (!p.publish()) pactsToDelete.add(format("%s.json", fileName)); - } - )) - ); - } - } - return pacts; - } - - @Override - protected void after() { - //by deleting from project_dir/target/pacts it won't be there for the pact:publish maven plugin to publish to the pact broker. Issue has been raised here https://github.com/DiUS/pact-jvm/issues/711 - pactsToDelete.stream().forEach(s -> { - File file = new File(Paths.get("", "target", "pacts", s).toAbsolutePath().toString()); - file.delete(); - }); - } -} diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/provider/CreateTestSuite.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/provider/CreateTestSuite.java deleted file mode 100644 index 726c764c..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/pact/provider/CreateTestSuite.java +++ /dev/null @@ -1,30 +0,0 @@ -package uk.gov.service.payments.commons.testing.pact.provider; - -import com.google.common.collect.ImmutableSetMultimap; -import junit.framework.JUnit4TestAdapter; -import junit.framework.TestSuite; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static java.lang.String.format; - -public class CreateTestSuite { - - private static final Logger LOGGER = LoggerFactory.getLogger(CreateTestSuite.class); - - public static TestSuite create(ImmutableSetMultimap consumerToJUnitTest) { - String consumer = System.getProperty("CONSUMER"); - TestSuite suite = new TestSuite(); - - if (consumer == null || consumer.isBlank()) { - LOGGER.info("Running all contract tests."); - consumerToJUnitTest.keys().elementSet().forEach(key -> consumerToJUnitTest.get(key).forEach(suite::addTest)); - } else if (consumerToJUnitTest.containsKey(consumer)) { - LOGGER.info("Running {}-connector contract tests only.", consumer); - consumerToJUnitTest.get(consumer).forEach(suite::addTest); - } else { - throw new RuntimeException(format("Error running provider contract tests. ${CONSUMER} system property was %s.", consumer)); - } - return suite; - } -} diff --git a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/port/PortFactory.java b/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/port/PortFactory.java deleted file mode 100644 index 9de42c72..00000000 --- a/testing-dropwizard-4/src/main/java/uk/gov/service/payments/commons/testing/port/PortFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package uk.gov.service.payments.commons.testing.port; - -import java.net.ServerSocket; -import java.util.concurrent.TimeUnit; - -public class PortFactory { - public static int findFreePort() { - int port; - try { - ServerSocket server = new ServerSocket(0); - port = server.getLocalPort(); - server.close(); - // allow time for the socket to be released - TimeUnit.MILLISECONDS.sleep(350); - } catch (Exception e) { - throw new RuntimeException("Exception while trying to find a free port", e); - } - return port; - } -} diff --git a/testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactProviderRuleTest.java b/testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactProviderRuleTest.java deleted file mode 100644 index 99ba48d4..00000000 --- a/testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactProviderRuleTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package uk.gov.service.payments.commons.testing.pact.consumers; - -import au.com.dius.pact.consumer.junit.PactVerification; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.http.client.fluent.Request; -import org.junit.Rule; -import org.junit.Test; - -import java.io.IOException; -import java.util.HashMap; - -import static org.assertj.core.api.Assertions.assertThat; - -public class PayPactProviderRuleTest { - - @Rule - public PayPactProviderRule stockQuoteService = new PayPactProviderRule("stock-quote-service", this); - - @Rule - public PayPactProviderRule weatherService = new PayPactProviderRule("weather-service", this); - - @Test - @PactVerification({"stock-quote-service"}) - @Pacts(pacts = {"consumer-stock-quote-service-axp"}) - public void getAmexPrice() throws Exception { - HashMap map = jsonToMap(Request.Get(stockQuoteService.getUrl() + "/stocks/AXP").execute().returnContent().asString()); - assertThat(map.get("name")).isEqualTo("American Express"); - assertThat(map.get("price")).isEqualTo("200.00"); - assertThat(map.get("currency")).isEqualTo("USD"); - } - - @Test - @PactVerification({"stock-quote-service"}) - @Pacts(pacts = {"consumer-stock-quote-service-v"}) - public void getVisaPrice() throws Exception { - HashMap map = jsonToMap(Request.Get(stockQuoteService.getUrl() + "/stocks/V").execute().returnContent().asString()); - assertThat(map.get("name")).isEqualTo("Visa"); - assertThat(map.get("price")).isEqualTo("100.00"); - assertThat(map.get("currency")).isEqualTo("USD"); - } - - @Test - @PactVerification({"weather-service"}) - @Pacts(pacts = {"consumer-weather-service"}) - public void getLondonWeather() throws Exception { - HashMap map = jsonToMap(Request.Get(weatherService.getUrl() + "/weather/London").execute().returnContent().asString()); - assertThat(map.get("name")).isEqualTo("London"); - assertThat(map.get("temperature")).isEqualTo("25"); - assertThat(map.get("unit")).isEqualTo("degrees"); - } - - @Test - @PactVerification({"weather-service", "stock-quote-service"}) - @Pacts(pacts = {"consumer-weather-service", "consumer-stock-quote-service-axp"}) - public void callTwoProviders() throws Exception { - HashMap map = jsonToMap(Request.Get(stockQuoteService.getUrl() + "/stocks/AXP").execute().returnContent().asString()); - assertThat(map.get("name")).isEqualTo("American Express"); - assertThat(map.get("price")).isEqualTo("200.00"); - assertThat(map.get("currency")).isEqualTo("USD"); - - map = jsonToMap(Request.Get(weatherService.getUrl() + "/weather/London").execute().returnContent().asString()); - assertThat(map.get("name")).isEqualTo("London"); - assertThat(map.get("temperature")).isEqualTo("25"); - assertThat(map.get("unit")).isEqualTo("degrees"); - } - - private HashMap jsonToMap(String respBody) throws IOException { - if (respBody.isEmpty()) { - return new HashMap(); - } - return new ObjectMapper().readValue(respBody, HashMap.class); - } -} diff --git a/testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactPublishingTest.java b/testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactPublishingTest.java deleted file mode 100644 index 841455a0..00000000 --- a/testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/consumers/PayPactPublishingTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package uk.gov.service.payments.commons.testing.pact.consumers; - -import au.com.dius.pact.consumer.junit.PactVerification; -import org.apache.http.client.fluent.Request; -import org.junit.AfterClass; -import org.junit.Rule; -import org.junit.Test; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; - -import static org.assertj.core.api.Java6Assertions.assertThat; - -public class PayPactPublishingTest { - - @Rule - public PayPactProviderRule weatherService = new PayPactProviderRule("weather-service", this); - - @Rule - public PayPactProviderRule orderService = new PayPactProviderRule("order-service", this); - - @Test - @PactVerification({"weather-service", "order-service"}) - @Pacts(pacts = {"consumer-weather-service"}) - @Pacts(pacts = {"consumer-order-service"}, publish = false) - public void specifyIfPactShouldBeWritten() throws IOException { - Request.Get(weatherService.getUrl() + "/weather/London").execute(); - Request.Get(orderService.getUrl() + "/orders").execute(); - } - - @AfterClass - public static void after() { - assertThat(new File(Paths.get("", "target", "pacts", "consumer-weather-service.json").toAbsolutePath().toString()).exists()).isTrue(); - assertThat(new File(Paths.get("", "target", "pacts", "consumer-order-service.json").toAbsolutePath().toString()).exists()).isFalse(); - } -} diff --git a/testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/provider/CreateTestSuiteTest.java b/testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/provider/CreateTestSuiteTest.java deleted file mode 100644 index 771bbbee..00000000 --- a/testing-dropwizard-4/src/test/java/uk/gov/service/payments/commons/testing/pact/provider/CreateTestSuiteTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package uk.gov.service.payments.commons.testing.pact.provider; - -import com.google.common.collect.ImmutableSetMultimap; -import junit.framework.JUnit4TestAdapter; -import org.junit.After; -import org.junit.Test; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -public class CreateTestSuiteTest { - - private ImmutableSetMultimap consumerToJUnitTest = ImmutableSetMultimap.of( - "consumer1", new JUnit4TestAdapter(String.class), - "consumer1", new JUnit4TestAdapter(Integer.class), - "consumer2", new JUnit4TestAdapter(String.class)); - - @After - public void after() { - System.clearProperty("CONSUMER"); - } - - @Test - public void addAllContractTests() { - assertThat(CreateTestSuite.create(consumerToJUnitTest).countTestCases()).isEqualTo(3); - } - - @Test - public void addContractTestsForConsumer1() { - System.setProperty("CONSUMER", "consumer1"); - assertThat(CreateTestSuite.create(consumerToJUnitTest).countTestCases()).isEqualTo(2); - } - - @Test - public void addContractTestsForConsumer2() { - System.setProperty("CONSUMER", "consumer2"); - assertThat(CreateTestSuite.create(consumerToJUnitTest).countTestCases()).isEqualTo(1); - } - - @Test(expected = RuntimeException.class) - public void throwIfConsumerIsUnknown() { - System.setProperty("CONSUMER", "unknown"); - CreateTestSuite.create(consumerToJUnitTest); - } -} diff --git a/testing-dropwizard-4/src/test/resources/pact-from-broker.json b/testing-dropwizard-4/src/test/resources/pact-from-broker.json deleted file mode 100644 index dca0293c..00000000 --- a/testing-dropwizard-4/src/test/resources/pact-from-broker.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "provider": { - "name": "provider-service" - }, - "consumer": { - "name": "consumer-service" - }, - "interactions": [ - { - "description": "a create charge request", - "request": { - "method": "GET", - "path": "/some/path", - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "application/json" - }, - "body": { - "amount": "100", - "created_date": "2016-01-01T12:00:00Z", - "description": "a description" - }, - "matchingRules": { - "body": { - "$.amount": { - "matchers": [ - { - "match": "type" - } - ], - "combine": "AND" - }, - "$.created_date": { - "matchers": [ - { - "match": "date", - "date": "yyyy-MM-dd'T'HH:mm:ssZ" - } - ], - "combine": "AND" - }, - "$.description": { - "matchers": [ - { - "match": "type" - } - ], - "combine": "AND" - } - } - } - } - } - ], - "metadata": { - "pact-specification": { - "version": "3.0.0" - }, - "pact-jvm": { - "version": "3.5.16" - } - }, - "createdAt": "2018-05-23T14:58:13+00:00", - "_links": { - "self": { - "title": "Pact", - "name": "Pact between consumer (v31825ce5eeb76fcb89fe17f3aa83b20ce664dc66) and provider", - "href": "https://localhost/pacts/provider/provider-service/consumer/consumer-service/version/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66" - }, - "pb:consumer": { - "title": "Consumer", - "name": "consumer-service", - "href": "https://localhost/pacticipants/consumer-service" - }, - "pb:consumer-version": { - "title": "Consumer version", - "name": "31825ce5eeb76fcb89fe17f3aa83b20ce664dc66", - "href": "https://localhost/pacticipants/consumer-service/versions/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66" - }, - "pb:provider": { - "title": "Provider", - "name": "provider-service", - "href": "https://localhost/pacticipants/provider-service" - }, - "pb:latest-pact-version": { - "title": "Latest version of this pact", - "href": "https://localhost/pacts/provider/provider-service/consumer/consumer-service/latest" - }, - "pb:all-pact-versions": { - "title": "All versions of this pact", - "href": "https://localhost/pacts/provider/provider-service/consumer/consumer-service/versions" - }, - "pb:latest-untagged-pact-version": { - "title": "Latest untagged version of this pact", - "href": "https://localhost/pacts/provider/provider-service/consumer/consumer-service/latest-untagged" - }, - "pb:latest-tagged-pact-version": { - "title": "Latest tagged version of this pact", - "href": "https://localhost/pacts/provider/provider-service/consumer/consumer-service/latest/{tag}", - "templated": true - }, - "pb:previous-distinct": { - "title": "Previous distinct version of this pact", - "href": "https://localhost/pacts/provider/provider-service/consumer/consumer-service/version/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66/previous-distinct" - }, - "pb:diff-previous-distinct": { - "title": "Diff with previous distinct version of this pact", - "href": "https://localhost/pacts/provider/provider-service/consumer/consumer-service/version/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66/diff/previous-distinct" - }, - "pb:pact-webhooks": { - "title": "Webhooks for the pact between consumer-service and provider-service", - "href": "https://localhost/webhooks/provider/provider-service/consumer/consumer-service" - }, - "pb:tag-prod-version": { - "title": "PUT to this resource to tag this consumer version as 'production'", - "href": "https://localhost/pacticipants/consumer-service/versions/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66/tags/prod" - }, - "pb:tag-version": { - "title": "PUT to this resource to tag this consumer version", - "href": "https://localhost/pacticipants/consumer-service/versions/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66/tags/{tag}" - }, - "pb:publish-verification-results": { - "title": "Publish verification results", - "href": "https://localhost/pacts/provider/provider-service/consumer/consumer-service/pact-version/0529f385b1a9b5d8c2d93d547ed6a5d95451a84a/verification-results" - }, - "curies": [ - { - "name": "pb", - "href": "https://localhost/doc/{rel}", - "templated": true - } - ] - } -} diff --git a/testing-dropwizard-4/src/test/resources/pact-publishing-test/pact-from-broker-2.json b/testing-dropwizard-4/src/test/resources/pact-publishing-test/pact-from-broker-2.json deleted file mode 100644 index 7ea151bf..00000000 --- a/testing-dropwizard-4/src/test/resources/pact-publishing-test/pact-from-broker-2.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "provider": { - "name": "provider-service" - }, - "consumer": { - "name": "consumer-service" - }, - "interactions": [ - { - "description": "Get current string", - "request": { - "method": "GET", - "path": "/current-string" - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "application/json" - }, - "body": { - "current_string": "hello" - } - } - } - ], - "metadata": { - "pact-specification": { - "version": "3.0.0" - }, - "pact-jvm": { - "version": "3.5.16" - } - }, - "createdAt": "2018-11-23T14:58:13+00:00", - "_links": { - "self": { - "title": "Pact", - "name": "Pact between consumer (v31825ce5eeb76fcb89fe17f3aa83b20ce664dc66) and provider", - "href": "http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/version/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66" - }, - "pb:consumer": { - "title": "Consumer", - "name": "consumer-service", - "href": "http://localhost:50000/pacticipants/consumer-service" - }, - "pb:consumer-version": { - "title": "Consumer version", - "name": "31825ce5eeb76fcb89fe17f3aa83b20ce664dc66", - "href": "http://localhost:50000/pacticipants/consumer-service/versions/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66" - }, - "pb:provider": { - "title": "Provider", - "name": "provider-service", - "href": "http://localhost:50000/pacticipants/provider-service" - }, - "pb:latest-pact-version": { - "title": "Latest version of this pact", - "href": "http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/latest" - }, - "pb:all-pact-versions": { - "title": "All versions of this pact", - "href": "http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/versions" - }, - "pb:latest-untagged-pact-version": { - "title": "Latest untagged version of this pact", - "href": "http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/latest-untagged" - }, - "pb:latest-tagged-pact-version": { - "title": "Latest tagged version of this pact", - "href": "http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/latest/master", - "templated": true - }, - "pb:previous-distinct": { - "title": "Previous distinct version of this pact", - "href": "http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/version/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66/previous-distinct" - }, - "pb:diff-previous-distinct": { - "title": "Diff with previous distinct version of this pact", - "href": "http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/version/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66/diff/previous-distinct" - }, - "pb:pact-webhooks": { - "title": "Webhooks for the pact between consumer-service and provider-service", - "href": "http://localhost:50000/webhooks/provider/provider-service/consumer/consumer-service" - }, - "pb:tag-prod-version": { - "title": "PUT to this resource to tag this consumer version as 'production'", - "href": "http://localhost:50000/pacticipants/consumer-service/versions/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66/tags/prod" - }, - "pb:tag-version": { - "title": "PUT to this resource to tag this consumer version", - "href": "http://localhost:50000/pacticipants/consumer-service/versions/31825ce5eeb76fcb89fe17f3aa83b20ce664dc66/tags/master" - }, - "pb:publish-verification-results": { - "title": "Publish verification results", - "href": "http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/pact-version/0529f385b1a9b5d8c2d93d547ed6a5d95451a84a/verification-results" - }, - "curies": [ - { - "name": "pb", - "href": "http://localhost:50000/doc/{rel}", - "templated": true - } - ] - } -} diff --git a/testing-dropwizard-4/src/test/resources/pact-publishing-test/pacts.json b/testing-dropwizard-4/src/test/resources/pact-publishing-test/pacts.json deleted file mode 100644 index 9c961ac5..00000000 --- a/testing-dropwizard-4/src/test/resources/pact-publishing-test/pacts.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "_links":{ - "self":{ - "href":"http://localhost:50000", - "title":"Index", - "templated":false - }, - "pb:publish-pact":{ - "href":"http://localhost:50000/pacts/provider/{provider}/consumer/{consumer}/version/{consumerApplicationVersion}", - "title":"Publish a pact", - "templated":true - }, - "pb:latest-pact-versions":{ - "href":"http://localhost:50000/pacts/latest", - "title":"Latest pact versions", - "templated":false - }, - "pb:tagged-pact-versions":{ - "href":"http://localhost:50000/pacts/provider/{provider}/consumer/{consumer}/tag/{tag}", - "title":"All versions of a pact for a given consumer, provider and consumer version tag", - "templated":false - }, - "pb:pacticipants":{ - "href":"http://localhost:50000/pacticipants", - "title":"Pacticipants", - "templated":false - }, - "pb:latest-provider-pacts":{ - "href":"http://localhost:50000/pacts/provider/{provider}/latest", - "title":"Latest pacts by provider", - "templated":true - }, - "pb:latest-provider-pacts-with-tag":{ - "href":"http://localhost:50000/pacts/provider/{provider}/latest/{tag}", - "title":"Latest pacts for provider with the specified tag", - "templated":true - }, - "pb:provider-pacts-with-tag":{ - "href":"http://localhost:50000/pacts/provider/{provider}/tag/{tag}", - "title":"All pact versions for the provider with the specified consumer version tag", - "templated":true - }, - "pb:provider-pacts":{ - "href":"http://localhost:50000/pacts/provider/{provider}", - "title":"All pact versions for the specified provider", - "templated":true - }, - "pb:latest-version":{ - "href":"http://localhost:50000/pacticipants/{pacticipant}/latest-version", - "title":"Latest pacticipant version", - "templated":true - }, - "pb:latest-tagged-version":{ - "href":"http://localhost:50000/pacticipants/{pacticipant}/latest-version/{tag}", - "title":"Latest pacticipant version with the specified tag", - "templated":true - }, - "pb:webhooks":{ - "href":"http://localhost:50000/webhooks", - "title":"Webhooks", - "templated":false - }, - "pb:integrations":{ - "href":"http://localhost:50000/integrations", - "title":"Integrations", - "templated":false - }, - "beta:pending-provider-pacts":{ - "href":"http://localhost:50000/pacts/provider/{provider}/pending", - "title":"Pending pact versions for the specified provider", - "templated":true - }, - "curies":[ - { - "name":"pb", - "href":"http://localhost:50000/doc/{rel}?context=index", - "templated":true - }, - { - "name":"beta", - "href":"http://localhost:50000/doc/{rel}?context=index", - "templated":true - } - ] - } -} diff --git a/testing-dropwizard-4/src/test/resources/pact-publishing-test/provider-service-pacts.json b/testing-dropwizard-4/src/test/resources/pact-publishing-test/provider-service-pacts.json deleted file mode 100644 index 9a5db846..00000000 --- a/testing-dropwizard-4/src/test/resources/pact-publishing-test/provider-service-pacts.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "_links":{ - "self":{ - "href":"http://localhost:50000/pacts/provider/provider-service/latest/master", - "title":"Latest pact versions for the provider provider-service with consumer version tag 'master'" - }, - "pb:provider":{ - "href":"http://localhost:50000/pacticipants/provider-service", - "name":"provider-service" - }, - "pb:pacts":[ - { - "href":"http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/version/2f2b6a9755cfaefe87567548272049d335678f95", - "title":"Pact between consumer-service (v2f2b6a9755cfaefe87567548272049d335678f95) and provider-service", - "name":"consumer-service" - } - ], - "provider":{ - "href":"http://localhost:50000/pacticipants/provider-service", - "title":"provider-service", - "name":"DEPRECATED - please use the pb:provider relation" - }, - "pacts":[ - { - "href":"http://localhost:50000/pacts/provider/provider-service/consumer/consumer-service/version/2f2b6a9755cfaefe87567548272049d335678f95", - "title":"DEPRECATED - please use the pb:pacts relation. Pact between consumer-service (v2f2b6a9755cfaefe87567548272049d335678f95) and provider-service", - "name":"consumer-service" - } - ] - } -} diff --git a/testing-dropwizard-4/src/test/resources/pacts/consumer-order-service.json b/testing-dropwizard-4/src/test/resources/pacts/consumer-order-service.json deleted file mode 100644 index 37258977..00000000 --- a/testing-dropwizard-4/src/test/resources/pacts/consumer-order-service.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "consumer": { - "name": "consumer" - }, - "provider": { - "name": "order-service" - }, - "interactions": [ - { - "description": "Get orders", - "request": { - "method": "GET", - "path": "/orders" - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "application/json" - }, - "body": [] - } - } - ], - "metadata": { - "pact-specification": { - "version": "3.0.0" - }, - "pact-jvm": { - "version": "3.5.16" - } - } -} diff --git a/testing-dropwizard-4/src/test/resources/pacts/consumer-stock-quote-service-axp.json b/testing-dropwizard-4/src/test/resources/pacts/consumer-stock-quote-service-axp.json deleted file mode 100644 index de78f460..00000000 --- a/testing-dropwizard-4/src/test/resources/pacts/consumer-stock-quote-service-axp.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "consumer": { - "name": "consumer" - }, - "provider": { - "name": "stock-quote-service" - }, - "interactions": [ - { - "description": "Request for Amex price", - "request": { - "method": "GET", - "path": "/stocks/AXP" - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "application/json" - }, - "body": { - "name": "American Express", - "price": "200.00", - "currency": "USD" - }, - "matchingRules": { - "$.body.name": { - "match": "type" - }, - "$.body.currency": { - "match": "type" - }, - "$.body.price": { - "match": "type" - } - } - } - } - ], - "metadata": { - "pact-specification": { - "version": "3.0.0" - }, - "pact-jvm": { - "version": "3.5.16" - } - } -} diff --git a/testing-dropwizard-4/src/test/resources/pacts/consumer-stock-quote-service-v.json b/testing-dropwizard-4/src/test/resources/pacts/consumer-stock-quote-service-v.json deleted file mode 100644 index 11258700..00000000 --- a/testing-dropwizard-4/src/test/resources/pacts/consumer-stock-quote-service-v.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "consumer": { - "name": "consumer" - }, - "provider": { - "name": "stock-quote-service" - }, - "interactions": [ - { - "description": "Request for Visa price", - "request": { - "method": "GET", - "path": "/stocks/V" - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "application/json" - }, - "body": { - "name": "Visa", - "price": "100.00", - "currency": "USD" - }, - "matchingRules": { - "$.body.name": { - "match": "type" - }, - "$.body.currency": { - "match": "type" - }, - "$.body.price": { - "match": "type" - } - } - } - } - ], - "metadata": { - "pact-specification": { - "version": "3.0.0" - }, - "pact-jvm": { - "version": "3.5.16" - } - } -} diff --git a/testing-dropwizard-4/src/test/resources/pacts/consumer-weather-service.json b/testing-dropwizard-4/src/test/resources/pacts/consumer-weather-service.json deleted file mode 100644 index 89ecdad0..00000000 --- a/testing-dropwizard-4/src/test/resources/pacts/consumer-weather-service.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "consumer": { - "name": "consumer" - }, - "provider": { - "name": "weather-service" - }, - "interactions": [ - { - "description": "Get weather for London", - "request": { - "method": "GET", - "path": "/weather/London" - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "application/json" - }, - "body": { - "name": "London", - "temperature": "25", - "unit": "degrees" - }, - "matchingRules": { - "$.body.temperature": { - "match": "type" - } - } - } - } - ], - "metadata": { - "pact-specification": { - "version": "3.0.0" - }, - "pact-jvm": { - "version": "3.5.16" - } - } -} diff --git a/testing-dropwizard-5/pom.xml b/testing-dropwizard-5/pom.xml index 5987fc38..c26c2913 100644 --- a/testing-dropwizard-5/pom.xml +++ b/testing-dropwizard-5/pom.xml @@ -16,13 +16,6 @@ - - io.dropwizard - dropwizard-dependencies - 5.0.0 - pom - import - org.testcontainers testcontainers-bom @@ -80,7 +73,6 @@ io.dropwizard.modules dropwizard-testing-junit4 5.0.0 - test org.hamcrest diff --git a/utils-dropwizard-4/pom.xml b/utils-dropwizard-4/pom.xml deleted file mode 100644 index de613c62..00000000 --- a/utils-dropwizard-4/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - 4.0.0 - - pay-java-commons - uk.gov.service.payments - 1.0.0 - - - utils-dropwizard-4 - Utilities for production code DW 4 - jar - - - - - io.dropwizard - dropwizard-core - - - io.dropwizard - dropwizard-db - - - - - io.dropwizard.metrics - metrics-graphite - 4.2.37 - - - - - - - - - - io.dropwizard - dropwizard-testing - test - - - - - org.hamcrest - hamcrest - ${hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${hamcrest.version} - test - - - diff --git a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/healthchecks/DatabaseHealthCheck.java b/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/healthchecks/DatabaseHealthCheck.java deleted file mode 100644 index bec5962b..00000000 --- a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/healthchecks/DatabaseHealthCheck.java +++ /dev/null @@ -1,32 +0,0 @@ -package uk.gov.service.payments.commons.utils.healthchecks; - -import com.codahale.metrics.health.HealthCheck; -import io.dropwizard.db.DataSourceFactory; - -import java.sql.Connection; -import java.sql.DriverManager; - -public class DatabaseHealthCheck extends HealthCheck { - - private final DataSourceFactory dataSourceFactory; - - public DatabaseHealthCheck(DataSourceFactory dataSourceFactory) { - this.dataSourceFactory = dataSourceFactory; - } - - @Override - protected Result check() { - try (Connection connection = DriverManager.getConnection( - dataSourceFactory.getUrl(), - dataSourceFactory.getUser(), - dataSourceFactory.getPassword())) { - connection.setReadOnly(true); - - return connection.isValid(2) - ? Result.healthy() - : Result.unhealthy("Could not validate the DB connection."); - } catch (Exception e) { - return Result.unhealthy(e); - } - } -} diff --git a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/metrics/DatabaseMetricsService.java b/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/metrics/DatabaseMetricsService.java deleted file mode 100644 index 0a11a1ef..00000000 --- a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/metrics/DatabaseMetricsService.java +++ /dev/null @@ -1,161 +0,0 @@ -package uk.gov.service.payments.commons.utils.metrics; - -import com.codahale.metrics.Counter; -import com.codahale.metrics.Gauge; -import com.codahale.metrics.MetricRegistry; -import io.dropwizard.db.DataSourceFactory; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Set; - -import static java.lang.String.format; - -public class DatabaseMetricsService { - - private final Set metrics = Set.of( - new PostgresGaugeMetric("numbackends", 0L), - new PostgresCounterMetric("xact_commit", 0L), - new PostgresCounterMetric("xact_rollback", 0L), - new PostgresCounterMetric("blks_read", 0L), - new PostgresCounterMetric("blks_hit", 0L), - new PostgresCounterMetric("tup_returned", 0L), - new PostgresCounterMetric("tup_fetched", 0L), - new PostgresCounterMetric("tup_inserted", 0L), - new PostgresCounterMetric("tup_updated", 0L), - new PostgresCounterMetric("tup_deleted", 0L), - new PostgresCounterMetric("conflicts", 0L), - new PostgresCounterMetric("temp_files", 0L), - new PostgresCounterMetric("temp_bytes", 0L), - new PostgresCounterMetric("deadlocks", 0L), - new PostgresCounterMetric("blk_read_time_ns", 0L), - new PostgresCounterMetric("blk_write_time_ns", 0L)); - - private final String databaseName; - private final JDBCConnectionProvider jdbcConnectionProvider; - private Integer statsHealthy = 0; - - public DatabaseMetricsService(DataSourceFactory dataSourceFactory, MetricRegistry metricRegistry, String databaseName) { - this.jdbcConnectionProvider = new JDBCConnectionFactory(dataSourceFactory); - this.databaseName = databaseName; - metrics.forEach(metric -> metric.register(metricRegistry, format("%sdb.", databaseName))); - metricRegistry.>register(format("%sdb.stats_healthy", databaseName), () -> statsHealthy); - } - - DatabaseMetricsService(JDBCConnectionProvider jdbcConnectionProvider, MetricRegistry metricRegistry, String databaseName) { - this.jdbcConnectionProvider = jdbcConnectionProvider; - this.databaseName = databaseName; - metrics.forEach(metric -> metric.register(metricRegistry, format("%sdb.", databaseName))); - metricRegistry.>register(format("%sdb.stats_healthy", databaseName), () -> statsHealthy); - } - - public void updateMetricData() { - statsHealthy = fetchDatabaseMetrics() ? 1 : 0; - } - - private boolean fetchDatabaseMetrics() { - try (Connection connection = jdbcConnectionProvider.getConnection(); - PreparedStatement statement = connection.prepareStatement("select *, blk_read_time * 1000 as blk_read_time_ns, blk_write_time * 1000 as blk_write_time_ns from pg_stat_database where datname = ?")) { - connection.setReadOnly(true); - statement.setString(1, databaseName); - if (statement.execute()) { - try (ResultSet resultSet = statement.getResultSet()) { - if (resultSet.next()) { - for (PostgresMetric metric : metrics) { - metric.setValue(resultSet.getLong(metric.getName())); - } - return true; - } - } - } - } catch (SQLException ignored) { - } - - return false; - } - - private interface PostgresMetric { - String getName(); - void register(MetricRegistry registry, String prefix); - void setValue(Long value); - } - - class PostgresGaugeMetric implements PostgresMetric,Gauge { - final String name; - Long value; - - PostgresGaugeMetric(String name, Long defaultValue) { - this.name = name; - this.value = defaultValue; - } - - @Override - public String getName() { - return name; - } - - @Override - public Long getValue() { - return value; - } - - @Override - public void register(MetricRegistry registry, String prefix) { - registry.>register(format("%s%s", prefix, name), this); - } - - public void setValue(Long value) { - this.value = value; - } - } - - class PostgresCounterMetric extends Counter implements PostgresMetric { - final String name; - Long value; - - PostgresCounterMetric(String name, Long defaultValue) { - this.name = name; - this.value = defaultValue; - } - - @Override - public String getName() { - return name; - } - - @Override - public long getCount() { - return value; - } - - @Override - public void register(MetricRegistry registry, String prefix) { - registry.register(format("%s%s", prefix, name), this); - } - - @Override - public void setValue(Long value) { - this.value = value; - } - } - - private class JDBCConnectionFactory implements JDBCConnectionProvider { - private DataSourceFactory dataSourceFactory; - - JDBCConnectionFactory(DataSourceFactory dataSourceFactory) { - this.dataSourceFactory = dataSourceFactory; - } - - @Override - public Connection getConnection() throws SQLException { - return DriverManager.getConnection(dataSourceFactory.getUrl(), dataSourceFactory.getUser(), dataSourceFactory.getPassword()); - } - } - - interface JDBCConnectionProvider { - Connection getConnection() throws SQLException; - } -} diff --git a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupDependentResource.java b/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupDependentResource.java deleted file mode 100644 index cb61df68..00000000 --- a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupDependentResource.java +++ /dev/null @@ -1,5 +0,0 @@ -package uk.gov.service.payments.commons.utils.startup; - -interface ApplicationStartupDependentResource { - boolean isAvailable(); -} diff --git a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupDependentResourceChecker.java b/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupDependentResourceChecker.java deleted file mode 100644 index 08eafd4d..00000000 --- a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupDependentResourceChecker.java +++ /dev/null @@ -1,41 +0,0 @@ -package uk.gov.service.payments.commons.utils.startup; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.time.Duration; -import java.util.function.Consumer; - -public class ApplicationStartupDependentResourceChecker { - - private static final int PROGRESSIVE_SECONDS_TO_WAIT = 5; - private static final Logger logger = LoggerFactory.getLogger(ApplicationStartupDependentResourceChecker.class); - - private final ApplicationStartupDependentResource applicationStartupDependentResource; - private final Consumer waiter; - - public ApplicationStartupDependentResourceChecker(ApplicationStartupDependentResource applicationStartupDependentResource) { - this(applicationStartupDependentResource, duration -> { - try { - Thread.sleep(duration.toMillis()); - } catch (InterruptedException ignored) { - } - }); - } - - public ApplicationStartupDependentResourceChecker(ApplicationStartupDependentResource applicationStartupDependentResource, Consumer waiter) { - this.applicationStartupDependentResource = applicationStartupDependentResource; - this.waiter = waiter; - } - - public void checkAndWaitForResource() { - long timeToWait = 0; - while(!applicationStartupDependentResource.isAvailable()) { - timeToWait += PROGRESSIVE_SECONDS_TO_WAIT; - logger.info("Waiting for {} seconds until {} is available ...", timeToWait, applicationStartupDependentResource); - waiter.accept(Duration.ofSeconds(timeToWait)); - } - logger.info("{} available.", applicationStartupDependentResource); - } - -} diff --git a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/DatabaseStartupResource.java b/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/DatabaseStartupResource.java deleted file mode 100644 index b73de68f..00000000 --- a/utils-dropwizard-4/src/main/java/uk/gov/service/payments/commons/utils/startup/DatabaseStartupResource.java +++ /dev/null @@ -1,40 +0,0 @@ -package uk.gov.service.payments.commons.utils.startup; - -import io.dropwizard.db.DataSourceFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.sql.DriverManager; -import java.sql.SQLException; - -import static java.lang.String.format; - -public class DatabaseStartupResource implements ApplicationStartupDependentResource { - - private static final Logger logger = LoggerFactory.getLogger(DatabaseStartupResource.class); - - private final String databaseUrl; - private final String databaseUser; - private final String databasePassword; - - public DatabaseStartupResource(DataSourceFactory dataSourceFactory) { - databaseUrl = dataSourceFactory.getUrl(); - databaseUser = dataSourceFactory.getUser(); - databasePassword = dataSourceFactory.getPassword(); - } - - public boolean isAvailable() { - try { - DriverManager.getConnection(databaseUrl, databaseUser, databasePassword).close(); - return true; - } catch (SQLException e) { - logger.warn("Unable to connect to database: {}", e.getMessage()); - return false; - } - } - - @Override - public String toString() { - return format("DatabaseStartupResource[url=%s, user=%s]", databaseUrl, databaseUser); - } -} diff --git a/utils-dropwizard-4/src/main/resources/sampling-rules.json b/utils-dropwizard-4/src/main/resources/sampling-rules.json deleted file mode 100644 index f781dd4f..00000000 --- a/utils-dropwizard-4/src/main/resources/sampling-rules.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "rules": [ - { - "description": "Exclude healthchecks", - "service_name": "*", - "http_method": "*", - "url_path": "/healthcheck", - "fixed_target": 0, - "rate": 0.0 - } - ], - "default": { - "fixed_target": 1, - "rate": 0.01 - }, - "version": 1 -} diff --git a/utils-dropwizard-4/src/test/java/uk/gov/service/payments/commons/utils/metrics/DatabaseMetricsServiceTest.java b/utils-dropwizard-4/src/test/java/uk/gov/service/payments/commons/utils/metrics/DatabaseMetricsServiceTest.java deleted file mode 100644 index aca08ec2..00000000 --- a/utils-dropwizard-4/src/test/java/uk/gov/service/payments/commons/utils/metrics/DatabaseMetricsServiceTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package uk.gov.service.payments.commons.utils.metrics; - -import com.codahale.metrics.Counter; -import com.codahale.metrics.Gauge; -import com.codahale.metrics.MetricRegistry; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Map; - -import static java.util.Map.entry; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -public class DatabaseMetricsServiceTest { - @Mock - Connection mockConnection; - @Mock - PreparedStatement mockPreparedStatement; - @Mock - ResultSet mockResultSet; - - @Test - public void updateMetricData() throws Throwable { - MetricRegistry metricRegistry = new MetricRegistry(); - when(mockConnection.prepareStatement("select *, blk_read_time * 1000 as blk_read_time_ns, blk_write_time * 1000 as blk_write_time_ns from pg_stat_database where datname = ?")).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.execute()).thenReturn(true); - when(mockPreparedStatement.getResultSet()).thenReturn(mockResultSet); - when(mockResultSet.next()).thenReturn(true); - try { - when(mockResultSet.getLong("numbackends")).thenReturn(1L); - } catch (SQLException ignored) { } - Map counterMetrics = Map.ofEntries( - entry("xact_commit", 2L), - entry("xact_rollback", 3L), - entry("blks_read", 4L), - entry("blks_hit", 5L), - entry("tup_returned", 6L), - entry("tup_fetched", 7L), - entry("tup_inserted", 8L), - entry("tup_updated", 9L), - entry("tup_deleted", 10L), - entry("conflicts", 11L), - entry("temp_files", 12L), - entry("temp_bytes", 13L), - entry("deadlocks", 14L), - entry("blk_read_time_ns", 15L), - entry("blk_write_time_ns", 16L) - ); - counterMetrics.forEach((name, value) -> { - try { - when(mockResultSet.getLong(name)).thenReturn(value); - } catch (SQLException ignored) { } - }); - DatabaseMetricsService databaseMetricsService = new DatabaseMetricsService(new MockJDBCConnectionFactory(), metricRegistry, "testme"); - - // Metrics all default to 0 and unhealthy - assertEquals(Integer.valueOf(0), ((Gauge)metricRegistry.getGauges().get("testmedb.stats_healthy")).getValue()); - assertEquals(Long.valueOf(0), ((Gauge)metricRegistry.getGauges().get("testmedb.numbackends")).getValue()); - counterMetrics.keySet().forEach(name -> assertEquals(0L, metricRegistry.getCounters().get("testmedb." + name).getCount())); - - databaseMetricsService.updateMetricData(); - - Map gauges = metricRegistry.getGauges(); - Map counters = metricRegistry.getCounters(); - assertEquals(2, gauges.size()); - assertEquals(Integer.valueOf(1), ((Gauge)gauges.get("testmedb.stats_healthy")).getValue()); - assertEquals(Long.valueOf(1), ((Gauge)gauges.get("testmedb.numbackends")).getValue()); - assertEquals(15, counters.size()); - counters.forEach((name, counter) -> assertEquals(counterMetrics.get(name.substring("testmedb.".length())).longValue(), counter.getCount())); - } - - private class MockJDBCConnectionFactory implements DatabaseMetricsService.JDBCConnectionProvider{ - @Override - public Connection getConnection() { - return mockConnection; - } - } -} diff --git a/utils-dropwizard-4/src/test/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupApplicationStartupDependentResourceCheckerTest.java b/utils-dropwizard-4/src/test/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupApplicationStartupDependentResourceCheckerTest.java deleted file mode 100644 index 88bc6e19..00000000 --- a/utils-dropwizard-4/src/test/java/uk/gov/service/payments/commons/utils/startup/ApplicationStartupApplicationStartupDependentResourceCheckerTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package uk.gov.service.payments.commons.utils.startup; - -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.LoggingEvent; -import ch.qos.logback.core.Appender; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.slf4j.LoggerFactory; - -import java.time.Duration; -import java.util.List; -import java.util.function.Consumer; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -public class ApplicationStartupApplicationStartupDependentResourceCheckerTest { - private ApplicationStartupDependentResourceChecker applicationStartupDependentResourceChecker; - - @Mock - DatabaseStartupResource mockApplicationStartupDependentResource; - @Mock - Consumer mockWaiter; - - private Appender mockAppender; - - @Captor - ArgumentCaptor loggingEventArgumentCaptor; - - @BeforeEach - public void setup() { - mockAppender = mock(Appender.class); - ((Logger) LoggerFactory.getLogger(ApplicationStartupDependentResourceChecker.class)).addAppender(mockAppender); - - applicationStartupDependentResourceChecker = new ApplicationStartupDependentResourceChecker(mockApplicationStartupDependentResource, mockWaiter); - } - - @Test - public void start_ShouldWaitAndLogUntilDatabaseIsAccessible() { - - when(mockApplicationStartupDependentResource.toString()).thenReturn("DatabaseStartupResource[url=mock, user=mock]"); - when(mockApplicationStartupDependentResource.isAvailable()) - .thenReturn(false) - .thenReturn(true); - - applicationStartupDependentResourceChecker.checkAndWaitForResource(); - - verify(mockApplicationStartupDependentResource, times(2)).isAvailable(); - verify(mockWaiter).accept(Duration.ofSeconds(5)); - - verify(mockAppender, times(2)).doAppend(loggingEventArgumentCaptor.capture()); - List allValues = loggingEventArgumentCaptor.getAllValues(); - - assertThat(allValues.get(0).getFormattedMessage(), is("Waiting for 5 seconds until DatabaseStartupResource[url=mock, user=mock] is available ...")); - assertThat(allValues.get(1).getFormattedMessage(), is("DatabaseStartupResource[url=mock, user=mock] available.")); - } - - @Test - public void start_ShouldProgressivelyIncrementSleepingTimeBetweenChecksForDBAccessibility() { - when(mockApplicationStartupDependentResource.toString()).thenReturn("DatabaseStartupResource[url=mock, user=mock]"); - when(mockApplicationStartupDependentResource.isAvailable()) - .thenReturn(false) - .thenReturn(false) - .thenReturn(false) - .thenReturn(true); - - applicationStartupDependentResourceChecker.checkAndWaitForResource(); - - verify(mockApplicationStartupDependentResource, times(4)).isAvailable(); - verify(mockWaiter).accept(Duration.ofSeconds(5)); - verify(mockWaiter).accept(Duration.ofSeconds(10)); - verify(mockWaiter).accept(Duration.ofSeconds(15)); - verify(mockAppender, times(4)).doAppend(loggingEventArgumentCaptor.capture()); - - List logStatement = loggingEventArgumentCaptor.getAllValues(); - assertThat(logStatement.get(0).getFormattedMessage(), is("Waiting for 5 seconds until DatabaseStartupResource[url=mock, user=mock] is available ...")); - assertThat(logStatement.get(1).getFormattedMessage(), is("Waiting for 10 seconds until DatabaseStartupResource[url=mock, user=mock] is available ...")); - assertThat(logStatement.get(2).getFormattedMessage(), is("Waiting for 15 seconds until DatabaseStartupResource[url=mock, user=mock] is available ...")); - assertThat(logStatement.get(3).getFormattedMessage(), is("DatabaseStartupResource[url=mock, user=mock] available.")); - } -} diff --git a/utils-dropwizard-5/pom.xml b/utils-dropwizard-5/pom.xml index a18e6dc6..d49d5ead 100644 --- a/utils-dropwizard-5/pom.xml +++ b/utils-dropwizard-5/pom.xml @@ -13,18 +13,6 @@ Utilities for production code DW 5 jar - - - - io.dropwizard - dropwizard-dependencies - 5.0.0 - pom - import - - - - @@ -44,12 +32,6 @@ 4.2.37 - - - - - diff --git a/validation-dropwizard-4/pom.xml b/validation-dropwizard-4/pom.xml deleted file mode 100644 index 54929967..00000000 --- a/validation-dropwizard-4/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - pay-java-commons - uk.gov.service.payments - 1.0.0 - - - validation-dropwizard-4 - Common validations DW 4 - jar - - - - org.apache.commons - commons-lang3 - - - jakarta.validation - jakarta.validation-api - - - \ No newline at end of file diff --git a/validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/DateTimeUtils.java b/validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/DateTimeUtils.java deleted file mode 100644 index b952b627..00000000 --- a/validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/DateTimeUtils.java +++ /dev/null @@ -1,62 +0,0 @@ -package uk.gov.service.payments.commons.validation; - -import java.time.LocalDate; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.Optional; - -public class DateTimeUtils { - private static final ZoneId UTC = ZoneOffset.UTC; - private static DateTimeFormatter dateTimeFormatterAny = DateTimeFormatter.ISO_ZONED_DATE_TIME; - private static DateTimeFormatter localDateFormatter = DateTimeFormatter.ISO_LOCAL_DATE; - - /** - * Converts any valid ZonedDateTime String (ISO_8601) representation to a UTC ZonedDateTime - * - * e.g. - * 1. 2010-01-01T12:00:00+01:00[Europe/Paris] to ZonedDateTime("2010-12-31T22:59:59.132Z") - * 2. 2010-12-31T22:59:59.132Z to ZonedDateTime("2010-12-31T22:59:59.132Z") - * - * @param dateString e.g. - * @return ZonedDateTime instance represented by dateString in UTC ("Z") or - * Optional.empty() if the dateString does not represent a valid ISO_8601 zone string - * @see "https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html" - */ - public static Optional toUTCZonedDateTime(String dateString) { - try { - ZonedDateTime utcDateTime = ZonedDateTime - .parse(dateString, dateTimeFormatterAny) - .withZoneSameInstant(UTC); - return Optional.of(utcDateTime); - } catch (DateTimeParseException ex) { - return Optional.empty(); - } - } - - /** - * Converts a LocalDateTime to a UTC ISO_8601 string representation - * - * e.g. - * 1. LocalDateTime("2010-01-01") to "2010-12-01" - * 2. LocalDateTime("2010-12-31") to "2010-12-31" - * - * - * @param zonedDateTime - * @return UTC ISO_8601 date string - */ - public static String toLocalDateString(ZonedDateTime zonedDateTime) { - return zonedDateTime.withZoneSameInstant(ZoneOffset.UTC).toLocalDate().format(localDateFormatter); - } - - public static Optional fromLocalDateOnlyString(String localDateString) { - try { - ZonedDateTime utcTime = LocalDate.parse(localDateString).atStartOfDay(ZoneOffset.UTC); - return Optional.of(utcTime); - } catch (DateTimeParseException ex) { - return Optional.empty(); - } - } -} diff --git a/validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/DateValidator.java b/validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/DateValidator.java deleted file mode 100644 index bcb8d513..00000000 --- a/validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/DateValidator.java +++ /dev/null @@ -1,19 +0,0 @@ -package uk.gov.service.payments.commons.validation; - - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -import static org.apache.commons.lang3.StringUtils.isBlank; - -public class DateValidator implements ConstraintValidator { - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - return isValid(value); - } - - public static boolean isValid(String value) { - return isBlank(value) || DateTimeUtils.toUTCZonedDateTime(value).isPresent(); - } -} diff --git a/validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/ValidDate.java b/validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/ValidDate.java deleted file mode 100644 index 9bcff613..00000000 --- a/validation-dropwizard-4/src/main/java/uk/gov/service/payments/commons/validation/ValidDate.java +++ /dev/null @@ -1,28 +0,0 @@ -package uk.gov.service.payments.commons.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE_USE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE }) -@Retention(RUNTIME) -@Constraint(validatedBy = DateValidator.class) -@Documented -public @interface ValidDate { - - String message() default "Must be a valid date"; - - Class[] groups() default {}; - - Class[] payload() default {}; -} diff --git a/validation-dropwizard-4/src/test/java/uk/gov/service/payments/commons/validation/DateTimeUtilsTest.java b/validation-dropwizard-4/src/test/java/uk/gov/service/payments/commons/validation/DateTimeUtilsTest.java deleted file mode 100644 index 53901409..00000000 --- a/validation-dropwizard-4/src/test/java/uk/gov/service/payments/commons/validation/DateTimeUtilsTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package uk.gov.service.payments.commons.validation; - -import org.junit.jupiter.api.Test; - -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.util.Locale; -import java.util.Optional; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.StringEndsWith.endsWith; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class DateTimeUtilsTest { - - static final DateTimeFormatter ISO_INSTANT_MILLISECOND_PRECISION = - new DateTimeFormatterBuilder() - .appendInstant(3) - .toFormatter(Locale.ENGLISH) - .withZone(ZoneOffset.UTC); - - @Test - void shouldConvertUTCZonedDateTimeToAISO_8601_UTCString() { - ZonedDateTime localDateTime = ZonedDateTime.of(2010, 11, 13, 12, 0, 0, 999, ZoneOffset.UTC); - - String dateString = ISO_INSTANT_MILLISECOND_PRECISION.format(localDateTime); - assertThat(dateString, is("2010-11-13T12:00:00.000Z")); - } - - @Test - void shouldConvertUTCZonedDateTimeToLocalDateString() { - ZonedDateTime localDateTime = ZonedDateTime.of(2010, 11, 13, 12, 0, 0, 0, ZoneOffset.UTC); - - String dateString = DateTimeUtils.toLocalDateString(localDateTime); - assertThat(dateString, is("2010-11-13")); - } - - @Test - void shouldConvertNonUTCZonedDateTimeToAISO_8601_UTCString() { - ZonedDateTime localDateTime = ZonedDateTime.of(2010, 11, 13, 12, 0, 0, 999, ZoneId.of("Europe/Paris")); - - String dateString = ISO_INSTANT_MILLISECOND_PRECISION.format(localDateTime); - assertThat(dateString, is("2010-11-13T11:00:00.000Z")); - } - - @Test - void shouldConvertUTCZonedISO_8601StringToADateTime() { - String aDate = "2010-01-01T12:00:00Z"; - Optional result = DateTimeUtils.toUTCZonedDateTime(aDate); - assertTrue(result.isPresent()); - assertThat(result.get().toString(), endsWith("Z")); - - aDate = "2010-12-31T23:59:59.132Z"; - result = DateTimeUtils.toUTCZonedDateTime(aDate); - assertTrue(result.isPresent()); - assertThat(result.get().toString(), endsWith("Z")); - } - - @Test - void shouldConvertNonUTCZonedISO_8601StringToADateTime() { - String aDate = "2010-01-01T12:00:00+01:00[Europe/Paris]"; - Optional result = DateTimeUtils.toUTCZonedDateTime(aDate); - assertTrue(result.isPresent()); - assertThat(result.get().toString(), endsWith("Z")); - - aDate = "2010-12-31T23:59:59.132+01:00[Europe/Paris]"; - result = DateTimeUtils.toUTCZonedDateTime(aDate); - assertTrue(result.isPresent()); - assertThat(result.get().toString(), endsWith("Z")); - } - - @Test - void shouldCovertNonZonedDateStringZonedISO_8601StringToADateTime() { - String date = "2020-09-25"; - Optional result = DateTimeUtils.fromLocalDateOnlyString(date); - assertThat(result.isPresent(), is(true)); - assertThat(result.get().toString(), is("2020-09-25T00:00Z")); - } - - @Test - void shouldNotCovertNonZonedDateStringToADateTimeIfNotISO_8601() { - String date = "2020/09/25"; - Optional result = DateTimeUtils.fromLocalDateOnlyString(date); - assertThat(result.isPresent(), is(false)); - } -} diff --git a/validation-dropwizard-5/pom.xml b/validation-dropwizard-5/pom.xml index 048efff0..a6743a14 100644 --- a/validation-dropwizard-5/pom.xml +++ b/validation-dropwizard-5/pom.xml @@ -13,18 +13,6 @@ Common validations DW 5 jar - - - - io.dropwizard - dropwizard-dependencies - 5.0.0 - pom - import - - - - org.apache.commons