From a32018d60044dd48ee39df72da9340210a1049a6 Mon Sep 17 00:00:00 2001 From: Eyre_S Date: Wed, 18 Oct 2023 23:40:17 +0800 Subject: [PATCH] fix morny test package path problem, add test for hash file and NamingUtils --- build.gradle | 24 +++++----- src/test/resources/assets_morny_tests/md5.gif | Bin 0 -> 85606 bytes .../sukazyo/cono/morny/test/MornyTests.scala | 4 ++ .../bot/event/OnQuestionMarkReplyTest.scala | 2 +- .../morny/daemon/MedicationTimerTest.scala | 42 ------------------ .../test/daemon/MedicationTimerTest.scala | 42 ++++++++++++++++++ .../morny => }/data/BilibiliFormsTest.scala | 2 +- .../morny/test/utils/CommonEncryptTest.scala | 16 +++++-- .../cono/morny/test/utils/FileUtilsTest.scala | 9 ---- .../tgapi/formatting/NamingUtilsTest.scala | 27 ++++++++--- .../TelegramUserInformationTest.scala | 1 + 11 files changed, 97 insertions(+), 72 deletions(-) create mode 100644 src/test/resources/assets_morny_tests/md5.gif rename src/test/scala/cc/sukazyo/cono/morny/test/{cc/sukazyo/cono/morny => }/bot/event/OnQuestionMarkReplyTest.scala (92%) delete mode 100644 src/test/scala/cc/sukazyo/cono/morny/test/cc/sukazyo/cono/morny/daemon/MedicationTimerTest.scala create mode 100644 src/test/scala/cc/sukazyo/cono/morny/test/daemon/MedicationTimerTest.scala rename src/test/scala/cc/sukazyo/cono/morny/test/{cc/sukazyo/cono/morny => }/data/BilibiliFormsTest.scala (99%) delete mode 100644 src/test/scala/cc/sukazyo/cono/morny/test/utils/FileUtilsTest.scala diff --git a/build.gradle b/build.gradle index a14668f..c874146 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ import org.ajoberstar.grgit.Status import java.nio.charset.Charset import java.nio.charset.StandardCharsets -final boolean proj_git = grgit!=null +final boolean proj_git = grgit != null final String proj_store = MORNY_CODE_STORE final String proj_commit = proj_git ? grgit.head().id : null final String proj_commit_path = MORNY_COMMIT_PATH @@ -23,7 +23,8 @@ if (!proj_git) println "[MornyBuild] git repository not available for current working space! git version tag will be disabled." else if (isCleanBuild()) { println "git: clean build at ${grgit.head().id}" -} else { +} +else { final Status status = grgit.status() println "git: non-clean-build" if (!status.unstaged.allChanges.empty) { @@ -45,7 +46,8 @@ final String proj_version_base = VERSION final String proj_version_delta = VERSION_DELTA final boolean proj_version_use_delta = Boolean.parseBoolean(USE_DELTA) final String proj_version = proj_version_base + (proj_version_use_delta ? "-δ${proj_version_delta}" : "") -final String proj_version_full = proj_version + (proj_git ? "+git.${proj_commit.substring(0, 8)}" + (proj_clean?"":".δ") : "") +final String proj_version_full = proj_version + (proj_git ? + "+git.${proj_commit.substring(0, 8)}" + (proj_clean ? "" : ".δ") : "") final String proj_version_codename = CODENAME final long proj_code_time = proj_clean ? grgit.head().dateTime.toInstant().toEpochMilli() : System.currentTimeMillis() @@ -53,7 +55,7 @@ final JavaVersion proj_java = JavaVersion.VERSION_17 final Charset proj_file_encoding = StandardCharsets.UTF_8 final proj_scala_api = 3 //final proj_scala_lib = proj_scala_api+'.4.0-RC1-bin-20230901-89e8dba-NIGHTLY' -final proj_scala_lib = proj_scala_api+'.3.1' +final proj_scala_lib = proj_scala_api + '.3.1' String publish_local_url = null String publish_remote_url = null String publish_remote_username = null @@ -80,6 +82,7 @@ dependencies { implementation "cc.sukazyo:messiva:${lib_messiva_v}" implementation "cc.sukazyo:resource-tools:${lib_resourcetools_v}" + testImplementation "cc.sukazyo:resource-tools:${lib_resourcetools_v}" implementation "com.github.pengrad:java-telegram-bot-api:${lib_javatelegramapi_v}" implementation "com.squareup.okhttp3:okhttp:${lib_okhttp_v}" @@ -88,7 +91,8 @@ dependencies { testImplementation "org.scalatest:scalatest_$proj_scala_api:${lib_scalatest_v}" testImplementation "org.scalatest:scalatest-freespec_$proj_scala_api:${lib_scalatest_v}" testRuntimeOnly "org.scala-lang.modules:scala-xml_$proj_scala_api:${lib_scalamodule_xml_v}" - testRuntimeOnly 'com.vladsch.flexmark:flexmark-all:0.64.6' // for generating HTML report // required by gradle-scalatest plugin + testRuntimeOnly 'com.vladsch.flexmark:flexmark-all:0.64.6' + // for generating HTML report // required by gradle-scalatest plugin } @@ -155,10 +159,10 @@ buildConfig { buildConfigField('String', 'VERSION_DELTA', proj_version_use_delta ? "\"${proj_version_delta}\"" : "null") buildConfigField('String', 'CODENAME', "\"${proj_version_codename}\"") buildConfigField('long', 'CODE_TIMESTAMP', "${proj_code_time}L") - buildConfigField('String', 'COMMIT', proj_git ? "\"${proj_commit}\"" : "null") + buildConfigField('String', 'COMMIT', proj_git ? "\"${proj_commit}\"" : "null") buildConfigField('boolean', 'CLEAN_BUILD', "${proj_clean}") - buildConfigField('String', 'CODE_STORE', proj_store==""?"null":"\"${proj_store}\"") - buildConfigField('String', 'COMMIT_PATH', proj_commit_path==""?"null":"\"${proj_commit_path}\"") + buildConfigField('String', 'CODE_STORE', proj_store == "" ? "null" : "\"${proj_store}\"") + buildConfigField('String', 'COMMIT_PATH', proj_commit_path == "" ? "null" : "\"${proj_commit_path}\"") } @@ -200,7 +204,7 @@ void listChanges (Status.Changes listing) { } publishing { - repositories{ + repositories { if (publish_local_url != null) maven { name 'archives' url publish_local_url @@ -216,7 +220,7 @@ publishing { } publications { //noinspection GroovyAssignabilityCheck - main (MavenPublication) { + main(MavenPublication) { //noinspection GroovyAssignabilityCheck from components.java //noinspection GroovyAssignabilityCheck diff --git a/src/test/resources/assets_morny_tests/md5.gif b/src/test/resources/assets_morny_tests/md5.gif new file mode 100644 index 0000000000000000000000000000000000000000..eff7bd09076a188c9b267b7b9d92b0be5d683127 GIT binary patch literal 85606 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 - val _curr = EpochMillis(current) - val _tz = ZoneOffset of useTimezone - val _next = EpochMillis(nextNotifyTime) - - s"at time [$_curr], and need to be notify at hours ${notifyAt.mkString(",")} with $_tz :" - { - s"next notify should at time [$_curr]" in { - MedicationTimer.calcNextRoutineTimestamp(_curr, _tz, notifyAt) shouldEqual _next - } - } - - } - - } - -} diff --git a/src/test/scala/cc/sukazyo/cono/morny/test/daemon/MedicationTimerTest.scala b/src/test/scala/cc/sukazyo/cono/morny/test/daemon/MedicationTimerTest.scala new file mode 100644 index 0000000..9ac6686 --- /dev/null +++ b/src/test/scala/cc/sukazyo/cono/morny/test/daemon/MedicationTimerTest.scala @@ -0,0 +1,42 @@ +package cc.sukazyo.cono.morny.test.daemon + +import cc.sukazyo.cono.morny.daemon.MedicationTimer +import cc.sukazyo.cono.morny.test.MornyTests +import cc.sukazyo.cono.morny.util.EpochDateTime.EpochMillis +import org.scalatest.prop.TableDrivenPropertyChecks + +import java.time.ZoneOffset + +class MedicationTimerTest extends MornyTests with TableDrivenPropertyChecks { + + "on calculating next notify time :" - { + + val examples = Table( + ("current", "notifyAt", "useTimezone", "nextNotifyTime"), + (("2023-10-09T23:54:10.000", "+8"), Set(1, 5, 19), "+8", ("2023-10-10T01:00:00.000", "+8")), + (("2022-11-13T13:14:15.000", "+2"), Set(7, 19, 21), "+2", ("2022-11-13T19:00:00.000", "+2")), + (("2022-11-13T13:14:35.000", "+8"), Set(7, 19, 21), "+8", ("2022-11-13T19:00:00", "+8")), + (("2022-11-13T13:14:35.174", "+2"), Set(7, 19, 21), "+2", ("2022-11-13T19:00:00", "+2")), + (("1998-02-01T08:14:35.871", "+8"), Set(7, 19, 21), "+8", ("1998-02-01T19:00:00", "+8")), + (("2022-11-13T00:00:00.000", "-1"), Set(7, 19, 21), "-1", ("2022-11-13T07:00:00", "-1")), + (("2022-11-21T19:00:00.000", "+0"), Set(7, 19, 21), "+0", ("2022-11-21T21:00:00", "+0")), + (("2022-12-31T21:00:00.000", "+0"), Set(7, 19, 21), "+0", ("2023-01-01T07:00:00", "+0")), + (("2125-11-18T23:45:27.062", "+0"), Set(7, 19, 21), "+0", ("2125-11-19T07:00:00", "+0")) + ) + + forAll(examples) { (current, notifyAt, useTimezone, nextNotifyTime) => + val _curr = EpochMillis(current) + val _tz = ZoneOffset of useTimezone + val _next = EpochMillis(nextNotifyTime) + + s"at time [$_curr], and need to be notify at hours ${notifyAt.mkString(",")} with $_tz :" - { + s"next notify should at time [$_curr]" in { + MedicationTimer.calcNextRoutineTimestamp(_curr, _tz, notifyAt) shouldEqual _next + } + } + + } + + } + +} diff --git a/src/test/scala/cc/sukazyo/cono/morny/test/cc/sukazyo/cono/morny/data/BilibiliFormsTest.scala b/src/test/scala/cc/sukazyo/cono/morny/test/data/BilibiliFormsTest.scala similarity index 99% rename from src/test/scala/cc/sukazyo/cono/morny/test/cc/sukazyo/cono/morny/data/BilibiliFormsTest.scala rename to src/test/scala/cc/sukazyo/cono/morny/test/data/BilibiliFormsTest.scala index 93388f5..c3dde75 100644 --- a/src/test/scala/cc/sukazyo/cono/morny/test/cc/sukazyo/cono/morny/data/BilibiliFormsTest.scala +++ b/src/test/scala/cc/sukazyo/cono/morny/test/data/BilibiliFormsTest.scala @@ -1,4 +1,4 @@ -package cc.sukazyo.cono.morny.test.cc.sukazyo.cono.morny.data +package cc.sukazyo.cono.morny.test.data import cc.sukazyo.cono.morny.data.BilibiliForms.* import cc.sukazyo.cono.morny.test.MornyTests diff --git a/src/test/scala/cc/sukazyo/cono/morny/test/utils/CommonEncryptTest.scala b/src/test/scala/cc/sukazyo/cono/morny/test/utils/CommonEncryptTest.scala index 9bd4a9d..06f5c38 100644 --- a/src/test/scala/cc/sukazyo/cono/morny/test/utils/CommonEncryptTest.scala +++ b/src/test/scala/cc/sukazyo/cono/morny/test/utils/CommonEncryptTest.scala @@ -67,13 +67,23 @@ class CommonEncryptTest extends MornyTests with TableDrivenPropertyChecks { "da39a3ee5e6b4b0d3255bfef95601890afd80709", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" - ) - ) + )), + ( + "md5.gif", ExampleHashValue( + "f5ca4f935d44b85c431a8bf788c0eaca", + "784cefac7a3699d704756d1a04189d6157405906", + "c0aa75d5345efae1019ca7a56eabc8673499dcee8ab8a8d657fb69f1f929b909", + "2d3123c543aa1745eeae57d2e6c31b6ea07dd2bb14cef2b5939116f9cf705953fb43cf6162c87ee1c7175d1de4af6d9de6f2bc817065cc854b912877848f937b" + )) ) forAll(examples_binary) { (file, hashes) => val _name = if file == null then "empty file" else s"file $file" - val _data = if file == null then Array.empty[Byte] else throw NotImplementedError("does not applied file get yet") + val _data = + if file == null then + Array.empty[Byte] + else + assets.getResource(file).read.readAllBytes s"while hashing binary $_name :" - { diff --git a/src/test/scala/cc/sukazyo/cono/morny/test/utils/FileUtilsTest.scala b/src/test/scala/cc/sukazyo/cono/morny/test/utils/FileUtilsTest.scala deleted file mode 100644 index 1873d12..0000000 --- a/src/test/scala/cc/sukazyo/cono/morny/test/utils/FileUtilsTest.scala +++ /dev/null @@ -1,9 +0,0 @@ -package cc.sukazyo.cono.morny.test.utils - -import cc.sukazyo.cono.morny.test.MornyTests - -class FileUtilsTest extends MornyTests { - - "while getting the MD5 hash of a file :" in pending - -} diff --git a/src/test/scala/cc/sukazyo/cono/morny/test/utils/tgapi/formatting/NamingUtilsTest.scala b/src/test/scala/cc/sukazyo/cono/morny/test/utils/tgapi/formatting/NamingUtilsTest.scala index 883d8aa..db8fe84 100644 --- a/src/test/scala/cc/sukazyo/cono/morny/test/utils/tgapi/formatting/NamingUtilsTest.scala +++ b/src/test/scala/cc/sukazyo/cono/morny/test/utils/tgapi/formatting/NamingUtilsTest.scala @@ -1,24 +1,39 @@ package cc.sukazyo.cono.morny.test.utils.tgapi.formatting import cc.sukazyo.cono.morny.test.MornyTests +import cc.sukazyo.cono.morny.util.tgapi.formatting.NamingUtils class NamingUtilsTest extends MornyTests { "while generating inline query result id :" - { + import NamingUtils.inlineQueryId + "while not use no data :" - { - "(different tag) should return different id" in pending - "(same tag) should return the same id" in pending + "(different tag) should return different id" in: + inlineQueryId("abc") should not equal inlineQueryId("abd") + inlineQueryId("abc") should not equal inlineQueryId("abe") + "(same tag) should return the same id" in: + inlineQueryId("abc") shouldEqual inlineQueryId("abc") + inlineQueryId("[e]vo]wvr'L\"pno[irvP)v]") shouldEqual inlineQueryId("[e]vo]wvr'L\"pno[irvP)v]") } "while use data :" - { - "(same tag) with (same data) should return the same id" in pending - "(same tag) with (different data) should return different id" in pending - "(different tag) with (same data) should return different id" in pending - "change tag and data position should return different id" in pending + "(same tag) with (same data) should return the same id" in: + inlineQueryId("random-tag", "123456789") shouldEqual + inlineQueryId("random-tag", "123456789") + "(same tag) with (different data) should return different id" in: + inlineQueryId("random-tag", "123456789") should not equal + inlineQueryId("random-tag", "987654321") + "(different tag) with (same data) should return different id" in: + inlineQueryId("random-tag", "123456789") should not equal + inlineQueryId("set-tag", "123456789") + "change tag and data position should return different id" in: + inlineQueryId("tag", "data") should not equal + inlineQueryId("data", "tag") } diff --git a/src/test/scala/cc/sukazyo/cono/morny/test/utils/tgapi/formatting/TelegramUserInformationTest.scala b/src/test/scala/cc/sukazyo/cono/morny/test/utils/tgapi/formatting/TelegramUserInformationTest.scala index c839a5b..a38ec53 100644 --- a/src/test/scala/cc/sukazyo/cono/morny/test/utils/tgapi/formatting/TelegramUserInformationTest.scala +++ b/src/test/scala/cc/sukazyo/cono/morny/test/utils/tgapi/formatting/TelegramUserInformationTest.scala @@ -9,6 +9,7 @@ class TelegramUserInformationTest extends MornyTests with TableDrivenPropertyChe private val examples_telegram_cdn = Table( ("username", "cdn"), ("Eyre_S", "cdn5"), + ("ankarinnie", "cdn1") ) forAll(examples_telegram_cdn) ((username, cdn) => s"while user is @$username :" - {