Cleanup StockQuote module output formatting

This commit is contained in:
Erik C. Thauvin 2025-05-09 22:33:23 -07:00
parent da04d43ce8
commit 6967341514
Signed by: erik
GPG key ID: 776702A6A2DA330E
4 changed files with 35 additions and 17 deletions

View file

@ -14,12 +14,12 @@ import java.time.ZoneId
*/ */
object ReleaseInfo { object ReleaseInfo {
const val PROJECT = "mobibot" const val PROJECT = "mobibot"
const val VERSION = "0.8.0-rc+20250509175846" const val VERSION = "0.8.0-rc+20250509223055"
@JvmField @JvmField
@Suppress("MagicNumber") @Suppress("MagicNumber")
val BUILD_DATE: LocalDateTime = LocalDateTime.ofInstant( val BUILD_DATE: LocalDateTime = LocalDateTime.ofInstant(
Instant.ofEpochMilli(1746838726462L), ZoneId.systemDefault() Instant.ofEpochMilli(1746855055425L), ZoneId.systemDefault()
) )
const val WEBSITE = "https://mobitopia.org/mobibot/" const val WEBSITE = "https://mobitopia.org/mobibot/"

View file

@ -98,8 +98,7 @@ class Info(private val tell: Tell, private val seen: Seen) : AbstractCommand() {
} else if (isEmpty()) { } else if (isEmpty()) {
return "0 second" return "0 second"
} }
return joinToString(" ")
return this.joinToString(" ")
} }
} }
} }

View file

@ -157,7 +157,7 @@ class StockQuote2 : AbstractModule() {
add( add(
PublicMessage( PublicMessage(
"Symbol: $tickerSymbol" "Symbol: ${tickerSymbol.bold()}"
) )
) )
@ -168,6 +168,16 @@ class StockQuote2 : AbstractModule() {
"Price: ".padEnd(pad).prependIndent() + c "Price: ".padEnd(pad).prependIndent() + c
) )
) )
add(
PublicMessage(
"Previous: ".padEnd(pad).prependIndent() + previous
)
)
add(
NoticeMessage(
"Symbol: ${tickerSymbol.bold()}"
)
)
add( add(
NoticeMessage( NoticeMessage(
"Change: ".padEnd(pad).prependIndent() + change + " [$changePercent%]" "Change: ".padEnd(pad).prependIndent() + change + " [$changePercent%]"
@ -188,11 +198,6 @@ class StockQuote2 : AbstractModule() {
"Open: ".padEnd(pad).prependIndent() + open "Open: ".padEnd(pad).prependIndent() + open
) )
) )
add(
PublicMessage(
"Previous: ".padEnd(pad).prependIndent() + previous
)
)
add( add(
NoticeMessage( NoticeMessage(
"Latest: ".padEnd(pad).prependIndent() + latest "Latest: ".padEnd(pad).prependIndent() + latest
@ -242,10 +247,15 @@ class StockQuote2 : AbstractModule() {
val json = getJsonResponse(response, debugMessage) val json = getJsonResponse(response, debugMessage)
val count = json.getInt("count") val count = json.getInt("count")
if (count == 0) { if (count == 0) {
add(ErrorMessage("Nothing found.")) add(ErrorMessage("Nothing found for: ${keywords.bold()}"))
return messages return messages
} }
add(
NoticeMessage(
"Search results for: ${keywords.bold()}"
)
)
val results = json.getJSONArray("result") val results = json.getJSONArray("result")
for (i in 0 until count) { for (i in 0 until count) {
@ -254,7 +264,7 @@ class StockQuote2 : AbstractModule() {
val name = result.getString("description") val name = result.getString("description")
add( add(
NoticeMessage("${symbol.bold()}: $name") NoticeMessage("${symbol.bold()}: $name".prependIndent())
) )
if (i >= 4) { if (i >= 4) {

View file

@ -119,10 +119,10 @@ class StockQuote2Test : LocalProperties() {
val messages = getSanitizedQuote(symbol, apiKey) val messages = getSanitizedQuote(symbol, apiKey)
assertThat(messages, "response not empty").isNotEmpty() assertThat(messages, "response not empty").isNotEmpty()
assertThat(messages, "getQuote($symbol)").index(0).prop(Message::msg) assertThat(messages, "getQuote($symbol)").index(0).prop(Message::msg)
.isEqualTo("Symbol: AAPL") .isEqualTo("Symbol: \u0002AAPL\u0002")
assertThat(messages, "getQuote($symbol)").index(1).prop(Message::msg) assertThat(messages, "getQuote($symbol)").index(1).prop(Message::msg)
.matches("\\s+Price:\\s+\\d+\\.\\d+.*".toRegex()) .matches("\\s+Price:\\s+\\d+\\.\\d+.*".toRegex())
assertThat(messages, "getQuote($symbol)").index(7).prop(Message::msg) assertThat(messages, "getQuote($symbol)").index(8).prop(Message::msg)
.matches("\\s+Latest:\\s+\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2} UTC".toRegex()) .matches("\\s+Latest:\\s+\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2} UTC".toRegex())
} }
@ -156,12 +156,12 @@ class StockQuote2Test : LocalProperties() {
val keywords = "alphabet inc" val keywords = "alphabet inc"
val messages = getSanitizedLookup(keywords, apiKey) val messages = getSanitizedLookup(keywords, apiKey)
assertThat(messages, "messages should not be empty").isNotEmpty() assertThat(messages, "messages should not be empty").isNotEmpty()
assertThat(messages, "lookup($keywords)").index(1).prop(Message::msg) assertThat(messages, "lookup($keywords)").index(0).prop(Message::msg)
.matches("\u0002\\w+\u0002: .*".toRegex()) .isEqualTo("Search results for: \u0002alphabet inc\u0002")
var hasGoog = false var hasGoog = false
for (msg in messages) { for (msg in messages) {
if (msg.msg.matches("\u0002GOOG\u0002: .*".toRegex())) { if (msg.msg.matches("\\s+\u0002GOOG\u0002: .*".toRegex())) {
hasGoog = true hasGoog = true
break break
} }
@ -179,5 +179,14 @@ class StockQuote2Test : LocalProperties() {
.isEqualTo("Please specify at least one search term.") .isEqualTo("Please specify at least one search term.")
} }
@Test
@Throws(ModuleException::class)
fun `Lookup not found`() {
val keywords = "foo motors"
val messages = getSanitizedLookup(keywords, apiKey)
assertThat(messages, "response not empty").isNotEmpty()
assertThat(messages, "lookup($keywords)").index(0).prop(Message::msg)
.isEqualTo("Nothing found for: \u0002foo motors\u0002")
}
} }
} }