3 Commits

Author SHA1 Message Date
0ed9e92441 release 0.9.12 2021-12-19 22:44:39 +03:00
1866a1bb12 endwalker support
* added sge and rpr
* changed way to define savage gear
* libraries update
2021-12-19 22:39:20 +03:00
08f7f4571e Release 0.9.11
change loggin, more tests, cosmetic changes
2020-12-12 20:15:14 +03:00
31 changed files with 133 additions and 93 deletions

View File

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

View File

@ -1,15 +1,15 @@
val AkkaVersion = "2.6.10"
val AkkaHttpVersion = "10.2.1"
val AkkaVersion = "2.6.17"
val AkkaHttpVersion = "10.2.7"
val SlickVersion = "3.3.3"
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.3"
libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.9.2"
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.9"
libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.9.4"
libraryDependencies += "com.typesafe.akka" %% "akka-http" % AkkaHttpVersion
libraryDependencies += "com.typesafe.akka" %% "akka-http-spray-json" % AkkaHttpVersion
libraryDependencies += "com.typesafe.akka" %% "akka-actor-typed" % 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 += "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-hikaricp" % SlickVersion
libraryDependencies += "org.flywaydb" % "flyway-core" % "6.0.6"
libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.32.3.2"
libraryDependencies += "org.postgresql" % "postgresql" % "42.2.18"
libraryDependencies += "org.flywaydb" % "flyway-core" % "8.2.2"
libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.36.0.3"
libraryDependencies += "org.postgresql" % "postgresql" % "42.3.1"
libraryDependencies += "org.mindrot" % "jbcrypt" % "0.3m"
libraryDependencies += "org.mindrot" % "jbcrypt" % "0.4"
// testing
libraryDependencies += "org.scalactic" %% "scalactic" % "3.1.4" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.1.4" % "test"
libraryDependencies += "org.scalactic" %% "scalactic" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "com.typesafe.akka" %% "akka-actor-testkit-typed" % AkkaVersion % "test"
libraryDependencies += "com.typesafe.akka" %% "akka-stream-testkit" % AkkaVersion % "test"

View File

@ -8,9 +8,10 @@
</root>
<logger name="me.arcanis.ffxivbis" level="DEBUG" />
<logger name="http" level="DEBUG">
<logger name="http" level="DEBUG" additivity="false">
<appender-ref ref="http" />
</logger>
<logger name="slick" level="INFO" />
<logger name="org.flywaydb.core.internal" level="INFO" />
</configuration>

View File

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

View File

@ -17,7 +17,7 @@ import spray.json._
trait HttpHandler extends StrictLogging { this: JsonSupport =>
implicit def exceptionHandler: ExceptionHandler = ExceptionHandler {
def exceptionHandler: ExceptionHandler = ExceptionHandler {
case ex: IllegalArgumentException =>
complete(StatusCodes.BadRequest, ErrorResponse(ex.getMessage))
@ -26,7 +26,7 @@ trait HttpHandler extends StrictLogging { this: JsonSupport =>
complete(StatusCodes.InternalServerError, ErrorResponse("unknown server error"))
}
implicit def rejectionHandler: RejectionHandler =
def rejectionHandler: RejectionHandler =
RejectionHandler.default
.mapRejectionResponse {
case response @ HttpResponse(_, _, entity: HttpEntity.Strict, _) =>

View File

@ -69,7 +69,7 @@ class BiSView(override val storage: ActorRef[Message],
def bisAction(playerId: PlayerId, piece: String, pieceType: String)(fn: Piece => Future[Unit]) =
getPiece(playerId, piece, pieceType) match {
case Some(item) => fn(item).map(_ => ())
case Some(item) => fn(item)
case _ => Future.failed(new Error(s"Could not construct piece from `$piece ($pieceType)`"))
}
@ -79,7 +79,7 @@ class BiSView(override val storage: ActorRef[Message],
bisAction(playerId, piece, pieceType)(addPieceBiS(playerId, _))
case (Some(piece), Some(pieceType), "remove", _) =>
bisAction(playerId, piece, pieceType)(removePieceBiS(playerId, _))
case (_, _, "create", Some(link)) => putBiS(playerId, link).map(_ => ())
case (_, _, "create", Some(link)) => putBiS(playerId, link)
case _ => Future.failed(new Error(s"Could not perform $action"))
}
case _ => Future.failed(new Error(s"Could not construct player id from `$player`"))

View File

@ -70,8 +70,8 @@ class LootView(override val storage: ActorRef[Message])
PlayerId(partyId, player) match {
case Some(playerId) => (getPiece(playerId), action) match {
case (Some(piece), "add") => addPieceLoot(playerId, piece, maybeFreeLoot).map(_ => ())
case (Some(piece), "remove") => removePieceLoot(playerId, piece).map(_ => ())
case (Some(piece), "add") => addPieceLoot(playerId, piece, maybeFreeLoot)
case (Some(piece), "remove") => removePieceLoot(playerId, piece)
case _ => Future.failed(new Error(s"Could not construct piece from `$maybePiece ($maybePieceType)`"))
}
case _ => Future.failed(new Error(s"Could not construct player id from `$player`"))

View File

@ -68,8 +68,8 @@ class PlayerView(override val storage: ActorRef[Message],
Player(-1, partyId, playerId.job, playerId.nick, BiS.empty, Seq.empty, maybeLink, maybePriority.getOrElse(0))
(action, maybePlayerId) match {
case ("add", Some(playerId)) => addPlayer(player(playerId)).map(_ => ())
case ("remove", Some(playerId)) => removePlayer(playerId).map(_ => ())
case ("add", Some(playerId)) => addPlayer(player(playerId))
case ("remove", Some(playerId)) => removePlayer(playerId)
case _ => Future.failed(new Error(s"Could not perform $action with $nick ($job)"))
}
}

View File

@ -68,10 +68,10 @@ class UserView(override val storage: ActorRef[Message])
action match {
case "add" => (maybePassword, permission) match {
case (Some(password), Some(permission)) => addUser(User(partyId, username, password, permission), isHashedPassword = false).map(_ => ())
case (Some(password), Some(permission)) => addUser(User(partyId, username, password, permission), isHashedPassword = false)
case _ => Future.failed(new Error(s"Could not construct permission/password from `$maybePermission`/`$maybePassword`"))
}
case "remove" => removeUser(partyId, username).map(_ => ())
case "remove" => removeUser(partyId, username)
case _ => Future.failed(new Error(s"Could not perform $action"))
}
}

View File

@ -62,6 +62,10 @@ object Job {
val leftSide: LeftSide = BodyMnks
val rightSide: RightSide = AccessoriesStr
}
trait Drgs extends Job {
val leftSide: LeftSide = BodyDrgs
val rightSide: RightSide = AccessoriesStr
}
trait Tanks extends Job {
val leftSide: LeftSide = BodyTanks
val rightSide: RightSide = AccessoriesVit
@ -79,12 +83,11 @@ object Job {
case object WHM extends Healers
case object SCH extends Healers
case object AST extends Healers
case object SGE extends Healers
case object MNK extends Mnks
case object DRG extends Job {
val leftSide: LeftSide = BodyDrgs
val rightSide: RightSide = AccessoriesStr
}
case object DRG extends Drgs
case object RPR extends Drgs
case object NIN extends Job {
val leftSide: LeftSide = BodyNins
val rightSide: RightSide = AccessoriesDex
@ -100,7 +103,7 @@ object Job {
case object RDM extends Casters
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)
def withName(job: String): Job.Job =

View File

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

View File

@ -7,9 +7,10 @@ object PieceType {
case object Crafted extends PieceType
case object Tome extends PieceType
case object Savage extends PieceType
case object Artifact extends PieceType
lazy val available: Seq[PieceType] =
Seq(Crafted, Tome, Savage)
Seq(Crafted, Tome, Savage, Artifact)
def withName(pieceType: String): PieceType =
available.find(_.toString.equalsIgnoreCase(pieceType)) match {

View File

@ -77,7 +77,7 @@ object BisProvider {
case "chest" => Some("body")
case "ringLeft" | "fingerL" => Some("left 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
}
}

View File

@ -101,7 +101,7 @@ object XivApi {
.getOrElse(throw new Exception(s"${shopMap(shopId).fields(s"ItemCost$index")}, $index"))
.getFields("IsUnique", "StackSize") match {
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
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 scala.concurrent.Future
import scala.util.Try
class Migration(config: Config) {
def performMigration(): Future[Int] = {
def performMigration(): Try[Boolean] = {
val section = DatabaseProfile.getSection(config)
val url = section.getString("db.url")
@ -33,11 +34,11 @@ class Migration(config: Config) {
flywayConfiguration.setDataSource(url, username, password)
val flyway = new Flyway(flywayConfiguration)
Future.successful(flyway.migrate())
Try(flyway.migrate().success)
}
}
object Migration {
def apply(config: Config): Future[Int] = new Migration(config).performMigration()
def apply(config: Config): Try[Boolean] = new Migration(config).performMigration()
}

View File

@ -17,6 +17,7 @@ import scala.concurrent.duration.FiniteDuration
import scala.language.implicitConversions
object Implicits {
implicit def getBooleanFromOptionString(maybeYes: Option[String]): Boolean = maybeYes.map(_.toLowerCase) match {
case Some("yes" | "on") => true
case _ => false

View File

@ -9,7 +9,6 @@ object Fixtures {
Head(pieceType = PieceType.Savage, Job.DNC),
Body(pieceType = PieceType.Savage, Job.DNC),
Hands(pieceType = PieceType.Tome, Job.DNC),
Waist(pieceType = PieceType.Tome, Job.DNC),
Legs(pieceType = PieceType.Tome, Job.DNC),
Feet(pieceType = PieceType.Savage, Job.DNC),
Ears(pieceType = PieceType.Savage, Job.DNC),
@ -19,16 +18,31 @@ object Fixtures {
Ring(pieceType = PieceType.Tome, Job.DNC, "right ring")
)
)
lazy val bis2: BiS = BiS(
Seq(
Weapon(pieceType = PieceType.Savage ,Job.DNC),
Head(pieceType = PieceType.Tome, Job.DNC),
Body(pieceType = PieceType.Savage, Job.DNC),
Hands(pieceType = PieceType.Tome, Job.DNC),
Legs(pieceType = PieceType.Savage, Job.DNC),
Feet(pieceType = PieceType.Tome, Job.DNC),
Ears(pieceType = PieceType.Savage, Job.DNC),
Neck(pieceType = PieceType.Savage, Job.DNC),
Wrist(pieceType = PieceType.Savage, Job.DNC),
Ring(pieceType = PieceType.Tome, Job.DNC, "left ring"),
Ring(pieceType = PieceType.Savage, Job.DNC, "right ring")
)
)
lazy val link: String = "https://ffxiv.ariyala.com/19V5R"
lazy val link2: String = "https://ffxiv.ariyala.com/1A0WM"
lazy val link3: String = "https://etro.gg/gearset/26a67536-b4ce-4adc-a46a-f70e348bb138"
lazy val link4: String = "https://etro.gg/gearset/865fc886-994f-4c28-8fc1-4379f160a916"
lazy val lootWeapon: Piece = Weapon(pieceType = PieceType.Tome, Job.AnyJob)
lazy val lootBody: Piece = Body(pieceType = PieceType.Savage, Job.AnyJob)
lazy val lootBodyCrafted: Piece = Body(pieceType = PieceType.Crafted, 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 lootEars: Piece = Ears(pieceType = PieceType.Savage, 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 route = new BiSEndpoint(party, provider)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = {
Await.result(Migration(testConfig), askTimeout)
override def beforeAll(): Unit = {
super.beforeAll()
Migration(testConfig)
Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout)
Await.result(storage.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
}
override def afterAll: Unit = {
super.afterAll()
override def afterAll(): Unit = {
Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit()
super.afterAll()
}
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 route = new LootEndpoint(party)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = {
Await.result(Migration(testConfig), askTimeout)
override def beforeAll(): Unit = {
super.beforeAll()
Migration(testConfig)
Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout)
Await.result(storage.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
}
override def afterAll: Unit = {
super.afterAll()
override def afterAll(): Unit = {
Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit()
super.afterAll()
}
"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 route = new PartyEndpoint(party, provider)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = {
Await.result(Migration(testConfig), askTimeout)
override def beforeAll(): Unit = {
super.beforeAll()
Migration(testConfig)
Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout)
}
override def afterAll: Unit = {
super.afterAll()
override def afterAll(): Unit = {
Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit()
super.afterAll()
}
"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 route = new PlayerEndpoint(party, provider)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = {
Await.result(Migration(testConfig), askTimeout)
override def beforeAll(): Unit = {
super.beforeAll()
Migration(testConfig)
Await.result(storage.ask(AddUser(Fixtures.userAdmin, isHashedPassword = true, _))(askTimeout, testKit.scheduler), askTimeout)
Await.result(storage.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
}
override def afterAll: Unit = {
super.afterAll()
override def afterAll(): Unit = {
Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit()
super.afterAll()
}
"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 route = new UserEndpoint(party)(askTimeout, testKit.scheduler).route
override def beforeAll: Unit = {
Await.result(Migration(testConfig), askTimeout)
override def beforeAll(): Unit = {
super.beforeAll()
Migration(testConfig)
}
override def afterAll: Unit = {
super.afterAll()
override def afterAll(): Unit = {
Settings.clearDatabase(testConfig)
TestKit.shutdownActorSystem(system)
testKit.shutdownTestKit()
super.afterAll()
}
"api v1 users endpoint" must {

View File

@ -46,7 +46,7 @@ class BiSTest extends AnyWordSpecLike with Matchers {
}
"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.lootBody.upgrade shouldEqual None
Fixtures.lootHands.upgrade shouldEqual Some(BodyUpgrade)
Fixtures.lootWaist.upgrade shouldEqual Some(AccessoryUpgrade)
Fixtures.lootLegs.upgrade shouldEqual None
Fixtures.lootEars.upgrade shouldEqual None
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 askTimeout: FiniteDuration = 60 seconds
override def beforeAll: Unit = {
Await.result(Migration(testKit.system.settings.config), askTimeout)
override def beforeAll(): Unit = {
super.beforeAll()
Migration(testKit.system.settings.config)
Await.result(database.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
}
override def afterAll: Unit = {
super.afterAll()
override def afterAll(): Unit = {
Settings.clearDatabase(testKit.system.settings.config)
super.afterAll()
}
"database bis handler" must {

View File

@ -19,14 +19,15 @@ class DatabaseLootHandlerTest extends ScalaTestWithActorTestKit(Settings.withRan
private val database = testKit.spawn(Database())
private val askTimeout = 60 seconds
override def beforeAll: Unit = {
Await.result(Migration(testKit.system.settings.config), askTimeout)
override def beforeAll(): Unit = {
super.beforeAll()
Migration(testKit.system.settings.config)
Await.result(database.ask(AddPlayer(Fixtures.playerEmpty, _))(askTimeout, testKit.scheduler), askTimeout)
}
override def afterAll: Unit = {
super.afterAll()
override def afterAll(): Unit = {
Settings.clearDatabase(testKit.system.settings.config)
super.afterAll()
}
"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 askTimeout = 60 seconds
override def beforeAll: Unit = {
Await.result(Migration(testKit.system.settings.config), askTimeout)
override def beforeAll(): Unit = {
super.beforeAll()
Migration(testKit.system.settings.config)
}
override def afterAll: Unit = {
super.afterAll()
override def afterAll(): Unit = {
Settings.clearDatabase(testKit.system.settings.config)
super.afterAll()
}
"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 askTimeout = 60 seconds
override def beforeAll: Unit = {
Await.result(Migration(testKit.system.settings.config), askTimeout)
override def beforeAll(): Unit = {
super.beforeAll()
Migration(testKit.system.settings.config)
}
override def afterAll: Unit = {
super.afterAll()
override def afterAll(): Unit = {
Settings.clearDatabase(testKit.system.settings.config)
super.afterAll()
}
"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
override def beforeAll(): Unit = {
super.beforeAll()
val testKit = ActorTestKit(Settings.withRandomDatabase)
val provider = testKit.spawn(BisProvider())

View File

@ -29,5 +29,11 @@ class BisProviderTest extends ScalaTestWithActorTestKit(Settings.withRandomDatab
probe.expectMessage(askTimeout, Fixtures.bis)
}
"get best in slot set (etro 2)" in {
val probe = testKit.createTestProbe[BiS]()
provider ! DownloadBiS(Fixtures.link4, Job.DNC, probe.ref)
probe.expectMessage(askTimeout, Fixtures.bis2)
}
}
}

View File

@ -1 +1 @@
version := "0.9.10"
version := "0.9.12"