Cleaned up tests with assertk

This commit is contained in:
Erik C. Thauvin 2022-10-03 23:52:55 -07:00
parent 4a1f4e32b3
commit d525910145
2 changed files with 142 additions and 112 deletions

View file

@ -65,6 +65,8 @@ dependencies {
testImplementation("org.mockito:mockito-core:4.8.0") testImplementation("org.mockito:mockito-core:4.8.0")
testImplementation("org.testng:testng:7.6.1") testImplementation("org.testng:testng:7.6.1")
testImplementation("com.willowtreeapps.assertk:assertk-jvm:0.25")
} }
kapt { kapt {

View file

@ -32,6 +32,17 @@
package net.thauvin.erik.akismet package net.thauvin.erik.akismet
import assertk.all
import assertk.assertThat
import assertk.assertions.contains
import assertk.assertions.isEmpty
import assertk.assertions.isEqualTo
import assertk.assertions.isFalse
import assertk.assertions.isNotEmpty
import assertk.assertions.isTrue
import assertk.assertions.key
import assertk.assertions.prop
import assertk.assertions.size
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
@ -82,8 +93,8 @@ class AkismetTest {
private val referer = "http://www.google.com" private val referer = "http://www.google.com"
private val date = Date() private val date = Date()
private val comment = AkismetComment( private val comment = AkismetComment(
userIp = "127.0.0.1", userIp = "127.0.0.1",
userAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6" userAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6"
) )
private val akismet = Akismet(apiKey, blog) private val akismet = Akismet(apiKey, blog)
private val mockComment: AkismetComment = AkismetComment(request = getMockRequest()) private val mockComment: AkismetComment = AkismetComment(request = getMockRequest())
@ -158,37 +169,40 @@ class AkismetTest {
akismet.blog = "" akismet.blog = ""
} }
assertEquals(akismet.blog, blog, "valid property") assertThat(akismet::blog).isEqualTo(blog)
} }
@Test @Test
fun verifyKeyTest() { fun verifyKeyTest() {
with(akismet) { assertThat(akismet, "akismet").all {
assertFalse(isVerifiedKey, "isVerifiedKey -> false") prop(Akismet::isVerifiedKey).isFalse()
prop(Akismet::verifyKey).isTrue()
assertTrue(verifyKey(), "verifyKey()") prop(Akismet::response).isEqualTo("valid")
assertEquals(response, "valid", "response -> valid") prop(Akismet::isVerifiedKey).isTrue()
assertTrue(isVerifiedKey, "isVerifiedKey -> true")
reset()
assertTrue(!isVerifiedKey && response.isEmpty() && httpStatusCode == 0, " reset")
} }
assertFalse(Akismet("123456789012").verifyKey(), "verifyKey() --> false") akismet.reset()
assertThat(akismet, "akismet.reset()").all {
prop(Akismet::isVerifiedKey).isFalse()
prop(Akismet::response).isEmpty()
prop(Akismet::httpStatusCode).isEqualTo(0)
}
assertThat(Akismet("123456789012"), "akismet(123456789012)").prop(Akismet::verifyKey).isFalse()
} }
@Test @Test
fun mockCommentTest() { fun mockCommentTest() {
with(mockComment) { assertThat(mockComment, "mockComment").all {
assertEquals(userIp, comment.userIp, "userIp") prop(AkismetComment::userIp).isEqualTo(comment.userIp)
assertEquals(userAgent, comment.userAgent, "userAgent") prop(AkismetComment::userAgent).isEqualTo(comment.userAgent)
assertEquals(referrer, comment.referrer, "referrer") prop(AkismetComment::referrer).isEqualTo(comment.referrer)
assertEquals(serverEnv["HTTP_ACCEPT_ENCODING"], "gzip", "HTTP_ACCEPT_ENCODING") prop(AkismetComment::serverEnv).all {
assertTrue(serverEnv.containsKey("REQUEST_URI"), "REQUEST_URI") key("HTTP_ACCEPT_ENCODING").isEqualTo("gzip")
assertEquals(serverEnv["REMOTE_ADDR"], comment.userIp, "REMOTE_ADDR") key("REMOTE_ADDR").isEqualTo(comment.userIp)
assertTrue(serverEnv["HTTP_NULL"].toString().isEmpty(), "HTTP_NULL") key("HTTP_NULL").isEmpty()
assertFalse(serverEnv.containsKey("HTTP_COOKIE"), "HTTP_COOKIE") size().isEqualTo(6)
assertEquals(serverEnv.size, 6, "serverEnv size") }
} }
} }
@ -199,23 +213,25 @@ class AkismetTest {
} }
val empty = AkismetComment("", "") val empty = AkismetComment("", "")
with(empty) { assertThat(empty, "AkismetComment(empty)").all {
assertFalse(isTest, "isTest") prop(AkismetComment::isTest).isFalse()
assertEquals(referrer, "", "referrer") prop(AkismetComment::referrer).isEqualTo("")
assertEquals(permalink, "", "permalink") prop(AkismetComment::permalink).isEqualTo("")
assertEquals(type, "", "type") prop(AkismetComment::type).isEqualTo("")
assertEquals(authorEmail, "", "authorEmail") prop(AkismetComment::authorEmail).isEqualTo("")
assertEquals(author, "", "author") prop(AkismetComment::author).isEqualTo("")
assertEquals(authorUrl, "", "authorUrl") prop(AkismetComment::authorUrl).isEqualTo("")
assertEquals(content, "", "content") prop(AkismetComment::content).isEqualTo("")
assertEquals(dateGmt, "", "dateGmt") prop(AkismetComment::dateGmt).isEqualTo("")
assertEquals(postModifiedGmt, "", "postModifiedGmt") prop(AkismetComment::postModifiedGmt).isEqualTo("")
assertEquals(blogLang, "", "blogLang") prop(AkismetComment::blogLang).isEqualTo("")
assertEquals(blogCharset, "", "blogCharset") prop(AkismetComment::blogCharset).isEqualTo("")
assertEquals(userRole, "", "userRole") prop(AkismetComment::userRole).isEqualTo("")
assertEquals(recheckReason, "", "recheckReason") prop(AkismetComment::recheckReason).isEqualTo("")
assertEquals(serverEnv.size, 0, "serverEnv size") prop(AkismetComment::serverEnv).size().isEqualTo(0)
}
with(empty) {
for (s in listOf("test", "", null)) { for (s in listOf("test", "", null)) {
referrer = s referrer = s
permalink = s permalink = s
@ -233,97 +249,112 @@ class AkismetTest {
val expected = if (s.isNullOrEmpty()) "" else s val expected = if (s.isNullOrEmpty()) "" else s
assertEquals(referrer, expected, "referrer: [$s]") assertThat(empty, "AkismetComment($s)").all {
assertEquals(permalink, expected, "permalink: [$s]") prop(AkismetComment::referrer).isEqualTo(expected)
assertEquals(type, expected, "type: [$s]") prop(AkismetComment::permalink).isEqualTo(expected)
assertEquals(authorEmail, expected, "authorEmail: [$s]") prop(AkismetComment::type).isEqualTo(expected)
assertEquals(author, expected, "author: [$s]") prop(AkismetComment::authorEmail).isEqualTo(expected)
assertEquals(authorUrl, expected, "authorUrl: [$s]") prop(AkismetComment::author).isEqualTo(expected)
assertEquals(content, expected, "content: [$s]") prop(AkismetComment::authorUrl).isEqualTo(expected)
assertEquals(dateGmt, expected, "dateGmt: [$s]") prop(AkismetComment::content).isEqualTo(expected)
assertEquals(postModifiedGmt, expected, "postModifiedGmt: [$s]") prop(AkismetComment::dateGmt).isEqualTo(expected)
assertEquals(blogLang, expected, "blogLang: [$s]") prop(AkismetComment::postModifiedGmt).isEqualTo(expected)
assertEquals(blogCharset, expected, "blogCharset: [$s]") prop(AkismetComment::blogLang).isEqualTo(expected)
assertEquals(userRole, expected, "userRole: [$s]") prop(AkismetComment::blogCharset).isEqualTo(expected)
assertEquals(recheckReason, expected, "recheckReason: [$s]") prop(AkismetComment::userRole).isEqualTo(expected)
assertEquals(serverEnv.size, 0, "serverEnv size: [$s]") prop(AkismetComment::recheckReason).isEqualTo(expected)
prop(AkismetComment::serverEnv).size().isEqualTo(0)
}
} }
} }
} }
@Test @Test
fun emptyResponseTest() { fun emptyResponseTest() {
with(akismet) { assertTrue(
assertTrue( akismet.executeMethod(
executeMethod( "https://postman-echo.com/status/200".toHttpUrl(), emptyFormBody, true
"https://postman-echo.com/status/200".toHttpUrl(), emptyFormBody, true
)
) )
var expected = "{\"status\":200}" )
assertEquals(response, expected, "response: $expected") var expected = "{\"status\":200}"
assertTrue(errorMessage.contains(expected), "errorMessage contains $expected") assertThat(akismet, "executeMethod(200)").all {
prop(Akismet::response).isEqualTo(expected)
prop(Akismet::errorMessage).contains(expected)
}
reset() akismet.reset()
assertTrue(httpStatusCode == 0 && errorMessage.isEmpty(), "reset") assertThat(akismet, "akismet.reset()").all {
prop(Akismet::httpStatusCode).isEqualTo(0)
prop(Akismet::errorMessage).isEmpty()
}
assertTrue( assertTrue(
executeMethod( akismet.executeMethod(
"https://erik.thauvin.net/blank.html".toHttpUrl(), emptyFormBody, true "https://erik.thauvin.net/blank.html".toHttpUrl(), emptyFormBody, true
)
) )
expected = "" )
assertEquals(response, expected, "response: $expected") expected = ""
assertTrue(errorMessage.contains("blank"), "errorMessage blank") assertThat(akismet, "executeMethod(blank)").all {
prop(Akismet::response).isEqualTo(expected)
prop(Akismet::errorMessage).contains("blank")
} }
} }
@Test @Test
fun proTipResponseTest() { fun proTipResponseTest() {
with(akismet) { assertFalse(
assertFalse( akismet.executeMethod(
executeMethod( "https://postman-echo.com/response-headers?x-akismet-pro-tip=discard".toHttpUrl(),
"https://postman-echo.com/response-headers?x-akismet-pro-tip=discard".toHttpUrl(), emptyFormBody
emptyFormBody
)
) )
assertEquals(proTip, "discard") )
assertTrue(isDiscard, "isDiscard") assertThat(akismet, "executeMethod(pro-tip)").all {
prop(Akismet::proTip).isEqualTo("discard")
prop(Akismet::isDiscard).isTrue()
}
reset() akismet.reset()
assertTrue(!isDiscard && response.isEmpty() && httpStatusCode == 0) assertThat(akismet, "akismet.reset()").all {
prop(Akismet::isDiscard).isFalse()
prop(Akismet::response).isEmpty()
prop(Akismet::httpStatusCode).isEqualTo(0)
} }
} }
@Test @Test
fun checkCommentTest() { fun checkCommentTest() {
with(akismet) { with(akismet) {
assertFalse(checkComment(comment), "check_comment(admin) -> false") assertFalse(checkComment(comment), "checkComment(admin)")
assertEquals(response, "false", "response -> false") assertThat(akismet::response).isEqualTo("false")
comment.userRole = "" comment.userRole = ""
assertTrue(checkComment(comment), "check_comment -> true") assertTrue(checkComment(comment), "checkComment()")
assertEquals(response, "true", "response -> true") assertThat(akismet::response).isEqualTo("true")
assertFalse(checkComment(mockComment), "checkComment(mock)")
assertThat(akismet::response).isEqualTo("false")
assertFalse(checkComment(mockComment), "check_comment(mock) -> false")
assertEquals(response, "false", "mock response -> false")
mockComment.userRole = "" mockComment.userRole = ""
assertTrue(checkComment(mockComment), "check_comment(mock) -> true") assertTrue(checkComment(mockComment), "checkComment(mock)")
assertEquals(response, "true", "mock response -> true") assertThat(akismet::response).isEqualTo("true")
assertEquals(httpStatusCode, 200, "status code") assertThat(akismet::httpStatusCode).isEqualTo(200)
} }
} }
@Test @Test
fun executeMethodTest() { fun executeMethodTest() {
with(akismet) { akismet.executeMethod(
executeMethod( "https://$apiKey.rest.akismet.com/1.1/comment-check".toHttpUrl(),
"https://$apiKey.rest.akismet.com/1.1/comment-check".toHttpUrl(), FormBody.Builder().apply { add("is_test", "1") }.build()
FormBody.Builder().apply { add("is_test", "1") }.build() )
) assertThat(akismet::debugHelp).isNotEmpty()
assertTrue(debugHelp.isNotEmpty(), "debugHelp not empty")
reset() akismet.reset()
assertTrue(httpStatusCode == 0 && debugHelp.isEmpty() && response.isEmpty(), "reset") assertThat(akismet, "akismet.reset()").all {
prop(Akismet::httpStatusCode).isEqualTo(0)
prop(Akismet::debugHelp).isEmpty()
prop(Akismet::response).isEmpty()
} }
} }
@ -335,7 +366,7 @@ class AkismetTest {
@Test @Test
fun ioErrorTest() { fun ioErrorTest() {
akismet.executeMethod("https://www.foobarxyz.com".toHttpUrl(), emptyFormBody) akismet.executeMethod("https://www.foobarxyz.com".toHttpUrl(), emptyFormBody)
assertTrue(akismet.errorMessage.contains("IO error")) assertThat(akismet::errorMessage).contains("IO error")
} }
@Test @Test
@ -355,36 +386,33 @@ class AkismetTest {
fun jsonCommentTest() { fun jsonCommentTest() {
val jsonComment = Akismet.jsonComment(mockComment.toJson()) val jsonComment = Akismet.jsonComment(mockComment.toJson())
assertEquals(jsonComment, mockComment, "equals") assertEquals(jsonComment, mockComment, "jsonComment = mockComment")
assertEquals(jsonComment.hashCode(), mockComment.hashCode(), "hashcode") assertEquals(jsonComment.hashCode(), mockComment.hashCode(), "jsonComment.hashCode = mockComment.hashcode")
assertNotEquals(jsonComment, comment, "json is different") assertNotEquals(jsonComment, comment, "json")
assertNotEquals(jsonComment.hashCode(), comment.hashCode(), "json hashcode is different") assertNotEquals(jsonComment.hashCode(), comment.hashCode(), "jsonComment.hashCode != mockComment.hashcode")
jsonComment.recheckReason = "" jsonComment.recheckReason = ""
assertNotEquals(jsonComment, mockComment, "not equals on change") assertNotEquals(jsonComment, mockComment, "jsonComment != jsonComment")
assertNotEquals(this, comment, "wrong object") assertNotEquals(this, comment, "this != comment")
} }
@Test @Test
fun buildUserAgentTest() { fun buildUserAgentTest() {
val libAgent = "${GeneratedVersion.PROJECT}/${GeneratedVersion.VERSION}" val libAgent = "${GeneratedVersion.PROJECT}/${GeneratedVersion.VERSION}"
assertEquals(akismet.buildUserAgent(), libAgent, "libAgent") assertEquals(akismet.buildUserAgent(), libAgent, "buildUserAgent()")
akismet.appUserAgent = "My App/1.0" akismet.appUserAgent = "My App/1.0"
assertEquals( assertEquals(akismet.buildUserAgent(), "${akismet.appUserAgent} | $libAgent", "buildUserAgent(my app)")
akismet.buildUserAgent(), "${akismet.appUserAgent} | $libAgent",
"my app"
)
} }
@Test @Test
fun dateToGmtTest() { fun dateToGmtTest() {
val localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()) val localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())
val utcDate = Akismet.dateToGmt(date) val utcDate = Akismet.dateToGmt(date)
assertEquals(Akismet.dateToGmt(localDateTime), utcDate, "dateGmt(localDateTime) = utcDate") assertEquals(Akismet.dateToGmt(localDateTime), utcDate, "dateGmt(localDateTime)")
assertEquals(comment.dateGmt, utcDate, "dateGmt == utcDate") assertThat(comment::dateGmt).isEqualTo(utcDate)
} }
private fun getMockRequest(): HttpServletRequest { private fun getMockRequest(): HttpServletRequest {
@ -397,7 +425,7 @@ class AkismetTest {
`when`(getHeader("User-Agent")).thenReturn(comment.userAgent) `when`(getHeader("User-Agent")).thenReturn(comment.userAgent)
`when`(getHeader("Accept-Encoding")).thenReturn("gzip") `when`(getHeader("Accept-Encoding")).thenReturn("gzip")
`when`(headerNames).thenReturn( `when`(headerNames).thenReturn(
Collections.enumeration(listOf("User-Agent", "referer", "Cookie", "Accept-Encoding", "Null")) Collections.enumeration(listOf("User-Agent", "referer", "Cookie", "Accept-Encoding", "Null"))
) )
} }
return request return request