diff --git a/build.sbt b/build.sbt index 85adeea..2cbeb3d 100644 --- a/build.sbt +++ b/build.sbt @@ -28,4 +28,7 @@ libraryDependencies ++= Seq( "io.circe" %% "circe-generic-extras" % circeVersion, "io.circe" %% "circe-optics" % circeVersion, "io.circe" %% "circe-parser" % circeVersion, + + "org.scalatest" %% "scalatest" % "3.2.16" % Test, + "org.scalamock" %% "scalamock" % "5.2.0" % Test ) diff --git a/src/test/scala/fetch/FileNameServiceSpec.scala b/src/test/scala/fetch/FileNameServiceSpec.scala new file mode 100644 index 0000000..67a8fba --- /dev/null +++ b/src/test/scala/fetch/FileNameServiceSpec.scala @@ -0,0 +1,35 @@ +import fetch.FileNameService +import org.scalatest.funsuite.AnyFunSuite + +import java.time.LocalDateTime + +class FileNameServiceSpec extends AnyFunSuite { + + test("FileNameService.generate returns correct file names") { + val startTime = LocalDateTime.of(2023, 5, 17, 0, 0) + val endTime = LocalDateTime.of(2023, 5, 17, 4, 0) + + val expectedFileNames = List( + "20230517_0030.csv", + "20230517_0130.csv", + "20230517_0230.csv", + "20230517_0330.csv", + ) + + val actualFileNames = FileNameService.generate(startTime, endTime) + + assert(actualFileNames == expectedFileNames) + } + + test("FileNameService.generateFromDate returns correct file names") { + val date = LocalDateTime.of(2023, 5, 17, 0, 0).toLocalDate + + val expectedFileNames = (0 to 23).toList + .map(hour => if(hour < 10) "0"+hour else ""+hour) + .map(str => s"20230517_${str}30.csv") + + val actualFileNames = FileNameService.generateFromDate(date) + + assert(actualFileNames == expectedFileNames) + } +} \ No newline at end of file diff --git a/src/test/scala/utils/IOSuite.scala b/src/test/scala/utils/IOSuite.scala new file mode 100644 index 0000000..d162fc2 --- /dev/null +++ b/src/test/scala/utils/IOSuite.scala @@ -0,0 +1,18 @@ +package base + +import cats.effect.IO +import cats.effect.unsafe.IORuntime +import org.scalatest.Succeeded + +import scala.concurrent.Future +import scala.concurrent.duration._ + +trait IOSuite { + + val Timeout: FiniteDuration = 5.seconds + + implicit val ioRuntime: IORuntime = IORuntime.global + + def runIO[A](io: IO[A], timeout: FiniteDuration = Timeout): Future[Succeeded.type] = + io.timeout(timeout).as(Succeeded).unsafeToFuture() +} \ No newline at end of file