diff --git a/README.md b/README.md index 30c9af6..200f97a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,19 @@ # Balta -Scala library to write Postgres DB code tests with +Balta makes testing DB entities from Scala easier. It's primarily focused on testing the behavior of [Postgres functions](https://www.postgresql.org/docs/current/xfunc.html). + +--- + +### Build Status + +[![Build](https://github.com/AbsaOSS/balta/workflows/Build/badge.svg)](https://github.com/AbsaOSS/balta/actions) + +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/za.co.absa.db/balta_2.12/badge.svg)](https://search.maven.org/search?q=g:za.co.absa.db.balta) + +--- Balta is a Scala library to help creating database tests, particularly testing Database functions. It is based on the -popular [ScalaTest](http://www.scalatest.org/) library and uses [PostgreSQL](https://www.postgresql.org/) as the -database engine. +popular [ScalaTest](http://www.scalatest.org/) library and uses [PostgreSQL](https://www.postgresql.org/) as the database engine. It's a natural complement to the use of [Fa-Db library](https://github.com/AbsaOSS/fa-db) in applications. diff --git a/balta/src/main/scala/za/co/absa/balta/classes/package.scala b/balta/src/main/scala/za/co/absa/balta/classes/package.scala deleted file mode 100644 index e24fb09..0000000 --- a/balta/src/main/scala/za/co/absa/balta/classes/package.scala +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2023 ABSA Group Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package za.co.absa.balta - -import java.sql.Connection - -package object classes { - case class JsonBString(value: String) extends AnyVal - - class DBConnection(val connection: Connection) extends AnyVal - - /** - * This is a function that sets a parameter of a prepared statement. - * - * @param dbUrl - the JDBC URL of the database - * @param username - the username to use when connecting to the database - * @param password - the password to use when connecting to the database - * @param persistData - whether to persist the data to the database (usually false for tests, set to true for - * debugging purposes) - */ - case class ConnectionInfo( - dbUrl: String, - username: String, - password: String, - persistData: Boolean - ) - -} diff --git a/balta/src/main/scala/za/co/absa/balta/DBTestSuite.scala b/balta/src/main/scala/za/co/absa/db/balta/DBTestSuite.scala similarity index 87% rename from balta/src/main/scala/za/co/absa/balta/DBTestSuite.scala rename to balta/src/main/scala/za/co/absa/db/balta/DBTestSuite.scala index 830f2ff..15e7eb8 100644 --- a/balta/src/main/scala/za/co/absa/balta/DBTestSuite.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/DBTestSuite.scala @@ -14,17 +14,17 @@ * limitations under the License. */ -package za.co.absa.balta +package za.co.absa.db.balta import org.scalactic.source import org.scalatest.Tag import org.scalatest.funsuite.AnyFunSuite -import za.co.absa.balta.classes.DBFunction.DBFunctionWithPositionedParamsOnly -import za.co.absa.balta.classes.setter.{AllowedParamTypes, Params} -import za.co.absa.balta.classes.setter.Params.{NamedParams, OrderedParams} -import za.co.absa.balta.classes.{ConnectionInfo, DBConnection, DBFunction, DBTable, QueryResult} +import za.co.absa.db.balta.classes.DBFunction.DBFunctionWithPositionedParamsOnly +import classes.setter.{AllowedParamTypes, Params} +import za.co.absa.db.balta.classes.setter.Params.{NamedParams, OrderedParams} +import classes.{DBConnection, DBFunction, DBTable, QueryResult} +import za.co.absa.db.balta.classes.simple.ConnectionInfo -import java.sql.DriverManager import java.time.OffsetDateTime import java.util.Properties @@ -39,13 +39,7 @@ abstract class DBTestSuite extends AnyFunSuite { /* the DB connection is ``lazy`, so it actually can be created only when needed and therefore the credentials overridden in the successor */ - protected lazy implicit val dbConnection: DBConnection = { - createConnection( - connectionInfo.dbUrl, - connectionInfo.username, - connectionInfo.password - ) - } + protected lazy implicit val dbConnection: DBConnection = DBConnection(connectionInfo) /** * This is the connection info for the DB. It can be overridden in the derived classes to provide specific credentials @@ -152,12 +146,6 @@ abstract class DBTestSuite extends AnyFunSuite { } // private functions - private def createConnection(url: String, username: String, password: String): DBConnection = { - val conn = DriverManager.getConnection(url, username, password) - conn.setAutoCommit(false) - new DBConnection(conn) - } - private def readConnectionInfoFromConfig = { val properties = new Properties() properties.load(getClass.getResourceAsStream("/database.properties")) diff --git a/balta/src/main/scala/za/co/absa/db/balta/classes/DBConnection.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/DBConnection.scala new file mode 100644 index 0000000..e3a1c87 --- /dev/null +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/DBConnection.scala @@ -0,0 +1,31 @@ +/* + * Copyright 2023 ABSA Group Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package za.co.absa.db.balta.classes + +import za.co.absa.db.balta.classes.simple.ConnectionInfo + +import java.sql.{Connection, DriverManager} + +class DBConnection(val connection: Connection) extends AnyVal + +object DBConnection { + def apply(connectionInfo: =>ConnectionInfo): DBConnection = { + val connection = DriverManager.getConnection(connectionInfo.dbUrl, connectionInfo.username, connectionInfo.password) + connection.setAutoCommit(false) + new DBConnection(connection) + } +} diff --git a/balta/src/main/scala/za/co/absa/balta/classes/DBFunction.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/DBFunction.scala similarity index 97% rename from balta/src/main/scala/za/co/absa/balta/classes/DBFunction.scala rename to balta/src/main/scala/za/co/absa/db/balta/classes/DBFunction.scala index 9264424..8f39e50 100644 --- a/balta/src/main/scala/za/co/absa/balta/classes/DBFunction.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/DBFunction.scala @@ -14,10 +14,10 @@ * limitations under the License. */ -package za.co.absa.balta.classes +package za.co.absa.db.balta.classes -import za.co.absa.balta.classes.DBFunction.{DBFunctionWithNamedParamsToo, DBFunctionWithPositionedParamsOnly, ParamsMap} -import za.co.absa.balta.classes.setter.{AllowedParamTypes, SetterFnc} +import DBFunction.{DBFunctionWithNamedParamsToo, DBFunctionWithPositionedParamsOnly, ParamsMap} +import za.co.absa.db.balta.classes.setter.{AllowedParamTypes, SetterFnc} import scala.collection.immutable.ListMap diff --git a/balta/src/main/scala/za/co/absa/balta/classes/DBQuerySupport.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/DBQuerySupport.scala similarity index 93% rename from balta/src/main/scala/za/co/absa/balta/classes/DBQuerySupport.scala rename to balta/src/main/scala/za/co/absa/db/balta/classes/DBQuerySupport.scala index 2668b68..ac3e1f1 100644 --- a/balta/src/main/scala/za/co/absa/balta/classes/DBQuerySupport.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/DBQuerySupport.scala @@ -14,9 +14,9 @@ * limitations under the License. */ -package za.co.absa.balta.classes +package za.co.absa.db.balta.classes -import za.co.absa.balta.classes.setter.SetterFnc +import za.co.absa.db.balta.classes.setter.SetterFnc /** * This is a based trait providing the ability to run an SQL query and verify the result via a provided function. diff --git a/balta/src/main/scala/za/co/absa/balta/classes/DBTable.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/DBTable.scala similarity index 98% rename from balta/src/main/scala/za/co/absa/balta/classes/DBTable.scala rename to balta/src/main/scala/za/co/absa/db/balta/classes/DBTable.scala index 0f142b1..9281125 100644 --- a/balta/src/main/scala/za/co/absa/balta/classes/DBTable.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/DBTable.scala @@ -14,10 +14,10 @@ * limitations under the License. */ -package za.co.absa.balta.classes +package za.co.absa.db.balta.classes -import za.co.absa.balta.classes.setter.{AllowedParamTypes, Params, SetterFnc} -import za.co.absa.balta.classes.setter.Params.NamedParams +import za.co.absa.db.balta.classes.setter.{AllowedParamTypes, Params, SetterFnc} +import za.co.absa.db.balta.classes.setter.Params.NamedParams /** * This class represents a database table. It allows to perform INSERT, SELECT and COUNT operations on the table easily. diff --git a/balta/src/main/scala/za/co/absa/balta/classes/QueryResult.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/QueryResult.scala similarity index 97% rename from balta/src/main/scala/za/co/absa/balta/classes/QueryResult.scala rename to balta/src/main/scala/za/co/absa/db/balta/classes/QueryResult.scala index 58a0f55..a429a6a 100644 --- a/balta/src/main/scala/za/co/absa/balta/classes/QueryResult.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/QueryResult.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package za.co.absa.balta.classes +package za.co.absa.db.balta.classes import java.sql.ResultSet diff --git a/balta/src/main/scala/za/co/absa/balta/classes/QueryResultRow.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/QueryResultRow.scala similarity index 97% rename from balta/src/main/scala/za/co/absa/balta/classes/QueryResultRow.scala rename to balta/src/main/scala/za/co/absa/db/balta/classes/QueryResultRow.scala index 28969e5..ab474a4 100644 --- a/balta/src/main/scala/za/co/absa/balta/classes/QueryResultRow.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/QueryResultRow.scala @@ -14,9 +14,10 @@ * limitations under the License. */ -package za.co.absa.balta.classes +package za.co.absa.db.balta.classes import org.postgresql.util.PGobject +import za.co.absa.db.balta.classes.simple.JsonBString import java.sql.{Date, ResultSet, Time} import java.time.{Instant, OffsetDateTime} diff --git a/balta/src/main/scala/za/co/absa/balta/classes/setter/AllowedParamTypes.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/setter/AllowedParamTypes.scala similarity index 92% rename from balta/src/main/scala/za/co/absa/balta/classes/setter/AllowedParamTypes.scala rename to balta/src/main/scala/za/co/absa/db/balta/classes/setter/AllowedParamTypes.scala index 6db1171..7383c40 100644 --- a/balta/src/main/scala/za/co/absa/balta/classes/setter/AllowedParamTypes.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/setter/AllowedParamTypes.scala @@ -14,11 +14,11 @@ * limitations under the License. */ -package za.co.absa.balta.classes.setter +package za.co.absa.db.balta.classes.setter -import za.co.absa.balta.classes.JsonBString +import za.co.absa.db.balta.classes.simple.JsonBString -import java.time.{Instant, OffsetDateTime, LocalTime, LocalDate} +import java.time.{Instant, LocalDate, LocalTime, OffsetDateTime} import java.util.UUID /** diff --git a/balta/src/main/scala/za/co/absa/balta/classes/setter/CustomDBType.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/setter/CustomDBType.scala similarity index 95% rename from balta/src/main/scala/za/co/absa/balta/classes/setter/CustomDBType.scala rename to balta/src/main/scala/za/co/absa/db/balta/classes/setter/CustomDBType.scala index 78921c9..2c23ef6 100644 --- a/balta/src/main/scala/za/co/absa/balta/classes/setter/CustomDBType.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/setter/CustomDBType.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package za.co.absa.balta.classes.setter +package za.co.absa.db.balta.classes.setter /** * This is a case class representing a custom DB type. diff --git a/balta/src/main/scala/za/co/absa/balta/classes/setter/Params.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/setter/Params.scala similarity index 99% rename from balta/src/main/scala/za/co/absa/balta/classes/setter/Params.scala rename to balta/src/main/scala/za/co/absa/db/balta/classes/setter/Params.scala index fc2effb..e428b40 100644 --- a/balta/src/main/scala/za/co/absa/balta/classes/setter/Params.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/setter/Params.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package za.co.absa.balta.classes.setter +package za.co.absa.db.balta.classes.setter import scala.collection.immutable.ListMap diff --git a/balta/src/main/scala/za/co/absa/balta/classes/setter/SetterFnc.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/setter/SetterFnc.scala similarity index 97% rename from balta/src/main/scala/za/co/absa/balta/classes/setter/SetterFnc.scala rename to balta/src/main/scala/za/co/absa/db/balta/classes/setter/SetterFnc.scala index e8e3b9f..02ba649 100644 --- a/balta/src/main/scala/za/co/absa/balta/classes/setter/SetterFnc.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/setter/SetterFnc.scala @@ -14,13 +14,12 @@ * limitations under the License. */ -package za.co.absa.balta.classes.setter - -import za.co.absa.balta.classes.JsonBString +package za.co.absa.db.balta.classes.setter import java.sql.{Date, PreparedStatement, Time, Timestamp, Types => SqlTypes} import java.util.UUID import org.postgresql.util.PGobject +import za.co.absa.db.balta.classes.simple.JsonBString import java.time.{Instant, LocalDate, LocalTime, OffsetDateTime, ZoneId, ZoneOffset} diff --git a/balta/src/main/scala/za/co/absa/db/balta/classes/simple/ConnectionInfo.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/simple/ConnectionInfo.scala new file mode 100644 index 0000000..c2ff9b6 --- /dev/null +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/simple/ConnectionInfo.scala @@ -0,0 +1,33 @@ +/* + * Copyright 2023 ABSA Group Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package za.co.absa.db.balta.classes.simple + +/** + * This is a function that sets a parameter of a prepared statement. + * + * @param dbUrl - the JDBC URL of the database + * @param username - the username to use when connecting to the database + * @param password - the password to use when connecting to the database + * @param persistData - whether to persist the data to the database (usually false for tests, set to true for + * debugging purposes) + */ +case class ConnectionInfo( + dbUrl: String, + username: String, + password: String, + persistData: Boolean + ) diff --git a/balta/src/main/scala/za/co/absa/db/balta/classes/simple/JsonBString.scala b/balta/src/main/scala/za/co/absa/db/balta/classes/simple/JsonBString.scala new file mode 100644 index 0000000..13a8b4a --- /dev/null +++ b/balta/src/main/scala/za/co/absa/db/balta/classes/simple/JsonBString.scala @@ -0,0 +1,19 @@ +/* + * Copyright 2023 ABSA Group Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package za.co.absa.db.balta.classes.simple + +case class JsonBString(value: String) extends AnyVal diff --git a/balta/src/main/scala/za/co/absa/balta/implicits/package.scala b/balta/src/main/scala/za/co/absa/db/balta/implicits/package.scala similarity index 92% rename from balta/src/main/scala/za/co/absa/balta/implicits/package.scala rename to balta/src/main/scala/za/co/absa/db/balta/implicits/package.scala index 3c13977..c3e9388 100644 --- a/balta/src/main/scala/za/co/absa/balta/implicits/package.scala +++ b/balta/src/main/scala/za/co/absa/db/balta/implicits/package.scala @@ -14,9 +14,9 @@ * limitations under the License. */ -package za.co.absa.balta +package za.co.absa.db.balta -import za.co.absa.balta.classes.DBConnection +import za.co.absa.db.balta.classes.DBConnection import java.sql.Connection import scala.language.implicitConversions diff --git a/build.sbt b/build.sbt index d1edc01..52093c3 100644 --- a/build.sbt +++ b/build.sbt @@ -16,8 +16,6 @@ import Dependencies._ -ThisBuild / organization := "za.co.absa" - lazy val scala211 = "2.11.12" lazy val scala212 = "2.12.18" lazy val scala213 = "2.13.11" diff --git a/publish.sbt b/publish.sbt index 93d5266..d7d9e55 100644 --- a/publish.sbt +++ b/publish.sbt @@ -49,6 +49,8 @@ ThisBuild / developers := List( ) ) +ThisBuild / organization := "za.co.absa.db" + ThisBuild / organizationName := "ABSA Group Limited" ThisBuild / organizationHomepage := Some(url("https://www.absa.africa"))