endwalker support

* added sge and rpr
* changed way to define savage gear
* libraries update
This commit is contained in:
Evgenii Alekseev 2021-12-19 22:39:20 +03:00
parent 08f7f4571e
commit 1866a1bb12
21 changed files with 95 additions and 81 deletions

View File

@ -1,6 +1,6 @@
name := "ffxivbis" name := "ffxivbis"
scalaVersion := "2.13.1" scalaVersion := "2.13.6"
scalacOptions ++= Seq("-deprecation", "-feature") scalacOptions ++= Seq("-deprecation", "-feature")

View File

@ -1,15 +1,15 @@
val AkkaVersion = "2.6.10" val AkkaVersion = "2.6.17"
val AkkaHttpVersion = "10.2.1" val AkkaHttpVersion = "10.2.7"
val SlickVersion = "3.3.3" val SlickVersion = "3.3.3"
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.3" libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.9"
libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.9.2" libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.9.4"
libraryDependencies += "com.typesafe.akka" %% "akka-http" % AkkaHttpVersion libraryDependencies += "com.typesafe.akka" %% "akka-http" % AkkaHttpVersion
libraryDependencies += "com.typesafe.akka" %% "akka-http-spray-json" % AkkaHttpVersion libraryDependencies += "com.typesafe.akka" %% "akka-http-spray-json" % AkkaHttpVersion
libraryDependencies += "com.typesafe.akka" %% "akka-actor-typed" % AkkaVersion libraryDependencies += "com.typesafe.akka" %% "akka-actor-typed" % AkkaVersion
libraryDependencies += "com.typesafe.akka" %% "akka-stream" % AkkaVersion libraryDependencies += "com.typesafe.akka" %% "akka-stream" % AkkaVersion
libraryDependencies += "com.github.swagger-akka-http" %% "swagger-akka-http" % "2.3.0" libraryDependencies += "com.github.swagger-akka-http" %% "swagger-akka-http" % "2.6.0"
libraryDependencies += "javax.ws.rs" % "javax.ws.rs-api" % "2.1.1" libraryDependencies += "javax.ws.rs" % "javax.ws.rs-api" % "2.1.1"
libraryDependencies += "io.spray" %% "spray-json" % "1.3.6" libraryDependencies += "io.spray" %% "spray-json" % "1.3.6"
@ -17,16 +17,16 @@ libraryDependencies += "com.lihaoyi" %% "scalatags" % "0.9.2"
libraryDependencies += "com.typesafe.slick" %% "slick" % SlickVersion libraryDependencies += "com.typesafe.slick" %% "slick" % SlickVersion
libraryDependencies += "com.typesafe.slick" %% "slick-hikaricp" % SlickVersion libraryDependencies += "com.typesafe.slick" %% "slick-hikaricp" % SlickVersion
libraryDependencies += "org.flywaydb" % "flyway-core" % "6.0.6" libraryDependencies += "org.flywaydb" % "flyway-core" % "8.2.2"
libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.32.3.2" libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.36.0.3"
libraryDependencies += "org.postgresql" % "postgresql" % "42.2.18" libraryDependencies += "org.postgresql" % "postgresql" % "42.3.1"
libraryDependencies += "org.mindrot" % "jbcrypt" % "0.3m" libraryDependencies += "org.mindrot" % "jbcrypt" % "0.4"
// testing // testing
libraryDependencies += "org.scalactic" %% "scalactic" % "3.1.4" % "test" libraryDependencies += "org.scalactic" %% "scalactic" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.1.4" % "test" libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "com.typesafe.akka" %% "akka-actor-testkit-typed" % AkkaVersion % "test" libraryDependencies += "com.typesafe.akka" %% "akka-actor-testkit-typed" % AkkaVersion % "test"
libraryDependencies += "com.typesafe.akka" %% "akka-stream-testkit" % AkkaVersion % "test" libraryDependencies += "com.typesafe.akka" %% "akka-stream-testkit" % AkkaVersion % "test"

View File

@ -11,6 +11,7 @@ package me.arcanis.ffxivbis
import akka.actor.typed.{Behavior, PostStop, Signal} import akka.actor.typed.{Behavior, PostStop, Signal}
import akka.actor.typed.scaladsl.{AbstractBehavior, ActorContext, Behaviors} import akka.actor.typed.scaladsl.{AbstractBehavior, ActorContext, Behaviors}
import akka.http.scaladsl.Http import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Route
import akka.stream.Materializer import akka.stream.Materializer
import com.typesafe.scalalogging.StrictLogging import com.typesafe.scalalogging.StrictLogging
import me.arcanis.ffxivbis.http.RootEndpoint import me.arcanis.ffxivbis.http.RootEndpoint
@ -19,6 +20,7 @@ import me.arcanis.ffxivbis.service.{Database, PartyService}
import me.arcanis.ffxivbis.storage.Migration import me.arcanis.ffxivbis.storage.Migration
import scala.concurrent.ExecutionContext import scala.concurrent.ExecutionContext
import scala.util.{Failure, Success}
class Application(context: ActorContext[Nothing]) class Application(context: ActorContext[Nothing])
extends AbstractBehavior[Nothing](context) with StrictLogging { extends AbstractBehavior[Nothing](context) with StrictLogging {
@ -42,14 +44,20 @@ class Application(context: ActorContext[Nothing])
implicit val executionContext: ExecutionContext = context.system.executionContext implicit val executionContext: ExecutionContext = context.system.executionContext
implicit val materializer: Materializer = Materializer(context) implicit val materializer: Materializer = Materializer(context)
Migration(config) Migration(config) match {
case Success(_) =>
val bisProvider = context.spawn(BisProvider(), "bis-provider")
val storage = context.spawn(Database(), "storage")
val party = context.spawn(PartyService(storage), "party")
val http = new RootEndpoint(context.system, party, bisProvider)
val bisProvider = context.spawn(BisProvider(), "bis-provider") val flow = Route.toFlow(http.route)(context.system)
val storage = context.spawn(Database(), "storage") Http(context.system).newServerAt(host, port).bindFlow(flow)
val party = context.spawn(PartyService(storage), "party")
val http = new RootEndpoint(context.system, party, bisProvider)
Http()(context.system).newServerAt(host, port).bindFlow(http.route) case Failure(exception) =>
logger.error("exception during migration", exception)
context.system.terminate()
}
} }
} }

View File

@ -62,6 +62,10 @@ object Job {
val leftSide: LeftSide = BodyMnks val leftSide: LeftSide = BodyMnks
val rightSide: RightSide = AccessoriesStr val rightSide: RightSide = AccessoriesStr
} }
trait Drgs extends Job {
val leftSide: LeftSide = BodyDrgs
val rightSide: RightSide = AccessoriesStr
}
trait Tanks extends Job { trait Tanks extends Job {
val leftSide: LeftSide = BodyTanks val leftSide: LeftSide = BodyTanks
val rightSide: RightSide = AccessoriesVit val rightSide: RightSide = AccessoriesVit
@ -79,12 +83,11 @@ object Job {
case object WHM extends Healers case object WHM extends Healers
case object SCH extends Healers case object SCH extends Healers
case object AST extends Healers case object AST extends Healers
case object SGE extends Healers
case object MNK extends Mnks case object MNK extends Mnks
case object DRG extends Job { case object DRG extends Drgs
val leftSide: LeftSide = BodyDrgs case object RPR extends Drgs
val rightSide: RightSide = AccessoriesStr
}
case object NIN extends Job { case object NIN extends Job {
val leftSide: LeftSide = BodyNins val leftSide: LeftSide = BodyNins
val rightSide: RightSide = AccessoriesDex val rightSide: RightSide = AccessoriesDex
@ -100,7 +103,7 @@ object Job {
case object RDM extends Casters case object RDM extends Casters
lazy val available: Seq[Job] = lazy val available: Seq[Job] =
Seq(PLD, WAR, DRK, GNB, WHM, SCH, AST, MNK, DRG, NIN, SAM, BRD, MCH, DNC, BLM, SMN, RDM) Seq(PLD, WAR, DRK, GNB, WHM, SCH, AST, SGE, MNK, DRG, RPR, NIN, SAM, BRD, MCH, DNC, BLM, SMN, RDM)
lazy val availableWithAnyJob: Seq[Job] = available.prepended(AnyJob) lazy val availableWithAnyJob: Seq[Job] = available.prepended(AnyJob)
def withName(job: String): Job.Job = def withName(job: String): Job.Job =

View File

@ -16,12 +16,13 @@ sealed trait Piece extends Equals {
def withJob(other: Job.Job): Piece def withJob(other: Job.Job): Piece
def upgrade: Option[PieceUpgrade] = this match { def upgrade: Option[PieceUpgrade] = {
case _ if pieceType != PieceType.Tome => None val isTome = pieceType == PieceType.Tome
case _: Waist => Some(AccessoryUpgrade) Some(this).collect {
case _: PieceAccessory => Some(AccessoryUpgrade) case _: PieceAccessory if isTome => AccessoryUpgrade
case _: PieceBody => Some(BodyUpgrade) case _: PieceBody if isTome => BodyUpgrade
case _: PieceWeapon => Some(WeaponUpgrade) case _: PieceWeapon if isTome => WeaponUpgrade
}
} }
// used for ring comparison // used for ring comparison
@ -54,10 +55,6 @@ case class Hands(override val pieceType: PieceType.PieceType, override val job:
val piece: String = "hands" val piece: String = "hands"
def withJob(other: Job.Job): Piece = copy(job = other) def withJob(other: Job.Job): Piece = copy(job = other)
} }
case class Waist(override val pieceType: PieceType.PieceType, override val job: Job.Job) extends PieceBody {
val piece: String = "waist"
def withJob(other: Job.Job): Piece = copy(job = other)
}
case class Legs(override val pieceType: PieceType.PieceType, override val job: Job.Job) extends PieceBody { case class Legs(override val pieceType: PieceType.PieceType, override val job: Job.Job) extends PieceBody {
val piece: String = "legs" val piece: String = "legs"
def withJob(other: Job.Job): Piece = copy(job = other) def withJob(other: Job.Job): Piece = copy(job = other)
@ -111,7 +108,6 @@ object Piece {
case "head" => Head(pieceType, job) case "head" => Head(pieceType, job)
case "body" => Body(pieceType, job) case "body" => Body(pieceType, job)
case "hands" => Hands(pieceType, job) case "hands" => Hands(pieceType, job)
case "waist" => Waist(pieceType, job)
case "legs" => Legs(pieceType, job) case "legs" => Legs(pieceType, job)
case "feet" => Feet(pieceType, job) case "feet" => Feet(pieceType, job)
case "ears" => Ears(pieceType, job) case "ears" => Ears(pieceType, job)
@ -125,7 +121,7 @@ object Piece {
} }
lazy val available: Seq[String] = Seq("weapon", lazy val available: Seq[String] = Seq("weapon",
"head", "body", "hands", "waist", "legs", "feet", "head", "body", "hands", "legs", "feet",
"ears", "neck", "wrist", "left ring", "right ring", "ears", "neck", "wrist", "left ring", "right ring",
"accessory upgrade", "body upgrade", "weapon upgrade") "accessory upgrade", "body upgrade", "weapon upgrade")
} }

View File

@ -77,7 +77,7 @@ object BisProvider {
case "chest" => Some("body") case "chest" => Some("body")
case "ringLeft" | "fingerL" => Some("left ring") case "ringLeft" | "fingerL" => Some("left ring")
case "ringRight" | "fingerR" => Some("right ring") case "ringRight" | "fingerR" => Some("right ring")
case "weapon" | "head" | "body" | "hands" | "waist" | "legs" | "feet" | "ears" | "neck" | "wrist" | "wrists" => Some(key) case "weapon" | "head" | "body" | "hands" | "legs" | "feet" | "ears" | "neck" | "wrist" | "wrists" => Some(key)
case _ => None case _ => None
} }
} }

View File

@ -101,7 +101,7 @@ object XivApi {
.getOrElse(throw new Exception(s"${shopMap(shopId).fields(s"ItemCost$index")}, $index")) .getOrElse(throw new Exception(s"${shopMap(shopId).fields(s"ItemCost$index")}, $index"))
.getFields("IsUnique", "StackSize") match { .getFields("IsUnique", "StackSize") match {
case Seq(JsNumber(isUnique), JsNumber(stackSize)) => case Seq(JsNumber(isUnique), JsNumber(stackSize)) =>
if (isUnique == 1 || stackSize.toLong == 2000) PieceType.Tome // either upgraded gear or tomes found if (isUnique == 1 || stackSize.toLong != 999) PieceType.Tome // either upgraded gear or tomes found
else PieceType.Savage else PieceType.Savage
case other => throw deserializationError(s"Could not parse $other") case other => throw deserializationError(s"Could not parse $other")
} }

View File

@ -13,10 +13,11 @@ import org.flywaydb.core.Flyway
import org.flywaydb.core.api.configuration.ClassicConfiguration import org.flywaydb.core.api.configuration.ClassicConfiguration
import scala.concurrent.Future import scala.concurrent.Future
import scala.util.Try
class Migration(config: Config) { class Migration(config: Config) {
def performMigration(): Future[Int] = { def performMigration(): Try[Boolean] = {
val section = DatabaseProfile.getSection(config) val section = DatabaseProfile.getSection(config)
val url = section.getString("db.url") val url = section.getString("db.url")
@ -33,11 +34,11 @@ class Migration(config: Config) {
flywayConfiguration.setDataSource(url, username, password) flywayConfiguration.setDataSource(url, username, password)
val flyway = new Flyway(flywayConfiguration) val flyway = new Flyway(flywayConfiguration)
Future.successful(flyway.migrate()) Try(flyway.migrate().success)
} }
} }
object Migration { object Migration {
def apply(config: Config): Future[Int] = new Migration(config).performMigration() def apply(config: Config): Try[Boolean] = new Migration(config).performMigration()
} }

View File

@ -9,7 +9,6 @@ object Fixtures {
Head(pieceType = PieceType.Savage, Job.DNC), Head(pieceType = PieceType.Savage, Job.DNC),
Body(pieceType = PieceType.Savage, Job.DNC), Body(pieceType = PieceType.Savage, Job.DNC),
Hands(pieceType = PieceType.Tome, Job.DNC), Hands(pieceType = PieceType.Tome, Job.DNC),
Waist(pieceType = PieceType.Tome, Job.DNC),
Legs(pieceType = PieceType.Tome, Job.DNC), Legs(pieceType = PieceType.Tome, Job.DNC),
Feet(pieceType = PieceType.Savage, Job.DNC), Feet(pieceType = PieceType.Savage, Job.DNC),
Ears(pieceType = PieceType.Savage, Job.DNC), Ears(pieceType = PieceType.Savage, Job.DNC),
@ -25,7 +24,6 @@ object Fixtures {
Head(pieceType = PieceType.Tome, Job.DNC), Head(pieceType = PieceType.Tome, Job.DNC),
Body(pieceType = PieceType.Savage, Job.DNC), Body(pieceType = PieceType.Savage, Job.DNC),
Hands(pieceType = PieceType.Tome, Job.DNC), Hands(pieceType = PieceType.Tome, Job.DNC),
Waist(pieceType = PieceType.Tome, Job.DNC),
Legs(pieceType = PieceType.Savage, Job.DNC), Legs(pieceType = PieceType.Savage, Job.DNC),
Feet(pieceType = PieceType.Tome, Job.DNC), Feet(pieceType = PieceType.Tome, Job.DNC),
Ears(pieceType = PieceType.Savage, Job.DNC), Ears(pieceType = PieceType.Savage, Job.DNC),
@ -45,7 +43,6 @@ object Fixtures {
lazy val lootBody: Piece = Body(pieceType = PieceType.Savage, Job.AnyJob) lazy val lootBody: Piece = Body(pieceType = PieceType.Savage, Job.AnyJob)
lazy val lootBodyCrafted: Piece = Body(pieceType = PieceType.Crafted, Job.AnyJob) lazy val lootBodyCrafted: Piece = Body(pieceType = PieceType.Crafted, Job.AnyJob)
lazy val lootHands: Piece = Hands(pieceType = PieceType.Tome, Job.AnyJob) lazy val lootHands: Piece = Hands(pieceType = PieceType.Tome, Job.AnyJob)
lazy val lootWaist: Piece = Waist(pieceType = PieceType.Tome, Job.AnyJob)
lazy val lootLegs: Piece = Legs(pieceType = PieceType.Savage, Job.AnyJob) lazy val lootLegs: Piece = Legs(pieceType = PieceType.Savage, Job.AnyJob)
lazy val lootEars: Piece = Ears(pieceType = PieceType.Savage, Job.AnyJob) lazy val lootEars: Piece = Ears(pieceType = PieceType.Savage, Job.AnyJob)
lazy val lootRing: Piece = Ring(pieceType = PieceType.Tome, Job.AnyJob) lazy val lootRing: Piece = Ring(pieceType = PieceType.Tome, Job.AnyJob)

View File

@ -39,17 +39,18 @@ class BiSEndpointTest extends AnyWordSpecLike with Matchers with ScalatestRouteT
private val party = testKit.spawn(PartyService(storage)) private val party = testKit.spawn(PartyService(storage))
private val route = new BiSEndpoint(party, provider)(askTimeout, testKit.scheduler).route private val route = new BiSEndpoint(party, provider)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = { override def beforeAll(): Unit = {
Await.result(Migration(testConfig), askTimeout) super.beforeAll()
Migration(testConfig)
Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout) Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout)
Await.result(storage.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout) Await.result(storage.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
} }
override def afterAll: Unit = { override def afterAll(): Unit = {
super.afterAll()
Settings.clearDatabase(testConfig) Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system) TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit() testKit.shutdownTestKit()
super.afterAll()
} }
private def compareBiSResponse(actual: PlayerResponse, expected: PlayerResponse): Unit = { private def compareBiSResponse(actual: PlayerResponse, expected: PlayerResponse): Unit = {

View File

@ -37,17 +37,18 @@ class LootEndpointTest extends AnyWordSpecLike with Matchers with ScalatestRoute
private val party = testKit.spawn(PartyService(storage)) private val party = testKit.spawn(PartyService(storage))
private val route = new LootEndpoint(party)(askTimeout, testKit.scheduler).route private val route = new LootEndpoint(party)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = { override def beforeAll(): Unit = {
Await.result(Migration(testConfig), askTimeout) super.beforeAll()
Migration(testConfig)
Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout) Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout)
Await.result(storage.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout) Await.result(storage.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
} }
override def afterAll: Unit = { override def afterAll(): Unit = {
super.afterAll()
Settings.clearDatabase(testConfig) Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system) TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit() testKit.shutdownTestKit()
super.afterAll()
} }
"api v1 loot endpoint" must { "api v1 loot endpoint" must {

View File

@ -37,16 +37,17 @@ class PartyEndpointTest extends AnyWordSpecLike with Matchers with ScalatestRout
private val party = testKit.spawn(PartyService(storage)) private val party = testKit.spawn(PartyService(storage))
private val route = new PartyEndpoint(party, provider)(askTimeout, testKit.scheduler).route private val route = new PartyEndpoint(party, provider)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = { override def beforeAll(): Unit = {
Await.result(Migration(testConfig), askTimeout) super.beforeAll()
Migration(testConfig)
Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout) Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout)
} }
override def afterAll: Unit = { override def afterAll(): Unit = {
super.afterAll()
Settings.clearDatabase(testConfig) Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system) TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit() testKit.shutdownTestKit()
super.afterAll()
} }
"api v1 party endpoint" must { "api v1 party endpoint" must {

View File

@ -36,17 +36,18 @@ class PlayerEndpointTest extends AnyWordSpecLike with Matchers with ScalatestRou
private val party = testKit.spawn(PartyService(storage)) private val party = testKit.spawn(PartyService(storage))
private val route = new PlayerEndpoint(party, provider)(askTimeout, testKit.scheduler).route private val route = new PlayerEndpoint(party, provider)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = { override def beforeAll(): Unit = {
Await.result(Migration(testConfig), askTimeout) super.beforeAll()
Migration(testConfig)
Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout) Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout)
Await.result(storage.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout) Await.result(storage.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
} }
override def afterAll: Unit = { override def afterAll(): Unit = {
super.afterAll()
Settings.clearDatabase(testConfig) Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system) TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit() testKit.shutdownTestKit()
super.afterAll()
} }
"api v1 player endpoint" must { "api v1 player endpoint" must {

View File

@ -33,15 +33,16 @@ class UserEndpointTest extends AnyWordSpecLike with Matchers with ScalatestRoute
private val party = testKit.spawn(PartyService(storage)) private val party = testKit.spawn(PartyService(storage))
private val route = new UserEndpoint(party)(askTimeout, testKit.scheduler).route private val route = new UserEndpoint(party)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = { override def beforeAll(): Unit = {
Await.result(Migration(testConfig), askTimeout) super.beforeAll()
Migration(testConfig)
} }
override def afterAll: Unit = { override def afterAll(): Unit = {
super.afterAll()
Settings.clearDatabase(testConfig) Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system) TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit() testKit.shutdownTestKit()
super.afterAll()
} }
"api v1 users endpoint" must { "api v1 users endpoint" must {

View File

@ -46,7 +46,7 @@ class BiSTest extends AnyWordSpecLike with Matchers {
} }
"return upgrade list" in { "return upgrade list" in {
Compare.mapEquals(Fixtures.bis.upgrades, Map[PieceUpgrade, Int](BodyUpgrade -> 2, AccessoryUpgrade -> 4)) shouldEqual true Compare.mapEquals(Fixtures.bis.upgrades, Map[PieceUpgrade, Int](BodyUpgrade -> 2, AccessoryUpgrade -> 3)) shouldEqual true
} }
} }

View File

@ -12,7 +12,6 @@ class PieceTest extends AnyWordSpecLike with Matchers {
Fixtures.lootWeapon.upgrade shouldEqual Some(WeaponUpgrade) Fixtures.lootWeapon.upgrade shouldEqual Some(WeaponUpgrade)
Fixtures.lootBody.upgrade shouldEqual None Fixtures.lootBody.upgrade shouldEqual None
Fixtures.lootHands.upgrade shouldEqual Some(BodyUpgrade) Fixtures.lootHands.upgrade shouldEqual Some(BodyUpgrade)
Fixtures.lootWaist.upgrade shouldEqual Some(AccessoryUpgrade)
Fixtures.lootLegs.upgrade shouldEqual None Fixtures.lootLegs.upgrade shouldEqual None
Fixtures.lootEars.upgrade shouldEqual None Fixtures.lootEars.upgrade shouldEqual None
Fixtures.lootLeftRing.upgrade shouldEqual Some(AccessoryUpgrade) Fixtures.lootLeftRing.upgrade shouldEqual Some(AccessoryUpgrade)

View File

@ -19,14 +19,15 @@ class DatabaseBiSHandlerTest extends ScalaTestWithActorTestKit(Settings.withRand
private val database = testKit.spawn(Database()) private val database = testKit.spawn(Database())
private val askTimeout: FiniteDuration = 60 seconds private val askTimeout: FiniteDuration = 60 seconds
override def beforeAll: Unit = { override def beforeAll(): Unit = {
Await.result(Migration(testKit.system.settings.config), askTimeout) super.beforeAll()
Migration(testKit.system.settings.config)
Await.result(database.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout) Await.result(database.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
} }
override def afterAll: Unit = { override def afterAll(): Unit = {
super.afterAll()
Settings.clearDatabase(testKit.system.settings.config) Settings.clearDatabase(testKit.system.settings.config)
super.afterAll()
} }
"database bis handler" must { "database bis handler" must {

View File

@ -19,14 +19,15 @@ class DatabaseLootHandlerTest extends ScalaTestWithActorTestKit(Settings.withRan
private val database = testKit.spawn(Database()) private val database = testKit.spawn(Database())
private val askTimeout = 60 seconds private val askTimeout = 60 seconds
override def beforeAll: Unit = { override def beforeAll(): Unit = {
Await.result(Migration(testKit.system.settings.config), askTimeout) super.beforeAll()
Migration(testKit.system.settings.config)
Await.result(database.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout) Await.result(database.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
} }
override def afterAll: Unit = { override def afterAll(): Unit = {
super.afterAll()
Settings.clearDatabase(testKit.system.settings.config) Settings.clearDatabase(testKit.system.settings.config)
super.afterAll()
} }
"database loot handler actor" must { "database loot handler actor" must {

View File

@ -18,13 +18,14 @@ class DatabasePartyHandlerTest extends ScalaTestWithActorTestKit(Settings.withRa
private val database = testKit.spawn(Database()) private val database = testKit.spawn(Database())
private val askTimeout = 60 seconds private val askTimeout = 60 seconds
override def beforeAll: Unit = { override def beforeAll(): Unit = {
Await.result(Migration(testKit.system.settings.config), askTimeout) super.beforeAll()
Migration(testKit.system.settings.config)
} }
override def afterAll: Unit = { override def afterAll(): Unit = {
super.afterAll()
Settings.clearDatabase(testKit.system.settings.config) Settings.clearDatabase(testKit.system.settings.config)
super.afterAll()
} }
"database party handler actor" must { "database party handler actor" must {

View File

@ -18,13 +18,14 @@ class DatabaseUserHandlerTest extends ScalaTestWithActorTestKit(Settings.withRan
private val database = testKit.spawn(Database()) private val database = testKit.spawn(Database())
private val askTimeout = 60 seconds private val askTimeout = 60 seconds
override def beforeAll: Unit = { override def beforeAll(): Unit = {
Await.result(Migration(testKit.system.settings.config), askTimeout) super.beforeAll()
Migration(testKit.system.settings.config)
} }
override def afterAll: Unit = { override def afterAll(): Unit = {
super.afterAll()
Settings.clearDatabase(testKit.system.settings.config) Settings.clearDatabase(testKit.system.settings.config)
super.afterAll()
} }
"database user handler actor" must { "database user handler actor" must {

View File

@ -24,6 +24,7 @@ class LootSelectorTest extends AnyWordSpecLike with Matchers with BeforeAndAfter
private val timeout: FiniteDuration = 60 seconds private val timeout: FiniteDuration = 60 seconds
override def beforeAll(): Unit = { override def beforeAll(): Unit = {
super.beforeAll()
val testKit = ActorTestKit(Settings.withRandomDatabase) val testKit = ActorTestKit(Settings.withRandomDatabase)
val provider = testKit.spawn(BisProvider()) val provider = testKit.spawn(BisProvider())