You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Api/Sources/src/test/kotlin/allin/data/postgres/PostgresUserDataSourceTest.kt

229 lines
5.9 KiB

import allin.data.postgres.PostgresUserDataSource
import allin.data.postgres.entities.UsersEntity
import allin.data.postgres.entities.users
import allin.ext.executeWithResult
import allin.model.User
import junit.framework.TestCase.*
import org.junit.jupiter.api.*
import org.ktorm.database.Database
import org.ktorm.dsl.eq
import org.ktorm.dsl.update
import org.ktorm.entity.find
import org.ktorm.support.postgresql.PostgreSqlDialect
import java.time.Instant
import java.util.*
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation::class)
class PostgresUserDataSourceTest {
private lateinit var userDataSource: PostgresUserDataSource
private lateinit var database: Database
@BeforeAll
fun setUp() {
val dbDatabase = System.getenv()["POSTGRES_DB"]
val dbUser = System.getenv()["POSTGRES_USER"]
val dbPassword = System.getenv()["POSTGRES_PASSWORD"]
val dbHost = System.getenv()["POSTGRES_HOST"]
val url = "jdbc:postgresql://$dbHost/$dbDatabase"
database = Database.connect(
url = url,
user = dbUser,
password = dbPassword,
dialect = PostgreSqlDialect()
)
userDataSource = PostgresUserDataSource(database)
}
@AfterAll
fun delUser() {
userDataSource.deleteUser("JaneDoe")
}
@Test
@Order(1)
fun addUser() {
val user = User(
id = "123",
username = "JohnDoe",
email = "johndoe@example.com",
password = "securePassword123",
nbCoins = 1000,
token = null,
image = null,
bestWin = 500,
nbBets = 50,
nbFriends = 10
)
userDataSource.addUser(user)
val addedUser = database.users.find { it.id eq "123" }
assertNotNull(addedUser)
assertEquals("JohnDoe", addedUser?.username)
}
@Test
@Order(2)
fun getUserByUsername() {
val result = userDataSource.getUserByUsername("JohnDoe")
assertNotNull(result.first)
assertEquals("JohnDoe", result.first?.username)
assertEquals("securePassword123", result.second)
val resultS = userDataSource.getUserByUsername("nonexistent")
assertNull(resultS.first)
assertNull(resultS.second)
}
@Test
@Order(3)
fun getUserById() {
val result = userDataSource.getUserById("123")
assertNotNull(result)
assertEquals("JohnDoe", result?.username)
}
@Test
@Order(4)
fun deleteUser() {
val result = userDataSource.deleteUser("JohnDoe")
assertTrue(result)
val deletedUser = database.users.find { it.id eq "123" }
assertNull(deletedUser)
val resultS = userDataSource.deleteUser("nonexistent")
assertFalse(resultS)
}
@Test
@Order(5)
fun addCoins() {
userDataSource.addUser(
User(
id = "11111",
username = "JaneDoe",
email = "janedoe@example.com",
password = "securePassword456",
nbCoins = 1000,
token = null,
image = null,
bestWin = 500,
nbBets = 50,
nbFriends = 10
)
)
userDataSource.addCoins("JaneDoe", 500)
val updatedUser = database.users.find { it.id eq "11111" }
assertNotNull(updatedUser)
assertEquals(1500, updatedUser?.nbCoins)
}
@Test
@Order(6)
fun removeCoins() {
userDataSource.removeCoins("JaneDoe", 300)
val updatedUser = database.users.find { it.id eq "11111" }
assertNotNull(updatedUser)
assertEquals(1200, updatedUser?.nbCoins)
}
@Test
@Order(7)
fun userExists() {
val result = userDataSource.userExists("JaneDoe")
assertTrue(result)
val resultS = userDataSource.userExists("nonexistent")
assertFalse(resultS)
}
@Test
@Order(8)
fun emailExists() {
val result = userDataSource.emailExists("janedoe@example.com")
assertTrue(result)
val resultS = userDataSource.emailExists("nonexistent@example.com")
assertFalse(resultS)
}
@Test
@Order(9)
fun canHaveDailyGift() {
database.update(UsersEntity) {
set(it.lastGift, Instant.now().minusSeconds(86400 * 2)) // 2 days ago
where { it.username eq "JaneDoe" }
}
val result = userDataSource.canHaveDailyGift("JaneDoe")
assertTrue(result)
val resultS = userDataSource.canHaveDailyGift("JaneDoe")
assertFalse(resultS)
}
@Test
@Order(10)
fun addImage() {
val imageBytes = "sampleImage".toByteArray()
userDataSource.addImage("11111", imageBytes)
val resultSet = database.executeWithResult(
"""
SELECT encode(image, 'base64') AS image
FROM userimage
WHERE user_id = '11111'
""".trimIndent()
)
assertNotNull(resultSet)
if (resultSet != null && resultSet.next()) {
val image = resultSet.getString("image")
assertEquals(Base64.getEncoder().encodeToString(imageBytes), image)
}
}
@Test
@Order(11)
fun getImage() {
val result = userDataSource.getImage("11111")
assertNotNull(result)
}
@Test
@Order(12)
fun removeImage() {
userDataSource.removeImage("11111")
val resultSet = database.executeWithResult(
"""
SELECT encode(image, 'base64') AS image
FROM userimage
WHERE user_id = '11111'
""".trimIndent()
)
assertNotNull(resultSet)
if (resultSet != null && resultSet.next()) {
val image = resultSet.getString("image")
assertNull(image)
}
}
}