diff --git a/modules/addonlib/src/test/resources/docspell-addon-single-file.zip b/modules/addonlib/src/test/resources/docspell-addon-single-file.zip new file mode 100644 index 00000000..94735d98 Binary files /dev/null and b/modules/addonlib/src/test/resources/docspell-addon-single-file.zip differ diff --git a/modules/addonlib/src/test/scala/docspell/addons/AddonArchiveTest.scala b/modules/addonlib/src/test/scala/docspell/addons/AddonArchiveTest.scala index 7cd98dcd..b49dbab8 100644 --- a/modules/addonlib/src/test/scala/docspell/addons/AddonArchiveTest.scala +++ b/modules/addonlib/src/test/scala/docspell/addons/AddonArchiveTest.scala @@ -9,7 +9,7 @@ package docspell.addons import cats.effect._ import cats.syntax.option._ -import docspell.common.UrlReader +import docspell.common._ import docspell.logging.TestLoggingConfig import munit._ @@ -42,10 +42,20 @@ class AddonArchiveTest extends CatsEffectSuite with TestLoggingConfig with Fixtu } yield () } + tempDir.test("read archive from zip with yaml only") { dir => + for { + aa <- AddonArchive.read[IO](singleFileAddonUrl, UrlReader.defaultReader[IO], None) + _ = assertEquals(aa.version, "0.7.0") + path <- aa.extractTo(UrlReader.defaultReader[IO], dir) + read <- AddonArchive.read[IO](aa.url, UrlReader.defaultReader[IO], path.some) + _ = assertEquals(aa, read) + } yield () + } + tempDir.test("Read generated addon from path") { dir => AddonGenerator.successAddon("mini-addon").use { addon => for { - archive <- IO(AddonArchive(addon.url, "", "")) + archive <- IO(AddonArchive(addon.url, "test-addon", "0.1.0")) path <- archive.extractTo[IO](UrlReader.defaultReader[IO], dir) read <- AddonArchive.read[IO](addon.url, UrlReader.defaultReader[IO], path.some) diff --git a/modules/addonlib/src/test/scala/docspell/addons/Fixtures.scala b/modules/addonlib/src/test/scala/docspell/addons/Fixtures.scala index f169d3dd..127c74da 100644 --- a/modules/addonlib/src/test/scala/docspell/addons/Fixtures.scala +++ b/modules/addonlib/src/test/scala/docspell/addons/Fixtures.scala @@ -31,6 +31,9 @@ trait Fixtures extends TestLoggingConfig { self: CatsEffectSuite => val miniAddonUrl = LenientUri.fromJava(getClass.getResource("/minimal-addon.zip")) + val singleFileAddonUrl = + LenientUri.fromJava(getClass.getResource("/docspell-addon-single-file.zip")) + val dummyAddonMeta = AddonMeta( meta = diff --git a/modules/common/src/main/scala/docspell/common/util/Directory.scala b/modules/common/src/main/scala/docspell/common/util/Directory.scala index fcde4ebb..8002bc85 100644 --- a/modules/common/src/main/scala/docspell/common/util/Directory.scala +++ b/modules/common/src/main/scala/docspell/common/util/Directory.scala @@ -6,6 +6,7 @@ package docspell.common.util +import cats.data.OptionT import cats.effect._ import cats.syntax.all._ import cats.{Applicative, Monad} @@ -26,10 +27,10 @@ object Directory { (dir :: dirs.toList).traverse_(Files[F].createDirectories(_)) def nonEmpty[F[_]: Files: Sync](dir: Path): F[Boolean] = - List( - Files[F].isDirectory(dir), - Files[F].list(dir).take(1).compile.last.map(_.isDefined) - ).sequence.map(_.forall(identity)) + OptionT + .whenM(Files[F].isDirectory(dir))(Files[F].list(dir).take(1).compile.toList) + .map(_.nonEmpty) + .isDefined def isEmpty[F[_]: Files: Sync](dir: Path): F[Boolean] = nonEmpty(dir).map(b => !b)