Skip to content

Commit

Permalink
tests: improve test speed and restructure test package
Browse files Browse the repository at this point in the history
* delete empty XesarApiInstanceTest.kt
* change package structure (now splitted into integration and unit)
* remove unnessary integration tests for every command testing if an OptionalEventException/RequiredEventException was thrown (instead unit tests ExecuteACommandAndSimulateDifferentResultScenarios.kt)
* use custom RequestConfig (<5000L) to make integration tests faster
  • Loading branch information
berka3 committed Jul 31, 2024
1 parent 69e606f commit 344f0bf
Show file tree
Hide file tree
Showing 139 changed files with 1,397 additions and 3,145 deletions.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.open200.xesar.connect
package com.open200.xesar.connect.test.integration

import com.open200.xesar.connect.Topics
import com.open200.xesar.connect.UserCredentials
import com.open200.xesar.connect.XesarConnect
import com.open200.xesar.connect.XesarMqttClient
import com.open200.xesar.connect.exception.UnauthorizedLoginAttemptException
import com.open200.xesar.connect.testutils.MosquittoContainer
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.common.runBlocking
import io.kotest.core.spec.style.FunSpec
Expand Down Expand Up @@ -121,6 +124,4 @@ class ConnectAndLoginTest :
}
}
}
// TODO
test("logout") {}
})
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.open200.xesar.connect
package com.open200.xesar.connect.test.integration

import com.open200.xesar.connect.Topics
import com.open200.xesar.connect.XesarConnect
import com.open200.xesar.connect.XesarMqttClient
import com.open200.xesar.connect.filters.AllTopicsFilter
import com.open200.xesar.connect.testutils.MosquittoContainer
import io.kotest.core.spec.style.FunSpec
import io.kotest.extensions.testcontainers.perProject
import io.kotest.matchers.booleans.shouldBeTrue
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.open200.xesar.connect
package com.open200.xesar.connect.test.integration

import com.open200.xesar.connect.Topics
import com.open200.xesar.connect.XesarConnect
import com.open200.xesar.connect.XesarMqttClient
import com.open200.xesar.connect.filters.AllTopicsFilter
import com.open200.xesar.connect.testutils.MosquittoContainer
import io.kotest.core.spec.style.FunSpec
import io.kotest.extensions.testcontainers.perProject
import io.kotest.matchers.booleans.shouldBeFalse
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.open200.xesar.connect.testutils
package com.open200.xesar.connect.test.integration

import com.open200.xesar.connect.Config
import io.mockk.mockk
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.open200.xesar.connect.query.stream
package com.open200.xesar.connect.test.integration

import com.open200.xesar.connect.*
import com.open200.xesar.connect.extension.queryStreamPerson
import com.open200.xesar.connect.messages.command.Query
import com.open200.xesar.connect.messages.query.QueryList
import com.open200.xesar.connect.messages.query.encodeQueryList
import com.open200.xesar.connect.testutils.MosquittoContainer
import com.open200.xesar.connect.testutils.PersonFixture
import com.open200.xesar.connect.test.util.fixture.PersonFixture
import io.kotest.core.spec.style.FunSpec
import io.kotest.extensions.testcontainers.perProject
import io.kotest.matchers.equals.shouldBeEqual
Expand All @@ -16,7 +15,7 @@ import java.util.*
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.toList

class QueryPersonStreamTest :
class QueryStreamTest :
FunSpec({
val container = MosquittoContainer.container()
val config = MosquittoContainer.config(container)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.open200.xesar.connect
package com.open200.xesar.connect.test.integration

import com.open200.xesar.connect.testutils.MosquittoContainer
import com.open200.xesar.connect.Topics
import com.open200.xesar.connect.XesarConnect
import com.open200.xesar.connect.logger
import io.kotest.core.spec.style.FunSpec
import io.kotest.extensions.testcontainers.perProject
import io.kotest.matchers.shouldBe
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package com.open200.xesar.connect.test.integration.command

import com.open200.xesar.connect.*
import com.open200.xesar.connect.extension.addEvvaComponentAsync
import com.open200.xesar.connect.messages.ComponentType
import com.open200.xesar.connect.messages.event.*
import com.open200.xesar.connect.messages.query.ComponentStatus
import com.open200.xesar.connect.test.integration.MosquittoContainer
import io.kotest.common.runBlocking
import io.kotest.core.spec.style.FunSpec
import io.kotest.extensions.testcontainers.perProject
import io.kotest.matchers.equals.shouldBeEqual
import io.kotest.matchers.shouldBe
import io.mockk.coEvery
import java.time.LocalDateTime
import java.util.*
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.launch

class AddEvvaComponentTest :
FunSpec({
val container = MosquittoContainer.container()
val config = MosquittoContainer.config(container)
listener(container.perProject())
val requestConfig = XesarConnect.RequestConfig(50L)

test("add evva component returning both events") {
coEvery { config.uuidGenerator.generateId() }
.returns(UUID.fromString("00000000-1281-40ae-89d7-5c541d77a757"))
runBlocking {
val simulatedBackendReady = CompletableDeferred<Unit>()
val commandReceived = CompletableDeferred<String>()

launch {
XesarMqttClient.connectAsync(config).await().use { client ->
client.subscribeAsync(arrayOf(Topics.ALL_TOPICS)).await()

client.onMessage = { topic, payload ->
when (topic) {
Topics.Command.ADD_EVVA_COMPONENT -> {
commandReceived.complete(payload.decodeToString())
}
}
}

simulatedBackendReady.complete(Unit)

val commandContent = commandReceived.await()

commandContent.shouldBeEqual(
"{\"commandId\":\"00000000-1281-40ae-89d7-5c541d77a757\",\"id\":\"2d52bd95-18ba-4e46-8f00-0fc4c1e3f9be\",\"type\":\"Cylinder\",\"token\":\"JDJhJDEwJDFSNEljZ2FaRUNXUXBTQ25XN05KbE9qRzFHQ1VjMzkvWTBVcFpZb1M4Vmt0dnJYZ0tJVFBx\"}")

val apiEvent =
ApiEvent(
UUID.fromString("00000000-1281-40ae-89d7-5c541d77a757"),
InstallationPointChanged(
aggregateId =
UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd")))

val apiEvent2 =
ApiEvent(
UUID.fromString("00000000-1281-40ae-89d7-5c541d77a757"),
EvvaComponentAdded(
id = UUID.fromString("2d52bd95-18ba-4e46-8f00-0fc4c1e3f9be"),
evvaComponentId =
UUID.fromString("3a33c05b-133d-4b9d-a496-5d30dfd2d2c3"),
type = ComponentType.Cylinder,
stateChangedAt = LocalDateTime.MIN,
status = ComponentStatus.AssembledPrepared))

client
.publishAsync(
Topics.Event.INSTALLATION_POINT_CHANGED, encodeEvent(apiEvent))
.await()

client
.publishAsync(Topics.Event.EVVA_COMPONENT_ADDED, encodeEvent(apiEvent2))
.await()
}
}
launch {
simulatedBackendReady.await()

val api = XesarConnect.connectAndLoginAsync(config).await()
api.subscribeAsync(
Topics(
Topics.Event.INSTALLATION_POINT_CHANGED,
Topics.Event.EVVA_COMPONENT_ADDED))
.await()

val addEvvaComponentEventPair =
api.addEvvaComponentAsync(
UUID.fromString("2d52bd95-18ba-4e46-8f00-0fc4c1e3f9be"),
ComponentType.Cylinder,
requestConfig)
val test = addEvvaComponentEventPair.installationPointChangedDeferred.await()
test.aggregateId.shouldBeEqual(
UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd"))
val evvaComponentAdded =
addEvvaComponentEventPair.evvaComponentAddedDeferred.await()
evvaComponentAdded.type.shouldBe(ComponentType.Cylinder)
}
}
}
})
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.open200.xesar.connect.command
package com.open200.xesar.connect.test.integration.command

import com.open200.xesar.connect.Topics
import com.open200.xesar.connect.XesarConnect
Expand All @@ -8,7 +8,7 @@ import com.open200.xesar.connect.messages.command.AuthorizationData
import com.open200.xesar.connect.messages.event.ApiEvent
import com.open200.xesar.connect.messages.event.IndividualAuthorizationsAddedToMedium
import com.open200.xesar.connect.messages.event.encodeEvent
import com.open200.xesar.connect.testutils.MosquittoContainer
import com.open200.xesar.connect.test.integration.MosquittoContainer
import io.kotest.common.runBlocking
import io.kotest.core.spec.style.FunSpec
import io.kotest.extensions.testcontainers.perProject
Expand All @@ -23,6 +23,7 @@ class AddInstallationPointAuthorizationToMediumTest :
val container = MosquittoContainer.container()
val config = MosquittoContainer.config(container)
listener(container.perProject())
val requestConfig = XesarConnect.RequestConfig(50L)

test("add installation point authorization to medium") {
coEvery { config.uuidGenerator.generateId() }
Expand Down Expand Up @@ -80,7 +81,8 @@ class AddInstallationPointAuthorizationToMediumTest :
val result =
api.addInstallationPointAuthorizationToMediumAsync(
UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd"),
authorizationData)
authorizationData,
requestConfig)
result
.await()
.id
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.open200.xesar.connect.command
package com.open200.xesar.connect.test.integration.command

import com.open200.xesar.connect.Topics
import com.open200.xesar.connect.XesarConnect
Expand All @@ -7,7 +7,7 @@ import com.open200.xesar.connect.extension.addInstallationPointToZoneAsync
import com.open200.xesar.connect.messages.event.ApiEvent
import com.open200.xesar.connect.messages.event.InstallationPointsInZoneChanged
import com.open200.xesar.connect.messages.event.encodeEvent
import com.open200.xesar.connect.testutils.MosquittoContainer
import com.open200.xesar.connect.test.integration.MosquittoContainer
import io.kotest.common.runBlocking
import io.kotest.core.spec.style.FunSpec
import io.kotest.extensions.testcontainers.perProject
Expand All @@ -23,6 +23,7 @@ class AddInstallationPointToZoneTest :
val container = MosquittoContainer.container()
val config = MosquittoContainer.config(container)
listener(container.perProject())
val requestConfig = XesarConnect.RequestConfig(50L)

test("add installation point to zone") {
coEvery { config.uuidGenerator.generateId() }
Expand Down Expand Up @@ -73,7 +74,8 @@ class AddInstallationPointToZoneTest :
val result =
api.addInstallationPointToZoneAsync(
UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd"),
UUID.fromString("2d52bd95-18ba-4e46-8f00-0fc4c1e3f9be"))
UUID.fromString("2d52bd95-18ba-4e46-8f00-0fc4c1e3f9be"),
requestConfig)
.await()
result.addedInstallationPoints.size.shouldBeEqual(1)
result.aggregateId.shouldBeEqual(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.open200.xesar.connect.command
package com.open200.xesar.connect.test.integration.command

import com.open200.xesar.connect.Topics
import com.open200.xesar.connect.XesarConnect
Expand All @@ -8,7 +8,7 @@ import com.open200.xesar.connect.messages.command.AuthorizationData
import com.open200.xesar.connect.messages.event.ApiEvent
import com.open200.xesar.connect.messages.event.IndividualAuthorizationsAddedToMedium
import com.open200.xesar.connect.messages.event.encodeEvent
import com.open200.xesar.connect.testutils.MosquittoContainer
import com.open200.xesar.connect.test.integration.MosquittoContainer
import io.kotest.common.runBlocking
import io.kotest.core.spec.style.FunSpec
import io.kotest.extensions.testcontainers.perProject
Expand All @@ -23,6 +23,7 @@ class AddZoneAuthorizationToMediumTest :
val container = MosquittoContainer.container()
val config = MosquittoContainer.config(container)
listener(container.perProject())
val requestConfig = XesarConnect.RequestConfig(50L)

test("add installation point authorization to medium") {
coEvery { config.uuidGenerator.generateId() }
Expand Down Expand Up @@ -80,7 +81,8 @@ class AddZoneAuthorizationToMediumTest :
val result =
api.addZoneAuthorizationToMediumAsync(
UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd"),
authorizationData)
authorizationData,
requestConfig)
.await()
result.id.shouldBeEqual(UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd"))
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package com.open200.xesar.connect.test.integration.command

import com.open200.xesar.connect.Topics
import com.open200.xesar.connect.XesarConnect
import com.open200.xesar.connect.XesarMqttClient
import com.open200.xesar.connect.extension.assignAuthorizationProfileToMediumAsync
import com.open200.xesar.connect.messages.event.*
import com.open200.xesar.connect.test.integration.MosquittoContainer
import io.kotest.common.runBlocking
import io.kotest.core.spec.style.FunSpec
import io.kotest.extensions.testcontainers.perProject
import io.kotest.matchers.equals.shouldBeEqual
import io.mockk.coEvery
import java.time.LocalDateTime
import java.util.*
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.launch

class AssignAuthorizationProfileToMediumTest :
FunSpec({
val container = MosquittoContainer.container()
val config = MosquittoContainer.config(container)
listener(container.perProject())
val requestConfig = XesarConnect.RequestConfig(50L)

test("assign authorization profile to medium returning both events") {
coEvery { config.uuidGenerator.generateId() }
.returns(UUID.fromString("00000000-1281-40ae-89d7-5c541d77a757"))
runBlocking {
val simulatedBackendReady = CompletableDeferred<Unit>()
val commandReceived = CompletableDeferred<String>()

launch {
XesarMqttClient.connectAsync(config).await().use { client ->
client.subscribeAsync(arrayOf(Topics.ALL_TOPICS)).await()

client.onMessage = { topic, payload ->
when (topic) {
Topics.Command.ASSIGN_AUTHORIZATION_PROFILE_TO_MEDIUM -> {
commandReceived.complete(payload.decodeToString())
}
}
}

simulatedBackendReady.complete(Unit)

val commandContent = commandReceived.await()

commandContent.shouldBeEqual(
"{\"commandId\":\"00000000-1281-40ae-89d7-5c541d77a757\",\"authorizationProfileId\":null,\"id\":\"2d52bd95-18ba-4e46-8f00-0fc4c1e3f9be\",\"token\":\"JDJhJDEwJDFSNEljZ2FaRUNXUXBTQ25XN05KbE9qRzFHQ1VjMzkvWTBVcFpZb1M4Vmt0dnJYZ0tJVFBx\"}")

val apiEvent2 =
ApiEvent(
UUID.fromString("00000000-1281-40ae-89d7-5c541d77a757"),
MediumAuthorizationProfileChanged(
id = UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd")))

val apiEvent =
ApiEvent(
UUID.fromString("00000000-1281-40ae-89d7-5c541d77a757"),
MediumChanged(
id = UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd"),
accessBeginAt =
LocalDateTime.parse("2023-08-24T16:25:52.225991"),
changedAt = LocalDateTime.parse("2023-08-23T16:25:52.225991")))

client
.publishAsync(Topics.Event.MEDIUM_CHANGED, encodeEvent(apiEvent))
.await()

client
.publishAsync(
Topics.Event.MEDIUM_AUTHORIZATION_PROFILE_CHANGED,
encodeEvent(apiEvent2))
.await()
}
}
launch {
simulatedBackendReady.await()

val api = XesarConnect.connectAndLoginAsync(config).await()
api.subscribeAsync(
Topics(
Topics.Event.MEDIUM_CHANGED,
Topics.Event.MEDIUM_AUTHORIZATION_PROFILE_CHANGED))
.await()

val assignAuthorizationProfileToMediumResult =
api.assignAuthorizationProfileToMediumAsync(
UUID.fromString("2d52bd95-18ba-4e46-8f00-0fc4c1e3f9be"),
requestConfig = requestConfig)
val test =
assignAuthorizationProfileToMediumResult
.mediumAuthorizationProfileChangedDeferred
.await()
test.id.shouldBeEqual(UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd"))
val mediumChanged =
assignAuthorizationProfileToMediumResult.mediumChangedDeferred.await()
mediumChanged.id.shouldBeEqual(
UUID.fromString("43edc7cf-80ab-4486-86db-41cda2c7a2cd"))
}
}
}
})
Loading

0 comments on commit 344f0bf

Please sign in to comment.