diff --git a/src/main/kotlin/net/thauvin/erik/bitly/Utils.kt b/src/main/kotlin/net/thauvin/erik/bitly/Utils.kt index 57cb313..53ab79a 100644 --- a/src/main/kotlin/net/thauvin/erik/bitly/Utils.kt +++ b/src/main/kotlin/net/thauvin/erik/bitly/Utils.kt @@ -49,22 +49,9 @@ import java.util.logging.Logger /** Useful functions. */ open class Utils private constructor() { companion object { - /** The logger instance. **/ + /** The logger instance. */ val logger: Logger by lazy { Logger.getLogger(Bitly::class.java.simpleName) } - /** - * Builds the full API endpoint URL using the [Constants.API_BASE_URL]. - * - * @param endPointPath The REST request path. (eg. `/shorten', '/user`) - */ - fun buildEndPointUrl(endPointPath: String): String { - return if (endPointPath.startsWith('/')) { - "${Constants.API_BASE_URL}$endPointPath" - } else { - "${Constants.API_BASE_URL}/$endPointPath" - } - } - /** * Executes an API call. * @@ -74,10 +61,11 @@ open class Utils private constructor() { * @param method The submission [Method][Methods]. * @return The response (JSON) from the API. */ + @JvmOverloads fun call( accessToken: String, endPoint: String, - params: Map, + params: Map = emptyMap(), method: Methods = Methods.POST ): String { var response = Constants.EMPTY @@ -153,6 +141,39 @@ open class Utils private constructor() { return Constants.EMPTY } + /** + * Validates a URL. + */ + fun String.isValidUrl(): Boolean { + if (this.isNotBlank()) { + try { + URL(this) + return true + } catch (e: MalformedURLException) { + logger.log(Level.FINE, "Invalid URL: $this", e) + } + } + return false + } + + /** + * Removes http(s) scheme from string. + */ + fun String.removeHttp(): String { + return this.replaceFirst(Regex("^[Hh][Tt]{2}[Pp][Ss]?://"), "") + } + + /** + * Builds the full API endpoint URL using the [Constants.API_BASE_URL]. + */ + fun String.toEndPoint(): String { + return if (this.startsWith('/')) { + "${Constants.API_BASE_URL}$this" + } else { + "${Constants.API_BASE_URL}/$this" + } + } + private fun validateCall(accessToken: String, endPoint: String): Boolean { when { endPoint.isBlank() -> logger.severe("Please specify a valid API endpoint.") @@ -161,20 +182,5 @@ open class Utils private constructor() { } return false } - - /** - * Validates a URL. - */ - fun validateUrl(url: String): Boolean { - if (url.isNotBlank()) { - try { - URL(url) - return true - } catch (e: MalformedURLException) { - logger.log(Level.FINE, "Invalid URL: $url", e) - } - } - return false - } } } diff --git a/src/test/kotlin/net/thauvin/erik/bitly/BitlyTest.kt b/src/test/kotlin/net/thauvin/erik/bitly/BitlyTest.kt index 9f75f5d..21602c0 100644 --- a/src/test/kotlin/net/thauvin/erik/bitly/BitlyTest.kt +++ b/src/test/kotlin/net/thauvin/erik/bitly/BitlyTest.kt @@ -32,6 +32,9 @@ package net.thauvin.erik.bitly +import net.thauvin.erik.bitly.Utils.Companion.removeHttp +import net.thauvin.erik.bitly.Utils.Companion.toEndPoint +import org.json.JSONObject import org.junit.Before import java.io.File import java.util.logging.Level @@ -72,7 +75,7 @@ class BitlyTest { val test = Bitly().apply { accessToken = "12345679" } assertEquals( "{\"message\":\"FORBIDDEN\"}", - test.bitlinks().shorten("https://erik.thauvin.net/blog", isJson = true) + test.bitlinks().shorten("https://erik.thauvin.net/blog", toJson = true) ) } @@ -89,12 +92,22 @@ class BitlyTest { @Test fun `as json`() { - assertTrue(bitly.bitlinks().shorten(longUrl, isJson = true).startsWith("{\"created_at\":")) + assertTrue(bitly.bitlinks().shorten(longUrl, toJson = true).startsWith("{\"created_at\":")) } @Test fun `get user`() { - assertTrue(bitly.call(Utils.buildEndPointUrl("user"), emptyMap(), Methods.GET).contains("\"login\":")) + assertTrue(bitly.call("/user".toEndPoint(), method = Methods.GET).contains("\"login\":")) + } + + @Test + fun `created by`() { + assertEquals( + "ethauvin", + JSONObject( + bitly.call("/bitlinks/${shortUrl.removeHttp()}".toEndPoint(), method = Methods.GET) + ).getString("created_by") + ) } @Test @@ -109,6 +122,6 @@ class BitlyTest { @Test fun `clicks summary`() { - assertNotEquals(Constants.EMPTY, bitly.bitlinks().Clicks().summary(shortUrl)) + assertNotEquals(Constants.EMPTY, bitly.bitlinks().clicks(shortUrl)) } }