Skip to content

Instantly share code, notes, and snippets.

@HamsterofDeath
Created September 16, 2024 11:25
Show Gist options
  • Save HamsterofDeath/2292e4e425344c66865f7f378b5e20cc to your computer and use it in GitHub Desktop.
Save HamsterofDeath/2292e4e425344c66865f7f378b5e20cc to your computer and use it in GitHub Desktop.
package hod.btlg.persistence
import hod.btlg.DBFiddle
import io.getquill.*
import org.scalatest.BeforeAndAfterAll
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import java.time.{ OffsetDateTime, ZoneOffset }
import scala.compiletime.uninitialized
class FeedbacksSpec extends PostgresBase {
import DBFiddle.pctx
import pctx.*
var testUser: BrainLiftUser = uninitialized
override def beforeAll(): Unit = {
super.beforeAll()
Feedbacks.init()
testUser = Accounts.insertUser(
BrainLiftUser(
"test",
0,
s"testUser${System.currentTimeMillis()}",
Some(s"Test User feedback ${System.currentTimeMillis()}")
).verified
)
require(testUser.internalId > 0)
}
"insertFeedback" should "successfully insert feedback for a logged-in user" in {
val feedback = Feedback(
internalId = 0,
userId = Some(testUser.internalId),
feedbackType = "positive",
message = "Great app!",
created = OffsetDateTime.now(ZoneOffset.UTC)
)
val insertedId = Feedbacks.insertFeedback(feedback)
insertedId should be > 0L
val insertedFeedback = pctx.run(query[Feedback].filter(_.internalId == lift(insertedId))).headOption
insertedFeedback shouldBe defined
insertedFeedback.get.userId shouldBe Some(testUser.internalId)
insertedFeedback.get.feedbackType shouldBe "positive"
insertedFeedback.get.message shouldBe "Great app!"
}
it should "successfully insert feedback for an anonymous user" in {
val feedback = Feedback(
internalId = 0,
userId = None,
feedbackType = "neutral",
message = "It's okay",
created = OffsetDateTime.now(ZoneOffset.UTC)
)
val insertedId = Feedbacks.insertFeedback(feedback)
insertedId should be > 0L
val insertedFeedback = pctx.run(query[Feedback].filter(_.internalId == lift(insertedId))).headOption
insertedFeedback shouldBe defined
insertedFeedback.get.userId shouldBe None
insertedFeedback.get.feedbackType shouldBe "neutral"
insertedFeedback.get.message shouldBe "It's okay"
}
"findFeedbackByUser" should "return feedback for a specific user" in {
val feedback1 = Feedback(0, Some(testUser.internalId), "positive", "Feedback 1", OffsetDateTime.now(ZoneOffset.UTC))
val feedback2 = Feedback(0, Some(testUser.internalId), "negative", "Feedback 2", OffsetDateTime.now(ZoneOffset.UTC))
Feedbacks.insertFeedback(feedback1)
Feedbacks.insertFeedback(feedback2)
val userFeedback = Feedbacks.findFeedbackByUser(testUser.internalId)
userFeedback.size should be >= 2
userFeedback.map(_.userId) should contain only Some(testUser.internalId)
}
"findFeedbackByType" should "return feedback of a specific type" in {
val feedback1 =
Feedback(0, Some(testUser.internalId), "positive", "Positive feedback", OffsetDateTime.now(ZoneOffset.UTC))
val feedback2 = Feedback(0, None, "positive", "Another positive feedback", OffsetDateTime.now(ZoneOffset.UTC))
Feedbacks.insertFeedback(feedback1)
Feedbacks.insertFeedback(feedback2)
val positiveFeedback = Feedbacks.findFeedbackByType("positive")
positiveFeedback.size should be >= 2
positiveFeedback.map(_.feedbackType) should contain only "positive"
}
"findFeedbackByDateRange" should "return feedback within a specific date range" in {
val now = OffsetDateTime.now(ZoneOffset.UTC)
val twoDaysAgo = now.minusDays(2)
val yesterday = now.minusDays(1)
val tomorrow = now.plusDays(1)
val oldFeedback = Feedback(0, Some(testUser.internalId), "old", "Old feedback", twoDaysAgo)
val recentFeedback = Feedback(0, Some(testUser.internalId), "recent", "Recent feedback", now)
Feedbacks.insertFeedback(oldFeedback)
Feedbacks.insertFeedback(recentFeedback)
val feedbackInRange = Feedbacks.findFeedbackByDateRange(yesterday, tomorrow)
feedbackInRange.size should be >= 1
feedbackInRange.map(_.feedbackType) should contain("recent")
feedbackInRange.map(_.feedbackType) should not contain ("old")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment