Skip to content

Commit

Permalink
sns publish integration tests
Browse files Browse the repository at this point in the history
  • Loading branch information
karlfosterBCL committed Mar 7, 2025
1 parent 27c2daf commit 8e4a7c1
Show file tree
Hide file tree
Showing 11 changed files with 86 additions and 51 deletions.
1 change: 0 additions & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ hmpps.sqs:
queueName: hmpps-breach-notice-queue
dlqName: hmpps-breach-notice-queue-dlq
subscribeTopicId: hmppsbreachnoticetopic
#subscribeFilter: '{"eventType":[ "probation-case.merge.completed", "probation-case.unmerge.completed", "probation-case.sentence.moved"] }'
audit:
queueName: audit-queue
topics:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,7 @@ package uk.gov.justice.digital.hmpps.breachnoticeapi.integration
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties =
["spring.autoconfigure.exclude=uk.gov.justice.hmpps.sqs.HmppsSqsConfiguration"],
)
class AuthorisationTest : IntegrationTestBase() {

@Nested
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,12 @@ import org.assertj.core.api.Assertions.assertThat
import org.hamcrest.Matchers.containsString
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import uk.gov.justice.digital.hmpps.breachnoticeapi.model.Address
import uk.gov.justice.digital.hmpps.breachnoticeapi.model.BreachNotice
import uk.gov.justice.digital.hmpps.breachnoticeapi.repository.BreachNoticeRepository
import java.time.LocalDate
import java.time.LocalDateTime

@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties =
["spring.autoconfigure.exclude=uk.gov.justice.hmpps.sqs.HmppsSqsConfiguration"],
)
class BreachNoticeCrudTests : IntegrationTestBase() {

@Autowired
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package uk.gov.justice.digital.hmpps.breachnoticeapi.integration

import org.assertj.core.api.Assertions.assertThat
import org.awaitility.Awaitility
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import software.amazon.awssdk.services.sns.model.MessageAttributeValue
import software.amazon.awssdk.services.sns.model.PublishRequest
import uk.gov.justice.digital.hmpps.breachnoticeapi.entity.BreachNoticeEntity
import uk.gov.justice.digital.hmpps.breachnoticeapi.model.BreachNotice
import uk.gov.justice.digital.hmpps.breachnoticeapi.repository.BreachNoticeRepository
import java.util.concurrent.TimeUnit

class DomainEventTest : IntegrationTestBase() {

@Autowired
private lateinit var breachNoticeRepository: BreachNoticeRepository

@Nested
@DisplayName("GET /breach-notice/{parameter}")
inner class BreachNoticeTestEntityEndpoint {

@Test
fun `merge event should update CRN for active breach notice`() {
webTestClient.post()
.uri("/breach-notice")
.headers(setAuthorisation(roles = listOf("ROLE_BREACH_NOTICE")))
.bodyValue(BreachNotice(crn = "X000101"))
.exchange()
.expectStatus()
.isCreated

val breachNotice = breachNoticeRepository.findByCrn("X000101").single()
assertThat(breachNotice.crn).isEqualTo("X000101")
assertThat(breachNotice.id).isNotNull()

val message: String = "{\"eventType\":\"probation-case.merge.completed\",\"version\":1,\"occurredAt\":\"2025-03-04T10:30:07.329287Z\",\"description\":\"A merge has been completed on the probation case\",\"additionalInformation\":{\"sourceCRN\":\"X000101\",\"targetCRN\":\"X000102\"},\"personReference\":{\"identifiers\":[{\"type\":\"CRN\",\"value\":\"X000102\"}]}}\n"

val responseFuture = inboundSnsClient.publish(
PublishRequest.builder().topicArn("arn:aws:sns:eu-west-2:000000000000:hmppsbreachnoticetopic").message(message).messageAttributes(
mapOf("eventType" to MessageAttributeValue.builder().dataType("String").stringValue("probation-case.merge.completed").build()),
).build(),
)
val response = responseFuture.get(10, TimeUnit.SECONDS)

assertThat(response.messageId()).isNotNull()

Awaitility.await().atMost(10, TimeUnit.SECONDS).untilAsserted {
val breachNoticeUpdated: BreachNoticeEntity = breachNoticeRepository.findById(breachNotice.id).orElse(null)
assertThat(breachNoticeUpdated).isNotNull
assertThat(breachNoticeUpdated.crn).isEqualTo("X000102")
assertThat(breachNoticeUpdated.id).isNotNull()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import uk.gov.justice.digital.hmpps.breachnoticeapi.integration.wiremock.Gotenbe
import uk.gov.justice.digital.hmpps.breachnoticeapi.integration.wiremock.GotenbernApiExtension.Companion.gotenberg
import uk.gov.justice.digital.hmpps.breachnoticeapi.integration.wiremock.HmppsAuthApiExtension
import uk.gov.justice.digital.hmpps.breachnoticeapi.integration.wiremock.HmppsAuthApiExtension.Companion.hmppsAuth
import uk.gov.justice.hmpps.sqs.HmppsQueueService
import uk.gov.justice.hmpps.sqs.HmppsSqsProperties
import uk.gov.justice.hmpps.sqs.MissingQueueException
import uk.gov.justice.hmpps.test.kotlin.auth.JwtAuthorisationHelper

@ExtendWith(GotenbernApiExtension::class)
Expand All @@ -25,6 +28,14 @@ abstract class IntegrationTestBase {
@Autowired
protected lateinit var jwtAuthHelper: JwtAuthorisationHelper

@Autowired
protected lateinit var hmppsQueueService: HmppsQueueService

private val inboundTopic by lazy { hmppsQueueService.findByTopicId("hmppsbreachnoticetopic") ?: throw MissingQueueException("HmppsTopic inboundtopic not found") }
protected val inboundSnsClient by lazy { inboundTopic.snsClient }

fun HmppsSqsProperties.inboundTopicConfig() = topics["hmppsbreachnoticetopic"] ?: throw MissingTopicException("hmppsbreachnoticetopic has not been loaded from configuration properties")

internal fun setAuthorisation(
username: String? = "AUTH_ADM",
roles: List<String> = listOf(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
package uk.gov.justice.digital.hmpps.breachnoticeapi.integration

import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties =
["spring.autoconfigure.exclude=uk.gov.justice.hmpps.sqs.HmppsSqsConfiguration"],
)
class NotFoundTest : IntegrationTestBase() {

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,11 @@ import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.CsvSource
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.web.server.LocalServerPort
import org.springframework.http.MediaType
import java.time.LocalDate
import java.time.format.DateTimeFormatter

@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties =
["spring.autoconfigure.exclude=uk.gov.justice.hmpps.sqs.HmppsSqsConfiguration"],
)
class OpenApiDocsTest : IntegrationTestBase() {
@LocalServerPort
private val port: Int = 0
Expand Down Expand Up @@ -72,10 +66,17 @@ class OpenApiDocsTest : IntegrationTestBase() {
fun `the open api json path security requirements are valid`() {
val result = OpenAPIV3Parser().readLocation("http://localhost:$port/v3/api-docs", null, null)

val exclusions = setOf(
"/queue-admin/retry-dlq/{dlqName}",
"/queue-admin/retry-all-dlqs",
"/queue-admin/purge-queue/{queueName}",
"/queue-admin/get-dlq-messages/{dlqName}",
)

// The security requirements of each path don't appear to be validated like they are at https://editor.swagger.io/
// We therefore need to grab all the valid security requirements and check that each path only contains those items
val securityRequirements = result.openAPI.security.flatMap { it.keys }
result.openAPI.paths.filter { it.value.get != null }.forEach { pathItem ->
result.openAPI.paths.filter { !exclusions.contains(it.key) }.filter { it.value.get != null }.forEach { pathItem ->
assertThat(pathItem.value.get.security.flatMap { it.keys }).isSubsetOf(securityRequirements)
}
}
Expand All @@ -100,12 +101,19 @@ class OpenApiDocsTest : IntegrationTestBase() {

@Test
fun `all endpoints have a security scheme defined`() {
// There are 4 SQS endpoints without security scheme, to be excluded from this test; all these endpoint has single tag "hmpps-queue-resource"
val queueAdminTag = "hmpps-queue-resource"
val queueAdminEndpointCount = 4

webTestClient.get()
.uri("/v3/api-docs")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus().isOk
.expectBody()
.jsonPath("$.paths[*][*][?(!@.security)]").doesNotExist()
.jsonPath("$.paths[*][*][?(!@.security)]..tags[0]").value<JSONArray> {
assertThat(it).hasSize(queueAdminEndpointCount)
it.forEach { tag -> assertThat(tag).isEqualTo(queueAdminTag) }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,12 @@ package uk.gov.justice.digital.hmpps.breachnoticeapi.integration
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.http.ContentDisposition
import org.springframework.http.MediaType
import uk.gov.justice.digital.hmpps.breachnoticeapi.model.BreachNotice
import uk.gov.justice.digital.hmpps.breachnoticeapi.repository.BreachNoticeRepository
import java.util.UUID

@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties =
["spring.autoconfigure.exclude=uk.gov.justice.hmpps.sqs.HmppsSqsConfiguration"],
)
class PdfGenerationTests : IntegrationTestBase() {

@Autowired
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,12 @@ package uk.gov.justice.digital.hmpps.breachnoticeapi.integration
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.ApplicationContext
import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.web.servlet.mvc.method.RequestMappingInfo
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
import java.io.File

@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties =
["spring.autoconfigure.exclude=uk.gov.justice.hmpps.sqs.HmppsSqsConfiguration"],
)
class ResourceSecurityTest : IntegrationTestBase() {
@Autowired
private lateinit var context: ApplicationContext
Expand All @@ -25,6 +19,7 @@ class ResourceSecurityTest : IntegrationTestBase() {
"GET /v3/api-docs",
"GET /v3/api-docs/swagger-config",
" /error",
"PUT /queue-admin/retry-all-dlqs",
)

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
package uk.gov.justice.digital.hmpps.breachnoticeapi.integration.health

import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import uk.gov.justice.digital.hmpps.breachnoticeapi.integration.IntegrationTestBase

@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties =
["spring.autoconfigure.exclude=uk.gov.justice.hmpps.sqs.HmppsSqsConfiguration"],
)
class HealthCheckTest : IntegrationTestBase() {

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,10 @@ package uk.gov.justice.digital.hmpps.breachnoticeapi.integration.health

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import uk.gov.justice.digital.hmpps.breachnoticeapi.integration.IntegrationTestBase
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties =
["spring.autoconfigure.exclude=uk.gov.justice.hmpps.sqs.HmppsSqsConfiguration"],
)
class InfoTest : IntegrationTestBase() {

@Test
Expand Down

0 comments on commit 8e4a7c1

Please sign in to comment.