Skip to content

Commit 2dce38c

Browse files
committed
implement toHaveClass
1 parent c8df572 commit 2dce38c

File tree

4 files changed

+59
-3
lines changed

4 files changed

+59
-3
lines changed

lib/src/main/kotlin/seleniumtestinglib/WebElement.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,8 @@ val WebElement.accessibleDescription: String
5959
?: getAttribute("aria-description")
6060
?: getAttribute("title")
6161

62+
val WebElement.classList: Set<String>
63+
get() = getAttribute("class").takeUnless(String::isNullOrBlank)
64+
?.split(Regex("\\s+"))?.toSet() ?: emptySet()
65+
6266
internal val WebElement.wrappedDriver get() = (this as RemoteWebElement).wrappedDriver as RemoteWebDriver

lib/src/main/kotlin/seleniumtestinglib/jestdom/Api.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,17 @@ data class JestDomMatcher(
8686
}
8787
}
8888

89-
fun toHaveClass(className: String) {
90-
validate(element?.getAttribute("class")?.contains(className) == null)
89+
fun toHaveClass(vararg classNames: String, exact: Boolean = false) {
90+
val expectedClasses = classNames.map { it.split(Regex("\\s+")) }.flatten().toSet()
91+
val elementClasses = element?.classList ?: emptySet()
92+
if (expectedClasses.isEmpty()) {
93+
validate(elementClasses.isNotEmpty())
94+
return
95+
}
96+
when (exact) {
97+
false -> validate(elementClasses.containsAll(expectedClasses))
98+
true -> validate(expectedClasses, elementClasses)
99+
}
91100
}
92101

93102
fun toHaveFocus() {

lib/src/test/kotlin/seleniumtestinglib/jestdom/HaveAttributeTest.kt renamed to lib/src/test/kotlin/seleniumtestinglib/jestdom/AttributeTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import seleniumtestinglib.render
99
import kotlin.test.Test
1010

1111
@ExtendWith(DriverLifeCycle::class)
12-
class HaveAttributeTest(private val driver: RemoteWebDriver) {
12+
class AttributeTest(private val driver: RemoteWebDriver) {
1313

1414
@Test
1515
fun `has attribute`() {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package seleniumtestinglib.jestdom
2+
3+
import org.junit.jupiter.api.extension.ExtendWith
4+
import org.openqa.selenium.remote.RemoteWebDriver
5+
import seleniumtestinglib.DriverLifeCycle
6+
import seleniumtestinglib.classList
7+
import seleniumtestinglib.queries.ByType.TestId
8+
import seleniumtestinglib.queries.getBy
9+
import seleniumtestinglib.render
10+
import kotlin.test.Test
11+
import kotlin.test.assertEquals
12+
13+
@ExtendWith(DriverLifeCycle::class)
14+
class ClassTest(private val driver: RemoteWebDriver) {
15+
16+
@Test
17+
fun `with classes`() {
18+
driver.render(
19+
"""<button data-testid="delete-button" class="btn extra btn-danger">
20+
Delete item
21+
</button>"""
22+
)
23+
24+
val deleteButton = driver.getBy(TestId, "delete-button")
25+
assertEquals(setOf("btn", "btn-danger", "extra"), deleteButton.classList)
26+
expect(deleteButton).toHaveClass()
27+
expect(deleteButton).toHaveClass("extra")
28+
expect(deleteButton).toHaveClass("btn-danger btn")
29+
expect(deleteButton).toHaveClass("btn-danger", "btn")
30+
expect(deleteButton).not.toHaveClass("btn-link")
31+
expect(deleteButton).toHaveClass("btn-danger extra btn", exact = true)
32+
expect(deleteButton).not.toHaveClass("btn-danger extra", exact = true)
33+
}
34+
35+
@Test
36+
fun `no classes`() {
37+
driver.render("""<button data-testid="no-classes">No Classes</button>""")
38+
39+
val noClasses = driver.getBy(TestId, "no-classes")
40+
assertEquals(emptySet(), noClasses.classList)
41+
expect(noClasses).not.toHaveClass()
42+
}
43+
}

0 commit comments

Comments
 (0)