Skip to content

Commit 9d599a2

Browse files
committed
Port some I18n to minutest
1 parent 3d86be7 commit 9d599a2

File tree

7 files changed

+162
-125
lines changed

7 files changed

+162
-125
lines changed

domain/src/test/kotlin/security/EncodingsTest.kt

+2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package kickstart.security
22

33
import com.natpryce.hamkrest.assertion.assertThat
44
import com.natpryce.hamkrest.equalTo
5+
import dev.minutest.Tests
56
import dev.minutest.junit.JUnit5Minutests
67
import dev.minutest.rootContext
78
import dev.minutest.test
89
import kotlin.test.Test
910

1011
class HexTest : JUnit5Minutests {
12+
@Tests
1113
fun `encoding and decoding tests`() = rootContext {
1214
test("encoding to hex") {
1315
assertThat(

domain/src/test/kotlin/security/PasswordHashTest.kt

+3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import com.natpryce.hamkrest.assertion.assertThat
44
import com.natpryce.hamkrest.equalTo
55
import com.natpryce.hamkrest.hasElement
66
import com.natpryce.hamkrest.hasSize
7+
import dev.minutest.Tests
78
import dev.minutest.junit.JUnit5Minutests
89
import dev.minutest.rootContext
910
import dev.minutest.test
1011

1112
class PasswordHashTest : JUnit5Minutests {
13+
@Tests
1214
fun salting() = rootContext {
1315
test("generates a 24 bytes salt") {
1416
val hash = PasswordHash.create("password")
@@ -26,6 +28,7 @@ class PasswordHashTest : JUnit5Minutests {
2628
}
2729
}
2830

31+
@Tests
2932
fun hashing() = rootContext {
3033
test("creates hash from clear text password") {
3134
val hash = PasswordHash.create("clear password")

integration/src/test/kotlin/security/UsersDatabaseTest.kt

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class Fixture : DatabaseFixture() {
4747

4848

4949
class UsersDatabaseTest : JUnit5Minutests {
50+
@Tests
5051
fun tests() = rootContext<Fixture> {
5152
given {
5253
Fixture()

webapp/src/test/kotlin/i18n/BundledMessagesTest.kt

+59-57
Original file line numberDiff line numberDiff line change
@@ -2,79 +2,81 @@ package i18n
22

33
import com.natpryce.hamkrest.*
44
import com.natpryce.hamkrest.assertion.assertThat
5+
import dev.minutest.Tests
6+
import dev.minutest.given
7+
import dev.minutest.junit.JUnit5Minutests
8+
import dev.minutest.rootContext
9+
import dev.minutest.test
510
import kickstart.i18n.BundledMessages
611
import kickstart.i18n.loadBundle
712
import kotlin.test.Test
813
import java.util.*
914

10-
class BundledMessagesTest {
15+
class BundledMessagesTest : JUnit5Minutests {
16+
@Tests
17+
fun tests() = rootContext<BundledMessages> {
18+
given { BundledMessages.rootedAt("test/i18n") }
1119

12-
val bundles = BundledMessages.rootedAt("test/i18n")
20+
test("loads translations in specified locale") {
21+
val translations = loadBundle("defaults", Locale.FRENCH)
1322

14-
@Test
15-
fun `loads translations in specified locale`() {
16-
val translations = bundles.loadBundle("defaults", Locale.FRENCH)
23+
assertThat(
24+
"translated value", translations.interpolate("app.value"),
25+
equalTo("valeur par défaut")
26+
)
27+
}
1728

18-
assertThat(
19-
"translated value", translations.interpolate("app.value"),
20-
equalTo("valeur par défaut")
21-
)
22-
}
29+
test("composes view translations") {
30+
val translations = loadBundle("views", "model/page", Locale.ENGLISH)
2331

24-
@Test
25-
fun `composes view translations`() {
26-
val translations = bundles.loadBundle("views", "model/page", Locale.ENGLISH)
32+
assertThat(
33+
"page value", translations.interpolate("page.value"),
34+
equalTo("page value")
35+
)
36+
assertThat(
37+
"model value", translations.interpolate("model.value"),
38+
equalTo("model default value")
39+
)
40+
assertThat(
41+
"default value", translations.interpolate("views.value"),
42+
equalTo("views default value")
43+
)
44+
}
2745

28-
assertThat(
29-
"page value", translations.interpolate("page.value"),
30-
equalTo("page value")
31-
)
32-
assertThat(
33-
"model value", translations.interpolate("model.value"),
34-
equalTo("model default value")
35-
)
36-
assertThat(
37-
"default value", translations.interpolate("views.value"),
38-
equalTo("views default value")
39-
)
40-
}
46+
test("looks up translation keys, starting with most specific") {
47+
fun lookupValueIn(bundleName: String): String? {
48+
val translations = loadBundle("views", bundleName, Locale.ENGLISH)
49+
return translations.interpolate("value")
50+
}
4151

42-
@Test
43-
fun `looks up translation keys, starting with most specific`() {
44-
fun lookupValueIn(bundleName: String): String? {
45-
val translations = bundles.loadBundle("views", bundleName, Locale.ENGLISH)
46-
return translations.interpolate("value")
52+
assertThat("page value", lookupValueIn("model/page"), equalTo("page value"))
53+
assertThat(
54+
"model default value",
55+
lookupValueIn("model/other"),
56+
equalTo("model default value")
57+
)
58+
assertThat("views default value", lookupValueIn("other"), equalTo("views default value"))
4759
}
4860

49-
assertThat("page value", lookupValueIn("model/page"), equalTo("page value"))
50-
assertThat(
51-
"model default value",
52-
lookupValueIn("model/other"),
53-
equalTo("model default value")
54-
)
55-
assertThat("views default value", lookupValueIn("other"), equalTo("views default value"))
56-
}
61+
test("ignores missing bundles") {
62+
val translations = loadBundle("missing", Locale.ENGLISH)
5763

58-
@Test
59-
fun `ignores missing bundles`() {
60-
val translations = bundles.loadBundle("missing", Locale.ENGLISH)
61-
62-
assertThat(translations.interpolate("key"), absent())
63-
}
64+
assertThat(translations.interpolate("key"), absent())
65+
}
6466

65-
@Test
66-
fun `provides search locations`() {
67-
val translations = bundles.loadBundle("views", "model/page", Locale.ENGLISH)
67+
test("provides search locations") {
68+
val translations = loadBundle("views", "model/page", Locale.ENGLISH)
6869

69-
val locations = translations.searchPath("views.value")
70-
.map { it.description }
70+
val locations = translations.searchPath("views.value")
71+
.map { it.description }
7172

72-
assertThat(
73-
locations,
74-
allOf(
75-
hasElement("bundle test/i18n/views/model/page in en"),
76-
hasElement("bundle test/i18n/views/model/defaults in en"),
77-
hasElement("bundle test/i18n/views/defaults in en"))
78-
)
73+
assertThat(
74+
locations,
75+
allOf(
76+
hasElement("bundle test/i18n/views/model/page in en"),
77+
hasElement("bundle test/i18n/views/model/defaults in en"),
78+
hasElement("bundle test/i18n/views/defaults in en"))
79+
)
80+
}
7981
}
8082
}

webapp/src/test/kotlin/i18n/CompositeMessagesTest.kt

+27-15
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,40 @@ package kickstart.i18n
33
import com.natpryce.hamkrest.absent
44
import com.natpryce.hamkrest.assertion.assertThat
55
import com.natpryce.hamkrest.equalTo
6+
import dev.minutest.Tests
7+
import dev.minutest.given
8+
import dev.minutest.junit.JUnit5Minutests
9+
import dev.minutest.rootContext
10+
import dev.minutest.test
611
import kotlin.test.Test
712

8-
class CompositeMessagesTest {
13+
class CompositeMessagesTest : JUnit5Minutests {
14+
@Tests
15+
fun tests() = rootContext<CompositeMessages> {
16+
context("when empty") {
17+
given { compose() }
918

10-
@Test
11-
fun `starts as empty`() {
12-
val composite = compose()
19+
test("can't interpolate anything") {
20+
val composite = compose()
1321

14-
assertThat("any message", composite.interpolate("message"), absent())
15-
}
22+
assertThat("any message", composite.interpolate("message"), absent())
23+
}
24+
}
1625

17-
@Test
18-
fun `looks up translation in all composed messages`() {
19-
val composite = noMessages + Messages { _, _ -> "translation" }
26+
context("when composed") {
27+
given { noMessages + Messages { _, _ -> "translation" } }
2028

21-
assertThat("translated message", composite.interpolate("message"), equalTo("translation"))
22-
}
29+
test("look up translation in all messages") {
30+
assertThat("translated message", interpolate("message"), equalTo("translation"))
31+
}
32+
}
2333

24-
@Test
25-
fun `looks ups translations in order of addition`() {
26-
val composite = Messages { _, _ -> "original" } + Messages { _, _ -> "override" }
34+
context("when overridden") {
35+
given { Messages { _, _ -> "original" } + Messages { _, _ -> "override" } }
2736

28-
assertThat("original translation", composite.interpolate("message"), equalTo("original"))
37+
test("looks ups translations in order of addition") {
38+
assertThat("original translation", interpolate("message"), equalTo("original"))
39+
}
40+
}
2941
}
3042
}
+31-20
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,43 @@
11
package kickstart.i18n
22

3+
import dev.minutest.Tests
4+
import dev.minutest.given
5+
import dev.minutest.junit.JUnit5Minutests
6+
import dev.minutest.rootContext
7+
import dev.minutest.test
38
import org.hamcrest.MatcherAssert.assertThat
49
import org.hamcrest.Matchers.*
510
import java.util.*
611
import kotlin.test.Test
712

8-
class I18nTest {
9-
val i18n = i18n(Locale.ENGLISH, Locale.CANADA_FRENCH, Locale.FRANCE)
13+
class I18nTest : JUnit5Minutests {
14+
@Tests
15+
fun tests() = rootContext<I18n> {
16+
context("with single locale") {
17+
given { i18n(Locale.ENGLISH) }
1018

11-
@Test
12-
fun `supports its default locale`() {
13-
assertThat("default", i18n.defaultLocale, equalTo(Locale.ENGLISH))
14-
assertThat("supported locales", i18n.supportedLocales, hasItem(Locale.ENGLISH))
15-
}
19+
test("supports its default locale") {
20+
assertThat("default", defaultLocale, equalTo(Locale.ENGLISH))
21+
assertThat("supported locales", supportedLocales, hasItem(Locale.ENGLISH))
22+
}
23+
}
1624

17-
@Test
18-
fun `supports additional locales`() {
19-
assertThat(
20-
"supported locales", i18n.supportedLocales,
21-
hasItems(Locale.FRANCE, Locale.CANADA_FRENCH, Locale.ENGLISH)
22-
)
23-
}
25+
context("with multiple locales") {
26+
given { i18n(Locale.ENGLISH, Locale.CANADA_FRENCH, Locale.FRANCE) }
27+
28+
test("supports additional locales") {
29+
assertThat(
30+
"supported locales", supportedLocales,
31+
hasItems(Locale.FRANCE, Locale.CANADA_FRENCH, Locale.ENGLISH)
32+
)
33+
}
2434

25-
@Test
26-
fun `computes alternative locales`() {
27-
assertThat(
28-
"alternatives to english", i18n.alternativeTo(Locale.ENGLISH),
29-
containsInAnyOrder(Locale.FRANCE, Locale.CANADA_FRENCH)
30-
)
35+
test("computes alternative locales") {
36+
assertThat(
37+
"alternatives to english", alternativeTo(Locale.ENGLISH),
38+
containsInAnyOrder(Locale.FRANCE, Locale.CANADA_FRENCH)
39+
)
40+
}
41+
}
3142
}
3243
}

webapp/src/test/kotlin/i18n/MessageBundleTest.kt

+39-33
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,53 @@ package kickstart.i18n
22

33
import com.natpryce.hamkrest.assertion.assertThat
44
import com.natpryce.hamkrest.equalTo
5+
import dev.minutest.Tests
6+
import dev.minutest.given
7+
import dev.minutest.junit.JUnit5Minutests
8+
import dev.minutest.rootContext
9+
import dev.minutest.test
510
import java.time.LocalDate
611
import java.time.ZoneOffset
7-
import kotlin.test.Test
812
import java.util.*
913

10-
class MessageBundleTest {
11-
val messages = MessageBundle(object : ListResourceBundle() {
12-
override fun getContents(): Array<Array<Any>> {
13-
return arrayOf(
14-
arrayOf("required", "is required"),
15-
arrayOf("out-of-range", "must be between {0, number} and {1, number}"),
16-
arrayOf("expired", "must be after {0, date}")
17-
)
18-
}
14+
class MessageBundleTest : JUnit5Minutests {
15+
@Tests
16+
fun tests() = rootContext< MessageBundle> {
17+
given {
18+
MessageBundle(object : ListResourceBundle() {
19+
override fun getContents(): Array<Array<Any>> {
20+
return arrayOf(
21+
arrayOf("required", "is required"),
22+
arrayOf("out-of-range", "must be between {0, number} and {1, number}"),
23+
arrayOf("expired", "must be after {0, date}")
24+
)
25+
}
1926

20-
override fun getLocale(): Locale {
21-
return Locale.CANADA_FRENCH
27+
override fun getLocale(): Locale {
28+
return Locale.CANADA_FRENCH
29+
}
30+
})
2231
}
23-
})
2432

25-
@Test
26-
fun `reads messages from resource bundle`() {
27-
assertThat("formatted message", messages.interpolate("required"), equalTo("is required"))
28-
}
33+
test("reads messages from resource bundle") {
34+
assertThat("formatted message", interpolate("required"), equalTo("is required"))
35+
}
2936

30-
@Test
31-
fun `uses provided parameters as message arguments`() {
32-
assertThat(
33-
"formatted message",
34-
messages.interpolate("out-of-range", 1, 10),
35-
equalTo("must be between 1 and 10")
36-
)
37-
}
37+
test("uses provided parameters as message arguments") {
38+
assertThat(
39+
"formatted message",
40+
interpolate("out-of-range", 1, 10),
41+
equalTo("must be between 1 and 10")
42+
)
43+
}
3844

39-
@Test
40-
fun `uses bundle locale when formatting parameters`() {
41-
val moment = LocalDate.parse("2021-05-05").atStartOfDay().toInstant(ZoneOffset.ofHours(-4))
42-
assertThat(
43-
"formatted message",
44-
messages.interpolate("expired", Date.from(moment)),
45-
equalTo("must be after 5 mai 2021")
46-
)
45+
test("uses bundle locale when formatting parameters") {
46+
val moment = LocalDate.parse("2021-05-05").atStartOfDay().toInstant(ZoneOffset.ofHours(-4))
47+
assertThat(
48+
"formatted message",
49+
interpolate("expired", Date.from(moment)),
50+
equalTo("must be after 5 mai 2021")
51+
)
52+
}
4753
}
4854
}

0 commit comments

Comments
 (0)