test: Add comprehensive unit tests
- IdleTimerTest.kt: 6 tests for timeout calculations - ConfigValidationTest.kt: 16 tests for config validation - Homepage URL validation - Admin PIN validation (4-8 digits) - Whitelist parsing and normalization - Updated IMPROVEMENTS.md with test coverage Total unit tests: 29
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
package farm.hobbs.kioskbrowser
|
||||
|
||||
import org.junit.Assert.*
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Unit tests for configuration validation
|
||||
*/
|
||||
class ConfigValidationTest {
|
||||
|
||||
/**
|
||||
* Validate homepage URL format
|
||||
*/
|
||||
private fun isValidHomepage(url: String): Boolean {
|
||||
return url.startsWith("http://") || url.startsWith("https://")
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate admin PIN (numeric, 4-8 digits)
|
||||
*/
|
||||
private fun isValidPin(pin: String): Boolean {
|
||||
return pin.matches(Regex("^\\d{4,8}$"))
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse whitelist from comma-separated string
|
||||
*/
|
||||
private fun parseWhitelist(input: String): List<String> {
|
||||
return input.split(",")
|
||||
.map { it.trim().lowercase() }
|
||||
.filter { it.isNotEmpty() }
|
||||
}
|
||||
|
||||
// Homepage validation tests
|
||||
@Test
|
||||
fun `valid https homepage`() {
|
||||
assertTrue(isValidHomepage("https://hobbs.farm"))
|
||||
assertTrue(isValidHomepage("https://example.com/path"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `valid http homepage`() {
|
||||
assertTrue(isValidHomepage("http://localhost:8080"))
|
||||
assertTrue(isValidHomepage("http://192.168.1.1"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invalid homepage without protocol`() {
|
||||
assertFalse(isValidHomepage("hobbs.farm"))
|
||||
assertFalse(isValidHomepage("www.example.com"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invalid homepage with wrong protocol`() {
|
||||
assertFalse(isValidHomepage("ftp://files.example.com"))
|
||||
assertFalse(isValidHomepage("file:///path/to/file"))
|
||||
}
|
||||
|
||||
// PIN validation tests
|
||||
@Test
|
||||
fun `valid 4 digit PIN`() {
|
||||
assertTrue(isValidPin("1234"))
|
||||
assertTrue(isValidPin("0000"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `valid 6 digit PIN`() {
|
||||
assertTrue(isValidPin("123456"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `valid 8 digit PIN`() {
|
||||
assertTrue(isValidPin("12345678"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invalid PIN too short`() {
|
||||
assertFalse(isValidPin("123"))
|
||||
assertFalse(isValidPin("1"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invalid PIN too long`() {
|
||||
assertFalse(isValidPin("123456789"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invalid PIN with letters`() {
|
||||
assertFalse(isValidPin("12ab"))
|
||||
assertFalse(isValidPin("abcd"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invalid PIN with special characters`() {
|
||||
assertFalse(isValidPin("12-34"))
|
||||
assertFalse(isValidPin("1234!"))
|
||||
}
|
||||
|
||||
// Whitelist parsing tests
|
||||
@Test
|
||||
fun `parse single domain`() {
|
||||
val result = parseWhitelist("hobbs.farm")
|
||||
assertEquals(listOf("hobbs.farm"), result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parse multiple domains`() {
|
||||
val result = parseWhitelist("hobbs.farm, example.com, test.org")
|
||||
assertEquals(listOf("hobbs.farm", "example.com", "test.org"), result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parse whitelist normalizes case`() {
|
||||
val result = parseWhitelist("HOBBS.FARM, Example.Com")
|
||||
assertEquals(listOf("hobbs.farm", "example.com"), result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parse whitelist handles extra whitespace`() {
|
||||
val result = parseWhitelist(" hobbs.farm , example.com ")
|
||||
assertEquals(listOf("hobbs.farm", "example.com"), result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parse whitelist filters empty entries`() {
|
||||
val result = parseWhitelist("hobbs.farm,,example.com,")
|
||||
assertEquals(listOf("hobbs.farm", "example.com"), result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parse empty whitelist`() {
|
||||
val result = parseWhitelist("")
|
||||
assertTrue(result.isEmpty())
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package farm.hobbs.kioskbrowser
|
||||
|
||||
import org.junit.Assert.*
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Unit tests for idle timer calculations and behavior
|
||||
*/
|
||||
class IdleTimerTest {
|
||||
|
||||
/**
|
||||
* Convert minutes to milliseconds for idle timeout
|
||||
*/
|
||||
private fun calculateTimeoutMs(minutes: Int): Long {
|
||||
return if (minutes <= 0) 0L else minutes * 60 * 1000L
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `zero timeout disables timer`() {
|
||||
assertEquals(0L, calculateTimeoutMs(0))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `negative timeout disables timer`() {
|
||||
assertEquals(0L, calculateTimeoutMs(-5))
|
||||
assertEquals(0L, calculateTimeoutMs(-1))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `1 minute timeout converts correctly`() {
|
||||
assertEquals(60_000L, calculateTimeoutMs(1))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `5 minute default timeout converts correctly`() {
|
||||
assertEquals(300_000L, calculateTimeoutMs(5))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `30 minute timeout converts correctly`() {
|
||||
assertEquals(1_800_000L, calculateTimeoutMs(30))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `60 minute timeout converts correctly`() {
|
||||
assertEquals(3_600_000L, calculateTimeoutMs(60))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user